diff --git a/active_directory/datadog_checks/active_directory/config_models/defaults.py b/active_directory/datadog_checks/active_directory/config_models/defaults.py index 4f39e93679a20..3d179e23b96bc 100644 --- a/active_directory/datadog_checks/active_directory/config_models/defaults.py +++ b/active_directory/datadog_checks/active_directory/config_models/defaults.py @@ -7,84 +7,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 shared_use_localized_counters(field, value): +def shared_use_localized_counters(): return False -def instance_additional_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_counter_data_types(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_extra_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_host(field, value): +def instance_host(): return '.' -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_password(field, value): - return get_default_field_value(field, value) - - -def instance_server(field, value): - return get_default_field_value(field, value) - - -def instance_server_tag(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_use_legacy_check_version(field, value): +def instance_use_legacy_check_version(): return False - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/active_directory/datadog_checks/active_directory/config_models/instance.py b/active_directory/datadog_checks/active_directory/config_models/instance.py index 6f8a26fe45109..5edb57d89d89e 100644 --- a/active_directory/datadog_checks/active_directory/config_models/instance.py +++ b/active_directory/datadog_checks/active_directory/config_models/instance.py @@ -9,9 +9,10 @@ from __future__ import annotations -from typing import Literal, Mapping, Optional, Sequence, Union +from typing import Mapping, Optional, Sequence, Union -from pydantic import BaseModel, Extra, Field, root_validator, validator +from pydantic import BaseModel, ConfigDict, Field, 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 @@ -20,101 +21,110 @@ class Counter(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - aggregate: Optional[Union[bool, Literal['only']]] - average: Optional[bool] - metric_name: Optional[str] - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + extra='allow', + frozen=True, + ) + aggregate: Optional[Union[bool, Literal['only']]] = None + average: Optional[bool] = None + metric_name: Optional[str] = None + name: Optional[str] = None + type: Optional[str] = None class InstanceCounts(BaseModel): - class Config: - allow_mutation = False - - monitored: Optional[str] - total: Optional[str] - unique: Optional[str] + model_config = ConfigDict( + frozen=True, + ) + monitored: Optional[str] = None + total: Optional[str] = None + unique: Optional[str] = None class ExtraMetrics(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + frozen=True, + ) counters: Sequence[Mapping[str, Union[str, Counter]]] - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] - instance_counts: Optional[InstanceCounts] + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None + instance_counts: Optional[InstanceCounts] = None name: str - tag_name: Optional[str] - use_localized_counters: Optional[bool] + tag_name: Optional[str] = None + use_localized_counters: Optional[bool] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metrics(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + frozen=True, + ) counters: Sequence[Mapping[str, Union[str, Counter]]] - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] - instance_counts: Optional[InstanceCounts] + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None + instance_counts: Optional[InstanceCounts] = None name: str - tag_name: Optional[str] - use_localized_counters: Optional[bool] + tag_name: Optional[str] = None + use_localized_counters: Optional[bool] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - additional_metrics: Optional[Sequence[Sequence[str]]] - counter_data_types: Optional[Sequence[str]] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - enable_health_service_check: Optional[bool] - extra_metrics: Optional[Mapping[str, ExtraMetrics]] - host: Optional[str] - metric_patterns: Optional[MetricPatterns] - metrics: Optional[Mapping[str, Metrics]] - min_collection_interval: Optional[float] - namespace: Optional[str] = Field(None, regex='\\w*') - password: Optional[str] - server: Optional[str] - server_tag: Optional[str] - service: Optional[str] - tags: Optional[Sequence[str]] - use_legacy_check_version: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + additional_metrics: Optional[Sequence[Sequence[str]]] = None + counter_data_types: Optional[Sequence[str]] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + enable_health_service_check: Optional[bool] = None + extra_metrics: Optional[Mapping[str, ExtraMetrics]] = None + host: Optional[str] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[Mapping[str, Metrics]] = None + min_collection_interval: Optional[float] = None + namespace: Optional[str] = Field(None, pattern='\\w*') + password: Optional[str] = None + server: Optional[str] = None + server_tag: Optional[str] = None + service: Optional[str] = None + tags: Optional[Sequence[str]] = None + use_legacy_check_version: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/active_directory/datadog_checks/active_directory/config_models/shared.py b/active_directory/datadog_checks/active_directory/config_models/shared.py index eefbab173ede1..aa58639466c05 100644 --- a/active_directory/datadog_checks/active_directory/config_models/shared.py +++ b/active_directory/datadog_checks/active_directory/config_models/shared.py @@ -11,7 +11,7 @@ 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 @@ -20,30 +20,39 @@ class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - service: Optional[str] - use_localized_counters: Optional[bool] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None + use_localized_counters: Optional[bool] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/activemq/datadog_checks/activemq/config_models/defaults.py b/activemq/datadog_checks/activemq/config_models/defaults.py index b9702a06b9ed7..42c096be40fdd 100644 --- a/activemq/datadog_checks/activemq/config_models/defaults.py +++ b/activemq/datadog_checks/activemq/config_models/defaults.py @@ -7,108 +7,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/activemq/datadog_checks/activemq/config_models/instance.py b/activemq/datadog_checks/activemq/config_models/instance.py index bc4c01723f132..631a321dda3bb 100644 --- a/activemq/datadog_checks/activemq/config_models/instance.py +++ b/activemq/datadog_checks/activemq/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,51 +20,60 @@ 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, + 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[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/activemq/datadog_checks/activemq/config_models/shared.py b/activemq/datadog_checks/activemq/config_models/shared.py index 1c722ceac49bc..0db55a6d064d5 100644 --- a/activemq/datadog_checks/activemq/config_models/shared.py +++ b/activemq/datadog_checks/activemq/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,34 +20,43 @@ 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, + frozen=True, + ) + collect_default_metrics: Optional[bool] = None + conf: Optional[Sequence[Mapping[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/activemq_xml/datadog_checks/activemq_xml/config_models/defaults.py b/activemq_xml/datadog_checks/activemq_xml/config_models/defaults.py index b42f95152170b..f3e5fc6ae11d3 100644 --- a/activemq_xml/datadog_checks/activemq_xml/config_models/defaults.py +++ b/activemq_xml/datadog_checks/activemq_xml/config_models/defaults.py @@ -7,196 +7,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_detailed_queues(field, value): - return get_default_field_value(field, value) - - -def instance_detailed_subscribers(field, value): - return get_default_field_value(field, value) - - -def instance_detailed_topics(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_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 False -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_skip_proxy(field, value): +def instance_skip_proxy(): return False -def instance_suppress_errors(field, value): +def instance_suppress_errors(): 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/activemq_xml/datadog_checks/activemq_xml/config_models/instance.py b/activemq_xml/datadog_checks/activemq_xml/config_models/instance.py index 2c773c1ac2865..0545ff900a60a 100644 --- a/activemq_xml/datadog_checks/activemq_xml/config_models/instance.py +++ b/activemq_xml/datadog_checks/activemq_xml/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,98 +20,107 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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] - detailed_queues: Optional[Sequence[str]] - detailed_subscribers: Optional[Sequence[str]] - detailed_topics: Optional[Sequence[str]] - 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] - read_timeout: Optional[float] - request_size: Optional[float] - service: Optional[str] - skip_proxy: Optional[bool] - suppress_errors: 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] + model_config = ConfigDict( + validate_default=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 + detailed_queues: Optional[Sequence[str]] = None + detailed_subscribers: Optional[Sequence[str]] = None + detailed_topics: Optional[Sequence[str]] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + extra_headers: Optional[Mapping[str, Any]] = None + headers: Optional[Mapping[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 + read_timeout: Optional[float] = None + request_size: Optional[float] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + suppress_errors: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None url: str - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] + use_legacy_auth_encoding: Optional[bool] = None + username: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/activemq_xml/datadog_checks/activemq_xml/config_models/shared.py b/activemq_xml/datadog_checks/activemq_xml/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/activemq_xml/datadog_checks/activemq_xml/config_models/shared.py +++ b/activemq_xml/datadog_checks/activemq_xml/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/aerospike/datadog_checks/aerospike/config_models/defaults.py b/aerospike/datadog_checks/aerospike/config_models/defaults.py index a7cf26812caa6..d58763cc7bd98 100644 --- a/aerospike/datadog_checks/aerospike/config_models/defaults.py +++ b/aerospike/datadog_checks/aerospike/config_models/defaults.py @@ -7,324 +7,138 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_mappings(field, value): - return get_default_field_value(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_datacenter_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_datacenters(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_host(field, value): +def instance_host(): return 'localhost' -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_namespace_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_namespaces(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://127.0.0.1:9145/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_port(field, value): +def instance_port(): return 3000 -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_config(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_name(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_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/aerospike/datadog_checks/aerospike/config_models/instance.py b/aerospike/datadog_checks/aerospike/config_models/instance.py index 3a7e40c083a16..938a0adcac27e 100644 --- a/aerospike/datadog_checks/aerospike/config_models/instance.py +++ b/aerospike/datadog_checks/aerospike/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,154 +20,163 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + labels: Optional[Sequence[str]] = None + match: Optional[Sequence[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] - datacenter_metrics: Optional[Sequence[str]] - datacenters: Optional[Sequence[str]] - 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] - host: Optional[str] - 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*') - namespace_metrics: Optional[Sequence[str]] - namespaces: Optional[Sequence[str]] - non_cumulative_histogram_buckets: Optional[bool] - ntlm_domain: Optional[str] - openmetrics_endpoint: Optional[str] - password: Optional[str] - persist_connections: Optional[bool] - port: Optional[int] - 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_config: Optional[Mapping[str, Any]] - tls_ignore_warning: Optional[bool] - tls_name: Optional[str] - 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, + 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 + datacenter_metrics: Optional[Sequence[str]] = None + datacenters: Optional[Sequence[str]] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + enable_health_service_check: Optional[bool] = None + exclude_labels: Optional[Sequence[str]] = None + exclude_metrics: Optional[Sequence[str]] = None + exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] = None + extra_headers: Optional[Mapping[str, Any]] = None + extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] = None + headers: Optional[Mapping[str, Any]] = None + histogram_buckets_as_distributions: Optional[bool] = None + host: Optional[str] = None + hostname_format: Optional[str] = None + hostname_label: Optional[str] = None + ignore_connection_errors: Optional[bool] = None + ignore_tags: Optional[Sequence[str]] = None + include_labels: Optional[Sequence[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[Sequence[Union[str, Mapping[str, Union[str, Metric]]]]] = None + min_collection_interval: Optional[float] = None + namespace: Optional[str] = Field(None, pattern='\\w*') + namespace_metrics: Optional[Sequence[str]] = None + namespaces: Optional[Sequence[str]] = None + 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 + port: Optional[int] = None + proxy: Optional[Proxy] = None + raw_line_filters: Optional[Sequence[str]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[Mapping[str, Any]] = None + request_size: Optional[float] = None + service: Optional[str] = None + share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tags: Optional[Sequence[str]] = None + telemetry: Optional[bool] = None + timeout: Optional[float] = None + tls_ca_cert: Optional[str] = None + tls_cert: Optional[str] = None + tls_config: Optional[Mapping[str, Any]] = None + tls_ignore_warning: Optional[bool] = None + tls_name: Optional[str] = None + tls_private_key: Optional[str] = None + tls_protocols_allowed: Optional[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/aerospike/datadog_checks/aerospike/config_models/shared.py b/aerospike/datadog_checks/aerospike/config_models/shared.py index 21a8b94da6221..6d31ea989b981 100644 --- a/aerospike/datadog_checks/aerospike/config_models/shared.py +++ b/aerospike/datadog_checks/aerospike/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,42 +20,51 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - mappings: Optional[Sequence[str]] - proxy: Optional[Proxy] - service: Optional[str] - skip_proxy: Optional[bool] - timeout: Optional[float] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + mappings: Optional[Sequence[str]] = None + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/airflow/datadog_checks/airflow/config_models/defaults.py b/airflow/datadog_checks/airflow/config_models/defaults.py index 0a32cc4dc3c7a..81b466607723e 100644 --- a/airflow/datadog_checks/airflow/config_models/defaults.py +++ b/airflow/datadog_checks/airflow/config_models/defaults.py @@ -7,180 +7,78 @@ # 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 False -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 False -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_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/airflow/datadog_checks/airflow/config_models/instance.py b/airflow/datadog_checks/airflow/config_models/instance.py index 22d2339b17335..b0c9dd6112c5c 100644 --- a/airflow/datadog_checks/airflow/config_models/instance.py +++ b/airflow/datadog_checks/airflow/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,94 +20,103 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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] - read_timeout: Optional[float] - request_size: Optional[float] - 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] + model_config = ConfigDict( + validate_default=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[Mapping[str, Any]] = None + headers: Optional[Mapping[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 + read_timeout: Optional[float] = None + request_size: Optional[float] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None url: str - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] + use_legacy_auth_encoding: Optional[bool] = None + username: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/airflow/datadog_checks/airflow/config_models/shared.py b/airflow/datadog_checks/airflow/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/airflow/datadog_checks/airflow/config_models/shared.py +++ b/airflow/datadog_checks/airflow/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/amazon_msk/datadog_checks/amazon_msk/config_models/defaults.py b/amazon_msk/datadog_checks/amazon_msk/config_models/defaults.py index b0ac0aa716059..91316074223fd 100644 --- a/amazon_msk/datadog_checks/amazon_msk/config_models/defaults.py +++ b/amazon_msk/datadog_checks/amazon_msk/config_models/defaults.py @@ -7,316 +7,142 @@ # 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_assume_role(field, value): - return get_default_field_value(field, value) - - -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_boto_config(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_jmx_exporter_port(field, value): +def instance_jmx_exporter_port(): return 11001 -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_node_exporter_port(field, value): +def instance_node_exporter_port(): return 11002 -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_prometheus_metrics_path(field, value): +def instance_prometheus_metrics_path(): return '/metrics' -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_region_name(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 False -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_openmetrics(field, value): +def instance_use_openmetrics(): return False -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/amazon_msk/datadog_checks/amazon_msk/config_models/instance.py b/amazon_msk/datadog_checks/amazon_msk/config_models/instance.py index a52371c7bd777..e4cc83845ee82 100644 --- a/amazon_msk/datadog_checks/amazon_msk/config_models/instance.py +++ b/amazon_msk/datadog_checks/amazon_msk/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,154 +20,163 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + labels: Optional[Sequence[str]] = None + match: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - allow_redirects: Optional[bool] - assume_role: Optional[str] - auth_token: Optional[AuthToken] - auth_type: Optional[str] - aws_host: Optional[str] - aws_region: Optional[str] - aws_service: Optional[str] - boto_config: Optional[Mapping[str, Any]] - cache_metric_wildcards: Optional[bool] - cache_shared_labels: Optional[bool] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + allow_redirects: Optional[bool] = None + assume_role: Optional[str] = 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 + boto_config: Optional[Mapping[str, Any]] = None + cache_metric_wildcards: Optional[bool] = None + cache_shared_labels: Optional[bool] = None cluster_arn: str - 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]] - jmx_exporter_port: Optional[int] - 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*') - node_exporter_port: Optional[int] - non_cumulative_histogram_buckets: Optional[bool] - ntlm_domain: Optional[str] - openmetrics_endpoint: Optional[str] - password: Optional[str] - persist_connections: Optional[bool] - prometheus_metrics_path: Optional[str] - proxy: Optional[Proxy] - raw_line_filters: Optional[Sequence[str]] - raw_metric_prefix: Optional[str] - read_timeout: Optional[float] - region_name: Optional[str] - 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_openmetrics: Optional[bool] - use_process_start_time: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + 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[Sequence[str]] = None + exclude_metrics: Optional[Sequence[str]] = None + exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] = None + extra_headers: Optional[Mapping[str, Any]] = None + extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] = None + headers: Optional[Mapping[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[Sequence[str]] = None + include_labels: Optional[Sequence[str]] = None + jmx_exporter_port: Optional[int] = 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[Sequence[Union[str, Mapping[str, Union[str, Metric]]]]] = None + min_collection_interval: Optional[float] = None + namespace: Optional[str] = Field(None, pattern='\\w*') + node_exporter_port: Optional[int] = None + 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 + prometheus_metrics_path: Optional[str] = None + proxy: Optional[Proxy] = None + raw_line_filters: Optional[Sequence[str]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + region_name: Optional[str] = None + rename_labels: Optional[Mapping[str, Any]] = None + request_size: Optional[float] = None + service: Optional[str] = None + share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[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_openmetrics: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/amazon_msk/datadog_checks/amazon_msk/config_models/shared.py b/amazon_msk/datadog_checks/amazon_msk/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/amazon_msk/datadog_checks/amazon_msk/config_models/shared.py +++ b/amazon_msk/datadog_checks/amazon_msk/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/ambari/datadog_checks/ambari/config_models/defaults.py b/ambari/datadog_checks/ambari/config_models/defaults.py index 6023e232fca10..9acfed538345e 100644 --- a/ambari/datadog_checks/ambari/config_models/defaults.py +++ b/ambari/datadog_checks/ambari/config_models/defaults.py @@ -7,192 +7,86 @@ # 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_service_metrics(field, value): +def shared_collect_service_metrics(): return True -def shared_collect_service_status(field, value): +def shared_collect_service_status(): return False -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 False -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 False -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_services(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_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/ambari/datadog_checks/ambari/config_models/instance.py b/ambari/datadog_checks/ambari/config_models/instance.py index 60e514a903b28..02e48e2d22947 100644 --- a/ambari/datadog_checks/ambari/config_models/instance.py +++ b/ambari/datadog_checks/ambari/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,95 +20,104 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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] - read_timeout: Optional[float] - request_size: Optional[float] - service: Optional[str] - services: Optional[Mapping[str, Any]] - 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] + model_config = ConfigDict( + validate_default=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[Mapping[str, Any]] = None + headers: Optional[Mapping[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 + read_timeout: Optional[float] = None + request_size: Optional[float] = None + service: Optional[str] = None + services: Optional[Mapping[str, Any]] = None + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None url: str - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] + use_legacy_auth_encoding: Optional[bool] = None + username: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/ambari/datadog_checks/ambari/config_models/shared.py b/ambari/datadog_checks/ambari/config_models/shared.py index f854ec16fbf83..41faa19611c99 100644 --- a/ambari/datadog_checks/ambari/config_models/shared.py +++ b/ambari/datadog_checks/ambari/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,43 +20,52 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - collect_service_metrics: Optional[bool] - collect_service_status: Optional[bool] - proxy: Optional[Proxy] - service: Optional[str] - skip_proxy: Optional[bool] - timeout: Optional[float] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + collect_service_metrics: Optional[bool] = None + collect_service_status: Optional[bool] = None + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/apache/datadog_checks/apache/config_models/defaults.py b/apache/datadog_checks/apache/config_models/defaults.py index 0a32cc4dc3c7a..81b466607723e 100644 --- a/apache/datadog_checks/apache/config_models/defaults.py +++ b/apache/datadog_checks/apache/config_models/defaults.py @@ -7,180 +7,78 @@ # 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 False -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 False -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_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/apache/datadog_checks/apache/config_models/instance.py b/apache/datadog_checks/apache/config_models/instance.py index 149c33b04216e..e950f012b6093 100644 --- a/apache/datadog_checks/apache/config_models/instance.py +++ b/apache/datadog_checks/apache/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,94 +20,103 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - allow_redirects: Optional[bool] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + allow_redirects: Optional[bool] = None apache_status_url: str - 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] - read_timeout: Optional[float] - request_size: Optional[float] - 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] - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + 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[Mapping[str, Any]] = None + headers: Optional[Mapping[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 + read_timeout: Optional[float] = None + request_size: Optional[float] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + use_legacy_auth_encoding: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/apache/datadog_checks/apache/config_models/shared.py b/apache/datadog_checks/apache/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/apache/datadog_checks/apache/config_models/shared.py +++ b/apache/datadog_checks/apache/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/arangodb/datadog_checks/arangodb/config_models/defaults.py b/arangodb/datadog_checks/arangodb/config_models/defaults.py index a76129227677c..2a49e1453f118 100644 --- a/arangodb/datadog_checks/arangodb/config_models/defaults.py +++ b/arangodb/datadog_checks/arangodb/config_models/defaults.py @@ -7,284 +7,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/arangodb/datadog_checks/arangodb/config_models/instance.py b/arangodb/datadog_checks/arangodb/config_models/instance.py index fb94969585fdc..6634ff2831f5b 100644 --- a/arangodb/datadog_checks/arangodb/config_models/instance.py +++ b/arangodb/datadog_checks/arangodb/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,146 +20,155 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + labels: Optional[Sequence[str]] = None + match: Optional[Sequence[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, + 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[Sequence[str]] = None + exclude_metrics: Optional[Sequence[str]] = None + exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] = None + extra_headers: Optional[Mapping[str, Any]] = None + extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] = None + headers: Optional[Mapping[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[Sequence[str]] = None + include_labels: Optional[Sequence[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[Sequence[Union[str, Mapping[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[Sequence[str]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[Mapping[str, Any]] = None + request_size: Optional[float] = None + service: Optional[str] = None + share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/arangodb/datadog_checks/arangodb/config_models/shared.py b/arangodb/datadog_checks/arangodb/config_models/shared.py index fd4cb4cdf9bd6..cddf15255ec30 100644 --- a/arangodb/datadog_checks/arangodb/config_models/shared.py +++ b/arangodb/datadog_checks/arangodb/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/argocd/datadog_checks/argocd/config_models/defaults.py b/argocd/datadog_checks/argocd/config_models/defaults.py index d91d4e884163f..2a49e1453f118 100644 --- a/argocd/datadog_checks/argocd/config_models/defaults.py +++ b/argocd/datadog_checks/argocd/config_models/defaults.py @@ -7,304 +7,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_api_server_endpoint(field, value): - return get_default_field_value(field, value) - - -def instance_app_controller_endpoint(field, value): - return get_default_field_value(field, value) - - -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_notifications_controller_endpoint(field, value): - return get_default_field_value(field, value) - - -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_repo_server_endpoint(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/argocd/datadog_checks/argocd/config_models/instance.py b/argocd/datadog_checks/argocd/config_models/instance.py index 85c28be049a65..d3aca148d15d7 100644 --- a/argocd/datadog_checks/argocd/config_models/instance.py +++ b/argocd/datadog_checks/argocd/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,150 +20,159 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + labels: Optional[Sequence[str]] = None + match: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - allow_redirects: Optional[bool] - api_server_endpoint: Optional[str] - app_controller_endpoint: Optional[str] - 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] - notifications_controller_endpoint: Optional[str] - 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]] - repo_server_endpoint: Optional[str] - 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, + frozen=True, + ) + allow_redirects: Optional[bool] = None + api_server_endpoint: Optional[str] = None + app_controller_endpoint: Optional[str] = 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[Sequence[str]] = None + exclude_metrics: Optional[Sequence[str]] = None + exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] = None + extra_headers: Optional[Mapping[str, Any]] = None + extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] = None + headers: Optional[Mapping[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[Sequence[str]] = None + include_labels: Optional[Sequence[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[Sequence[Union[str, Mapping[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 + notifications_controller_endpoint: Optional[str] = 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[Sequence[str]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[Mapping[str, Any]] = None + repo_server_endpoint: Optional[str] = None + request_size: Optional[float] = None + service: Optional[str] = None + share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/argocd/datadog_checks/argocd/config_models/shared.py b/argocd/datadog_checks/argocd/config_models/shared.py index fd4cb4cdf9bd6..cddf15255ec30 100644 --- a/argocd/datadog_checks/argocd/config_models/shared.py +++ b/argocd/datadog_checks/argocd/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/aspdotnet/datadog_checks/aspdotnet/config_models/defaults.py b/aspdotnet/datadog_checks/aspdotnet/config_models/defaults.py index 4f39e93679a20..3d179e23b96bc 100644 --- a/aspdotnet/datadog_checks/aspdotnet/config_models/defaults.py +++ b/aspdotnet/datadog_checks/aspdotnet/config_models/defaults.py @@ -7,84 +7,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 shared_use_localized_counters(field, value): +def shared_use_localized_counters(): return False -def instance_additional_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_counter_data_types(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_extra_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_host(field, value): +def instance_host(): return '.' -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_password(field, value): - return get_default_field_value(field, value) - - -def instance_server(field, value): - return get_default_field_value(field, value) - - -def instance_server_tag(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_use_legacy_check_version(field, value): +def instance_use_legacy_check_version(): return False - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/aspdotnet/datadog_checks/aspdotnet/config_models/instance.py b/aspdotnet/datadog_checks/aspdotnet/config_models/instance.py index 6f8a26fe45109..5edb57d89d89e 100644 --- a/aspdotnet/datadog_checks/aspdotnet/config_models/instance.py +++ b/aspdotnet/datadog_checks/aspdotnet/config_models/instance.py @@ -9,9 +9,10 @@ from __future__ import annotations -from typing import Literal, Mapping, Optional, Sequence, Union +from typing import Mapping, Optional, Sequence, Union -from pydantic import BaseModel, Extra, Field, root_validator, validator +from pydantic import BaseModel, ConfigDict, Field, 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 @@ -20,101 +21,110 @@ class Counter(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - aggregate: Optional[Union[bool, Literal['only']]] - average: Optional[bool] - metric_name: Optional[str] - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + extra='allow', + frozen=True, + ) + aggregate: Optional[Union[bool, Literal['only']]] = None + average: Optional[bool] = None + metric_name: Optional[str] = None + name: Optional[str] = None + type: Optional[str] = None class InstanceCounts(BaseModel): - class Config: - allow_mutation = False - - monitored: Optional[str] - total: Optional[str] - unique: Optional[str] + model_config = ConfigDict( + frozen=True, + ) + monitored: Optional[str] = None + total: Optional[str] = None + unique: Optional[str] = None class ExtraMetrics(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + frozen=True, + ) counters: Sequence[Mapping[str, Union[str, Counter]]] - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] - instance_counts: Optional[InstanceCounts] + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None + instance_counts: Optional[InstanceCounts] = None name: str - tag_name: Optional[str] - use_localized_counters: Optional[bool] + tag_name: Optional[str] = None + use_localized_counters: Optional[bool] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metrics(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + frozen=True, + ) counters: Sequence[Mapping[str, Union[str, Counter]]] - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] - instance_counts: Optional[InstanceCounts] + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None + instance_counts: Optional[InstanceCounts] = None name: str - tag_name: Optional[str] - use_localized_counters: Optional[bool] + tag_name: Optional[str] = None + use_localized_counters: Optional[bool] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - additional_metrics: Optional[Sequence[Sequence[str]]] - counter_data_types: Optional[Sequence[str]] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - enable_health_service_check: Optional[bool] - extra_metrics: Optional[Mapping[str, ExtraMetrics]] - host: Optional[str] - metric_patterns: Optional[MetricPatterns] - metrics: Optional[Mapping[str, Metrics]] - min_collection_interval: Optional[float] - namespace: Optional[str] = Field(None, regex='\\w*') - password: Optional[str] - server: Optional[str] - server_tag: Optional[str] - service: Optional[str] - tags: Optional[Sequence[str]] - use_legacy_check_version: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + additional_metrics: Optional[Sequence[Sequence[str]]] = None + counter_data_types: Optional[Sequence[str]] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + enable_health_service_check: Optional[bool] = None + extra_metrics: Optional[Mapping[str, ExtraMetrics]] = None + host: Optional[str] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[Mapping[str, Metrics]] = None + min_collection_interval: Optional[float] = None + namespace: Optional[str] = Field(None, pattern='\\w*') + password: Optional[str] = None + server: Optional[str] = None + server_tag: Optional[str] = None + service: Optional[str] = None + tags: Optional[Sequence[str]] = None + use_legacy_check_version: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/aspdotnet/datadog_checks/aspdotnet/config_models/shared.py b/aspdotnet/datadog_checks/aspdotnet/config_models/shared.py index eefbab173ede1..aa58639466c05 100644 --- a/aspdotnet/datadog_checks/aspdotnet/config_models/shared.py +++ b/aspdotnet/datadog_checks/aspdotnet/config_models/shared.py @@ -11,7 +11,7 @@ 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 @@ -20,30 +20,39 @@ class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - service: Optional[str] - use_localized_counters: Optional[bool] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None + use_localized_counters: Optional[bool] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/avi_vantage/datadog_checks/avi_vantage/check.py b/avi_vantage/datadog_checks/avi_vantage/check.py index 20c21776192a9..bcfc0ac15dbe5 100644 --- a/avi_vantage/datadog_checks/avi_vantage/check.py +++ b/avi_vantage/datadog_checks/avi_vantage/check.py @@ -51,7 +51,8 @@ def configure_scrapers(self): instance_copy['metrics'] = [resource_metrics] instance_copy['rename_labels'] = LABELS_REMAPPER.copy() instance_copy['rename_labels']['name'] = entity + "_name" - instance_copy['rename_labels'].update(self.config.rename_labels) + if self.config.rename_labels is not None: + instance_copy['rename_labels'].update(self.config.rename_labels) scrapers[endpoint] = self.create_scraper(instance_copy) diff --git a/avi_vantage/datadog_checks/avi_vantage/config_models/defaults.py b/avi_vantage/datadog_checks/avi_vantage/config_models/defaults.py index 8d631c6508583..f0567c64398e0 100644 --- a/avi_vantage/datadog_checks/avi_vantage/config_models/defaults.py +++ b/avi_vantage/datadog_checks/avi_vantage/config_models/defaults.py @@ -7,292 +7,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 False -def instance_enable_health_service_check(field, value): +def instance_enable_health_service_check(): return True -def instance_entities(field, value): +def instance_entities(): return ['controller', 'pool', 'serviceengine', 'virtualservice'] -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/avi_vantage/datadog_checks/avi_vantage/config_models/instance.py b/avi_vantage/datadog_checks/avi_vantage/config_models/instance.py index 1505a9318d9d6..169cf0053f348 100644 --- a/avi_vantage/datadog_checks/avi_vantage/config_models/instance.py +++ b/avi_vantage/datadog_checks/avi_vantage/config_models/instance.py @@ -9,9 +9,10 @@ from __future__ import annotations -from typing import Any, Literal, Mapping, Optional, Sequence, Union +from typing import Any, Mapping, Optional, Sequence, Union -from pydantic import BaseModel, Extra, Field, root_validator, validator +from pydantic import BaseModel, ConfigDict, Field, 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 @@ -20,148 +21,157 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + labels: Optional[Sequence[str]] = None + match: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - allow_redirects: Optional[bool] - auth_token: Optional[AuthToken] - auth_type: Optional[str] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + allow_redirects: Optional[bool] = None + auth_token: Optional[AuthToken] = None + auth_type: Optional[str] = None avi_controller_url: 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] - entities: Optional[Sequence[Literal['controller', 'pool', 'serviceengine', 'virtualservice']]] - 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) + 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 + entities: Optional[Sequence[Literal['controller', 'pool', 'serviceengine', 'virtualservice']]] = None + exclude_labels: Optional[Sequence[str]] = None + exclude_metrics: Optional[Sequence[str]] = None + exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] = None + extra_headers: Optional[Mapping[str, Any]] = None + extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] = None + headers: Optional[Mapping[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[Sequence[str]] = None + include_labels: Optional[Sequence[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[Sequence[Union[str, Mapping[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[Sequence[str]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[Mapping[str, Any]] = None + request_size: Optional[float] = None + service: Optional[str] = None + share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/avi_vantage/datadog_checks/avi_vantage/config_models/shared.py b/avi_vantage/datadog_checks/avi_vantage/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/avi_vantage/datadog_checks/avi_vantage/config_models/shared.py +++ b/avi_vantage/datadog_checks/avi_vantage/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/avi_vantage/tests/test_config_validation.py b/avi_vantage/tests/test_config_validation.py index 85814603d1dbf..a56b2719bfe60 100644 --- a/avi_vantage/tests/test_config_validation.py +++ b/avi_vantage/tests/test_config_validation.py @@ -17,5 +17,11 @@ def test_missing_url(dd_run_check): def test_bad_entity(dd_run_check): instance = {"avi_controller_url": "foo", "entities": ["foo"]} check = AviVantageCheck('avi_vantage', {}, [instance]) - with pytest.raises(Exception, match=r'unexpected value; permitted'): + with pytest.raises( + Exception, + match=( + "InstanceConfig`:\nentities -> 1\n" + " Input should be 'controller', 'pool', 'serviceengine' or 'virtualservice'" + ), + ): dd_run_check(check) diff --git a/azure_iot_edge/datadog_checks/azure_iot_edge/config_models/defaults.py b/azure_iot_edge/datadog_checks/azure_iot_edge/config_models/defaults.py index 50cf5270cee24..6cc07ac1c3a3e 100644 --- a/azure_iot_edge/datadog_checks/azure_iot_edge/config_models/defaults.py +++ b/azure_iot_edge/datadog_checks/azure_iot_edge/config_models/defaults.py @@ -7,276 +7,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_prometheus_url(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/azure_iot_edge/datadog_checks/azure_iot_edge/config_models/instance.py b/azure_iot_edge/datadog_checks/azure_iot_edge/config_models/instance.py index 0e063890c9246..af5e150f95913 100644 --- a/azure_iot_edge/datadog_checks/azure_iot_edge/config_models/instance.py +++ b/azure_iot_edge/datadog_checks/azure_iot_edge/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,142 +20,151 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[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( + frozen=True, + ) + target_label_key: Optional[str] = None + target_label_value_list: Optional[Sequence[str]] = None class TargetMetric(BaseModel): - class Config: - allow_mutation = False - - label_to_match: Optional[str] - labels_to_get: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + label_to_match: Optional[str] = None + labels_to_get: Optional[Sequence[str]] = None class LabelJoins(BaseModel): - class Config: - allow_mutation = False - - target_metric: Optional[TargetMetric] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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] + model_config = ConfigDict( + validate_default=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 edge_agent_prometheus_url: str edge_hub_prometheus_url: str - empty_default_hostname: Optional[bool] - exclude_labels: Optional[Sequence[str]] - extra_headers: Optional[Mapping[str, Any]] - 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] - prometheus_url: Optional[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) + empty_default_hostname: Optional[bool] = None + exclude_labels: Optional[Sequence[str]] = None + extra_headers: Optional[Mapping[str, Any]] = None + headers: Optional[Mapping[str, Any]] = None + health_service_check: Optional[bool] = None + ignore_metrics: Optional[Sequence[str]] = None + ignore_metrics_by_labels: Optional[IgnoreMetricsByLabels] = None + ignore_tags: Optional[Sequence[str]] = None + include_labels: Optional[Sequence[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[Mapping[str, Any]] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[Sequence[Union[str, Mapping[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: Optional[str] = None + 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[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + type_overrides: Optional[Mapping[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/azure_iot_edge/datadog_checks/azure_iot_edge/config_models/shared.py b/azure_iot_edge/datadog_checks/azure_iot_edge/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/azure_iot_edge/datadog_checks/azure_iot_edge/config_models/shared.py +++ b/azure_iot_edge/datadog_checks/azure_iot_edge/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/boundary/datadog_checks/boundary/config_models/defaults.py b/boundary/datadog_checks/boundary/config_models/defaults.py index a76129227677c..2a49e1453f118 100644 --- a/boundary/datadog_checks/boundary/config_models/defaults.py +++ b/boundary/datadog_checks/boundary/config_models/defaults.py @@ -7,284 +7,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/boundary/datadog_checks/boundary/config_models/instance.py b/boundary/datadog_checks/boundary/config_models/instance.py index 3b69c898cf75b..28affe260574c 100644 --- a/boundary/datadog_checks/boundary/config_models/instance.py +++ b/boundary/datadog_checks/boundary/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,147 +20,156 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + labels: Optional[Sequence[str]] = None + match: Optional[Sequence[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]] + model_config = ConfigDict( + validate_default=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[Sequence[str]] = None + exclude_metrics: Optional[Sequence[str]] = None + exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] = None + extra_headers: Optional[Mapping[str, Any]] = None + extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] = None + headers: Optional[Mapping[str, Any]] = None health_endpoint: str - 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] + 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[Sequence[str]] = None + include_labels: Optional[Sequence[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[Sequence[Union[str, Mapping[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[Sequence[str]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[Mapping[str, Any]] = None + request_size: Optional[float] = None + service: Optional[str] = None + share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/boundary/datadog_checks/boundary/config_models/shared.py b/boundary/datadog_checks/boundary/config_models/shared.py index fd4cb4cdf9bd6..cddf15255ec30 100644 --- a/boundary/datadog_checks/boundary/config_models/shared.py +++ b/boundary/datadog_checks/boundary/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/btrfs/datadog_checks/btrfs/config_models/defaults.py b/btrfs/datadog_checks/btrfs/config_models/defaults.py index 34cec6ef3597d..a4a110493a7fe 100644 --- a/btrfs/datadog_checks/btrfs/config_models/defaults.py +++ b/btrfs/datadog_checks/btrfs/config_models/defaults.py @@ -7,36 +7,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_excluded_devices(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_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/btrfs/datadog_checks/btrfs/config_models/instance.py b/btrfs/datadog_checks/btrfs/config_models/instance.py index 27358adca193e..253e53bd4960e 100644 --- a/btrfs/datadog_checks/btrfs/config_models/instance.py +++ b/btrfs/datadog_checks/btrfs/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,43 +20,52 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - excluded_devices: Optional[Sequence[str]] - 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, + frozen=True, + ) + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + excluded_devices: Optional[Sequence[str]] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + service: Optional[str] = None + tags: Optional[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/btrfs/datadog_checks/btrfs/config_models/shared.py b/btrfs/datadog_checks/btrfs/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/btrfs/datadog_checks/btrfs/config_models/shared.py +++ b/btrfs/datadog_checks/btrfs/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/cacti/datadog_checks/cacti/config_models/defaults.py b/cacti/datadog_checks/cacti/config_models/defaults.py index 2fcf5fe2be4a2..a32c0490085ed 100644 --- a/cacti/datadog_checks/cacti/config_models/defaults.py +++ b/cacti/datadog_checks/cacti/config_models/defaults.py @@ -7,52 +7,22 @@ # 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_field_names(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_mysql_db(field, value): +def instance_mysql_db(): return 'cacti' -def instance_mysql_password(field, value): - return get_default_field_value(field, value) - - -def instance_mysql_port(field, value): +def instance_mysql_port(): return 3306 - - -def instance_rrd_whitelist(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) diff --git a/cacti/datadog_checks/cacti/config_models/instance.py b/cacti/datadog_checks/cacti/config_models/instance.py index bf2ff38c979fb..7bdfddfe9a367 100644 --- a/cacti/datadog_checks/cacti/config_models/instance.py +++ b/cacti/datadog_checks/cacti/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,50 +20,59 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - field_names: Optional[Sequence[str]] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - mysql_db: Optional[str] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + field_names: Optional[Sequence[str]] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + mysql_db: Optional[str] = None mysql_host: str - mysql_password: Optional[str] - mysql_port: Optional[int] + mysql_password: Optional[str] = None + mysql_port: Optional[int] = None mysql_user: str rrd_path: str - rrd_whitelist: Optional[str] - service: Optional[str] - tags: Optional[Sequence[str]] + rrd_whitelist: Optional[str] = None + service: Optional[str] = None + tags: Optional[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/cacti/datadog_checks/cacti/config_models/shared.py b/cacti/datadog_checks/cacti/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/cacti/datadog_checks/cacti/config_models/shared.py +++ b/cacti/datadog_checks/cacti/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/calico/datadog_checks/calico/config_models/defaults.py b/calico/datadog_checks/calico/config_models/defaults.py index a76129227677c..2a49e1453f118 100644 --- a/calico/datadog_checks/calico/config_models/defaults.py +++ b/calico/datadog_checks/calico/config_models/defaults.py @@ -7,284 +7,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/calico/datadog_checks/calico/config_models/instance.py b/calico/datadog_checks/calico/config_models/instance.py index fb94969585fdc..6634ff2831f5b 100644 --- a/calico/datadog_checks/calico/config_models/instance.py +++ b/calico/datadog_checks/calico/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,146 +20,155 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + labels: Optional[Sequence[str]] = None + match: Optional[Sequence[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, + 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[Sequence[str]] = None + exclude_metrics: Optional[Sequence[str]] = None + exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] = None + extra_headers: Optional[Mapping[str, Any]] = None + extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] = None + headers: Optional[Mapping[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[Sequence[str]] = None + include_labels: Optional[Sequence[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[Sequence[Union[str, Mapping[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[Sequence[str]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[Mapping[str, Any]] = None + request_size: Optional[float] = None + service: Optional[str] = None + share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/calico/datadog_checks/calico/config_models/shared.py b/calico/datadog_checks/calico/config_models/shared.py index fd4cb4cdf9bd6..cddf15255ec30 100644 --- a/calico/datadog_checks/calico/config_models/shared.py +++ b/calico/datadog_checks/calico/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/cassandra/datadog_checks/cassandra/config_models/defaults.py b/cassandra/datadog_checks/cassandra/config_models/defaults.py index 91f55843f388b..07982a605ce4a 100644 --- a/cassandra/datadog_checks/cassandra/config_models/defaults.py +++ b/cassandra/datadog_checks/cassandra/config_models/defaults.py @@ -7,108 +7,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 True -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/cassandra/datadog_checks/cassandra/config_models/instance.py b/cassandra/datadog_checks/cassandra/config_models/instance.py index a5d173e6c4a8b..34493d8397a25 100644 --- a/cassandra/datadog_checks/cassandra/config_models/instance.py +++ b/cassandra/datadog_checks/cassandra/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,52 +20,61 @@ class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) cassandra_aliasing: bool - collect_default_jvm_metrics: Optional[bool] - empty_default_hostname: Optional[bool] + 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[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/cassandra/datadog_checks/cassandra/config_models/shared.py b/cassandra/datadog_checks/cassandra/config_models/shared.py index 1c722ceac49bc..0db55a6d064d5 100644 --- a/cassandra/datadog_checks/cassandra/config_models/shared.py +++ b/cassandra/datadog_checks/cassandra/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,34 +20,43 @@ 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, + frozen=True, + ) + collect_default_metrics: Optional[bool] = None + conf: Optional[Sequence[Mapping[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/cassandra_nodetool/datadog_checks/cassandra_nodetool/config_models/defaults.py b/cassandra_nodetool/datadog_checks/cassandra_nodetool/config_models/defaults.py index 0687abcfb7553..e8413b8115380 100644 --- a/cassandra_nodetool/datadog_checks/cassandra_nodetool/config_models/defaults.py +++ b/cassandra_nodetool/datadog_checks/cassandra_nodetool/config_models/defaults.py @@ -7,60 +7,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_nodetool(field, value): +def shared_nodetool(): return '/usr/bin/nodetool' -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_host(field, value): +def instance_host(): return 'localhost' -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_nodetool(field, value): - return get_default_field_value(field, value) - - -def instance_password(field, value): - return get_default_field_value(field, value) - - -def instance_port(field, value): +def instance_port(): return 7199 -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_ssl(field, value): +def instance_ssl(): return False - - -def instance_tags(field, value): - return get_default_field_value(field, value) - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/cassandra_nodetool/datadog_checks/cassandra_nodetool/config_models/instance.py b/cassandra_nodetool/datadog_checks/cassandra_nodetool/config_models/instance.py index 3c4d54bd7a48a..7e9851a742871 100644 --- a/cassandra_nodetool/datadog_checks/cassandra_nodetool/config_models/instance.py +++ b/cassandra_nodetool/datadog_checks/cassandra_nodetool/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,49 +20,58 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - host: Optional[str] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + host: Optional[str] = None keyspaces: Sequence[str] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - nodetool: Optional[str] - password: Optional[str] - port: Optional[int] - service: Optional[str] - ssl: Optional[bool] - tags: Optional[Sequence[str]] - username: Optional[str] - - @root_validator(pre=True) + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + nodetool: Optional[str] = None + password: Optional[str] = None + port: Optional[int] = None + service: Optional[str] = None + ssl: Optional[bool] = None + tags: Optional[Sequence[str]] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/cassandra_nodetool/datadog_checks/cassandra_nodetool/config_models/shared.py b/cassandra_nodetool/datadog_checks/cassandra_nodetool/config_models/shared.py index bba3416218254..a6f2ff57ef3fd 100644 --- a/cassandra_nodetool/datadog_checks/cassandra_nodetool/config_models/shared.py +++ b/cassandra_nodetool/datadog_checks/cassandra_nodetool/config_models/shared.py @@ -11,7 +11,7 @@ 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 @@ -20,30 +20,39 @@ class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - nodetool: Optional[str] - service: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + nodetool: Optional[str] = None + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/ceph/datadog_checks/ceph/config_models/defaults.py b/ceph/datadog_checks/ceph/config_models/defaults.py index 1be466352736d..f7331ce176048 100644 --- a/ceph/datadog_checks/ceph/config_models/defaults.py +++ b/ceph/datadog_checks/ceph/config_models/defaults.py @@ -7,48 +7,26 @@ # 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_ceph_cluster(field, value): +def instance_ceph_cluster(): return 'ceph' -def instance_ceph_cmd(field, value): +def instance_ceph_cmd(): return '/usr/bin/ceph' -def instance_collect_service_check_for(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) - - -def instance_use_sudo(field, value): +def instance_use_sudo(): return False diff --git a/ceph/datadog_checks/ceph/config_models/instance.py b/ceph/datadog_checks/ceph/config_models/instance.py index 35bb406a754bb..6c49bcf3352d7 100644 --- a/ceph/datadog_checks/ceph/config_models/instance.py +++ b/ceph/datadog_checks/ceph/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,46 +20,55 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - ceph_cluster: Optional[str] - ceph_cmd: Optional[str] - collect_service_check_for: Optional[Sequence[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]] - use_sudo: Optional[bool] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + ceph_cluster: Optional[str] = None + ceph_cmd: Optional[str] = None + collect_service_check_for: Optional[Sequence[str]] = None + 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[Sequence[str]] = None + use_sudo: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/ceph/datadog_checks/ceph/config_models/shared.py b/ceph/datadog_checks/ceph/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/ceph/datadog_checks/ceph/config_models/shared.py +++ b/ceph/datadog_checks/ceph/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/cilium/datadog_checks/cilium/config_models/defaults.py b/cilium/datadog_checks/cilium/config_models/defaults.py index 6715c9ac8c612..4cf4dab11267b 100644 --- a/cilium/datadog_checks/cilium/config_models/defaults.py +++ b/cilium/datadog_checks/cilium/config_models/defaults.py @@ -7,372 +7,162 @@ # 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_agent_endpoint(field, value): - return get_default_field_value(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_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_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_health_service_check(field, value): +def instance_health_service_check(): return True -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_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): - 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_operator_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_prometheus_metrics_prefix(field, value): - return get_default_field_value(field, value) - - -def instance_prometheus_url(field, value): - return get_default_field_value(field, value) - - -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_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_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_type_overrides(field, value): - return get_default_field_value(field, value) - - -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_openmetrics(field, value): +def instance_use_openmetrics(): return False -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/cilium/datadog_checks/cilium/config_models/instance.py b/cilium/datadog_checks/cilium/config_models/instance.py index 785133a51583e..7dcfb6fb814a1 100644 --- a/cilium/datadog_checks/cilium/config_models/instance.py +++ b/cilium/datadog_checks/cilium/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,190 +20,199 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + extra='allow', + frozen=True, + ) + name: Optional[str] = None + type: Optional[str] = None class IgnoreMetricsByLabels(BaseModel): - class Config: - allow_mutation = False - - target_label_key: Optional[str] - target_label_value_list: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + target_label_key: Optional[str] = None + target_label_value_list: Optional[Sequence[str]] = None class TargetMetric(BaseModel): - class Config: - allow_mutation = False - - label_to_match: Optional[str] - labels_to_get: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + label_to_match: Optional[str] = None + labels_to_get: Optional[Sequence[str]] = None class LabelJoins(BaseModel): - class Config: - allow_mutation = False - - target_metric: Optional[TargetMetric] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + labels: Optional[Sequence[str]] = None + match: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - agent_endpoint: Optional[str] - 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] - 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]] - health_service_check: Optional[bool] - histogram_buckets_as_distributions: Optional[bool] - hostname_format: Optional[str] - hostname_label: Optional[str] - ignore_connection_errors: 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, 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] - operator_endpoint: Optional[str] - password: Optional[str] - persist_connections: Optional[bool] - prometheus_metrics_prefix: Optional[str] - prometheus_url: Optional[str] - 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] - 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] - 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] - type_overrides: Optional[Mapping[str, Any]] - use_latest_spec: Optional[bool] - use_legacy_auth_encoding: Optional[bool] - use_openmetrics: Optional[bool] - use_process_start_time: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + agent_endpoint: Optional[str] = None + 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 + 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[Sequence[str]] = None + exclude_metrics: Optional[Sequence[str]] = None + exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] = None + extra_headers: Optional[Mapping[str, Any]] = None + extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] = None + headers: Optional[Mapping[str, Any]] = None + health_service_check: Optional[bool] = 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_metrics: Optional[Sequence[str]] = None + ignore_metrics_by_labels: Optional[IgnoreMetricsByLabels] = None + ignore_tags: Optional[Sequence[str]] = None + include_labels: Optional[Sequence[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[Mapping[str, Any]] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[Sequence[Union[str, Mapping[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 + operator_endpoint: Optional[str] = None + password: Optional[str] = None + persist_connections: Optional[bool] = None + prometheus_metrics_prefix: Optional[str] = None + prometheus_url: Optional[str] = None + proxy: Optional[Proxy] = None + raw_line_filters: Optional[Sequence[str]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[Mapping[str, Any]] = 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 + share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + type_overrides: Optional[Mapping[str, Any]] = None + use_latest_spec: Optional[bool] = None + use_legacy_auth_encoding: Optional[bool] = None + use_openmetrics: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/cilium/datadog_checks/cilium/config_models/shared.py b/cilium/datadog_checks/cilium/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/cilium/datadog_checks/cilium/config_models/shared.py +++ b/cilium/datadog_checks/cilium/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/cisco_aci/datadog_checks/cisco_aci/config_models/defaults.py b/cisco_aci/datadog_checks/cisco_aci/config_models/defaults.py index 0eb3e40421c56..e60aec5388c04 100644 --- a/cisco_aci/datadog_checks/cisco_aci/config_models/defaults.py +++ b/cisco_aci/datadog_checks/cisco_aci/config_models/defaults.py @@ -7,212 +7,86 @@ # 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_aci_url(field, value): +def instance_aci_url(): return 'http://localhost' -def instance_aci_urls(field, value): - return get_default_field_value(field, value) - - -def instance_allow_redirects(field, value): +def instance_allow_redirects(): return True -def instance_appcenter(field, value): +def instance_appcenter(): return False -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_cert_key(field, value): - return get_default_field_value(field, value) - - -def instance_cert_key_password(field, value): - return get_default_field_value(field, value) - - -def instance_cert_key_path(field, value): - return get_default_field_value(field, value) - - -def instance_cert_name(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 False -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 False -def instance_proxy(field, value): - return get_default_field_value(field, value) - - -def instance_pwd(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_skip_proxy(field, value): +def instance_skip_proxy(): return False -def instance_tags(field, value): - return get_default_field_value(field, value) - - -def instance_tenant(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 diff --git a/cisco_aci/datadog_checks/cisco_aci/config_models/instance.py b/cisco_aci/datadog_checks/cisco_aci/config_models/instance.py index dac3155ea9449..6c110da08aaf2 100644 --- a/cisco_aci/datadog_checks/cisco_aci/config_models/instance.py +++ b/cisco_aci/datadog_checks/cisco_aci/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,102 +20,111 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - aci_url: Optional[str] - aci_urls: Optional[Sequence[str]] - allow_redirects: Optional[bool] - appcenter: Optional[bool] - auth_token: Optional[AuthToken] - auth_type: Optional[str] - aws_host: Optional[str] - aws_region: Optional[str] - aws_service: Optional[str] - cert_key: Optional[str] - cert_key_password: Optional[str] - cert_key_path: Optional[str] - cert_name: 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] - pwd: Optional[str] - read_timeout: Optional[float] - request_size: Optional[float] - service: Optional[str] - skip_proxy: Optional[bool] - tags: Optional[Sequence[str]] - tenant: 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] - use_legacy_auth_encoding: Optional[bool] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + aci_url: Optional[str] = None + aci_urls: Optional[Sequence[str]] = None + allow_redirects: Optional[bool] = None + appcenter: 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 + cert_key: Optional[str] = None + cert_key_password: Optional[str] = None + cert_key_path: Optional[str] = None + cert_name: Optional[str] = None + connect_timeout: Optional[float] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + extra_headers: Optional[Mapping[str, Any]] = None + headers: Optional[Mapping[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: Optional[str] = None + read_timeout: Optional[float] = None + request_size: Optional[float] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[str]] = None + tenant: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + use_legacy_auth_encoding: Optional[bool] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/cisco_aci/datadog_checks/cisco_aci/config_models/shared.py b/cisco_aci/datadog_checks/cisco_aci/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/cisco_aci/datadog_checks/cisco_aci/config_models/shared.py +++ b/cisco_aci/datadog_checks/cisco_aci/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/citrix_hypervisor/datadog_checks/citrix_hypervisor/config_models/defaults.py b/citrix_hypervisor/datadog_checks/citrix_hypervisor/config_models/defaults.py index 0a32cc4dc3c7a..81b466607723e 100644 --- a/citrix_hypervisor/datadog_checks/citrix_hypervisor/config_models/defaults.py +++ b/citrix_hypervisor/datadog_checks/citrix_hypervisor/config_models/defaults.py @@ -7,180 +7,78 @@ # 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 False -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 False -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_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/citrix_hypervisor/datadog_checks/citrix_hypervisor/config_models/instance.py b/citrix_hypervisor/datadog_checks/citrix_hypervisor/config_models/instance.py index 22d2339b17335..b0c9dd6112c5c 100644 --- a/citrix_hypervisor/datadog_checks/citrix_hypervisor/config_models/instance.py +++ b/citrix_hypervisor/datadog_checks/citrix_hypervisor/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,94 +20,103 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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] - read_timeout: Optional[float] - request_size: Optional[float] - 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] + model_config = ConfigDict( + validate_default=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[Mapping[str, Any]] = None + headers: Optional[Mapping[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 + read_timeout: Optional[float] = None + request_size: Optional[float] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None url: str - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] + use_legacy_auth_encoding: Optional[bool] = None + username: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/citrix_hypervisor/datadog_checks/citrix_hypervisor/config_models/shared.py b/citrix_hypervisor/datadog_checks/citrix_hypervisor/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/citrix_hypervisor/datadog_checks/citrix_hypervisor/config_models/shared.py +++ b/citrix_hypervisor/datadog_checks/citrix_hypervisor/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/clickhouse/datadog_checks/clickhouse/config_models/defaults.py b/clickhouse/datadog_checks/clickhouse/config_models/defaults.py index a519894f54459..a5d5bee5638dd 100644 --- a/clickhouse/datadog_checks/clickhouse/config_models/defaults.py +++ b/clickhouse/datadog_checks/clickhouse/config_models/defaults.py @@ -7,80 +7,46 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_global_custom_queries(field, value): - return get_default_field_value(field, value) - - -def shared_service(field, value): - return get_default_field_value(field, value) - - -def instance_compression(field, value): - return get_default_field_value(field, value) - - -def instance_connect_timeout(field, value): +def instance_connect_timeout(): return 10 -def instance_custom_queries(field, value): - return get_default_field_value(field, value) - - -def instance_db(field, value): +def instance_db(): return 'default' -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_only_custom_queries(field, value): +def instance_only_custom_queries(): return False -def instance_password(field, value): - return get_default_field_value(field, value) - - -def instance_port(field, value): +def instance_port(): return 9000 -def instance_read_timeout(field, value): +def instance_read_timeout(): return 10 -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_tls_verify(field, value): +def instance_tls_verify(): return False -def instance_use_global_custom_queries(field, value): +def instance_use_global_custom_queries(): return 'true' -def instance_username(field, value): +def instance_username(): return 'default' diff --git a/clickhouse/datadog_checks/clickhouse/config_models/instance.py b/clickhouse/datadog_checks/clickhouse/config_models/instance.py index 4cb85da01d8a4..e066ef860ac59 100644 --- a/clickhouse/datadog_checks/clickhouse/config_models/instance.py +++ b/clickhouse/datadog_checks/clickhouse/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,63 +20,72 @@ class CustomQuery(BaseModel): - class Config: - allow_mutation = False - - columns: Optional[Sequence[Mapping[str, Any]]] - query: Optional[str] - tags: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + columns: Optional[Sequence[Mapping[str, Any]]] = None + query: Optional[str] = None + tags: Optional[Sequence[str]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - compression: Optional[str] - connect_timeout: Optional[int] - custom_queries: Optional[Sequence[CustomQuery]] - db: Optional[str] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - only_custom_queries: Optional[bool] - password: Optional[str] - port: Optional[int] - read_timeout: Optional[int] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + compression: Optional[str] = None + connect_timeout: Optional[int] = None + custom_queries: Optional[Sequence[CustomQuery]] = None + db: Optional[str] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + only_custom_queries: Optional[bool] = None + password: Optional[str] = None + port: Optional[int] = None + read_timeout: Optional[int] = None server: str - service: Optional[str] - tags: Optional[Sequence[str]] - tls_verify: Optional[bool] - use_global_custom_queries: Optional[str] - username: Optional[str] + service: Optional[str] = None + tags: Optional[Sequence[str]] = None + tls_verify: Optional[bool] = None + use_global_custom_queries: Optional[str] = None + username: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/clickhouse/datadog_checks/clickhouse/config_models/shared.py b/clickhouse/datadog_checks/clickhouse/config_models/shared.py index 5e538415ce396..45d1293f12b20 100644 --- a/clickhouse/datadog_checks/clickhouse/config_models/shared.py +++ b/clickhouse/datadog_checks/clickhouse/config_models/shared.py @@ -11,39 +11,39 @@ from typing import Any, Mapping, Optional, Sequence -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 - - global_custom_queries: Optional[Sequence[Mapping[str, Any]]] - service: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + global_custom_queries: Optional[Sequence[Mapping[str, Any]]] = None + 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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/cloud_foundry_api/datadog_checks/cloud_foundry_api/config_models/defaults.py b/cloud_foundry_api/datadog_checks/cloud_foundry_api/config_models/defaults.py index 00c9c438fbf1c..785596c8c0afe 100644 --- a/cloud_foundry_api/datadog_checks/cloud_foundry_api/config_models/defaults.py +++ b/cloud_foundry_api/datadog_checks/cloud_foundry_api/config_models/defaults.py @@ -7,188 +7,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 False -def instance_event_filter(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_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 False -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_results_per_page(field, value): +def instance_results_per_page(): return 100 -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_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/cloud_foundry_api/datadog_checks/cloud_foundry_api/config_models/instance.py b/cloud_foundry_api/datadog_checks/cloud_foundry_api/config_models/instance.py index dd3ebf012e8e1..faf0fd7100fcb 100644 --- a/cloud_foundry_api/datadog_checks/cloud_foundry_api/config_models/instance.py +++ b/cloud_foundry_api/datadog_checks/cloud_foundry_api/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -from pydantic import BaseModel, 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 @@ -20,98 +20,107 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - allow_redirects: Optional[bool] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + allow_redirects: Optional[bool] = None api_url: str - auth_token: Optional[AuthToken] - auth_type: Optional[str] - aws_host: Optional[str] - aws_region: Optional[str] - aws_service: Optional[str] + 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 client_id: str client_secret: str - connect_timeout: Optional[float] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - event_filter: Optional[Sequence[str]] - 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] - read_timeout: Optional[float] - request_size: Optional[float] + connect_timeout: Optional[float] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + event_filter: Optional[Sequence[str]] = None + extra_headers: Optional[Mapping[str, Any]] = None + headers: Optional[Mapping[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 + read_timeout: Optional[float] = None + request_size: Optional[float] = None results_per_page: Optional[int] = Field(None, le=5000) - 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] - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + service: Optional[str] = None + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + use_legacy_auth_encoding: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/cloud_foundry_api/datadog_checks/cloud_foundry_api/config_models/shared.py b/cloud_foundry_api/datadog_checks/cloud_foundry_api/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/cloud_foundry_api/datadog_checks/cloud_foundry_api/config_models/shared.py +++ b/cloud_foundry_api/datadog_checks/cloud_foundry_api/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/cloudera/datadog_checks/cloudera/api/api_v7.py b/cloudera/datadog_checks/cloudera/api/api_v7.py index 25e4f10df934f..f9068a004d419 100644 --- a/cloudera/datadog_checks/cloudera/api/api_v7.py +++ b/cloudera/datadog_checks/cloudera/api/api_v7.py @@ -94,7 +94,8 @@ def _collect_cluster_tags(self, cluster): cluster_tags.extend( [f"{cluster_tag['name']}:{cluster_tag['value']}" for cluster_tag in cluster.get('tags', [])] ) - cluster_tags.extend(self._check.config.tags) + if self._check.config.tags is not None: + cluster_tags.extend(self._check.config.tags) return cluster_tags def _collect_cluster_service_check(self, cluster, tags): @@ -151,7 +152,8 @@ def _collect_hosts(self, cluster_name, config): def _collect_host_tags(self, host): host_tags = [f"cloudera_hostname:{host['name']}", f"cloudera_rack_id:{host['rack_id']}"] host_tags.extend([f"{host_tag['name']}:{host_tag['value']}" for host_tag in host['tags'] or []]) - host_tags.extend(self._check.config.tags) + if self._check.config.tags is not None: + host_tags.extend(self._check.config.tags) return host_tags def _collect_host_service_check(self, host, tags): @@ -204,6 +206,9 @@ def _query_time_series(self, category, name, query, tags): self._check.gauge(metric, value, tags=[*item_tags]) def _collect_custom_queries(self): + if self._check.config.custom_queries is None: + return + for custom_query in self._check.config.custom_queries: try: tags = custom_query.tags if custom_query.tags else [] diff --git a/cloudera/datadog_checks/cloudera/check.py b/cloudera/datadog_checks/cloudera/check.py index 765fd46f3250a..511fc2b2a6c39 100644 --- a/cloudera/datadog_checks/cloudera/check.py +++ b/cloudera/datadog_checks/cloudera/check.py @@ -22,8 +22,10 @@ def __init__(self, name, init_config, instances): @AgentCheck.metadata_entrypoint def _create_client(self): self.can_connect_tags = [f'api_url:{self.config.api_url}'] - for tag in self.config.tags: - self.can_connect_tags.append(tag) + if self.config.tags is not None: + for tag in self.config.tags: + self.can_connect_tags.append(tag) + try: self.client = make_api(self) except Exception as e: diff --git a/cloudera/datadog_checks/cloudera/config_models/defaults.py b/cloudera/datadog_checks/cloudera/config_models/defaults.py index 3773f4f24b1aa..3d095e6edffe3 100644 --- a/cloudera/datadog_checks/cloudera/config_models/defaults.py +++ b/cloudera/datadog_checks/cloudera/config_models/defaults.py @@ -7,48 +7,22 @@ # 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_cloudera_client(field, value): +def instance_cloudera_client(): return 'cm_client' -def instance_clusters(field, value): - return get_default_field_value(field, value) - - -def instance_custom_queries(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_max_parallel_requests(field, value): +def instance_max_parallel_requests(): return 100 -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/cloudera/datadog_checks/cloudera/config_models/instance.py b/cloudera/datadog_checks/cloudera/config_models/instance.py index a8be12e006336..8e52c9a8c3499 100644 --- a/cloudera/datadog_checks/cloudera/config_models/instance.py +++ b/cloudera/datadog_checks/cloudera/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, Union -from pydantic import BaseModel, 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 @@ -20,9 +20,9 @@ class Clusters(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + frozen=True, + ) exclude: Optional[Sequence[str]] = Field( None, description='List of regular expressions with the patterns of clusters that will not be processed.\n' ) @@ -36,55 +36,64 @@ class Config: class CustomQuery(BaseModel): - class Config: - allow_mutation = False - - query: Optional[str] - tags: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + query: Optional[str] = None + tags: Optional[Sequence[str]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) api_url: str - cloudera_client: Optional[str] - clusters: Optional[Clusters] - custom_queries: Optional[Sequence[CustomQuery]] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - max_parallel_requests: Optional[int] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - service: Optional[str] - tags: Optional[Sequence[str]] - - @root_validator(pre=True) + cloudera_client: Optional[str] = None + clusters: Optional[Clusters] = None + custom_queries: Optional[Sequence[CustomQuery]] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + max_parallel_requests: Optional[int] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + service: Optional[str] = None + tags: Optional[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/cloudera/datadog_checks/cloudera/config_models/shared.py b/cloudera/datadog_checks/cloudera/config_models/shared.py index b9e9e55ad0e66..8739f906cef35 100644 --- a/cloudera/datadog_checks/cloudera/config_models/shared.py +++ b/cloudera/datadog_checks/cloudera/config_models/shared.py @@ -11,40 +11,40 @@ 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] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None workload_password: str workload_username: str - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/cloudera/tests/test_unit_autodiscover.py b/cloudera/tests/test_unit_autodiscover.py index ae557026e03fd..2482b7e6b7f23 100644 --- a/cloudera/tests/test_unit_autodiscover.py +++ b/cloudera/tests/test_unit_autodiscover.py @@ -3,6 +3,7 @@ # Licensed under a 3-clause BSD style license (see LICENSE) import random +import re import string from contextlib import nullcontext as does_not_raise @@ -25,7 +26,7 @@ [], pytest.raises( Exception, - match='Setting `include` must be an array', + match=re.escape('clusters -> include\n Input should be an instance of Sequence'), ), [ { @@ -43,7 +44,7 @@ [], pytest.raises( Exception, - match='Setting `include` must be an array', + match=re.escape('clusters -> include\n Input should be an instance of Sequence'), ), [ { @@ -61,7 +62,12 @@ [], pytest.raises( Exception, - match='`include` entries must be a map or a string', + match=re.escape( + 'clusters -> include -> 1 -> str\n' + ' Input should be a valid string\n' + 'clusters -> include -> 1 -> dict[str,any]\n' + ' Input should be a valid dictionary' + ), ), [ { @@ -79,7 +85,12 @@ [], pytest.raises( Exception, - match='`include` entries must be a map or a string', + match=re.escape( + 'clusters -> include -> 1 -> str\n' + ' Input should be a valid string\n' + 'clusters -> include -> 1 -> dict[str,any]\n' + ' Input should be a valid dictionary' + ), ), [ { diff --git a/cockroachdb/datadog_checks/cockroachdb/config_models/defaults.py b/cockroachdb/datadog_checks/cockroachdb/config_models/defaults.py index 8dbd804b4e7bd..dbb3bd9ebc44e 100644 --- a/cockroachdb/datadog_checks/cockroachdb/config_models/defaults.py +++ b/cockroachdb/datadog_checks/cockroachdb/config_models/defaults.py @@ -7,360 +7,162 @@ # 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_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_health_service_check(field, value): +def instance_health_service_check(): return True -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_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): - 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://localhost:8080/_status/vars' -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_prometheus_url(field, value): - return get_default_field_value(field, value) - - -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_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_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_type_overrides(field, value): - return get_default_field_value(field, value) - - -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/cockroachdb/datadog_checks/cockroachdb/config_models/instance.py b/cockroachdb/datadog_checks/cockroachdb/config_models/instance.py index bceeec6655b2e..e57304ed42cee 100644 --- a/cockroachdb/datadog_checks/cockroachdb/config_models/instance.py +++ b/cockroachdb/datadog_checks/cockroachdb/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,187 +20,196 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + extra='allow', + frozen=True, + ) + name: Optional[str] = None + type: Optional[str] = None class IgnoreMetricsByLabels(BaseModel): - class Config: - allow_mutation = False - - target_label_key: Optional[str] - target_label_value_list: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + target_label_key: Optional[str] = None + target_label_value_list: Optional[Sequence[str]] = None class TargetMetric(BaseModel): - class Config: - allow_mutation = False - - label_to_match: Optional[str] - labels_to_get: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + label_to_match: Optional[str] = None + labels_to_get: Optional[Sequence[str]] = None class LabelJoins(BaseModel): - class Config: - allow_mutation = False - - target_metric: Optional[TargetMetric] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + labels: Optional[Sequence[str]] = None + match: Optional[Sequence[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] - 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]] - health_service_check: Optional[bool] - histogram_buckets_as_distributions: Optional[bool] - hostname_format: Optional[str] - hostname_label: Optional[str] - ignore_connection_errors: 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, 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] - prometheus_metrics_prefix: Optional[str] - prometheus_url: Optional[str] - 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] - 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] - 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] - type_overrides: Optional[Mapping[str, Any]] - 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, + 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 + 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[Sequence[str]] = None + exclude_metrics: Optional[Sequence[str]] = None + exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] = None + extra_headers: Optional[Mapping[str, Any]] = None + extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] = None + headers: Optional[Mapping[str, Any]] = None + health_service_check: Optional[bool] = 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_metrics: Optional[Sequence[str]] = None + ignore_metrics_by_labels: Optional[IgnoreMetricsByLabels] = None + ignore_tags: Optional[Sequence[str]] = None + include_labels: Optional[Sequence[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[Mapping[str, Any]] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[Sequence[Union[str, Mapping[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 + prometheus_metrics_prefix: Optional[str] = None + prometheus_url: Optional[str] = None + proxy: Optional[Proxy] = None + raw_line_filters: Optional[Sequence[str]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[Mapping[str, Any]] = 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 + share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + type_overrides: Optional[Mapping[str, Any]] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/cockroachdb/datadog_checks/cockroachdb/config_models/shared.py b/cockroachdb/datadog_checks/cockroachdb/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/cockroachdb/datadog_checks/cockroachdb/config_models/shared.py +++ b/cockroachdb/datadog_checks/cockroachdb/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/confluent_platform/datadog_checks/confluent_platform/config_models/defaults.py b/confluent_platform/datadog_checks/confluent_platform/config_models/defaults.py index e5109d019a056..42c096be40fdd 100644 --- a/confluent_platform/datadog_checks/confluent_platform/config_models/defaults.py +++ b/confluent_platform/datadog_checks/confluent_platform/config_models/defaults.py @@ -7,104 +7,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 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/confluent_platform/datadog_checks/confluent_platform/config_models/instance.py b/confluent_platform/datadog_checks/confluent_platform/config_models/instance.py index bc4c01723f132..631a321dda3bb 100644 --- a/confluent_platform/datadog_checks/confluent_platform/config_models/instance.py +++ b/confluent_platform/datadog_checks/confluent_platform/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,51 +20,60 @@ 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, + 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[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/confluent_platform/datadog_checks/confluent_platform/config_models/shared.py b/confluent_platform/datadog_checks/confluent_platform/config_models/shared.py index 82b5cb56076f3..d4711fb6c2c0b 100644 --- a/confluent_platform/datadog_checks/confluent_platform/config_models/shared.py +++ b/confluent_platform/datadog_checks/confluent_platform/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,34 +20,43 @@ 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, + frozen=True, + ) + collect_default_metrics: Optional[bool] = None + conf: Optional[Sequence[Mapping[str, Any]]] = None is_jmx: bool - new_gc_metrics: Optional[bool] - service: Optional[str] + new_gc_metrics: Optional[bool] = None + service: Optional[str] = None service_check_prefix: str - @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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/consul/datadog_checks/consul/config_models/defaults.py b/consul/datadog_checks/consul/config_models/defaults.py index b227386e29e1c..95adbc588254c 100644 --- a/consul/datadog_checks/consul/config_models/defaults.py +++ b/consul/datadog_checks/consul/config_models/defaults.py @@ -7,228 +7,114 @@ # 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_acl_token(field, value): - return get_default_field_value(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_catalog_checks(field, value): +def instance_catalog_checks(): return False -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_disable_legacy_service_tag(field, value): +def instance_disable_legacy_service_tag(): return False -def instance_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return False -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_max_services(field, value): +def instance_max_services(): return 50 -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_network_latency_checks(field, value): +def instance_network_latency_checks(): return False -def instance_new_leader_checks(field, value): +def instance_new_leader_checks(): 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_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_self_leader_check(field, value): +def instance_self_leader_check(): return False -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_services_exclude(field, value): - return get_default_field_value(field, value) - - -def instance_services_include(field, value): - return get_default_field_value(field, value) - - -def instance_single_node_install(field, value): +def instance_single_node_install(): return False -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_threads_count(field, value): +def instance_threads_count(): return 1 -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_use_prometheus_endpoint(field, value): +def instance_use_prometheus_endpoint(): return False - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/consul/datadog_checks/consul/config_models/instance.py b/consul/datadog_checks/consul/config_models/instance.py index 1ca486c45189a..075af1db48b8e 100644 --- a/consul/datadog_checks/consul/config_models/instance.py +++ b/consul/datadog_checks/consul/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,106 +20,115 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - acl_token: Optional[str] - allow_redirects: Optional[bool] - auth_token: Optional[AuthToken] - auth_type: Optional[str] - aws_host: Optional[str] - aws_region: Optional[str] - aws_service: Optional[str] - catalog_checks: Optional[bool] - connect_timeout: Optional[float] - disable_generic_tags: Optional[bool] - disable_legacy_service_tag: 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] - max_services: Optional[float] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - network_latency_checks: Optional[bool] - new_leader_checks: Optional[bool] - ntlm_domain: Optional[str] - password: Optional[str] - persist_connections: Optional[bool] - proxy: Optional[Proxy] - read_timeout: Optional[float] - request_size: Optional[float] - self_leader_check: Optional[bool] - service: Optional[str] - services_exclude: Optional[Sequence[str]] - services_include: Optional[Sequence[str]] - single_node_install: Optional[bool] - skip_proxy: Optional[bool] - tags: Optional[Sequence[str]] - threads_count: Optional[float] - 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] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + acl_token: Optional[str] = None + 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 + catalog_checks: Optional[bool] = None + connect_timeout: Optional[float] = None + disable_generic_tags: Optional[bool] = None + disable_legacy_service_tag: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + extra_headers: Optional[Mapping[str, Any]] = None + headers: Optional[Mapping[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 + max_services: Optional[float] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + network_latency_checks: Optional[bool] = None + new_leader_checks: Optional[bool] = None + ntlm_domain: Optional[str] = None + password: Optional[str] = None + persist_connections: Optional[bool] = None + proxy: Optional[Proxy] = None + read_timeout: Optional[float] = None + request_size: Optional[float] = None + self_leader_check: Optional[bool] = None + service: Optional[str] = None + services_exclude: Optional[Sequence[str]] = None + services_include: Optional[Sequence[str]] = None + single_node_install: Optional[bool] = None + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[str]] = None + threads_count: Optional[float] = 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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None url: str - use_legacy_auth_encoding: Optional[bool] - use_prometheus_endpoint: Optional[bool] - username: Optional[str] + use_legacy_auth_encoding: Optional[bool] = None + use_prometheus_endpoint: Optional[bool] = None + username: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/consul/datadog_checks/consul/config_models/shared.py b/consul/datadog_checks/consul/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/consul/datadog_checks/consul/config_models/shared.py +++ b/consul/datadog_checks/consul/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/coredns/datadog_checks/coredns/config_models/defaults.py b/coredns/datadog_checks/coredns/config_models/defaults.py index db53a177ed9b2..31d6011904e71 100644 --- a/coredns/datadog_checks/coredns/config_models/defaults.py +++ b/coredns/datadog_checks/coredns/config_models/defaults.py @@ -7,360 +7,162 @@ # 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_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_health_service_check(field, value): +def instance_health_service_check(): return True -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_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): - 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://%%host%%:9153/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_prometheus_metrics_prefix(field, value): - return get_default_field_value(field, value) - - -def instance_prometheus_url(field, value): - return get_default_field_value(field, value) - - -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_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_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_type_overrides(field, value): - return get_default_field_value(field, value) - - -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/coredns/datadog_checks/coredns/config_models/instance.py b/coredns/datadog_checks/coredns/config_models/instance.py index bceeec6655b2e..e57304ed42cee 100644 --- a/coredns/datadog_checks/coredns/config_models/instance.py +++ b/coredns/datadog_checks/coredns/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,187 +20,196 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + extra='allow', + frozen=True, + ) + name: Optional[str] = None + type: Optional[str] = None class IgnoreMetricsByLabels(BaseModel): - class Config: - allow_mutation = False - - target_label_key: Optional[str] - target_label_value_list: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + target_label_key: Optional[str] = None + target_label_value_list: Optional[Sequence[str]] = None class TargetMetric(BaseModel): - class Config: - allow_mutation = False - - label_to_match: Optional[str] - labels_to_get: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + label_to_match: Optional[str] = None + labels_to_get: Optional[Sequence[str]] = None class LabelJoins(BaseModel): - class Config: - allow_mutation = False - - target_metric: Optional[TargetMetric] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + labels: Optional[Sequence[str]] = None + match: Optional[Sequence[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] - 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]] - health_service_check: Optional[bool] - histogram_buckets_as_distributions: Optional[bool] - hostname_format: Optional[str] - hostname_label: Optional[str] - ignore_connection_errors: 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, 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] - prometheus_metrics_prefix: Optional[str] - prometheus_url: Optional[str] - 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] - 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] - 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] - type_overrides: Optional[Mapping[str, Any]] - 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, + 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 + 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[Sequence[str]] = None + exclude_metrics: Optional[Sequence[str]] = None + exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] = None + extra_headers: Optional[Mapping[str, Any]] = None + extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] = None + headers: Optional[Mapping[str, Any]] = None + health_service_check: Optional[bool] = 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_metrics: Optional[Sequence[str]] = None + ignore_metrics_by_labels: Optional[IgnoreMetricsByLabels] = None + ignore_tags: Optional[Sequence[str]] = None + include_labels: Optional[Sequence[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[Mapping[str, Any]] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[Sequence[Union[str, Mapping[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 + prometheus_metrics_prefix: Optional[str] = None + prometheus_url: Optional[str] = None + proxy: Optional[Proxy] = None + raw_line_filters: Optional[Sequence[str]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[Mapping[str, Any]] = 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 + share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + type_overrides: Optional[Mapping[str, Any]] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/coredns/datadog_checks/coredns/config_models/shared.py b/coredns/datadog_checks/coredns/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/coredns/datadog_checks/coredns/config_models/shared.py +++ b/coredns/datadog_checks/coredns/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/couch/datadog_checks/couch/config_models/defaults.py b/couch/datadog_checks/couch/config_models/defaults.py index 8d91714e4f9a3..d5ff860b5a248 100644 --- a/couch/datadog_checks/couch/config_models/defaults.py +++ b/couch/datadog_checks/couch/config_models/defaults.py @@ -7,200 +7,86 @@ # 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_db_exclude(field, value): - return get_default_field_value(field, value) - - -def instance_db_include(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_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_max_dbs_per_check(field, value): +def instance_max_dbs_per_check(): return 50 -def instance_max_nodes_per_check(field, value): +def instance_max_nodes_per_check(): return 20 -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_name(field, value): - return get_default_field_value(field, value) - - -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_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_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/couch/datadog_checks/couch/config_models/instance.py b/couch/datadog_checks/couch/config_models/instance.py index 59a128b0a8e6f..ee8d8a969a173 100644 --- a/couch/datadog_checks/couch/config_models/instance.py +++ b/couch/datadog_checks/couch/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,99 +20,108 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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] - db_exclude: Optional[Sequence[str]] - db_include: Optional[Sequence[str]] - 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] - max_dbs_per_check: Optional[int] - max_nodes_per_check: Optional[int] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - name: Optional[str] - ntlm_domain: Optional[str] - password: Optional[str] - persist_connections: Optional[bool] - proxy: Optional[Proxy] - read_timeout: Optional[float] - request_size: Optional[float] + model_config = ConfigDict( + validate_default=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 + db_exclude: Optional[Sequence[str]] = None + db_include: Optional[Sequence[str]] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + extra_headers: Optional[Mapping[str, Any]] = None + headers: Optional[Mapping[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 + max_dbs_per_check: Optional[int] = None + max_nodes_per_check: Optional[int] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + name: Optional[str] = None + ntlm_domain: Optional[str] = None + password: Optional[str] = None + persist_connections: Optional[bool] = None + proxy: Optional[Proxy] = None + read_timeout: Optional[float] = None + request_size: Optional[float] = None server: str - 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] - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + service: Optional[str] = None + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + use_legacy_auth_encoding: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/couch/datadog_checks/couch/config_models/shared.py b/couch/datadog_checks/couch/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/couch/datadog_checks/couch/config_models/shared.py +++ b/couch/datadog_checks/couch/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/couchbase/datadog_checks/couchbase/config_models/defaults.py b/couchbase/datadog_checks/couchbase/config_models/defaults.py index ae255fadf90ea..266b8a20dac93 100644 --- a/couchbase/datadog_checks/couchbase/config_models/defaults.py +++ b/couchbase/datadog_checks/couchbase/config_models/defaults.py @@ -7,192 +7,90 @@ # 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 False -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_index_stats_url(field, value): +def instance_index_stats_url(): return 'http://localhost:9102' -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 False -def instance_proxy(field, value): - return get_default_field_value(field, value) - - -def instance_query_monitoring_url(field, value): +def instance_query_monitoring_url(): return 'http://localhost:8093' -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_skip_proxy(field, value): +def instance_skip_proxy(): return False -def instance_sync_gateway_url(field, value): +def instance_sync_gateway_url(): return 'http://localhost:4986' -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/couchbase/datadog_checks/couchbase/config_models/instance.py b/couchbase/datadog_checks/couchbase/config_models/instance.py index 74b84784c6fa9..48c0c5c580c4e 100644 --- a/couchbase/datadog_checks/couchbase/config_models/instance.py +++ b/couchbase/datadog_checks/couchbase/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,97 +20,106 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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]] - index_stats_url: Optional[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] - min_collection_interval: Optional[float] - ntlm_domain: Optional[str] - password: Optional[str] - persist_connections: Optional[bool] - proxy: Optional[Proxy] - query_monitoring_url: Optional[str] - read_timeout: Optional[float] - request_size: Optional[float] + model_config = ConfigDict( + validate_default=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[Mapping[str, Any]] = None + headers: Optional[Mapping[str, Any]] = None + index_stats_url: Optional[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 + min_collection_interval: Optional[float] = None + ntlm_domain: Optional[str] = None + password: Optional[str] = None + persist_connections: Optional[bool] = None + proxy: Optional[Proxy] = None + query_monitoring_url: Optional[str] = None + read_timeout: Optional[float] = None + request_size: Optional[float] = None server: str - service: Optional[str] - skip_proxy: Optional[bool] - sync_gateway_url: Optional[str] - 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] - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + service: Optional[str] = None + skip_proxy: Optional[bool] = None + sync_gateway_url: Optional[str] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + use_legacy_auth_encoding: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/couchbase/datadog_checks/couchbase/config_models/shared.py b/couchbase/datadog_checks/couchbase/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/couchbase/datadog_checks/couchbase/config_models/shared.py +++ b/couchbase/datadog_checks/couchbase/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/crio/datadog_checks/crio/config_models/defaults.py b/crio/datadog_checks/crio/config_models/defaults.py index 9d0d06c6805c6..6cc07ac1c3a3e 100644 --- a/crio/datadog_checks/crio/config_models/defaults.py +++ b/crio/datadog_checks/crio/config_models/defaults.py @@ -7,272 +7,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/crio/datadog_checks/crio/config_models/instance.py b/crio/datadog_checks/crio/config_models/instance.py index 4bb176acb6d2f..5ded4c1b97033 100644 --- a/crio/datadog_checks/crio/config_models/instance.py +++ b/crio/datadog_checks/crio/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,140 +20,149 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[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( + frozen=True, + ) + target_label_key: Optional[str] = None + target_label_value_list: Optional[Sequence[str]] = None class TargetMetric(BaseModel): - class Config: - allow_mutation = False - - label_to_match: Optional[str] - labels_to_get: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + label_to_match: Optional[str] = None + labels_to_get: Optional[Sequence[str]] = None class LabelJoins(BaseModel): - class Config: - allow_mutation = False - - target_metric: Optional[TargetMetric] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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]] - 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] + model_config = ConfigDict( + validate_default=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[Sequence[str]] = None + extra_headers: Optional[Mapping[str, Any]] = None + headers: Optional[Mapping[str, Any]] = None + health_service_check: Optional[bool] = None + ignore_metrics: Optional[Sequence[str]] = None + ignore_metrics_by_labels: Optional[IgnoreMetricsByLabels] = None + ignore_tags: Optional[Sequence[str]] = None + include_labels: Optional[Sequence[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[Mapping[str, Any]] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[Sequence[Union[str, Mapping[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[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + type_overrides: Optional[Mapping[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/crio/datadog_checks/crio/config_models/shared.py b/crio/datadog_checks/crio/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/crio/datadog_checks/crio/config_models/shared.py +++ b/crio/datadog_checks/crio/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/datadog_checks_base/datadog_checks/base/checks/base.py b/datadog_checks_base/datadog_checks/base/checks/base.py index e9d176479e7e4..999e728d7f646 100644 --- a/datadog_checks_base/datadog_checks/base/checks/base.py +++ b/datadog_checks_base/datadog_checks/base/checks/base.py @@ -458,7 +458,7 @@ def log_typos_in_options(self, user_config, models_config, level): if isinstance(models_config, BaseModel): # Also add aliases, if any - known_options.update(set(models_config.dict(by_alias=True))) + known_options.update(set(models_config.model_dump(by_alias=True))) unknown_options = [option for option in user_configs.keys() if option not in known_options] # type: List[str] @@ -485,33 +485,29 @@ def load_configuration_models(self, package_path=None): module_parts = self.__module__.split('.') package_path = '{}.config_models'.format('.'.join(module_parts[:2])) if self._config_model_shared is None: - raw_shared_config = self._get_config_model_initialization_data() - intg_shared_config = self._get_shared_config() - raw_shared_config.update(intg_shared_config) - - shared_config = self.load_configuration_model(package_path, 'SharedConfig', raw_shared_config) + shared_config = copy.deepcopy(self.init_config) + context = self._get_config_model_context(shared_config) + shared_model = self.load_configuration_model(package_path, 'SharedConfig', shared_config, context) try: - self.log_typos_in_options(intg_shared_config, shared_config, 'init_config') + self.log_typos_in_options(shared_config, shared_model, 'init_config') except Exception as e: self.log.debug("Failed to detect typos in `init_config` section: %s", e) - if shared_config is not None: - self._config_model_shared = shared_config + if shared_model is not None: + self._config_model_shared = shared_model if self._config_model_instance is None: - raw_instance_config = self._get_config_model_initialization_data() - intg_instance_config = self._get_instance_config() - raw_instance_config.update(intg_instance_config) - - instance_config = self.load_configuration_model(package_path, 'InstanceConfig', raw_instance_config) + instance_config = copy.deepcopy(self.instance) + context = self._get_config_model_context(instance_config) + instance_model = self.load_configuration_model(package_path, 'InstanceConfig', instance_config, context) try: - self.log_typos_in_options(intg_instance_config, instance_config, 'instances') + self.log_typos_in_options(instance_config, instance_model, 'instances') except Exception as e: self.log.debug("Failed to detect typos in `instances` section: %s", e) - if instance_config is not None: - self._config_model_instance = instance_config + if instance_model is not None: + self._config_model_instance = instance_model @staticmethod - def load_configuration_model(import_path, model_name, config): + def load_configuration_model(import_path, model_name, config, context): try: package = importlib.import_module(import_path) # TODO: remove the type ignore when we drop Python 2 @@ -525,7 +521,7 @@ def load_configuration_model(import_path, model_name, config): model = getattr(package, model_name, None) if model is not None: try: - config_model = model(**config) + config_model = model.model_validate(config, context=context) # TODO: remove the type ignore when we drop Python 2 except ValidationError as e: # type: ignore errors = e.errors() @@ -550,17 +546,8 @@ def load_configuration_model(import_path, model_name, config): else: return config_model - def _get_shared_config(self): - # Any extra fields will be available during a config model's initial validation stage - return copy.deepcopy(self.init_config) - - def _get_instance_config(self): - # Any extra fields will be available during a config model's initial validation stage - return copy.deepcopy(self.instance) - - def _get_config_model_initialization_data(self): - # Allow for advanced functionality during the initial root validation stage - return {'__data': {'logger': self.log, 'warning': self.warning}} + def _get_config_model_context(self, config): + return {'logger': self.log, 'warning': self.warning, 'configured_fields': frozenset(config)} def register_secret(self, secret): # type: (str) -> None diff --git a/datadog_checks_base/datadog_checks/base/utils/models/fields.py b/datadog_checks_base/datadog_checks/base/utils/models/fields.py deleted file mode 100644 index a35384eb34dc9..0000000000000 --- a/datadog_checks_base/datadog_checks/base/utils/models/fields.py +++ /dev/null @@ -1,17 +0,0 @@ -# (C) Datadog, Inc. 2021-present -# All rights reserved -# Licensed under a 3-clause BSD style license (see LICENSE) -from pydantic.fields import SHAPE_MAPPING, SHAPE_SEQUENCE, SHAPE_SINGLETON - - -def get_default_field_value(field, value): - if field.shape == SHAPE_MAPPING: - return {} - elif field.shape == SHAPE_SEQUENCE: - return [] - elif field.shape == SHAPE_SINGLETON: - field_type = field.type_ - if field_type in (float, int, str): - return field_type() - - return value diff --git a/datadog_checks_base/datadog_checks/base/utils/models/validation/core.py b/datadog_checks_base/datadog_checks/base/utils/models/validation/core.py index a5bd35c563f24..701cdedcb92f9 100644 --- a/datadog_checks_base/datadog_checks/base/utils/models/validation/core.py +++ b/datadog_checks_base/datadog_checks/base/utils/models/validation/core.py @@ -1,17 +1,11 @@ # (C) Datadog, Inc. 2021-present # All rights reserved # Licensed under a 3-clause BSD style license (see LICENSE) -from ..types import make_immutable_check_config - - def initialize_config(values, **kwargs): - # This is what is returned by the initial root validator of each config model. + # This is what is returned by the initial model validator of each config model. return values -def finalize_config(values, **kwargs): - # This is what is returned by the final root validator of each config model. Note: - # - # 1. the final object must be a dict - # 2. we maintain the original order of keys - return {field: make_immutable_check_config(value) for field, value in values.items()} +def check_model(model, **kwargs): + # This is what is returned by the final model validator of each config model. + return model diff --git a/datadog_checks_base/datadog_checks/base/utils/models/validation/helpers.py b/datadog_checks_base/datadog_checks/base/utils/models/validation/helpers.py deleted file mode 100644 index 962eb42d7f848..0000000000000 --- a/datadog_checks_base/datadog_checks/base/utils/models/validation/helpers.py +++ /dev/null @@ -1,7 +0,0 @@ -# (C) Datadog, Inc. 2021-present -# All rights reserved -# Licensed under a 3-clause BSD style license (see LICENSE) - - -def get_initialization_data(values): - return values['__data'] diff --git a/datadog_checks_base/datadog_checks/base/utils/models/validation/utils.py b/datadog_checks_base/datadog_checks/base/utils/models/validation/utils.py index e4d72394ebbd3..6690b172ede4c 100644 --- a/datadog_checks_base/datadog_checks/base/utils/models/validation/utils.py +++ b/datadog_checks_base/datadog_checks/base/utils/models/validation/utils.py @@ -1,14 +1,18 @@ # (C) Datadog, Inc. 2021-present # All rights reserved # Licensed under a 3-clause BSD style license (see LICENSE) -from .helpers import get_initialization_data +from ..types import make_immutable_check_config -def handle_deprecations(config_section, deprecations, values): - warning_method = get_initialization_data(values)['warning'] +def make_immutable(value): + return make_immutable_check_config(value) + + +def handle_deprecations(config_section, deprecations, fields, context): + warning_method = context['warning'] for option, data in deprecations.items(): - if option not in values: + if option not in fields: continue message = f'Option `{option}` in `{config_section}` is deprecated ->\n' diff --git a/datadog_checks_base/pyproject.toml b/datadog_checks_base/pyproject.toml index 2f0b7d5f9c6ce..14b21fd082f19 100644 --- a/datadog_checks_base/pyproject.toml +++ b/datadog_checks_base/pyproject.toml @@ -55,7 +55,7 @@ deps = [ "prometheus-client==0.17.0; python_version > '3.0'", "protobuf==3.17.3; python_version < '3.0'", "protobuf==3.20.2; python_version > '3.0'", - "pydantic==1.10.8; python_version > '3.0'", + "pydantic==2.0; python_version > '3.0'", "python-dateutil==2.8.2", "pywin32==228; sys_platform == 'win32' and python_version < '3.0'", "pywin32==306; sys_platform == 'win32' and python_version > '3.0'", diff --git a/datadog_checks_base/tests/base/checks/test_agent_check.py b/datadog_checks_base/tests/base/checks/test_agent_check.py index b734b5e7e2035..5ce36c67f0dc0 100644 --- a/datadog_checks_base/tests/base/checks/test_agent_check.py +++ b/datadog_checks_base/tests/base/checks/test_agent_check.py @@ -976,20 +976,19 @@ def test_load_configuration_models(dd_run_check, mocker): instance_config = {} shared_config = {} package = mocker.MagicMock() - package.InstanceConfig = mocker.MagicMock(return_value=instance_config) - package.SharedConfig = mocker.MagicMock(return_value=shared_config) + package.InstanceConfig.model_validate = mocker.MagicMock(return_value=instance_config) + package.SharedConfig.model_validate = mocker.MagicMock(return_value=shared_config) import_module = mocker.patch('importlib.import_module', return_value=package) dd_run_check(check) - instance_data = check._get_config_model_initialization_data() - instance_data.update(instance) - init_config_data = check._get_config_model_initialization_data() - init_config_data.update(init_config) - import_module.assert_called_with('datadog_checks.base.config_models') - package.InstanceConfig.assert_called_once_with(**instance_data) - package.SharedConfig.assert_called_once_with(**init_config_data) + package.InstanceConfig.model_validate.assert_called_once_with( + instance, context=check._get_config_model_context(instance) + ) + package.SharedConfig.model_validate.assert_called_once_with( + init_config, context=check._get_config_model_context(init_config) + ) assert check._config_model_instance is instance_config assert check._config_model_shared is shared_config @@ -997,11 +996,7 @@ def test_load_configuration_models(dd_run_check, mocker): if PY3: - from pydantic import BaseModel, Field - - class BaseModelTest(BaseModel): - field = "" - schema_ = Field("", alias='schema') + from .utils import BaseModelTest else: diff --git a/datadog_checks_base/tests/base/checks/utils.py b/datadog_checks_base/tests/base/checks/utils.py new file mode 100644 index 0000000000000..ac671edafa86d --- /dev/null +++ b/datadog_checks_base/tests/base/checks/utils.py @@ -0,0 +1,9 @@ +# (C) Datadog, Inc. 2023-present +# All rights reserved +# Licensed under a 3-clause BSD style license (see LICENSE) +from pydantic import BaseModel, Field + + +class BaseModelTest(BaseModel): + field: str = "" + schema_: str = Field("", alias='schema') diff --git a/datadog_checks_base/tests/models/config_models/defaults.py b/datadog_checks_base/tests/models/config_models/defaults.py index feb2184864791..88ff6770acdc6 100644 --- a/datadog_checks_base/tests/models/config_models/defaults.py +++ b/datadog_checks_base/tests/models/config_models/defaults.py @@ -7,52 +7,6 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_deprecated(field, value): - return get_default_field_value(field, value) - - -def shared_timeout(field, value): - return get_default_field_value(field, value) - - -def instance_array(field, value): - return get_default_field_value(field, value) - - -def instance_deprecated(field, value): - return get_default_field_value(field, value) - - -def instance_flag(field, value): +def instance_flag(): return False - - -def instance_hyphenated_name(field, value): - return get_default_field_value(field, value) - - -def instance_mapping(field, value): - return get_default_field_value(field, value) - - -def instance_obj(field, value): - return get_default_field_value(field, value) - - -def instance_pass_(field, value): - return get_default_field_value(field, value) - - -def instance_pid(field, value): - return get_default_field_value(field, value) - - -def instance_text(field, value): - return get_default_field_value(field, value) - - -def instance_timeout(field, value): - return get_default_field_value(field, value) diff --git a/datadog_checks_base/tests/models/config_models/deprecations.py b/datadog_checks_base/tests/models/config_models/deprecations.py index 31120f1ad4c6d..44a38fa2ae045 100644 --- a/datadog_checks_base/tests/models/config_models/deprecations.py +++ b/datadog_checks_base/tests/models/config_models/deprecations.py @@ -4,8 +4,8 @@ def shared(): - return {'deprecated': {'Release': '8.0.0', 'Migration': 'do this\nand that\n'}} + return {'deprecated': {'Agent_Version': '8.0.0', 'Migration': 'do this\nand that\n'}} def instance(): - return {'deprecated': {'Release': '9.0.0', 'Migration': 'do this\nand that\n'}} + return {'deprecated': {'Agent version': '9.0.0', 'Migration': 'do this\nand that\n'}} diff --git a/datadog_checks_base/tests/models/config_models/instance.py b/datadog_checks_base/tests/models/config_models/instance.py index bc765ba8ee706..d879e003da783 100644 --- a/datadog_checks_base/tests/models/config_models/instance.py +++ b/datadog_checks_base/tests/models/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -from pydantic import BaseModel, 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 @@ -20,51 +20,61 @@ class Obj(BaseModel): - class Config: - allow_mutation = False - - bar: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + bar: Optional[Sequence[str]] = None foo: bool class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - array: Optional[Sequence[str]] - deprecated: Optional[str] - flag: Optional[bool] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + array: Optional[Sequence[str]] = None + deprecated: Optional[str] = None + flag: Optional[bool] = None hyphenated_name: Optional[str] = Field(None, alias='hyphenated-name') - mapping: Optional[Mapping[str, Any]] - obj: Optional[Obj] + mapping: Optional[Mapping[str, Any]] = None + obj: Optional[Obj] = None pass_: Optional[str] = Field(None, alias='pass') - pid: Optional[int] - text: Optional[str] - timeout: Optional[float] - - @root_validator(pre=True) - def _handle_deprecations(cls, values): - validation.utils.handle_deprecations('instances', deprecations.instance(), values) + pid: Optional[int] = None + text: Optional[str] = None + timeout: Optional[float] = None + + @model_validator(mode='before') + def _handle_deprecations(cls, values, info): + fields = info.context['configured_fields'] + validation.utils.handle_deprecations('instances', deprecations.instance(), fields, info.context) return values - @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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/datadog_checks_base/tests/models/config_models/shared.py b/datadog_checks_base/tests/models/config_models/shared.py index 54dea622d2874..6c63a9244322b 100644 --- a/datadog_checks_base/tests/models/config_models/shared.py +++ b/datadog_checks_base/tests/models/config_models/shared.py @@ -11,44 +11,45 @@ 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, deprecations, validators +from . import deprecations, validators class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - deprecated: Optional[str] - timeout: Optional[float] - - @root_validator(pre=True) - def _handle_deprecations(cls, values): - validation.utils.handle_deprecations('init_config', deprecations.shared(), values) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + deprecated: Optional[str] = None + timeout: Optional[float] = None + + @model_validator(mode='before') + def _handle_deprecations(cls, values, info): + fields = info.context['configured_fields'] + validation.utils.handle_deprecations('init_config', deprecations.shared(), fields, info.context) return values - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/datadog_checks_base/tests/models/config_models/validators.py b/datadog_checks_base/tests/models/config_models/validators.py index 91bef7eb12637..1b99ebf855087 100644 --- a/datadog_checks_base/tests/models/config_models/validators.py +++ b/datadog_checks_base/tests/models/config_models/validators.py @@ -2,7 +2,6 @@ # All rights reserved # Licensed under a 3-clause BSD style license (see LICENSE) - # Here you can include additional config validators or transformers # # def initialize_instance(values, **kwargs): diff --git a/datadog_checks_base/tests/models/test_interface.py b/datadog_checks_base/tests/models/test_interface.py index fd176bc43165e..3d189482e715a 100644 --- a/datadog_checks_base/tests/models/test_interface.py +++ b/datadog_checks_base/tests/models/test_interface.py @@ -21,9 +21,6 @@ def check(self, _): def test_defaults(dd_run_check): - # TODO: move imports up top when we drop Python 2 - from immutables import Map - init_config = {} instance = {} @@ -32,14 +29,14 @@ def test_defaults(dd_run_check): dd_run_check(check) - assert check.shared_config.deprecated == '' + assert check.shared_config.deprecated is None - assert check.config.text == '' + assert check.config.text is None assert check.config.flag is False - assert check.config.timeout == 0 and isinstance(check.config.timeout, float) - assert check.config.pid == 0 and isinstance(check.config.pid, int) - assert check.config.array == () - assert check.config.mapping == Map() + assert check.config.timeout is None + assert check.config.pid is None + assert check.config.array is None + assert check.config.mapping is None assert check.config.obj is None assert not check.warnings @@ -56,7 +53,7 @@ def test_errors_shared_config(dd_run_check): Exception, match="""Detected 1 error while loading configuration model `SharedConfig`: timeout - value is not a valid float""", + Input should be a valid number, unable to parse string as a number""", ): dd_run_check(check, extract_message=True) @@ -72,11 +69,11 @@ def test_errors_instance_config(dd_run_check): Exception, match="""Detected 3 errors while loading configuration model `InstanceConfig`: array -> 1 - str type expected + Input should be a valid string obj -> foo - field required + Field required timeout - value is not a valid float""", + Input should be a valid number, unable to parse string as a number""", ): dd_run_check(check, extract_message=True) @@ -137,12 +134,12 @@ def test_deprecations(dd_run_check): assert check.warnings == [ """Option `deprecated` in `init_config` is deprecated -> -Release: 8.0.0 +Agent_Version: 8.0.0 Migration: do this and that """, """Option `deprecated` in `instances` is deprecated -> -Release: 9.0.0 +Agent version: 9.0.0 Migration: do this and that """, diff --git a/datadog_checks_dev/datadog_checks/dev/tooling/configuration/consumers/model/model_consumer.py b/datadog_checks_dev/datadog_checks/dev/tooling/configuration/consumers/model/model_consumer.py index d4cf7375164cf..3b9948dada87b 100644 --- a/datadog_checks_dev/datadog_checks/dev/tooling/configuration/consumers/model/model_consumer.py +++ b/datadog_checks_dev/datadog_checks/dev/tooling/configuration/consumers/model/model_consumer.py @@ -1,10 +1,13 @@ # (C) Datadog, Inc. 2021-present # All rights reserved # Licensed under a 3-clause BSD style license (see LICENSE) +import warnings from typing import Dict, List, Tuple import yaml +from datamodel_code_generator import DataModelType from datamodel_code_generator.format import CodeFormatter, PythonVersion +from datamodel_code_generator.model import get_data_model_types from datamodel_code_generator.parser import LiteralType from datamodel_code_generator.parser.openapi import OpenAPIParser @@ -96,10 +99,15 @@ def _process_section(self, section) -> (List[Tuple[str, str]], dict, ModelInfo): package_info.append((model_id, schema_name)) (section_openapi_document, model_info) = build_openapi_document(section, model_id, schema_name, errors) + model_types = get_data_model_types(DataModelType.PydanticV2BaseModel, target_python_version=PYTHON_VERSION) try: section_parser = OpenAPIParser( yaml.safe_dump(section_openapi_document), - target_python_version=PythonVersion.PY_38, + data_model_type=model_types.data_model, + data_model_root_type=model_types.root_model, + data_model_field_type=model_types.field_model, + data_type_manager_type=model_types.data_type_manager, + dump_resolve_reference_action=model_types.dump_resolve_reference_action, enum_field_as_literal=LiteralType.All, encoding='utf-8', use_generic_container_types=True, @@ -110,7 +118,11 @@ def _process_section(self, section) -> (List[Tuple[str, str]], dict, ModelInfo): # https://github.com/koxudaxi/datamodel-code-generator/pull/173 field_constraints=True, ) - parsed_section = section_parser.parse() + # https://github.com/pydantic/pydantic/issues/6422 + # https://github.com/pydantic/pydantic/issues/6467#issuecomment-1623680485 + with warnings.catch_warnings(): + warnings.simplefilter('ignore') + parsed_section = section_parser.parse() except Exception as e: errors.append(f'Error parsing the OpenAPI schema `{schema_name}`: {e}') model_files[model_file_name] = ('', errors) @@ -149,7 +161,7 @@ def _build_model_files( model_files = {} if model_info.defaults_file_lines: defaults_file_contents = self._build_defaults_file(model_info) - model_files['defaults.py'] = (defaults_file_contents, []) + model_files['defaults.py'] = (f'\n{defaults_file_contents}', []) if model_info.deprecation_data: deprecations_file_contents = self._build_deprecation_file(model_info.deprecation_data) @@ -239,11 +251,6 @@ def _build_package_root(package_info): return package_root_lines def _build_defaults_file(self, model_info: ModelInfo): - if model_info.defaults_file_needs_dynamic_values: - model_info.defaults_file_lines.insert( - 0, 'from datadog_checks.base.utils.models.fields import get_default_field_value' - ) - model_info.defaults_file_lines.append('') defaults_file_contents = '\n'.join(model_info.defaults_file_lines) if model_info.defaults_file_needs_value_normalization: diff --git a/datadog_checks_dev/datadog_checks/dev/tooling/configuration/consumers/model/model_file.py b/datadog_checks_dev/datadog_checks/dev/tooling/configuration/consumers/model/model_file.py index 01648411c0505..2c010611fd99b 100644 --- a/datadog_checks_dev/datadog_checks/dev/tooling/configuration/consumers/model/model_file.py +++ b/datadog_checks_dev/datadog_checks/dev/tooling/configuration/consumers/model/model_file.py @@ -28,7 +28,15 @@ def build_model_file( if model_id in model_info.deprecation_data: model_file_lines += _define_deprecation_functions(model_id, section_name) - model_file_lines += _define_validator_functions(model_id, model_info.validator_data) + model_file_lines += _define_validator_functions(model_id, model_info.validator_data, options_with_defaults) + + config_lines = [] + for i, line in enumerate(model_file_lines): + if line.startswith(' model_config = ConfigDict('): + config_lines.append(i) + + final_config_line = config_lines[-1] + model_file_lines.insert(final_config_line + 1, ' validate_default=True,') model_file_lines.append('') model_file_contents = '\n'.join(model_file_lines) @@ -46,7 +54,11 @@ def _add_imports(model_file_lines, need_defaults, need_deprecations): # pydantic imports final_import_line = import_lines[-1] - model_file_lines[final_import_line] += ', root_validator, validator' + for index in reversed(import_lines): + line = model_file_lines[index] + if line.startswith('from pydantic '): + model_file_lines[index] += ', field_validator, model_validator' + break local_imports = ['validators'] if need_defaults: @@ -71,42 +83,47 @@ def _add_imports(model_file_lines, need_defaults, need_deprecations): def _define_deprecation_functions(model_id, section_name): model_file_lines = [''] - model_file_lines.append(' @root_validator(pre=True)') - model_file_lines.append(' def _handle_deprecations(cls, values):') + model_file_lines.append(" @model_validator(mode='before')") + model_file_lines.append(' def _handle_deprecations(cls, values, info):') + model_file_lines.append(" fields = info.context['configured_fields']") model_file_lines.append( - f' validation.utils.handle_deprecations(' f'{section_name!r}, deprecations.{model_id}(), values)' + f' validation.utils.handle_deprecations(' + f'{section_name!r}, deprecations.{model_id}(), fields, info.context)' ) model_file_lines.append(' return values') return model_file_lines -def _define_validator_functions(model_id, validator_data): +def _define_validator_functions(model_id, validator_data, need_defaults): model_file_lines = [''] - model_file_lines.append(' @root_validator(pre=True)') + model_file_lines.append(" @model_validator(mode='before')") model_file_lines.append(' def _initial_validation(cls, values):') model_file_lines.append( f" return validation.core.initialize_config(" f"getattr(validators, 'initialize_{model_id}', identity)(values))" ) - model_file_lines.append('') - model_file_lines.append(" @validator('*', pre=True, always=True)") - model_file_lines.append(' def _ensure_defaults(cls, v, field):') - model_file_lines.append(' if v is not None or field.required:') - model_file_lines.append(' return v') - model_file_lines.append('') - model_file_lines.append(f" return getattr(defaults, f'{model_id}_{{field.name}}')(field, v)") + if need_defaults: + model_file_lines.append('') + model_file_lines.append(" @field_validator('*', mode='before')") + model_file_lines.append(' def _ensure_defaults(cls, value, info):') + model_file_lines.append(' field = cls.model_fields[info.field_name]') + model_file_lines.append(' field_name = field.alias or info.field_name') + model_file_lines.append(" if field_name in info.context['configured_fields']:") + model_file_lines.append(' return value') + model_file_lines.append('') + model_file_lines.append(f" return getattr(defaults, f'{model_id}_{{info.field_name}}', lambda: value)()") model_file_lines.append('') - model_file_lines.append(" @validator('*')") - model_file_lines.append(' def _run_validations(cls, v, field):') - # TODO: remove conditional when there is a workaround: - # https://github.com/samuelcolvin/pydantic/issues/2376 - model_file_lines.append(' if not v:') - model_file_lines.append(' return v') + model_file_lines.append(" @field_validator('*')") + model_file_lines.append(' def _run_validations(cls, value, info):') + model_file_lines.append(' field = cls.model_fields[info.field_name]') + model_file_lines.append(' field_name = field.alias or info.field_name') + model_file_lines.append(" if field_name not in info.context['configured_fields']:") + model_file_lines.append(' return value') model_file_lines.append('') model_file_lines.append( - f" return getattr(validators, f'{model_id}_{{field.name}}', identity)(v, field=field)" + f" return getattr(validators, f'{model_id}_{{info.field_name}}', identity)(value, field=field)" ) for option_name, import_paths in validator_data: @@ -114,20 +131,24 @@ def _define_validator_functions(model_id, validator_data): validator_name = import_path.replace('.', '_') model_file_lines.append('') - model_file_lines.append(f' @validator({option_name!r})') - model_file_lines.append(f' def _run_{option_name}_{validator_name}(cls, v, field):') - # TODO: remove conditional when there is a workaround: - # https://github.com/samuelcolvin/pydantic/issues/2376 - model_file_lines.append(' if not v:') - model_file_lines.append(' return v') + model_file_lines.append(f' @field_validator({option_name!r})') + model_file_lines.append(f' def _run_{option_name}_{validator_name}(cls, value, info):') + model_file_lines.append(' field = cls.model_fields[info.field_name]') + model_file_lines.append(' field_name = field.alias or info.field_name') + model_file_lines.append(" if field_name not in info.context['configured_fields']:") + model_file_lines.append(' return value') model_file_lines.append('') - model_file_lines.append(f' return validation.{import_path}(v, field=field)') + model_file_lines.append(f' return validation.{import_path}(value, field=field)') + + model_file_lines.append('') + model_file_lines.append(" @field_validator('*', mode='after')") + model_file_lines.append(' def _make_immutable(cls, value):') + model_file_lines.append(' return validation.utils.make_immutable(value)') model_file_lines.append('') - model_file_lines.append(' @root_validator(pre=False)') - model_file_lines.append(' def _final_validation(cls, values):') + model_file_lines.append(" @model_validator(mode='after')") + model_file_lines.append(' def _final_validation(cls, model):') model_file_lines.append( - f" return validation.core.finalize_config(" - f"getattr(validators, 'finalize_{model_id}', identity)(values))" + f" return validation.core.check_model(getattr(validators, 'check_{model_id}', identity)(model))" ) return model_file_lines diff --git a/datadog_checks_dev/datadog_checks/dev/tooling/configuration/consumers/model/model_info.py b/datadog_checks_dev/datadog_checks/dev/tooling/configuration/consumers/model/model_info.py index 50efbd840d79c..78708d2ca2bbb 100644 --- a/datadog_checks_dev/datadog_checks/dev/tooling/configuration/consumers/model/model_info.py +++ b/datadog_checks_dev/datadog_checks/dev/tooling/configuration/consumers/model/model_info.py @@ -11,7 +11,6 @@ class ModelInfo: def __init__(self): self.defaults_file_needs_value_normalization = False - self.defaults_file_needs_dynamic_values = False # Contains function definitions as text for options that are optional so they have a default value self.defaults_file_lines: List[str] = [] self.validator_data = [] @@ -22,7 +21,6 @@ def update(self, section_model): Updates this model with another ModelInfo """ self.defaults_file_needs_value_normalization += section_model.defaults_file_needs_value_normalization - self.defaults_file_needs_dynamic_values += section_model.defaults_file_needs_dynamic_values self.defaults_file_lines.extend(section_model.defaults_file_lines) self.validator_data.extend(section_model.validator_data) self.deprecation_data.update(section_model.deprecation_data) @@ -65,15 +63,11 @@ def add_defaults(self, model_id: str, normalized_option_name: str, type_data: di :param normalized_option_name: Used to build the function name :type_data: dict containing all the relevant information to build the function """ - self.defaults_file_lines.extend(['', '', f'def {model_id}_{normalized_option_name}(field, value):']) - default_value = self._get_default_value(type_data) if default_value is not NO_DEFAULT: self.defaults_file_needs_value_normalization = True + self.defaults_file_lines.extend(['', '', f'def {model_id}_{normalized_option_name}():']) self.defaults_file_lines.append(f' return {default_value!r}') - else: - self.defaults_file_needs_dynamic_values = True - self.defaults_file_lines.append(' return get_default_field_value(field, value)') @staticmethod def _get_default_value(type_data): diff --git a/datadog_checks_dev/datadog_checks/dev/tooling/templates/integration/check/{check_name}/datadog_checks/{check_name}/config_models/defaults.py b/datadog_checks_dev/datadog_checks/dev/tooling/templates/integration/check/{check_name}/datadog_checks/{check_name}/config_models/defaults.py index 79219eb922502..54022a8362565 100644 --- a/datadog_checks_dev/datadog_checks/dev/tooling/templates/integration/check/{check_name}/datadog_checks/{check_name}/config_models/defaults.py +++ b/datadog_checks_dev/datadog_checks/dev/tooling/templates/integration/check/{check_name}/datadog_checks/{check_name}/config_models/defaults.py @@ -2,24 +2,9 @@ {documentation} -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_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return False -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/datadog_checks_dev/datadog_checks/dev/tooling/templates/integration/check/{check_name}/datadog_checks/{check_name}/config_models/instance.py b/datadog_checks_dev/datadog_checks/dev/tooling/templates/integration/check/{check_name}/datadog_checks/{check_name}/config_models/instance.py index 6a4f0ee5441cf..cf2c08158a52f 100644 --- a/datadog_checks_dev/datadog_checks/dev/tooling/templates/integration/check/{check_name}/datadog_checks/{check_name}/config_models/instance.py +++ b/datadog_checks_dev/datadog_checks/dev/tooling/templates/integration/check/{check_name}/datadog_checks/{check_name}/config_models/instance.py @@ -6,7 +6,7 @@ from typing import Optional, Sequence -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 @@ -15,32 +15,41 @@ class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - empty_default_hostname: Optional[bool] - min_collection_interval: Optional[float] - service: Optional[str] - tags: Optional[Sequence[str]] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + empty_default_hostname: Optional[bool] = None + min_collection_interval: Optional[float] = None + service: Optional[str] = None + tags: Optional[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{{info.field_name}}', lambda: value)() - return getattr(defaults, f'instance_{{field.name}}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{{info.field_name}}', identity)(value, field=field) - return getattr(validators, f'instance_{{field.name}}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/datadog_checks_dev/datadog_checks/dev/tooling/templates/integration/check/{check_name}/datadog_checks/{check_name}/config_models/shared.py b/datadog_checks_dev/datadog_checks/dev/tooling/templates/integration/check/{check_name}/datadog_checks/{check_name}/config_models/shared.py index 89de7b30d6dfc..9ff64c128faae 100644 --- a/datadog_checks_dev/datadog_checks/dev/tooling/templates/integration/check/{check_name}/datadog_checks/{check_name}/config_models/shared.py +++ b/datadog_checks_dev/datadog_checks/dev/tooling/templates/integration/check/{check_name}/datadog_checks/{check_name}/config_models/shared.py @@ -6,7 +6,7 @@ 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 @@ -15,29 +15,38 @@ class SharedConfig(BaseModel): - class Config: - allow_mutation = False + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{{info.field_name}}', lambda: value)() - return getattr(defaults, f'shared_{{field.name}}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{{info.field_name}}', identity)(value, field=field) - return getattr(validators, f'shared_{{field.name}}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/datadog_checks_dev/datadog_checks/dev/tooling/templates/integration/jmx/{check_name}/datadog_checks/{check_name}/config_models/defaults.py b/datadog_checks_dev/datadog_checks/dev/tooling/templates/integration/jmx/{check_name}/datadog_checks/{check_name}/config_models/defaults.py index a80e57daa8969..f18e05420d284 100644 --- a/datadog_checks_dev/datadog_checks/dev/tooling/templates/integration/jmx/{check_name}/datadog_checks/{check_name}/config_models/defaults.py +++ b/datadog_checks_dev/datadog_checks/dev/tooling/templates/integration/jmx/{check_name}/datadog_checks/{check_name}/config_models/defaults.py @@ -2,25 +2,10 @@ {documentation} -from datadog_checks.base.utils.models.fields import get_default_field_value - - -def shared_conf(field, value): - return get_default_field_value(field, value) - - def shared_new_gc_metrics(field, value): 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): return True @@ -29,42 +14,10 @@ def instance_empty_default_hostname(field, value): 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): 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): return 15000 @@ -75,27 +28,3 @@ def instance_rmi_connection_timeout(field, value): def instance_rmi_registry_ssl(field, value): 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/datadog_checks_dev/datadog_checks/dev/tooling/templates/integration/jmx/{check_name}/datadog_checks/{check_name}/config_models/instance.py b/datadog_checks_dev/datadog_checks/dev/tooling/templates/integration/jmx/{check_name}/datadog_checks/{check_name}/config_models/instance.py index 4022cd9c51fb8..48711372c14ac 100644 --- a/datadog_checks_dev/datadog_checks/dev/tooling/templates/integration/jmx/{check_name}/datadog_checks/{check_name}/config_models/instance.py +++ b/datadog_checks_dev/datadog_checks/dev/tooling/templates/integration/jmx/{check_name}/datadog_checks/{check_name}/config_models/instance.py @@ -6,7 +6,7 @@ from typing import Optional, Sequence -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 @@ -15,50 +15,59 @@ 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, + frozen=True, + ) + collect_default_jvm_metrics: Optional[bool] = None + empty_default_hostname: Optional[bool] = None host: str - 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] + 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[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{{info.field_name}}', lambda: value)() - return getattr(defaults, f'instance_{{field.name}}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{{info.field_name}}', identity)(value, field=field) - return getattr(validators, f'instance_{{field.name}}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/datadog_checks_dev/datadog_checks/dev/tooling/templates/integration/jmx/{check_name}/datadog_checks/{check_name}/config_models/shared.py b/datadog_checks_dev/datadog_checks/dev/tooling/templates/integration/jmx/{check_name}/datadog_checks/{check_name}/config_models/shared.py index 04f06ab1afb07..3b34891a38ca7 100644 --- a/datadog_checks_dev/datadog_checks/dev/tooling/templates/integration/jmx/{check_name}/datadog_checks/{check_name}/config_models/shared.py +++ b/datadog_checks_dev/datadog_checks/dev/tooling/templates/integration/jmx/{check_name}/datadog_checks/{check_name}/config_models/shared.py @@ -6,7 +6,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -15,34 +15,43 @@ class SharedConfig(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) collect_default_metrics: bool - conf: Optional[Sequence[Mapping[str, Any]]] + conf: Optional[Sequence[Mapping[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{{info.field_name}}', lambda: value)() - return getattr(defaults, f'shared_{{field.name}}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{{info.field_name}}', identity)(value, field=field) - return getattr(validators, f'shared_{{field.name}}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/datadog_checks_dev/pyproject.toml b/datadog_checks_dev/pyproject.toml index e5343de726053..609c71f68bf6c 100644 --- a/datadog_checks_dev/pyproject.toml +++ b/datadog_checks_dev/pyproject.toml @@ -67,7 +67,7 @@ cli = [ "click~=8.1,!=8.1.4", "codespell", "colorama", - "datamodel-code-generator~=0.20.0", + "datamodel-code-generator~=0.21.1", "hatch>=1.5.0", "in-toto==1.0.1", "jsonschema", @@ -77,6 +77,7 @@ cli = [ "pip-tools", "pathspec>=0.10.0", "platformdirs>=2.0.0a3", + "pydantic>=2.0.2", "pysmi>=0.3.4", "securesystemslib[crypto]==0.20.1", "semver>=2.13.0", diff --git a/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_all_required.py b/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_all_required.py index c92db09c6b346..d33c17c579d73 100644 --- a/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_all_required.py +++ b/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_all_required.py @@ -56,7 +56,7 @@ def config(self) -> InstanceConfig: """ from __future__ import annotations - 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 @@ -65,31 +65,31 @@ def config(self) -> InstanceConfig: class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) foo: 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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_array.py b/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_array.py index aa7e67fba4508..2b9087df0d2f2 100644 --- a/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_array.py +++ b/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_array.py @@ -34,7 +34,7 @@ def test(): assert len(model_definitions) == 1 files = model_definitions['test.yaml'] - assert len(files) == 4 + assert len(files) == 3 validators_contents, validators_errors = files['validators.py'] assert not validators_errors @@ -56,18 +56,6 @@ def config(self) -> InstanceConfig: """ ) - defaults_contents, defaults_errors = files['defaults.py'] - assert not defaults_errors - assert defaults_contents == normalize_yaml( - """ - from datadog_checks.base.utils.models.fields import get_default_field_value - - - def instance_tags(field, value): - return get_default_field_value(field, value) - """ - ) - instance_model_contents, instance_model_errors = files['instance.py'] assert not instance_model_errors assert instance_model_contents == normalize_yaml( @@ -76,41 +64,41 @@ def instance_tags(field, value): from typing import Optional, Sequence - 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 InstanceConfig(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) foo: str - tags: Optional[Sequence[str]] + tags: Optional[Sequence[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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_both_models_basic.py b/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_both_models_basic.py index 91cc9a158a463..b7482f3e637c8 100644 --- a/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_both_models_basic.py +++ b/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_both_models_basic.py @@ -33,7 +33,7 @@ def test(): assert len(model_definitions) == 1 files = model_definitions['test.yaml'] - assert len(files) == 5 + assert len(files) == 4 validators_contents, validators_errors = files['validators.py'] assert not validators_errors @@ -61,22 +61,6 @@ def shared_config(self) -> SharedConfig: """ ) - defaults_contents, defaults_errors = files['defaults.py'] - assert not defaults_errors - assert defaults_contents == normalize_yaml( - """ - from datadog_checks.base.utils.models.fields import get_default_field_value - - - def shared_foo(field, value): - return get_default_field_value(field, value) - - - def instance_foo(field, value): - return get_default_field_value(field, value) - """ - ) - shared_model_contents, shared_model_errors = files['shared.py'] assert not shared_model_errors assert shared_model_contents == normalize_yaml( @@ -85,41 +69,41 @@ def instance_foo(field, value): 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 - - foo: Optional[str] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + foo: 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 + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - return getattr(defaults, f'shared_{field.name}')(field, v) + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='after') + def _make_immutable(cls, value): + return validation.utils.make_immutable(value) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) - - @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)) """ ) @@ -131,40 +115,40 @@ def _final_validation(cls, values): 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 InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - foo: Optional[str] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + foo: 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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_common_validators.py b/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_common_validators.py index 7833de1a4a1e0..8a6f8831336be 100644 --- a/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_common_validators.py +++ b/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_common_validators.py @@ -40,7 +40,7 @@ def test(): assert len(model_definitions) == 1 files = model_definitions['test.yaml'] - assert len(files) == 4 + assert len(files) == 3 validators_contents, validators_errors = files['validators.py'] assert not validators_errors @@ -62,18 +62,6 @@ def config(self) -> InstanceConfig: """ ) - defaults_contents, defaults_errors = files['defaults.py'] - assert not defaults_errors - assert defaults_contents == normalize_yaml( - """ - from datadog_checks.base.utils.models.fields import get_default_field_value - - - def instance_tags(field, value): - return get_default_field_value(field, value) - """ - ) - instance_model_contents, instance_model_errors = files['instance.py'] assert not instance_model_errors assert instance_model_contents == normalize_yaml( @@ -82,69 +70,77 @@ def instance_tags(field, value): from typing import Optional, Sequence - 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 InstanceConfig(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) foo: str - tags: Optional[Sequence[str]] + tags: Optional[Sequence[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 - - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) - - @validator('foo') - def _run_foo_pkg_subpkg2_validate2(cls, v, field): - if not v: - return v - - return validation.pkg.subpkg2.validate2(v, field=field) - - @validator('foo') - def _run_foo_pkg_subpkg2_validate1(cls, v, field): - if not v: - return v - - return validation.pkg.subpkg2.validate1(v, field=field) - - @validator('tags') - def _run_tags_pkg_subpkg1_validate2(cls, v, field): - if not v: - return v - - return validation.pkg.subpkg1.validate2(v, field=field) - - @validator('tags') - def _run_tags_pkg_subpkg1_validate1(cls, v, field): - if not v: - return v - - return validation.pkg.subpkg1.validate1(v, field=field) - - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_instance', identity)(values)) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value + + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) + + @field_validator('foo') + def _run_foo_pkg_subpkg2_validate2(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value + + return validation.pkg.subpkg2.validate2(value, field=field) + + @field_validator('foo') + def _run_foo_pkg_subpkg2_validate1(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value + + return validation.pkg.subpkg2.validate1(value, field=field) + + @field_validator('tags') + def _run_tags_pkg_subpkg1_validate2(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value + + return validation.pkg.subpkg1.validate2(value, field=field) + + @field_validator('tags') + def _run_tags_pkg_subpkg1_validate1(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value + + return validation.pkg.subpkg1.validate1(value, field=field) + + @field_validator('*', mode='after') + def _make_immutable(cls, value): + return validation.utils.make_immutable(value) + + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_instance', identity)(model)) """ ) diff --git a/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_defaults.py b/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_defaults.py index 26aac81be59c5..c48c676ea2a77 100644 --- a/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_defaults.py +++ b/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_defaults.py @@ -92,28 +92,17 @@ def config(self) -> InstanceConfig: defaults_contents, defaults_errors = files['defaults.py'] assert not defaults_errors - assert defaults_contents == normalize_yaml( + assert defaults_contents == '\n' + normalize_yaml( """ - from datadog_checks.base.utils.models.fields import get_default_field_value - - - def instance_default_precedence(field, value): + def instance_default_precedence(): return 'baz' - def instance_example(field, value): + def instance_example(): return 'bar' - def instance_example_ignored_array(field, value): - return get_default_field_value(field, value) - - - def instance_example_ignored_object(field, value): - return get_default_field_value(field, value) - - - def instance_long_default_formatted(field, value): + def instance_long_default_formatted(): return [ ['01', '02', '03', '04', '05'], ['06', '07', '08', '09', '10'], @@ -132,7 +121,7 @@ def instance_long_default_formatted(field, value): from typing import Any, Mapping, Optional, Sequence - 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 @@ -141,36 +130,45 @@ def instance_long_default_formatted(field, value): class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - default_precedence: Optional[str] - example: Optional[str] - example_ignored_array: Optional[Sequence[str]] - example_ignored_object: Optional[Mapping[str, Any]] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + default_precedence: Optional[str] = None + example: Optional[str] = None + example_ignored_array: Optional[Sequence[str]] = None + example_ignored_object: Optional[Mapping[str, Any]] = None foo: str - long_default_formatted: Optional[Sequence[Sequence[str]]] + long_default_formatted: Optional[Sequence[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_deprecations.py b/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_deprecations.py index 2eb97101ab588..aba066ef50a72 100644 --- a/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_deprecations.py +++ b/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_deprecations.py @@ -43,7 +43,7 @@ def test(): model_definitions = consumer.render() files = model_definitions['test.yaml'] - assert len(files) == 6 + assert len(files) == 5 _, validators_errors = files['validators.py'] assert not validators_errors diff --git a/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_duplicate_hidden.py b/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_duplicate_hidden.py index ca504691d97fb..ffdc50f10cf53 100644 --- a/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_duplicate_hidden.py +++ b/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_duplicate_hidden.py @@ -60,11 +60,11 @@ def config(self) -> InstanceConfig: defaults_contents, defaults_errors = files['defaults.py'] assert not defaults_errors - assert defaults_contents == normalize_yaml( + assert defaults_contents == '\n' + normalize_yaml( """ - def instance_password(field, value): + def instance_password(): return 'secret' """ ) @@ -77,7 +77,7 @@ def instance_password(field, value): 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 @@ -86,32 +86,41 @@ def instance_password(field, value): class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) foo: str - password: Optional[str] + password: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_enum.py b/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_enum.py index 5a73b9298ca54..614e165f06324 100644 --- a/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_enum.py +++ b/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_enum.py @@ -56,9 +56,9 @@ def config(self) -> InstanceConfig: defaults_contents, defaults_errors = generated_files['defaults.py'] assert not defaults_errors - assert defaults_contents == normalize_yaml( + assert defaults_contents == '\n' + normalize_yaml( """ - def instance_my_str(field, value): + def instance_my_str(): return 'a' """ ) @@ -69,9 +69,10 @@ def instance_my_str(field, value): """ 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 @@ -80,32 +81,41 @@ def instance_my_str(field, value): class InstanceConfig(BaseModel): - class Config: - allow_mutation = False + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + my_str: Optional[Literal['a', 'b', 'c']] = None - my_str: Optional[Literal['a', 'b', 'c']] - - @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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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)) """ ) assert instance_model_contents == instace_model_expected_contents @@ -161,9 +171,9 @@ def config(self) -> InstanceConfig: defaults_contents, defaults_errors = generated_files['defaults.py'] assert not defaults_errors - assert defaults_contents == normalize_yaml( + assert defaults_contents == '\n' + normalize_yaml( """ - def instance_my_int(field, value): + def instance_my_int(): return 1 """ ) @@ -174,9 +184,10 @@ def instance_my_int(field, value): """ 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 @@ -185,32 +196,41 @@ def instance_my_int(field, value): class InstanceConfig(BaseModel): - class Config: - allow_mutation = False + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + my_int: Optional[Literal[1, 2, 3]] = None - my_int: Optional[Literal[1, 2, 3]] - - @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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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)) """ ) assert instance_model_contents == instace_model_expected_contents diff --git a/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_merge_instances.py b/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_merge_instances.py index bae4a51224ba3..eb4b23dfe65f5 100644 --- a/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_merge_instances.py +++ b/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_merge_instances.py @@ -46,7 +46,7 @@ def test(): assert len(model_definitions) == 1 files = model_definitions['test.yaml'] - assert len(files) == 4 + assert len(files) == 3 validators_contents, validators_errors = files['validators.py'] assert not validators_errors @@ -68,18 +68,6 @@ def config(self) -> InstanceConfig: """ ) - defaults_contents, defaults_errors = files['defaults.py'] - assert not defaults_errors - assert defaults_contents == normalize_yaml( - """ - from datadog_checks.base.utils.models.fields import get_default_field_value - - - def instance_foo(field, value): - return get_default_field_value(field, value) - """ - ) - instance_model_contents, instance_model_errors = files['instance.py'] assert not instance_model_errors assert instance_model_contents == normalize_yaml( @@ -88,41 +76,41 @@ def instance_foo(field, value): 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 InstanceConfig(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) bar: str - foo: Optional[str] + foo: 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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_nested_option.py b/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_nested_option.py index a9c3115fda0be..25693e22ba180 100644 --- a/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_nested_option.py +++ b/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_nested_option.py @@ -48,7 +48,7 @@ def test(): assert len(model_definitions) == 1 files = model_definitions['test.yaml'] - assert len(files) == 4 + assert len(files) == 3 validators_contents, validators_errors = files['validators.py'] assert not validators_errors @@ -70,18 +70,6 @@ def config(self) -> InstanceConfig: """ ) - defaults_contents, defaults_errors = files['defaults.py'] - assert not defaults_errors - assert defaults_contents == normalize_yaml( - """ - from datadog_checks.base.utils.models.fields import get_default_field_value - - - def instance_settings(field, value): - return get_default_field_value(field, value) - """ - ) - instance_model_contents, instance_model_errors = files['instance.py'] assert not instance_model_errors assert instance_model_contents == normalize_yaml( @@ -90,57 +78,57 @@ def instance_settings(field, value): from typing import Optional, Sequence - 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 Setting2(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + frozen=True, + ) bar: str - baz: Optional[Sequence[str]] + baz: Optional[Sequence[str]] = None class Settings(BaseModel): - class Config: - allow_mutation = False - - setting1: Optional[str] - setting2: Optional[Setting2] + model_config = ConfigDict( + frozen=True, + ) + setting1: Optional[str] = None + setting2: Optional[Setting2] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) foo: str - settings: Optional[Settings] + settings: Optional[Settings] = 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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_object_arbitrary_values.py b/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_object_arbitrary_values.py index 5e2e3dd4afca7..1b762b7dbfa0e 100644 --- a/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_object_arbitrary_values.py +++ b/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_object_arbitrary_values.py @@ -33,7 +33,7 @@ def test(): assert len(model_definitions) == 1 files = model_definitions['test.yaml'] - assert len(files) == 4 + assert len(files) == 3 validators_contents, validators_errors = files['validators.py'] assert not validators_errors @@ -55,18 +55,6 @@ def config(self) -> InstanceConfig: """ ) - defaults_contents, defaults_errors = files['defaults.py'] - assert not defaults_errors - assert defaults_contents == normalize_yaml( - """ - from datadog_checks.base.utils.models.fields import get_default_field_value - - - def instance_obj(field, value): - return get_default_field_value(field, value) - """ - ) - instance_model_contents, instance_model_errors = files['instance.py'] assert not instance_model_errors assert instance_model_contents == normalize_yaml( @@ -75,41 +63,41 @@ def instance_obj(field, value): from typing import Any, Mapping, 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 InstanceConfig(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) foo: str - obj: Optional[Mapping[str, Any]] + obj: Optional[Mapping[str, Any]] = 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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_object_model.py b/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_object_model.py index 7b9f6d28b1865..fe025ed3f19e5 100644 --- a/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_object_model.py +++ b/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_object_model.py @@ -41,7 +41,7 @@ def test(): assert len(model_definitions) == 1 files = model_definitions['test.yaml'] - assert len(files) == 4 + assert len(files) == 3 validators_contents, validators_errors = files['validators.py'] assert not validators_errors @@ -63,18 +63,6 @@ def config(self) -> InstanceConfig: """ ) - defaults_contents, defaults_errors = files['defaults.py'] - assert not defaults_errors - assert defaults_contents == normalize_yaml( - """ - from datadog_checks.base.utils.models.fields import get_default_field_value - - - def instance_obj(field, value): - return get_default_field_value(field, value) - """ - ) - instance_model_contents, instance_model_errors = files['instance.py'] assert not instance_model_errors assert instance_model_contents == normalize_yaml( @@ -83,49 +71,49 @@ def instance_obj(field, value): from typing import Optional, Sequence - 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 Obj(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + frozen=True, + ) bar: str - baz: Optional[Sequence[str]] + baz: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) foo: str - obj: Optional[Obj] + obj: Optional[Obj] = 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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_object_typed_values.py b/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_object_typed_values.py index 1ac44c4e85de3..e307459352992 100644 --- a/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_object_typed_values.py +++ b/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_object_typed_values.py @@ -36,7 +36,7 @@ def test(): assert len(model_definitions) == 1 files = model_definitions['test.yaml'] - assert len(files) == 4 + assert len(files) == 3 validators_contents, validators_errors = files['validators.py'] assert not validators_errors @@ -58,18 +58,6 @@ def config(self) -> InstanceConfig: """ ) - defaults_contents, defaults_errors = files['defaults.py'] - assert not defaults_errors - assert defaults_contents == normalize_yaml( - """ - from datadog_checks.base.utils.models.fields import get_default_field_value - - - def instance_obj(field, value): - return get_default_field_value(field, value) - """ - ) - instance_model_contents, instance_model_errors = files['instance.py'] assert not instance_model_errors assert instance_model_contents == normalize_yaml( @@ -78,41 +66,41 @@ def instance_obj(field, value): from typing import Mapping, Optional, Sequence - 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 InstanceConfig(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) foo: str - obj: Optional[Mapping[str, Sequence[float]]] + obj: Optional[Mapping[str, Sequence[float]]] = 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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_only_shared.py b/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_only_shared.py index 504d8270fcec8..3ba607df3d9c0 100644 --- a/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_only_shared.py +++ b/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_only_shared.py @@ -27,7 +27,7 @@ def test(): assert len(model_definitions) == 1 files = model_definitions['test.yaml'] - assert len(files) == 4 + assert len(files) == 3 validators_contents, validators_errors = files['validators.py'] assert not validators_errors @@ -49,18 +49,6 @@ def shared_config(self) -> SharedConfig: """ ) - defaults_contents, defaults_errors = files['defaults.py'] - assert not defaults_errors - assert defaults_contents == normalize_yaml( - """ - from datadog_checks.base.utils.models.fields import get_default_field_value - - - def shared_foo(field, value): - return get_default_field_value(field, value) - """ - ) - shared_model_contents, shared_model_errors = files['shared.py'] assert not shared_model_errors assert shared_model_contents == normalize_yaml( @@ -69,40 +57,40 @@ def shared_foo(field, value): 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + foo: Optional[str] = None - foo: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_option_name_normalization.py b/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_option_name_normalization.py index 225746e43a66d..5b2869035c79b 100644 --- a/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_option_name_normalization.py +++ b/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_option_name_normalization.py @@ -32,7 +32,7 @@ def test(): assert len(model_definitions) == 1 files = model_definitions['test.yaml'] - assert len(files) == 4 + assert len(files) == 3 validators_contents, validators_errors = files['validators.py'] assert not validators_errors @@ -54,18 +54,6 @@ def config(self) -> InstanceConfig: """ ) - defaults_contents, defaults_errors = files['defaults.py'] - assert not defaults_errors - assert defaults_contents == normalize_yaml( - """ - from datadog_checks.base.utils.models.fields import get_default_field_value - - - def instance_bar_baz(field, value): - return get_default_field_value(field, value) - """ - ) - instance_model_contents, instance_model_errors = files['instance.py'] assert not instance_model_errors assert instance_model_contents == normalize_yaml( @@ -74,41 +62,41 @@ def instance_bar_baz(field, value): from typing import Optional - from pydantic import BaseModel, 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 - from . import defaults, validators + from . import validators class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) bar_baz: Optional[str] = Field(None, alias='bar-baz') foo: 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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_union_types.py b/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_union_types.py index 738a2adb971d0..6c075f31408d8 100644 --- a/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_union_types.py +++ b/datadog_checks_dev/tests/tooling/configuration/consumers/model/test_union_types.py @@ -36,7 +36,7 @@ def test(): assert len(model_definitions) == 1 files = model_definitions['test.yaml'] - assert len(files) == 4 + assert len(files) == 3 validators_contents, validators_errors = files['validators.py'] assert not validators_errors @@ -58,18 +58,6 @@ def config(self) -> InstanceConfig: """ ) - defaults_contents, defaults_errors = files['defaults.py'] - assert not defaults_errors - assert defaults_contents == normalize_yaml( - """ - from datadog_checks.base.utils.models.fields import get_default_field_value - - - def instance_obj(field, value): - return get_default_field_value(field, value) - """ - ) - instance_model_contents, instance_model_errors = files['instance.py'] assert not instance_model_errors assert instance_model_contents == normalize_yaml( @@ -78,41 +66,41 @@ def instance_obj(field, value): from typing import Optional, Sequence, 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 - from . import defaults, validators + from . import validators class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) foo: str - obj: Optional[Union[str, Sequence[str]]] + obj: Optional[Union[str, Sequence[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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/datadog_cluster_agent/datadog_checks/datadog_cluster_agent/config_models/defaults.py b/datadog_cluster_agent/datadog_checks/datadog_cluster_agent/config_models/defaults.py index 9d0d06c6805c6..6cc07ac1c3a3e 100644 --- a/datadog_cluster_agent/datadog_checks/datadog_cluster_agent/config_models/defaults.py +++ b/datadog_cluster_agent/datadog_checks/datadog_cluster_agent/config_models/defaults.py @@ -7,272 +7,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/datadog_cluster_agent/datadog_checks/datadog_cluster_agent/config_models/instance.py b/datadog_cluster_agent/datadog_checks/datadog_cluster_agent/config_models/instance.py index 4bb176acb6d2f..5ded4c1b97033 100644 --- a/datadog_cluster_agent/datadog_checks/datadog_cluster_agent/config_models/instance.py +++ b/datadog_cluster_agent/datadog_checks/datadog_cluster_agent/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,140 +20,149 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[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( + frozen=True, + ) + target_label_key: Optional[str] = None + target_label_value_list: Optional[Sequence[str]] = None class TargetMetric(BaseModel): - class Config: - allow_mutation = False - - label_to_match: Optional[str] - labels_to_get: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + label_to_match: Optional[str] = None + labels_to_get: Optional[Sequence[str]] = None class LabelJoins(BaseModel): - class Config: - allow_mutation = False - - target_metric: Optional[TargetMetric] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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]] - 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] + model_config = ConfigDict( + validate_default=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[Sequence[str]] = None + extra_headers: Optional[Mapping[str, Any]] = None + headers: Optional[Mapping[str, Any]] = None + health_service_check: Optional[bool] = None + ignore_metrics: Optional[Sequence[str]] = None + ignore_metrics_by_labels: Optional[IgnoreMetricsByLabels] = None + ignore_tags: Optional[Sequence[str]] = None + include_labels: Optional[Sequence[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[Mapping[str, Any]] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[Sequence[Union[str, Mapping[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[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + type_overrides: Optional[Mapping[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/datadog_cluster_agent/datadog_checks/datadog_cluster_agent/config_models/shared.py b/datadog_cluster_agent/datadog_checks/datadog_cluster_agent/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/datadog_cluster_agent/datadog_checks/datadog_cluster_agent/config_models/shared.py +++ b/datadog_cluster_agent/datadog_checks/datadog_cluster_agent/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/dcgm/datadog_checks/dcgm/config_models/defaults.py b/dcgm/datadog_checks/dcgm/config_models/defaults.py index c7f245d1a5e04..ce57e52bb4d03 100644 --- a/dcgm/datadog_checks/dcgm/config_models/defaults.py +++ b/dcgm/datadog_checks/dcgm/config_models/defaults.py @@ -7,284 +7,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/dcgm/datadog_checks/dcgm/config_models/instance.py b/dcgm/datadog_checks/dcgm/config_models/instance.py index 5a32f2666573e..364568d359afa 100644 --- a/dcgm/datadog_checks/dcgm/config_models/instance.py +++ b/dcgm/datadog_checks/dcgm/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,146 +20,155 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + labels: Optional[Sequence[str]] = None + match: Optional[Sequence[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, + 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[Sequence[str]] = None + exclude_metrics: Optional[Sequence[str]] = None + exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] = None + extra_headers: Optional[Mapping[str, Any]] = None + extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] = None + headers: Optional[Mapping[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[Sequence[str]] = None + include_labels: Optional[Sequence[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[Sequence[Union[str, Mapping[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[Sequence[str]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[Mapping[str, Any]] = None + request_size: Optional[float] = None + service: Optional[str] = None + share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/dcgm/datadog_checks/dcgm/config_models/shared.py b/dcgm/datadog_checks/dcgm/config_models/shared.py index 5bf22be279a60..59c534d071001 100644 --- a/dcgm/datadog_checks/dcgm/config_models/shared.py +++ b/dcgm/datadog_checks/dcgm/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/ddev/src/ddev/plugin/external/hatch/environment_collector.py b/ddev/src/ddev/plugin/external/hatch/environment_collector.py index 99dd4d44056f9..a5ad2b14e3cd4 100644 --- a/ddev/src/ddev/plugin/external/hatch/environment_collector.py +++ b/ddev/src/ddev/plugin/external/hatch/environment_collector.py @@ -120,7 +120,7 @@ def get_initial_config(self): 'black==22.12.0', 'ruff==0.0.257', # Keep in sync with: /datadog_checks_base/pyproject.toml - 'pydantic==1.10.8', + 'pydantic==2.0.2', ], } config = {'lint': lint_env} diff --git a/directory/datadog_checks/directory/config_models/defaults.py b/directory/datadog_checks/directory/config_models/defaults.py index 9b4dcb70f47ae..a633b95516a97 100644 --- a/directory/datadog_checks/directory/config_models/defaults.py +++ b/directory/datadog_checks/directory/config_models/defaults.py @@ -7,84 +7,50 @@ # 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_countonly(field, value): +def instance_countonly(): return False -def instance_dirs_patterns_full(field, value): +def instance_dirs_patterns_full(): return False -def instance_dirtagname(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_dirs(field, value): - return get_default_field_value(field, value) - - -def instance_filegauges(field, value): +def instance_filegauges(): return False -def instance_filetagname(field, value): - return get_default_field_value(field, value) - - -def instance_follow_symlinks(field, value): +def instance_follow_symlinks(): return True -def instance_ignore_missing(field, value): +def instance_ignore_missing(): 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_name(field, value): - return get_default_field_value(field, value) - - -def instance_pattern(field, value): +def instance_pattern(): return '*' -def instance_recursive(field, value): +def instance_recursive(): return False -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_stat_follow_symlinks(field, value): +def instance_stat_follow_symlinks(): return True -def instance_submit_histograms(field, value): +def instance_submit_histograms(): return True - - -def instance_tags(field, value): - return get_default_field_value(field, value) diff --git a/directory/datadog_checks/directory/config_models/instance.py b/directory/datadog_checks/directory/config_models/instance.py index eea53d27ed2db..071490eb1e54b 100644 --- a/directory/datadog_checks/directory/config_models/instance.py +++ b/directory/datadog_checks/directory/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,56 +20,65 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - countonly: Optional[bool] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + countonly: Optional[bool] = None directory: str - dirs_patterns_full: Optional[bool] - dirtagname: Optional[str] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - exclude_dirs: Optional[Sequence[str]] - filegauges: Optional[bool] - filetagname: Optional[str] - follow_symlinks: Optional[bool] - ignore_missing: Optional[bool] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - name: Optional[str] - pattern: Optional[str] - recursive: Optional[bool] - service: Optional[str] - stat_follow_symlinks: Optional[bool] - submit_histograms: Optional[bool] - tags: Optional[Sequence[str]] - - @root_validator(pre=True) + dirs_patterns_full: Optional[bool] = None + dirtagname: Optional[str] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + exclude_dirs: Optional[Sequence[str]] = None + filegauges: Optional[bool] = None + filetagname: Optional[str] = None + follow_symlinks: Optional[bool] = None + ignore_missing: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + name: Optional[str] = None + pattern: Optional[str] = None + recursive: Optional[bool] = None + service: Optional[str] = None + stat_follow_symlinks: Optional[bool] = None + submit_histograms: Optional[bool] = None + tags: Optional[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/directory/datadog_checks/directory/config_models/shared.py b/directory/datadog_checks/directory/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/directory/datadog_checks/directory/config_models/shared.py +++ b/directory/datadog_checks/directory/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/disk/datadog_checks/disk/config_models/defaults.py b/disk/datadog_checks/disk/config_models/defaults.py index 8f46ae88b28dd..cc71b94e4471c 100644 --- a/disk/datadog_checks/disk/config_models/defaults.py +++ b/disk/datadog_checks/disk/config_models/defaults.py @@ -7,116 +7,50 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_device_global_exclude(field, value): - return get_default_field_value(field, value) - - -def shared_file_system_global_exclude(field, value): - return get_default_field_value(field, value) - - -def shared_mount_point_global_exclude(field, value): - return get_default_field_value(field, value) - - -def shared_service(field, value): - return get_default_field_value(field, value) - - -def instance_all_partitions(field, value): +def instance_all_partitions(): return False -def instance_blkid_cache_file(field, value): - return get_default_field_value(field, value) - - -def instance_create_mounts(field, value): - return get_default_field_value(field, value) - - -def instance_device_exclude(field, value): - return get_default_field_value(field, value) - - -def instance_device_include(field, value): - return get_default_field_value(field, value) - - -def instance_device_tag_re(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_file_system_exclude(field, value): - return get_default_field_value(field, value) - - -def instance_file_system_include(field, value): - return get_default_field_value(field, value) - - -def instance_include_all_devices(field, value): +def instance_include_all_devices(): return True -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_min_disk_size(field, value): +def instance_min_disk_size(): return 0 -def instance_mount_point_exclude(field, value): - return get_default_field_value(field, value) - - -def instance_mount_point_include(field, value): - return get_default_field_value(field, value) - - -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_service_check_rw(field, value): +def instance_service_check_rw(): return False -def instance_tag_by_filesystem(field, value): +def instance_tag_by_filesystem(): return False -def instance_tag_by_label(field, value): +def instance_tag_by_label(): return True -def instance_tags(field, value): - return get_default_field_value(field, value) - - -def instance_timeout(field, value): +def instance_timeout(): return 5 -def instance_use_lsblk(field, value): +def instance_use_lsblk(): return False -def instance_use_mount(field, value): +def instance_use_mount(): return False diff --git a/disk/datadog_checks/disk/config_models/instance.py b/disk/datadog_checks/disk/config_models/instance.py index 0a05b4b08ffc8..d2190c7145100 100644 --- a/disk/datadog_checks/disk/config_models/instance.py +++ b/disk/datadog_checks/disk/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,72 +20,81 @@ class CreateMount(BaseModel): - class Config: - allow_mutation = False - - host: Optional[str] - mountpoint: Optional[str] - password: Optional[str] - share: Optional[str] - type: Optional[str] - user: Optional[str] + model_config = ConfigDict( + frozen=True, + ) + host: Optional[str] = None + mountpoint: Optional[str] = None + password: Optional[str] = None + share: Optional[str] = None + type: Optional[str] = None + user: Optional[str] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - all_partitions: Optional[bool] - blkid_cache_file: Optional[str] - create_mounts: Optional[Sequence[CreateMount]] - device_exclude: Optional[Sequence[str]] - device_include: Optional[Sequence[str]] - device_tag_re: Optional[Mapping[str, Any]] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - file_system_exclude: Optional[Sequence[str]] - file_system_include: Optional[Sequence[str]] - include_all_devices: Optional[bool] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - min_disk_size: Optional[float] - mount_point_exclude: Optional[Sequence[str]] - mount_point_include: Optional[Sequence[str]] - service: Optional[str] - service_check_rw: Optional[bool] - tag_by_filesystem: Optional[bool] - tag_by_label: Optional[bool] - tags: Optional[Sequence[str]] - timeout: Optional[int] - use_lsblk: Optional[bool] - use_mount: Optional[bool] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + all_partitions: Optional[bool] = None + blkid_cache_file: Optional[str] = None + create_mounts: Optional[Sequence[CreateMount]] = None + device_exclude: Optional[Sequence[str]] = None + device_include: Optional[Sequence[str]] = None + device_tag_re: Optional[Mapping[str, Any]] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + file_system_exclude: Optional[Sequence[str]] = None + file_system_include: Optional[Sequence[str]] = None + include_all_devices: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + min_disk_size: Optional[float] = None + mount_point_exclude: Optional[Sequence[str]] = None + mount_point_include: Optional[Sequence[str]] = None + service: Optional[str] = None + service_check_rw: Optional[bool] = None + tag_by_filesystem: Optional[bool] = None + tag_by_label: Optional[bool] = None + tags: Optional[Sequence[str]] = None + timeout: Optional[int] = None + use_lsblk: Optional[bool] = None + use_mount: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/disk/datadog_checks/disk/config_models/shared.py b/disk/datadog_checks/disk/config_models/shared.py index db701e9075455..f26e88b208fdf 100644 --- a/disk/datadog_checks/disk/config_models/shared.py +++ b/disk/datadog_checks/disk/config_models/shared.py @@ -11,41 +11,41 @@ from typing import Optional, Sequence -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 - - device_global_exclude: Optional[Sequence[str]] - file_system_global_exclude: Optional[Sequence[str]] - mount_point_global_exclude: Optional[Sequence[str]] - service: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + device_global_exclude: Optional[Sequence[str]] = None + file_system_global_exclude: Optional[Sequence[str]] = None + mount_point_global_exclude: Optional[Sequence[str]] = None + 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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/dns_check/datadog_checks/dns_check/config_models/defaults.py b/dns_check/datadog_checks/dns_check/config_models/defaults.py index 84917b1a99ca0..7c4fab390ba15 100644 --- a/dns_check/datadog_checks/dns_check/config_models/defaults.py +++ b/dns_check/datadog_checks/dns_check/config_models/defaults.py @@ -7,60 +7,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_default_timeout(field, value): +def shared_default_timeout(): return 5 -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_name(field, value): - return get_default_field_value(field, value) - - -def instance_nameserver(field, value): - return get_default_field_value(field, value) - - -def instance_nameserver_port(field, value): +def instance_nameserver_port(): return 53 -def instance_record_type(field, value): +def instance_record_type(): return 'A' -def instance_resolves_as(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 5 diff --git a/dns_check/datadog_checks/dns_check/config_models/instance.py b/dns_check/datadog_checks/dns_check/config_models/instance.py index b56433555bae7..28bf117ac104f 100644 --- a/dns_check/datadog_checks/dns_check/config_models/instance.py +++ b/dns_check/datadog_checks/dns_check/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,49 +20,58 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[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, + 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] - name: Optional[str] - nameserver: Optional[str] - nameserver_port: Optional[int] - record_type: Optional[str] - resolves_as: Optional[str] - service: Optional[str] - tags: Optional[Sequence[str]] - timeout: Optional[int] - - @root_validator(pre=True) + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + name: Optional[str] = None + nameserver: Optional[str] = None + nameserver_port: Optional[int] = None + record_type: Optional[str] = None + resolves_as: Optional[str] = None + service: Optional[str] = None + tags: Optional[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/dns_check/datadog_checks/dns_check/config_models/shared.py b/dns_check/datadog_checks/dns_check/config_models/shared.py index a945b3a08a144..76b4effac7b5f 100644 --- a/dns_check/datadog_checks/dns_check/config_models/shared.py +++ b/dns_check/datadog_checks/dns_check/config_models/shared.py @@ -11,7 +11,7 @@ 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 @@ -20,30 +20,39 @@ class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - default_timeout: Optional[int] - service: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + default_timeout: Optional[int] = None + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/dotnetclr/datadog_checks/dotnetclr/config_models/defaults.py b/dotnetclr/datadog_checks/dotnetclr/config_models/defaults.py index 4f39e93679a20..3d179e23b96bc 100644 --- a/dotnetclr/datadog_checks/dotnetclr/config_models/defaults.py +++ b/dotnetclr/datadog_checks/dotnetclr/config_models/defaults.py @@ -7,84 +7,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 shared_use_localized_counters(field, value): +def shared_use_localized_counters(): return False -def instance_additional_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_counter_data_types(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_extra_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_host(field, value): +def instance_host(): return '.' -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_password(field, value): - return get_default_field_value(field, value) - - -def instance_server(field, value): - return get_default_field_value(field, value) - - -def instance_server_tag(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_use_legacy_check_version(field, value): +def instance_use_legacy_check_version(): return False - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/dotnetclr/datadog_checks/dotnetclr/config_models/instance.py b/dotnetclr/datadog_checks/dotnetclr/config_models/instance.py index 6f8a26fe45109..5edb57d89d89e 100644 --- a/dotnetclr/datadog_checks/dotnetclr/config_models/instance.py +++ b/dotnetclr/datadog_checks/dotnetclr/config_models/instance.py @@ -9,9 +9,10 @@ from __future__ import annotations -from typing import Literal, Mapping, Optional, Sequence, Union +from typing import Mapping, Optional, Sequence, Union -from pydantic import BaseModel, Extra, Field, root_validator, validator +from pydantic import BaseModel, ConfigDict, Field, 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 @@ -20,101 +21,110 @@ class Counter(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - aggregate: Optional[Union[bool, Literal['only']]] - average: Optional[bool] - metric_name: Optional[str] - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + extra='allow', + frozen=True, + ) + aggregate: Optional[Union[bool, Literal['only']]] = None + average: Optional[bool] = None + metric_name: Optional[str] = None + name: Optional[str] = None + type: Optional[str] = None class InstanceCounts(BaseModel): - class Config: - allow_mutation = False - - monitored: Optional[str] - total: Optional[str] - unique: Optional[str] + model_config = ConfigDict( + frozen=True, + ) + monitored: Optional[str] = None + total: Optional[str] = None + unique: Optional[str] = None class ExtraMetrics(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + frozen=True, + ) counters: Sequence[Mapping[str, Union[str, Counter]]] - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] - instance_counts: Optional[InstanceCounts] + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None + instance_counts: Optional[InstanceCounts] = None name: str - tag_name: Optional[str] - use_localized_counters: Optional[bool] + tag_name: Optional[str] = None + use_localized_counters: Optional[bool] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metrics(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + frozen=True, + ) counters: Sequence[Mapping[str, Union[str, Counter]]] - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] - instance_counts: Optional[InstanceCounts] + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None + instance_counts: Optional[InstanceCounts] = None name: str - tag_name: Optional[str] - use_localized_counters: Optional[bool] + tag_name: Optional[str] = None + use_localized_counters: Optional[bool] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - additional_metrics: Optional[Sequence[Sequence[str]]] - counter_data_types: Optional[Sequence[str]] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - enable_health_service_check: Optional[bool] - extra_metrics: Optional[Mapping[str, ExtraMetrics]] - host: Optional[str] - metric_patterns: Optional[MetricPatterns] - metrics: Optional[Mapping[str, Metrics]] - min_collection_interval: Optional[float] - namespace: Optional[str] = Field(None, regex='\\w*') - password: Optional[str] - server: Optional[str] - server_tag: Optional[str] - service: Optional[str] - tags: Optional[Sequence[str]] - use_legacy_check_version: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + additional_metrics: Optional[Sequence[Sequence[str]]] = None + counter_data_types: Optional[Sequence[str]] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + enable_health_service_check: Optional[bool] = None + extra_metrics: Optional[Mapping[str, ExtraMetrics]] = None + host: Optional[str] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[Mapping[str, Metrics]] = None + min_collection_interval: Optional[float] = None + namespace: Optional[str] = Field(None, pattern='\\w*') + password: Optional[str] = None + server: Optional[str] = None + server_tag: Optional[str] = None + service: Optional[str] = None + tags: Optional[Sequence[str]] = None + use_legacy_check_version: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/dotnetclr/datadog_checks/dotnetclr/config_models/shared.py b/dotnetclr/datadog_checks/dotnetclr/config_models/shared.py index eefbab173ede1..aa58639466c05 100644 --- a/dotnetclr/datadog_checks/dotnetclr/config_models/shared.py +++ b/dotnetclr/datadog_checks/dotnetclr/config_models/shared.py @@ -11,7 +11,7 @@ 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 @@ -20,30 +20,39 @@ class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - service: Optional[str] - use_localized_counters: Optional[bool] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None + use_localized_counters: Optional[bool] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/druid/datadog_checks/druid/config_models/defaults.py b/druid/datadog_checks/druid/config_models/defaults.py index 0a32cc4dc3c7a..81b466607723e 100644 --- a/druid/datadog_checks/druid/config_models/defaults.py +++ b/druid/datadog_checks/druid/config_models/defaults.py @@ -7,180 +7,78 @@ # 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 False -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 False -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_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/druid/datadog_checks/druid/config_models/instance.py b/druid/datadog_checks/druid/config_models/instance.py index 22d2339b17335..b0c9dd6112c5c 100644 --- a/druid/datadog_checks/druid/config_models/instance.py +++ b/druid/datadog_checks/druid/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,94 +20,103 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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] - read_timeout: Optional[float] - request_size: Optional[float] - 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] + model_config = ConfigDict( + validate_default=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[Mapping[str, Any]] = None + headers: Optional[Mapping[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 + read_timeout: Optional[float] = None + request_size: Optional[float] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None url: str - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] + use_legacy_auth_encoding: Optional[bool] = None + username: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/druid/datadog_checks/druid/config_models/shared.py b/druid/datadog_checks/druid/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/druid/datadog_checks/druid/config_models/shared.py +++ b/druid/datadog_checks/druid/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/ecs_fargate/datadog_checks/ecs_fargate/config_models/defaults.py b/ecs_fargate/datadog_checks/ecs_fargate/config_models/defaults.py index 870e2716c3f9f..2028ece5ab1a4 100644 --- a/ecs_fargate/datadog_checks/ecs_fargate/config_models/defaults.py +++ b/ecs_fargate/datadog_checks/ecs_fargate/config_models/defaults.py @@ -7,180 +7,78 @@ # 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 False -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 20 -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_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_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/ecs_fargate/datadog_checks/ecs_fargate/config_models/instance.py b/ecs_fargate/datadog_checks/ecs_fargate/config_models/instance.py index 41ccd2a6e6e1b..f15b81079e318 100644 --- a/ecs_fargate/datadog_checks/ecs_fargate/config_models/instance.py +++ b/ecs_fargate/datadog_checks/ecs_fargate/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,93 +20,102 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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] - read_timeout: Optional[float] - request_size: Optional[float] - 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] - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=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[Mapping[str, Any]] = None + headers: Optional[Mapping[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 + read_timeout: Optional[float] = None + request_size: Optional[float] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + use_legacy_auth_encoding: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/ecs_fargate/datadog_checks/ecs_fargate/config_models/shared.py b/ecs_fargate/datadog_checks/ecs_fargate/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/ecs_fargate/datadog_checks/ecs_fargate/config_models/shared.py +++ b/ecs_fargate/datadog_checks/ecs_fargate/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/eks_fargate/datadog_checks/eks_fargate/config_models/defaults.py b/eks_fargate/datadog_checks/eks_fargate/config_models/defaults.py index 0a32cc4dc3c7a..81b466607723e 100644 --- a/eks_fargate/datadog_checks/eks_fargate/config_models/defaults.py +++ b/eks_fargate/datadog_checks/eks_fargate/config_models/defaults.py @@ -7,180 +7,78 @@ # 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 False -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 False -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_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/eks_fargate/datadog_checks/eks_fargate/config_models/instance.py b/eks_fargate/datadog_checks/eks_fargate/config_models/instance.py index 41ccd2a6e6e1b..f15b81079e318 100644 --- a/eks_fargate/datadog_checks/eks_fargate/config_models/instance.py +++ b/eks_fargate/datadog_checks/eks_fargate/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,93 +20,102 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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] - read_timeout: Optional[float] - request_size: Optional[float] - 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] - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=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[Mapping[str, Any]] = None + headers: Optional[Mapping[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 + read_timeout: Optional[float] = None + request_size: Optional[float] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + use_legacy_auth_encoding: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/eks_fargate/datadog_checks/eks_fargate/config_models/shared.py b/eks_fargate/datadog_checks/eks_fargate/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/eks_fargate/datadog_checks/eks_fargate/config_models/shared.py +++ b/eks_fargate/datadog_checks/eks_fargate/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/elastic/datadog_checks/elastic/config_models/defaults.py b/elastic/datadog_checks/elastic/config_models/defaults.py index 7e14e96e0af35..4275721ee189d 100644 --- a/elastic/datadog_checks/elastic/config_models/defaults.py +++ b/elastic/datadog_checks/elastic/config_models/defaults.py @@ -7,236 +7,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_admin_forwarder(field, value): +def instance_admin_forwarder(): return False -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_cat_allocation_stats(field, value): +def instance_cat_allocation_stats(): return False -def instance_cluster_stats(field, value): +def instance_cluster_stats(): return False -def instance_connect_timeout(field, value): - return get_default_field_value(field, value) - - -def instance_custom_queries(field, value): - return get_default_field_value(field, value) - - -def instance_detailed_index_stats(field, value): +def instance_detailed_index_stats(): return False -def instance_disable_generic_tags(field, value): +def instance_disable_generic_tags(): return False -def instance_disable_legacy_cluster_tag(field, value): +def instance_disable_legacy_cluster_tag(): return False -def instance_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return False -def instance_extra_headers(field, value): - return get_default_field_value(field, value) - - -def instance_gc_collectors_as_rate(field, value): +def instance_gc_collectors_as_rate(): return False -def instance_headers(field, value): - return get_default_field_value(field, value) - - -def instance_index_stats(field, value): +def instance_index_stats(): 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_min_collection_interval(field, value): +def instance_min_collection_interval(): return 15 -def instance_node_name_as_host(field, value): +def instance_node_name_as_host(): 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_pending_task_stats(field, value): +def instance_pending_task_stats(): return True -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_pshard_graceful_timeout(field, value): +def instance_pshard_graceful_timeout(): return False -def instance_pshard_stats(field, value): +def instance_pshard_stats(): return False -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_skip_proxy(field, value): +def instance_skip_proxy(): return False -def instance_slm_stats(field, value): +def instance_slm_stats(): return False -def instance_submit_events(field, value): +def instance_submit_events(): return True -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/elastic/datadog_checks/elastic/config_models/instance.py b/elastic/datadog_checks/elastic/config_models/instance.py index f97837a87b7ef..4ac11de5cb817 100644 --- a/elastic/datadog_checks/elastic/config_models/instance.py +++ b/elastic/datadog_checks/elastic/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,128 +20,137 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class Column(BaseModel): - class Config: - allow_mutation = False - - name: Optional[str] - type: Optional[str] - value_path: Optional[str] + model_config = ConfigDict( + frozen=True, + ) + name: Optional[str] = None + type: Optional[str] = None + value_path: Optional[str] = None class CustomQuery(BaseModel): - class Config: - allow_mutation = False - - columns: Optional[Sequence[Column]] - data_path: Optional[str] - endpoint: Optional[str] - payload: Optional[Mapping[str, Any]] - tags: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + columns: Optional[Sequence[Column]] = None + data_path: Optional[str] = None + endpoint: Optional[str] = None + payload: Optional[Mapping[str, Any]] = None + tags: Optional[Sequence[str]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - admin_forwarder: Optional[bool] - allow_redirects: Optional[bool] - auth_token: Optional[AuthToken] - auth_type: Optional[str] - aws_host: Optional[str] - aws_region: Optional[str] - aws_service: Optional[str] - cat_allocation_stats: Optional[bool] - cluster_stats: Optional[bool] - connect_timeout: Optional[float] - custom_queries: Optional[Sequence[CustomQuery]] - detailed_index_stats: Optional[bool] - disable_generic_tags: Optional[bool] - disable_legacy_cluster_tag: Optional[bool] - empty_default_hostname: Optional[bool] - extra_headers: Optional[Mapping[str, Any]] - gc_collectors_as_rate: Optional[bool] - headers: Optional[Mapping[str, Any]] - index_stats: Optional[bool] - 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] - node_name_as_host: Optional[bool] - ntlm_domain: Optional[str] - password: Optional[str] - pending_task_stats: Optional[bool] - persist_connections: Optional[bool] - proxy: Optional[Proxy] - pshard_graceful_timeout: Optional[bool] - pshard_stats: Optional[bool] - read_timeout: Optional[float] - request_size: Optional[float] - service: Optional[str] - skip_proxy: Optional[bool] - slm_stats: Optional[bool] - submit_events: 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] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + admin_forwarder: Optional[bool] = None + 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 + cat_allocation_stats: Optional[bool] = None + cluster_stats: Optional[bool] = None + connect_timeout: Optional[float] = None + custom_queries: Optional[Sequence[CustomQuery]] = None + detailed_index_stats: Optional[bool] = None + disable_generic_tags: Optional[bool] = None + disable_legacy_cluster_tag: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + extra_headers: Optional[Mapping[str, Any]] = None + gc_collectors_as_rate: Optional[bool] = None + headers: Optional[Mapping[str, Any]] = None + index_stats: Optional[bool] = 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 + node_name_as_host: Optional[bool] = None + ntlm_domain: Optional[str] = None + password: Optional[str] = None + pending_task_stats: Optional[bool] = None + persist_connections: Optional[bool] = None + proxy: Optional[Proxy] = None + pshard_graceful_timeout: Optional[bool] = None + pshard_stats: Optional[bool] = None + read_timeout: Optional[float] = None + request_size: Optional[float] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + slm_stats: Optional[bool] = None + submit_events: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None url: str - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] + use_legacy_auth_encoding: Optional[bool] = None + username: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/elastic/datadog_checks/elastic/config_models/shared.py b/elastic/datadog_checks/elastic/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/elastic/datadog_checks/elastic/config_models/shared.py +++ b/elastic/datadog_checks/elastic/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/envoy/datadog_checks/envoy/config_models/defaults.py b/envoy/datadog_checks/envoy/config_models/defaults.py index 41d15a3382ade..0f496a2bf0b32 100644 --- a/envoy/datadog_checks/envoy/config_models/defaults.py +++ b/envoy/datadog_checks/envoy/config_models/defaults.py @@ -7,316 +7,150 @@ # 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_metrics(field, value): +def instance_cache_metrics(): 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_collect_server_info(field, value): +def instance_collect_server_info(): 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_disable_legacy_cluster_tag(field, value): +def instance_disable_legacy_cluster_tag(): 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_excluded_metrics(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_included_metrics(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://localhost:80/stats/prometheus' -def instance_parse_unknown_metrics(field, value): +def instance_parse_unknown_metrics(): return False -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_stats_url(field, value): +def instance_stats_url(): return 'http://localhost:80/stats' -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/envoy/datadog_checks/envoy/config_models/instance.py b/envoy/datadog_checks/envoy/config_models/instance.py index 32dcf8818a513..bb67674f09245 100644 --- a/envoy/datadog_checks/envoy/config_models/instance.py +++ b/envoy/datadog_checks/envoy/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,153 +20,162 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + labels: Optional[Sequence[str]] = None + match: Optional[Sequence[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_metrics: Optional[bool] - cache_shared_labels: Optional[bool] - collect_counters_with_distributions: Optional[bool] - collect_histogram_buckets: Optional[bool] - collect_server_info: Optional[bool] - connect_timeout: Optional[float] - disable_generic_tags: Optional[bool] - disable_legacy_cluster_tag: 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]]]] - excluded_metrics: Optional[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]] - included_metrics: 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] - parse_unknown_metrics: Optional[bool] - 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] - stats_url: Optional[str] - 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, + 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_metrics: Optional[bool] = None + cache_shared_labels: Optional[bool] = None + collect_counters_with_distributions: Optional[bool] = None + collect_histogram_buckets: Optional[bool] = None + collect_server_info: Optional[bool] = None + connect_timeout: Optional[float] = None + disable_generic_tags: Optional[bool] = None + disable_legacy_cluster_tag: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + enable_health_service_check: Optional[bool] = None + exclude_labels: Optional[Sequence[str]] = None + exclude_metrics: Optional[Sequence[str]] = None + exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] = None + excluded_metrics: Optional[Sequence[str]] = None + extra_headers: Optional[Mapping[str, Any]] = None + extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] = None + headers: Optional[Mapping[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[Sequence[str]] = None + include_labels: Optional[Sequence[str]] = None + included_metrics: Optional[Sequence[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[Sequence[Union[str, Mapping[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 + parse_unknown_metrics: Optional[bool] = None + password: Optional[str] = None + persist_connections: Optional[bool] = None + proxy: Optional[Proxy] = None + raw_line_filters: Optional[Sequence[str]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[Mapping[str, Any]] = None + request_size: Optional[float] = None + service: Optional[str] = None + share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + stats_url: Optional[str] = None + tag_by_endpoint: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/envoy/datadog_checks/envoy/config_models/shared.py b/envoy/datadog_checks/envoy/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/envoy/datadog_checks/envoy/config_models/shared.py +++ b/envoy/datadog_checks/envoy/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/etcd/datadog_checks/etcd/config_models/defaults.py b/etcd/datadog_checks/etcd/config_models/defaults.py index f23aaff8883d5..7b39bb262dde0 100644 --- a/etcd/datadog_checks/etcd/config_models/defaults.py +++ b/etcd/datadog_checks/etcd/config_models/defaults.py @@ -7,280 +7,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_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_leader_tag(field, value): +def instance_leader_tag(): return True -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_preview(field, value): +def instance_use_preview(): 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/etcd/datadog_checks/etcd/config_models/instance.py b/etcd/datadog_checks/etcd/config_models/instance.py index f3ce7bea50518..4e5ce72d0b2aa 100644 --- a/etcd/datadog_checks/etcd/config_models/instance.py +++ b/etcd/datadog_checks/etcd/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,142 +20,151 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[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( + frozen=True, + ) + target_label_key: Optional[str] = None + target_label_value_list: Optional[Sequence[str]] = None class TargetMetric(BaseModel): - class Config: - allow_mutation = False - - label_to_match: Optional[str] - labels_to_get: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + label_to_match: Optional[str] = None + labels_to_get: Optional[Sequence[str]] = None class LabelJoins(BaseModel): - class Config: - allow_mutation = False - - target_metric: Optional[TargetMetric] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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]] - 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]] - leader_tag: Optional[bool] - 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] + model_config = ConfigDict( + validate_default=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[Sequence[str]] = None + extra_headers: Optional[Mapping[str, Any]] = None + headers: Optional[Mapping[str, Any]] = None + health_service_check: Optional[bool] = None + ignore_metrics: Optional[Sequence[str]] = None + ignore_metrics_by_labels: Optional[IgnoreMetricsByLabels] = None + ignore_tags: Optional[Sequence[str]] = None + include_labels: Optional[Sequence[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[Mapping[str, Any]] = None + leader_tag: Optional[bool] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[Sequence[Union[str, Mapping[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_preview: 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[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + type_overrides: Optional[Mapping[str, Any]] = None + use_legacy_auth_encoding: Optional[bool] = None + use_preview: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/etcd/datadog_checks/etcd/config_models/shared.py b/etcd/datadog_checks/etcd/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/etcd/datadog_checks/etcd/config_models/shared.py +++ b/etcd/datadog_checks/etcd/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/exchange_server/datadog_checks/exchange_server/config_models/defaults.py b/exchange_server/datadog_checks/exchange_server/config_models/defaults.py index 4f39e93679a20..3d179e23b96bc 100644 --- a/exchange_server/datadog_checks/exchange_server/config_models/defaults.py +++ b/exchange_server/datadog_checks/exchange_server/config_models/defaults.py @@ -7,84 +7,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 shared_use_localized_counters(field, value): +def shared_use_localized_counters(): return False -def instance_additional_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_counter_data_types(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_extra_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_host(field, value): +def instance_host(): return '.' -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_password(field, value): - return get_default_field_value(field, value) - - -def instance_server(field, value): - return get_default_field_value(field, value) - - -def instance_server_tag(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_use_legacy_check_version(field, value): +def instance_use_legacy_check_version(): return False - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/exchange_server/datadog_checks/exchange_server/config_models/instance.py b/exchange_server/datadog_checks/exchange_server/config_models/instance.py index 6f8a26fe45109..5edb57d89d89e 100644 --- a/exchange_server/datadog_checks/exchange_server/config_models/instance.py +++ b/exchange_server/datadog_checks/exchange_server/config_models/instance.py @@ -9,9 +9,10 @@ from __future__ import annotations -from typing import Literal, Mapping, Optional, Sequence, Union +from typing import Mapping, Optional, Sequence, Union -from pydantic import BaseModel, Extra, Field, root_validator, validator +from pydantic import BaseModel, ConfigDict, Field, 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 @@ -20,101 +21,110 @@ class Counter(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - aggregate: Optional[Union[bool, Literal['only']]] - average: Optional[bool] - metric_name: Optional[str] - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + extra='allow', + frozen=True, + ) + aggregate: Optional[Union[bool, Literal['only']]] = None + average: Optional[bool] = None + metric_name: Optional[str] = None + name: Optional[str] = None + type: Optional[str] = None class InstanceCounts(BaseModel): - class Config: - allow_mutation = False - - monitored: Optional[str] - total: Optional[str] - unique: Optional[str] + model_config = ConfigDict( + frozen=True, + ) + monitored: Optional[str] = None + total: Optional[str] = None + unique: Optional[str] = None class ExtraMetrics(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + frozen=True, + ) counters: Sequence[Mapping[str, Union[str, Counter]]] - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] - instance_counts: Optional[InstanceCounts] + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None + instance_counts: Optional[InstanceCounts] = None name: str - tag_name: Optional[str] - use_localized_counters: Optional[bool] + tag_name: Optional[str] = None + use_localized_counters: Optional[bool] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metrics(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + frozen=True, + ) counters: Sequence[Mapping[str, Union[str, Counter]]] - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] - instance_counts: Optional[InstanceCounts] + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None + instance_counts: Optional[InstanceCounts] = None name: str - tag_name: Optional[str] - use_localized_counters: Optional[bool] + tag_name: Optional[str] = None + use_localized_counters: Optional[bool] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - additional_metrics: Optional[Sequence[Sequence[str]]] - counter_data_types: Optional[Sequence[str]] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - enable_health_service_check: Optional[bool] - extra_metrics: Optional[Mapping[str, ExtraMetrics]] - host: Optional[str] - metric_patterns: Optional[MetricPatterns] - metrics: Optional[Mapping[str, Metrics]] - min_collection_interval: Optional[float] - namespace: Optional[str] = Field(None, regex='\\w*') - password: Optional[str] - server: Optional[str] - server_tag: Optional[str] - service: Optional[str] - tags: Optional[Sequence[str]] - use_legacy_check_version: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + additional_metrics: Optional[Sequence[Sequence[str]]] = None + counter_data_types: Optional[Sequence[str]] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + enable_health_service_check: Optional[bool] = None + extra_metrics: Optional[Mapping[str, ExtraMetrics]] = None + host: Optional[str] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[Mapping[str, Metrics]] = None + min_collection_interval: Optional[float] = None + namespace: Optional[str] = Field(None, pattern='\\w*') + password: Optional[str] = None + server: Optional[str] = None + server_tag: Optional[str] = None + service: Optional[str] = None + tags: Optional[Sequence[str]] = None + use_legacy_check_version: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/exchange_server/datadog_checks/exchange_server/config_models/shared.py b/exchange_server/datadog_checks/exchange_server/config_models/shared.py index eefbab173ede1..aa58639466c05 100644 --- a/exchange_server/datadog_checks/exchange_server/config_models/shared.py +++ b/exchange_server/datadog_checks/exchange_server/config_models/shared.py @@ -11,7 +11,7 @@ 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 @@ -20,30 +20,39 @@ class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - service: Optional[str] - use_localized_counters: Optional[bool] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None + use_localized_counters: Optional[bool] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/external_dns/datadog_checks/external_dns/config_models/defaults.py b/external_dns/datadog_checks/external_dns/config_models/defaults.py index 9d0d06c6805c6..6cc07ac1c3a3e 100644 --- a/external_dns/datadog_checks/external_dns/config_models/defaults.py +++ b/external_dns/datadog_checks/external_dns/config_models/defaults.py @@ -7,272 +7,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/external_dns/datadog_checks/external_dns/config_models/instance.py b/external_dns/datadog_checks/external_dns/config_models/instance.py index 4bb176acb6d2f..5ded4c1b97033 100644 --- a/external_dns/datadog_checks/external_dns/config_models/instance.py +++ b/external_dns/datadog_checks/external_dns/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,140 +20,149 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[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( + frozen=True, + ) + target_label_key: Optional[str] = None + target_label_value_list: Optional[Sequence[str]] = None class TargetMetric(BaseModel): - class Config: - allow_mutation = False - - label_to_match: Optional[str] - labels_to_get: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + label_to_match: Optional[str] = None + labels_to_get: Optional[Sequence[str]] = None class LabelJoins(BaseModel): - class Config: - allow_mutation = False - - target_metric: Optional[TargetMetric] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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]] - 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] + model_config = ConfigDict( + validate_default=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[Sequence[str]] = None + extra_headers: Optional[Mapping[str, Any]] = None + headers: Optional[Mapping[str, Any]] = None + health_service_check: Optional[bool] = None + ignore_metrics: Optional[Sequence[str]] = None + ignore_metrics_by_labels: Optional[IgnoreMetricsByLabels] = None + ignore_tags: Optional[Sequence[str]] = None + include_labels: Optional[Sequence[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[Mapping[str, Any]] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[Sequence[Union[str, Mapping[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[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + type_overrides: Optional[Mapping[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/external_dns/datadog_checks/external_dns/config_models/shared.py b/external_dns/datadog_checks/external_dns/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/external_dns/datadog_checks/external_dns/config_models/shared.py +++ b/external_dns/datadog_checks/external_dns/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/fluentd/datadog_checks/fluentd/config_models/defaults.py b/fluentd/datadog_checks/fluentd/config_models/defaults.py index c0c20291f0879..cb2f07fb41a40 100644 --- a/fluentd/datadog_checks/fluentd/config_models/defaults.py +++ b/fluentd/datadog_checks/fluentd/config_models/defaults.py @@ -7,196 +7,90 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_fluentd(field, value): +def shared_fluentd(): return 'fluentd' -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 False -def instance_extra_headers(field, value): - return get_default_field_value(field, value) - - -def instance_fluentd(field, value): +def instance_fluentd(): return 'fluentd' -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 False -def instance_plugin_ids(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 16 -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_tag_by(field, value): +def instance_tag_by(): return 'plugin_id' -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/fluentd/datadog_checks/fluentd/config_models/instance.py b/fluentd/datadog_checks/fluentd/config_models/instance.py index 61cc3b4dcda88..4ab45d86111ff 100644 --- a/fluentd/datadog_checks/fluentd/config_models/instance.py +++ b/fluentd/datadog_checks/fluentd/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,97 +20,106 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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]] - fluentd: Optional[str] - 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] + model_config = ConfigDict( + validate_default=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[Mapping[str, Any]] = None + fluentd: Optional[str] = None + headers: Optional[Mapping[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 monitor_agent_url: str - ntlm_domain: Optional[str] - password: Optional[str] - persist_connections: Optional[bool] - plugin_ids: Optional[Sequence[str]] - proxy: Optional[Proxy] - read_timeout: Optional[float] - request_size: Optional[float] - service: Optional[str] - skip_proxy: Optional[bool] - tag_by: Optional[str] - 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] - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + ntlm_domain: Optional[str] = None + password: Optional[str] = None + persist_connections: Optional[bool] = None + plugin_ids: Optional[Sequence[str]] = None + proxy: Optional[Proxy] = None + read_timeout: Optional[float] = None + request_size: Optional[float] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + tag_by: Optional[str] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + use_legacy_auth_encoding: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/fluentd/datadog_checks/fluentd/config_models/shared.py b/fluentd/datadog_checks/fluentd/config_models/shared.py index 193bcd2dccffa..abe63595382ba 100644 --- a/fluentd/datadog_checks/fluentd/config_models/shared.py +++ b/fluentd/datadog_checks/fluentd/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,42 +20,51 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - fluentd: Optional[str] - proxy: Optional[Proxy] - service: Optional[str] - skip_proxy: Optional[bool] - timeout: Optional[float] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + fluentd: Optional[str] = None + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/foundationdb/datadog_checks/foundationdb/config_models/defaults.py b/foundationdb/datadog_checks/foundationdb/config_models/defaults.py index f40f3ab7441d5..ccf94d4e25a15 100644 --- a/foundationdb/datadog_checks/foundationdb/config_models/defaults.py +++ b/foundationdb/datadog_checks/foundationdb/config_models/defaults.py @@ -7,60 +7,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_cluster_file(field, value): +def instance_cluster_file(): return '/var/lib/foundationdb/fdb.cluster' -def instance_custom_queries(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) - - -def instance_tls_ca_file(field, value): - return get_default_field_value(field, value) - - -def instance_tls_certificate_file(field, value): - return get_default_field_value(field, value) - - -def instance_tls_key_file(field, value): - return get_default_field_value(field, value) - - -def instance_tls_password(field, value): - return get_default_field_value(field, value) - - -def instance_tls_verify_peers(field, value): - return get_default_field_value(field, value) diff --git a/foundationdb/datadog_checks/foundationdb/config_models/instance.py b/foundationdb/datadog_checks/foundationdb/config_models/instance.py index 2f4ec6c401f31..b9b9b6da6a5a4 100644 --- a/foundationdb/datadog_checks/foundationdb/config_models/instance.py +++ b/foundationdb/datadog_checks/foundationdb/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,49 +20,58 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - cluster_file: Optional[str] - custom_queries: Optional[Sequence[Mapping[str, Any]]] - 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]] - tls_ca_file: Optional[str] - tls_certificate_file: Optional[str] - tls_key_file: Optional[str] - tls_password: Optional[str] - tls_verify_peers: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + cluster_file: Optional[str] = None + custom_queries: Optional[Sequence[Mapping[str, Any]]] = None + 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[Sequence[str]] = None + tls_ca_file: Optional[str] = None + tls_certificate_file: Optional[str] = None + tls_key_file: Optional[str] = None + tls_password: Optional[str] = None + tls_verify_peers: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/foundationdb/datadog_checks/foundationdb/config_models/shared.py b/foundationdb/datadog_checks/foundationdb/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/foundationdb/datadog_checks/foundationdb/config_models/shared.py +++ b/foundationdb/datadog_checks/foundationdb/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/gearmand/datadog_checks/gearmand/config_models/defaults.py b/gearmand/datadog_checks/gearmand/config_models/defaults.py index dae05eff13bec..286acc3eadfe3 100644 --- a/gearmand/datadog_checks/gearmand/config_models/defaults.py +++ b/gearmand/datadog_checks/gearmand/config_models/defaults.py @@ -7,44 +7,22 @@ # 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_port(field, value): +def instance_port(): return 4730 -def instance_server(field, value): +def instance_server(): return '127.0.0.1' - - -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_tasks(field, value): - return get_default_field_value(field, value) diff --git a/gearmand/datadog_checks/gearmand/config_models/instance.py b/gearmand/datadog_checks/gearmand/config_models/instance.py index 412c774540364..c9099a4117ffa 100644 --- a/gearmand/datadog_checks/gearmand/config_models/instance.py +++ b/gearmand/datadog_checks/gearmand/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,45 +20,54 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[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] - port: Optional[int] - server: Optional[str] - service: Optional[str] - tags: Optional[Sequence[str]] - tasks: Optional[Sequence[str]] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=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 + port: Optional[int] = None + server: Optional[str] = None + service: Optional[str] = None + tags: Optional[Sequence[str]] = None + tasks: Optional[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/gearmand/datadog_checks/gearmand/config_models/shared.py b/gearmand/datadog_checks/gearmand/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/gearmand/datadog_checks/gearmand/config_models/shared.py +++ b/gearmand/datadog_checks/gearmand/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/gitlab/datadog_checks/gitlab/config_models/defaults.py b/gitlab/datadog_checks/gitlab/config_models/defaults.py index a5b8348e4c4ec..18f486822e575 100644 --- a/gitlab/datadog_checks/gitlab/config_models/defaults.py +++ b/gitlab/datadog_checks/gitlab/config_models/defaults.py @@ -7,376 +7,162 @@ # 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_api_token(field, value): - return get_default_field_value(field, value) - - -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_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_gitaly_server_endpoint(field, value): - return get_default_field_value(field, value) - - -def instance_gitlab_url(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 False -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_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): - 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:///-/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_prometheus_endpoint(field, value): - return get_default_field_value(field, value) - - -def instance_prometheus_metrics_prefix(field, value): - return get_default_field_value(field, value) - - -def instance_prometheus_url(field, value): - return get_default_field_value(field, value) - - -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_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_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_type_overrides(field, value): - return get_default_field_value(field, value) - - -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/gitlab/datadog_checks/gitlab/config_models/instance.py b/gitlab/datadog_checks/gitlab/config_models/instance.py index 94201d25cb0ec..e5f617f9fcac8 100644 --- a/gitlab/datadog_checks/gitlab/config_models/instance.py +++ b/gitlab/datadog_checks/gitlab/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,191 +20,200 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + extra='allow', + frozen=True, + ) + name: Optional[str] = None + type: Optional[str] = None class IgnoreMetricsByLabels(BaseModel): - class Config: - allow_mutation = False - - target_label_key: Optional[str] - target_label_value_list: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + target_label_key: Optional[str] = None + target_label_value_list: Optional[Sequence[str]] = None class TargetMetric(BaseModel): - class Config: - allow_mutation = False - - label_to_match: Optional[str] - labels_to_get: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + label_to_match: Optional[str] = None + labels_to_get: Optional[Sequence[str]] = None class LabelJoins(BaseModel): - class Config: - allow_mutation = False - - target_metric: Optional[TargetMetric] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + labels: Optional[Sequence[str]] = None + match: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - allow_redirects: Optional[bool] - api_token: Optional[str] - 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] - 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]]]]] - gitaly_server_endpoint: Optional[str] - gitlab_url: Optional[str] - headers: Optional[Mapping[str, Any]] - health_service_check: Optional[bool] - histogram_buckets_as_distributions: Optional[bool] - hostname_format: Optional[str] - hostname_label: Optional[str] - ignore_connection_errors: 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, 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] - prometheus_endpoint: Optional[str] - prometheus_metrics_prefix: Optional[str] - prometheus_url: Optional[str] - 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] - 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] - 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] - type_overrides: Optional[Mapping[str, Any]] - 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, + frozen=True, + ) + allow_redirects: Optional[bool] = None + api_token: Optional[str] = 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 + 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[Sequence[str]] = None + exclude_metrics: Optional[Sequence[str]] = None + exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] = None + extra_headers: Optional[Mapping[str, Any]] = None + extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] = None + gitaly_server_endpoint: Optional[str] = None + gitlab_url: Optional[str] = None + headers: Optional[Mapping[str, Any]] = None + health_service_check: Optional[bool] = 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_metrics: Optional[Sequence[str]] = None + ignore_metrics_by_labels: Optional[IgnoreMetricsByLabels] = None + ignore_tags: Optional[Sequence[str]] = None + include_labels: Optional[Sequence[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[Mapping[str, Any]] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[Sequence[Union[str, Mapping[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 + prometheus_endpoint: Optional[str] = None + prometheus_metrics_prefix: Optional[str] = None + prometheus_url: Optional[str] = None + proxy: Optional[Proxy] = None + raw_line_filters: Optional[Sequence[str]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[Mapping[str, Any]] = 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 + share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + type_overrides: Optional[Mapping[str, Any]] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/gitlab/datadog_checks/gitlab/config_models/shared.py b/gitlab/datadog_checks/gitlab/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/gitlab/datadog_checks/gitlab/config_models/shared.py +++ b/gitlab/datadog_checks/gitlab/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/gitlab_runner/datadog_checks/gitlab_runner/config_models/defaults.py b/gitlab_runner/datadog_checks/gitlab_runner/config_models/defaults.py index 5e66968d363df..887aa484bb1dd 100644 --- a/gitlab_runner/datadog_checks/gitlab_runner/config_models/defaults.py +++ b/gitlab_runner/datadog_checks/gitlab_runner/config_models/defaults.py @@ -7,272 +7,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 False -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 False -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/gitlab_runner/datadog_checks/gitlab_runner/config_models/instance.py b/gitlab_runner/datadog_checks/gitlab_runner/config_models/instance.py index b924b6cdecdf7..241f30e5c5214 100644 --- a/gitlab_runner/datadog_checks/gitlab_runner/config_models/instance.py +++ b/gitlab_runner/datadog_checks/gitlab_runner/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,142 +20,151 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[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( + frozen=True, + ) + target_label_key: Optional[str] = None + target_label_value_list: Optional[Sequence[str]] = None class TargetMetric(BaseModel): - class Config: - allow_mutation = False - - label_to_match: Optional[str] - labels_to_get: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + label_to_match: Optional[str] = None + labels_to_get: Optional[Sequence[str]] = None class LabelJoins(BaseModel): - class Config: - allow_mutation = False - - target_metric: Optional[TargetMetric] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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[Sequence[str]] = None + extra_headers: Optional[Mapping[str, Any]] = None gitlab_url: 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] + headers: Optional[Mapping[str, Any]] = None + health_service_check: Optional[bool] = None + ignore_metrics: Optional[Sequence[str]] = None + ignore_metrics_by_labels: Optional[IgnoreMetricsByLabels] = None + ignore_tags: Optional[Sequence[str]] = None + include_labels: Optional[Sequence[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[Mapping[str, Any]] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[Sequence[Union[str, Mapping[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_endpoint: str - prometheus_metrics_prefix: Optional[str] + 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[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + type_overrides: Optional[Mapping[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/gitlab_runner/datadog_checks/gitlab_runner/config_models/shared.py b/gitlab_runner/datadog_checks/gitlab_runner/config_models/shared.py index 3ad3bec454d9c..70855079e3ede 100644 --- a/gitlab_runner/datadog_checks/gitlab_runner/config_models/shared.py +++ b/gitlab_runner/datadog_checks/gitlab_runner/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,42 +20,51 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class SharedConfig(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) allowed_metrics: Sequence[str] - proxy: Optional[Proxy] - service: Optional[str] - skip_proxy: Optional[bool] - timeout: Optional[float] + proxy: Optional[Proxy] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + timeout: Optional[float] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/glusterfs/datadog_checks/glusterfs/config_models/defaults.py b/glusterfs/datadog_checks/glusterfs/config_models/defaults.py index b78b3318b931d..37709c779b0c2 100644 --- a/glusterfs/datadog_checks/glusterfs/config_models/defaults.py +++ b/glusterfs/datadog_checks/glusterfs/config_models/defaults.py @@ -7,40 +7,22 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_gstatus_path(field, value): +def shared_gstatus_path(): return '/opt/datadog-agent/embedded/sbin/gstatus' -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) - - -def instance_use_sudo(field, value): +def instance_use_sudo(): return True diff --git a/glusterfs/datadog_checks/glusterfs/config_models/instance.py b/glusterfs/datadog_checks/glusterfs/config_models/instance.py index 6c3aa876a25a7..0ac5b0739126b 100644 --- a/glusterfs/datadog_checks/glusterfs/config_models/instance.py +++ b/glusterfs/datadog_checks/glusterfs/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,43 +20,52 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[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]] - use_sudo: Optional[bool] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=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[Sequence[str]] = None + use_sudo: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/glusterfs/datadog_checks/glusterfs/config_models/shared.py b/glusterfs/datadog_checks/glusterfs/config_models/shared.py index 58c9d43d29d0c..a802847d143fb 100644 --- a/glusterfs/datadog_checks/glusterfs/config_models/shared.py +++ b/glusterfs/datadog_checks/glusterfs/config_models/shared.py @@ -11,7 +11,7 @@ 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 @@ -20,30 +20,39 @@ class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - gstatus_path: Optional[str] - service: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + gstatus_path: Optional[str] = None + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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_expvar/datadog_checks/go_expvar/config_models/defaults.py b/go_expvar/datadog_checks/go_expvar/config_models/defaults.py index cb85d69c39a9f..48417a591706d 100644 --- a/go_expvar/datadog_checks/go_expvar/config_models/defaults.py +++ b/go_expvar/datadog_checks/go_expvar/config_models/defaults.py @@ -7,188 +7,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 False -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_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 'go_expvar' -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_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_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/go_expvar/datadog_checks/go_expvar/config_models/instance.py b/go_expvar/datadog_checks/go_expvar/config_models/instance.py index 63e542a3ce5a2..aa877478dbc9e 100644 --- a/go_expvar/datadog_checks/go_expvar/config_models/instance.py +++ b/go_expvar/datadog_checks/go_expvar/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,106 +20,115 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metric(BaseModel): - class Config: - allow_mutation = False - - alias: Optional[str] - path: Optional[str] - tags: Optional[Sequence[str]] - type: Optional[str] + model_config = ConfigDict( + frozen=True, + ) + alias: Optional[str] = None + path: Optional[str] = None + tags: Optional[Sequence[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( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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] + model_config = ConfigDict( + validate_default=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 expvar_url: str - 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] - metrics: Optional[Sequence[Metric]] - min_collection_interval: Optional[float] - namespace: Optional[str] - ntlm_domain: Optional[str] - password: Optional[str] - persist_connections: Optional[bool] - proxy: Optional[Proxy] - read_timeout: Optional[float] - request_size: Optional[float] - 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] - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + extra_headers: Optional[Mapping[str, Any]] = None + headers: Optional[Mapping[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 + metrics: Optional[Sequence[Metric]] = 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 + proxy: Optional[Proxy] = None + read_timeout: Optional[float] = None + request_size: Optional[float] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + use_legacy_auth_encoding: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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_expvar/datadog_checks/go_expvar/config_models/shared.py b/go_expvar/datadog_checks/go_expvar/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/go_expvar/datadog_checks/go_expvar/config_models/shared.py +++ b/go_expvar/datadog_checks/go_expvar/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/gunicorn/datadog_checks/gunicorn/config_models/defaults.py b/gunicorn/datadog_checks/gunicorn/config_models/defaults.py index 3b1764d41e8b2..254a9ed58d4ca 100644 --- a/gunicorn/datadog_checks/gunicorn/config_models/defaults.py +++ b/gunicorn/datadog_checks/gunicorn/config_models/defaults.py @@ -7,40 +7,22 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_gunicorn(field, value): +def shared_gunicorn(): return 'gunicorn' -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_gunicorn(field, value): +def instance_gunicorn(): return 'gunicorn' -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/gunicorn/datadog_checks/gunicorn/config_models/instance.py b/gunicorn/datadog_checks/gunicorn/config_models/instance.py index 6f351c37b3abb..01d7e3ef54960 100644 --- a/gunicorn/datadog_checks/gunicorn/config_models/instance.py +++ b/gunicorn/datadog_checks/gunicorn/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,44 +20,53 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - gunicorn: Optional[str] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + gunicorn: Optional[str] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None proc_name: str - service: Optional[str] - tags: Optional[Sequence[str]] + service: Optional[str] = None + tags: Optional[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/gunicorn/datadog_checks/gunicorn/config_models/shared.py b/gunicorn/datadog_checks/gunicorn/config_models/shared.py index 9a4fa6fe45096..94a7316157dfc 100644 --- a/gunicorn/datadog_checks/gunicorn/config_models/shared.py +++ b/gunicorn/datadog_checks/gunicorn/config_models/shared.py @@ -11,7 +11,7 @@ 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 @@ -20,30 +20,39 @@ class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - gunicorn: Optional[str] - service: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + gunicorn: Optional[str] = None + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/haproxy/datadog_checks/haproxy/config_models/defaults.py b/haproxy/datadog_checks/haproxy/config_models/defaults.py index f989f8d24e617..76d3ba12e7e13 100644 --- a/haproxy/datadog_checks/haproxy/config_models/defaults.py +++ b/haproxy/datadog_checks/haproxy/config_models/defaults.py @@ -7,428 +7,206 @@ # 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_active_tag(field, value): +def instance_active_tag(): return False -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_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_collate_status_tags_per_host(field, value): +def instance_collate_status_tags_per_host(): return True -def instance_collect_aggregates_only(field, value): - return get_default_field_value(field, value) - - -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_collect_status_metrics(field, value): +def instance_collect_status_metrics(): return False -def instance_collect_status_metrics_by_host(field, value): +def instance_collect_status_metrics_by_host(): return False -def instance_connect_timeout(field, value): - return get_default_field_value(field, value) - - -def instance_count_status_by_service(field, value): +def instance_count_status_by_service(): return True -def instance_disable_generic_tags(field, value): +def instance_disable_generic_tags(): return False -def instance_disable_legacy_service_tag(field, value): +def instance_disable_legacy_service_tag(): 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_enable_service_check(field, value): +def instance_enable_service_check(): return False -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_health_service_check(field, value): +def instance_health_service_check(): return True -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_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): - 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_prometheus_metrics_prefix(field, value): - return get_default_field_value(field, value) - - -def instance_prometheus_url(field, value): - return get_default_field_value(field, value) - - -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_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_services_exclude(field, value): - return get_default_field_value(field, value) - - -def instance_services_include(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_startup_grace_seconds(field, value): +def instance_startup_grace_seconds(): return 0 -def instance_status_check(field, value): +def instance_status_check(): return False -def instance_tag_by_endpoint(field, value): +def instance_tag_by_endpoint(): return True -def instance_tag_service_check_by_host(field, value): +def instance_tag_service_check_by_host(): return False -def instance_tags(field, value): - return get_default_field_value(field, value) - - -def instance_tags_regex(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_type_overrides(field, value): - return get_default_field_value(field, value) - - -def instance_url(field, value): - return get_default_field_value(field, value) - - -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_openmetrics(field, value): +def instance_use_openmetrics(): return False -def instance_use_process_start_time(field, value): +def instance_use_process_start_time(): return False -def instance_use_prometheus(field, value): +def instance_use_prometheus(): return False - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/haproxy/datadog_checks/haproxy/config_models/instance.py b/haproxy/datadog_checks/haproxy/config_models/instance.py index 45d4f742677d2..ea3a92f4cc67c 100644 --- a/haproxy/datadog_checks/haproxy/config_models/instance.py +++ b/haproxy/datadog_checks/haproxy/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,204 +20,213 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + extra='allow', + frozen=True, + ) + name: Optional[str] = None + type: Optional[str] = None class IgnoreMetricsByLabels(BaseModel): - class Config: - allow_mutation = False - - target_label_key: Optional[str] - target_label_value_list: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + target_label_key: Optional[str] = None + target_label_value_list: Optional[Sequence[str]] = None class TargetMetric(BaseModel): - class Config: - allow_mutation = False - - label_to_match: Optional[str] - labels_to_get: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + label_to_match: Optional[str] = None + labels_to_get: Optional[Sequence[str]] = None class LabelJoins(BaseModel): - class Config: - allow_mutation = False - - target_metric: Optional[TargetMetric] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + labels: Optional[Sequence[str]] = None + match: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - active_tag: Optional[bool] - 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] - cache_metric_wildcards: Optional[bool] - cache_shared_labels: Optional[bool] - collate_status_tags_per_host: Optional[bool] - collect_aggregates_only: Optional[Union[bool, str]] - collect_counters_with_distributions: Optional[bool] - collect_histogram_buckets: Optional[bool] - collect_status_metrics: Optional[bool] - collect_status_metrics_by_host: Optional[bool] - connect_timeout: Optional[float] - count_status_by_service: Optional[bool] - disable_generic_tags: Optional[bool] - disable_legacy_service_tag: Optional[bool] - empty_default_hostname: Optional[bool] - enable_health_service_check: Optional[bool] - enable_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]] - health_service_check: Optional[bool] - histogram_buckets_as_distributions: Optional[bool] - hostname_format: Optional[str] - hostname_label: Optional[str] - ignore_connection_errors: 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, 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] - prometheus_metrics_prefix: Optional[str] - prometheus_url: Optional[str] - 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] - 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] - services_exclude: Optional[Sequence[str]] - services_include: Optional[Sequence[str]] - share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] - skip_proxy: Optional[bool] - startup_grace_seconds: Optional[float] - status_check: Optional[bool] - tag_by_endpoint: Optional[bool] - tag_service_check_by_host: Optional[bool] - tags: Optional[Sequence[str]] - tags_regex: Optional[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] - type_overrides: Optional[Mapping[str, Any]] - url: Optional[str] - use_latest_spec: Optional[bool] - use_legacy_auth_encoding: Optional[bool] - use_openmetrics: Optional[bool] - use_process_start_time: Optional[bool] - use_prometheus: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + active_tag: Optional[bool] = None + 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 + cache_metric_wildcards: Optional[bool] = None + cache_shared_labels: Optional[bool] = None + collate_status_tags_per_host: Optional[bool] = None + collect_aggregates_only: Optional[Union[bool, str]] = None + collect_counters_with_distributions: Optional[bool] = None + collect_histogram_buckets: Optional[bool] = None + collect_status_metrics: Optional[bool] = None + collect_status_metrics_by_host: Optional[bool] = None + connect_timeout: Optional[float] = None + count_status_by_service: Optional[bool] = None + disable_generic_tags: Optional[bool] = None + disable_legacy_service_tag: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + enable_health_service_check: Optional[bool] = None + enable_service_check: Optional[bool] = None + exclude_labels: Optional[Sequence[str]] = None + exclude_metrics: Optional[Sequence[str]] = None + exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] = None + extra_headers: Optional[Mapping[str, Any]] = None + extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] = None + headers: Optional[Mapping[str, Any]] = None + health_service_check: Optional[bool] = 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_metrics: Optional[Sequence[str]] = None + ignore_metrics_by_labels: Optional[IgnoreMetricsByLabels] = None + ignore_tags: Optional[Sequence[str]] = None + include_labels: Optional[Sequence[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[Mapping[str, Any]] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[Sequence[Union[str, Mapping[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 + prometheus_metrics_prefix: Optional[str] = None + prometheus_url: Optional[str] = None + proxy: Optional[Proxy] = None + raw_line_filters: Optional[Sequence[str]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[Mapping[str, Any]] = 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 + services_exclude: Optional[Sequence[str]] = None + services_include: Optional[Sequence[str]] = None + share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + startup_grace_seconds: Optional[float] = None + status_check: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tag_service_check_by_host: Optional[bool] = None + tags: Optional[Sequence[str]] = None + tags_regex: Optional[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + type_overrides: Optional[Mapping[str, Any]] = None + url: Optional[str] = None + use_latest_spec: Optional[bool] = None + use_legacy_auth_encoding: Optional[bool] = None + use_openmetrics: Optional[bool] = None + use_process_start_time: Optional[bool] = None + use_prometheus: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/haproxy/datadog_checks/haproxy/config_models/shared.py b/haproxy/datadog_checks/haproxy/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/haproxy/datadog_checks/haproxy/config_models/shared.py +++ b/haproxy/datadog_checks/haproxy/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/harbor/datadog_checks/harbor/config_models/defaults.py b/harbor/datadog_checks/harbor/config_models/defaults.py index b1b763fe65341..81b466607723e 100644 --- a/harbor/datadog_checks/harbor/config_models/defaults.py +++ b/harbor/datadog_checks/harbor/config_models/defaults.py @@ -7,172 +7,78 @@ # 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 False -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_persist_connections(field, value): +def instance_persist_connections(): return False -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_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 diff --git a/harbor/datadog_checks/harbor/config_models/instance.py b/harbor/datadog_checks/harbor/config_models/instance.py index 4de920934b7de..1afa826fcdf02 100644 --- a/harbor/datadog_checks/harbor/config_models/instance.py +++ b/harbor/datadog_checks/harbor/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,94 +20,103 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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] + model_config = ConfigDict( + validate_default=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[Mapping[str, Any]] = None + headers: Optional[Mapping[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: str - persist_connections: Optional[bool] - proxy: Optional[Proxy] - read_timeout: Optional[float] - request_size: Optional[float] - 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] + persist_connections: Optional[bool] = None + proxy: Optional[Proxy] = None + read_timeout: Optional[float] = None + request_size: Optional[float] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[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 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/harbor/datadog_checks/harbor/config_models/shared.py b/harbor/datadog_checks/harbor/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/harbor/datadog_checks/harbor/config_models/shared.py +++ b/harbor/datadog_checks/harbor/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/hazelcast/datadog_checks/hazelcast/config_models/defaults.py b/hazelcast/datadog_checks/hazelcast/config_models/defaults.py index c83a66aa87c91..c25c1f89eca5c 100644 --- a/hazelcast/datadog_checks/hazelcast/config_models/defaults.py +++ b/hazelcast/datadog_checks/hazelcast/config_models/defaults.py @@ -7,272 +7,110 @@ # 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_is_jmx(field, value): +def shared_is_jmx(): return False -def shared_new_gc_metrics(field, value): +def shared_new_gc_metrics(): return False -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_service_check_prefix(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_collect_default_jvm_metrics(field, value): +def instance_collect_default_jvm_metrics(): return True -def instance_connect_timeout(field, value): - return get_default_field_value(field, value) - - -def instance_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return False -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_host(field, value): - return get_default_field_value(field, value) - - -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_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_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_log_requests(field, value): +def instance_log_requests(): return False -def instance_mc_cluster_states(field, value): - return get_default_field_value(field, value) - - -def instance_mc_health_check_endpoint(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_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_port(field, value): +def instance_port(): return 1099 -def instance_process_name_regex(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 16 -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_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_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_use_legacy_auth_encoding(field, value): +def instance_use_legacy_auth_encoding(): return True - - -def instance_user(field, value): - return get_default_field_value(field, value) - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/hazelcast/datadog_checks/hazelcast/config_models/instance.py b/hazelcast/datadog_checks/hazelcast/config_models/instance.py index 593548c7e4c4b..6c38cc1e77b7f 100644 --- a/hazelcast/datadog_checks/hazelcast/config_models/instance.py +++ b/hazelcast/datadog_checks/hazelcast/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,103 +20,112 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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] - collect_default_jvm_metrics: Optional[bool] - connect_timeout: Optional[float] - empty_default_hostname: Optional[bool] - extra_headers: Optional[Mapping[str, Any]] - headers: Optional[Mapping[str, Any]] - host: Optional[str] - is_jmx: Optional[bool] - java_bin_path: Optional[str] - java_options: Optional[str] - jmx_url: Optional[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] - key_store_password: Optional[str] - key_store_path: Optional[str] - log_requests: Optional[bool] - mc_cluster_states: Optional[Mapping[str, Any]] - mc_health_check_endpoint: Optional[str] - min_collection_interval: Optional[float] - name: Optional[str] - ntlm_domain: Optional[str] - password: Optional[str] - persist_connections: Optional[bool] - port: Optional[int] - process_name_regex: Optional[str] - proxy: Optional[Proxy] - read_timeout: Optional[float] - request_size: Optional[float] - rmi_client_timeout: Optional[float] - rmi_connection_timeout: Optional[float] - rmi_registry_ssl: 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] - tools_jar_path: Optional[str] - trust_store_password: Optional[str] - trust_store_path: Optional[str] - use_legacy_auth_encoding: Optional[bool] - user: Optional[str] - username: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=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 + collect_default_jvm_metrics: Optional[bool] = None + connect_timeout: Optional[float] = None + empty_default_hostname: Optional[bool] = None + extra_headers: Optional[Mapping[str, Any]] = None + headers: Optional[Mapping[str, Any]] = None + host: Optional[str] = None + is_jmx: Optional[bool] = None + java_bin_path: Optional[str] = None + java_options: Optional[str] = None + jmx_url: Optional[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 + key_store_password: Optional[str] = None + key_store_path: Optional[str] = None + log_requests: Optional[bool] = None + mc_cluster_states: Optional[Mapping[str, Any]] = None + mc_health_check_endpoint: Optional[str] = None + min_collection_interval: Optional[float] = None + name: Optional[str] = None + ntlm_domain: Optional[str] = None + password: Optional[str] = None + persist_connections: Optional[bool] = None + port: Optional[int] = None + process_name_regex: Optional[str] = None + proxy: Optional[Proxy] = None + read_timeout: Optional[float] = None + request_size: Optional[float] = None + rmi_client_timeout: Optional[float] = None + rmi_connection_timeout: Optional[float] = None + rmi_registry_ssl: Optional[bool] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + tools_jar_path: Optional[str] = None + trust_store_password: Optional[str] = None + trust_store_path: Optional[str] = None + use_legacy_auth_encoding: Optional[bool] = None + user: Optional[str] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/hazelcast/datadog_checks/hazelcast/config_models/shared.py b/hazelcast/datadog_checks/hazelcast/config_models/shared.py index 0215d6ad00e3b..83534741d4019 100644 --- a/hazelcast/datadog_checks/hazelcast/config_models/shared.py +++ b/hazelcast/datadog_checks/hazelcast/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,46 +20,55 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - collect_default_metrics: Optional[bool] - conf: Optional[Sequence[Mapping[str, Any]]] - is_jmx: Optional[bool] - new_gc_metrics: Optional[bool] - proxy: Optional[Proxy] - service: Optional[str] - service_check_prefix: Optional[str] - skip_proxy: Optional[bool] - timeout: Optional[float] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + collect_default_metrics: Optional[bool] = None + conf: Optional[Sequence[Mapping[str, Any]]] = None + is_jmx: Optional[bool] = None + new_gc_metrics: Optional[bool] = None + proxy: Optional[Proxy] = None + service: Optional[str] = None + service_check_prefix: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/hdfs_datanode/datadog_checks/hdfs_datanode/config_models/defaults.py b/hdfs_datanode/datadog_checks/hdfs_datanode/config_models/defaults.py index 0a32cc4dc3c7a..81b466607723e 100644 --- a/hdfs_datanode/datadog_checks/hdfs_datanode/config_models/defaults.py +++ b/hdfs_datanode/datadog_checks/hdfs_datanode/config_models/defaults.py @@ -7,180 +7,78 @@ # 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 False -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 False -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_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/hdfs_datanode/datadog_checks/hdfs_datanode/config_models/instance.py b/hdfs_datanode/datadog_checks/hdfs_datanode/config_models/instance.py index b89851a32190c..977815744f163 100644 --- a/hdfs_datanode/datadog_checks/hdfs_datanode/config_models/instance.py +++ b/hdfs_datanode/datadog_checks/hdfs_datanode/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,94 +20,103 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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]] + model_config = ConfigDict( + validate_default=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[Mapping[str, Any]] = None hdfs_datanode_jmx_uri: str - 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] - read_timeout: Optional[float] - request_size: Optional[float] - 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] - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + headers: Optional[Mapping[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 + read_timeout: Optional[float] = None + request_size: Optional[float] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + use_legacy_auth_encoding: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/hdfs_datanode/datadog_checks/hdfs_datanode/config_models/shared.py b/hdfs_datanode/datadog_checks/hdfs_datanode/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/hdfs_datanode/datadog_checks/hdfs_datanode/config_models/shared.py +++ b/hdfs_datanode/datadog_checks/hdfs_datanode/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/hdfs_namenode/datadog_checks/hdfs_namenode/config_models/defaults.py b/hdfs_namenode/datadog_checks/hdfs_namenode/config_models/defaults.py index 0a32cc4dc3c7a..81b466607723e 100644 --- a/hdfs_namenode/datadog_checks/hdfs_namenode/config_models/defaults.py +++ b/hdfs_namenode/datadog_checks/hdfs_namenode/config_models/defaults.py @@ -7,180 +7,78 @@ # 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 False -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 False -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_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/hdfs_namenode/datadog_checks/hdfs_namenode/config_models/instance.py b/hdfs_namenode/datadog_checks/hdfs_namenode/config_models/instance.py index cbfd818f77967..7a11a8ba7b92e 100644 --- a/hdfs_namenode/datadog_checks/hdfs_namenode/config_models/instance.py +++ b/hdfs_namenode/datadog_checks/hdfs_namenode/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,94 +20,103 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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]] + model_config = ConfigDict( + validate_default=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[Mapping[str, Any]] = None hdfs_namenode_jmx_uri: str - 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] - read_timeout: Optional[float] - request_size: Optional[float] - 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] - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + headers: Optional[Mapping[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 + read_timeout: Optional[float] = None + request_size: Optional[float] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + use_legacy_auth_encoding: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/hdfs_namenode/datadog_checks/hdfs_namenode/config_models/shared.py b/hdfs_namenode/datadog_checks/hdfs_namenode/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/hdfs_namenode/datadog_checks/hdfs_namenode/config_models/shared.py +++ b/hdfs_namenode/datadog_checks/hdfs_namenode/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/hive/datadog_checks/hive/config_models/defaults.py b/hive/datadog_checks/hive/config_models/defaults.py index b9702a06b9ed7..42c096be40fdd 100644 --- a/hive/datadog_checks/hive/config_models/defaults.py +++ b/hive/datadog_checks/hive/config_models/defaults.py @@ -7,108 +7,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/hive/datadog_checks/hive/config_models/instance.py b/hive/datadog_checks/hive/config_models/instance.py index bc4c01723f132..631a321dda3bb 100644 --- a/hive/datadog_checks/hive/config_models/instance.py +++ b/hive/datadog_checks/hive/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,51 +20,60 @@ 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, + 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[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/hive/datadog_checks/hive/config_models/shared.py b/hive/datadog_checks/hive/config_models/shared.py index 1c722ceac49bc..0db55a6d064d5 100644 --- a/hive/datadog_checks/hive/config_models/shared.py +++ b/hive/datadog_checks/hive/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,34 +20,43 @@ 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, + frozen=True, + ) + collect_default_metrics: Optional[bool] = None + conf: Optional[Sequence[Mapping[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/hivemq/datadog_checks/hivemq/config_models/defaults.py b/hivemq/datadog_checks/hivemq/config_models/defaults.py index b9702a06b9ed7..42c096be40fdd 100644 --- a/hivemq/datadog_checks/hivemq/config_models/defaults.py +++ b/hivemq/datadog_checks/hivemq/config_models/defaults.py @@ -7,108 +7,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/hivemq/datadog_checks/hivemq/config_models/instance.py b/hivemq/datadog_checks/hivemq/config_models/instance.py index bc4c01723f132..631a321dda3bb 100644 --- a/hivemq/datadog_checks/hivemq/config_models/instance.py +++ b/hivemq/datadog_checks/hivemq/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,51 +20,60 @@ 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, + 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[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/hivemq/datadog_checks/hivemq/config_models/shared.py b/hivemq/datadog_checks/hivemq/config_models/shared.py index 1c722ceac49bc..0db55a6d064d5 100644 --- a/hivemq/datadog_checks/hivemq/config_models/shared.py +++ b/hivemq/datadog_checks/hivemq/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,34 +20,43 @@ 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, + frozen=True, + ) + collect_default_metrics: Optional[bool] = None + conf: Optional[Sequence[Mapping[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/http_check/datadog_checks/http_check/config_models/defaults.py b/http_check/datadog_checks/http_check/config_models/defaults.py index d2d8fe6702189..4f458c30b3f9d 100644 --- a/http_check/datadog_checks/http_check/config_models/defaults.py +++ b/http_check/datadog_checks/http_check/config_models/defaults.py @@ -7,252 +7,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_check_certificate_expiration(field, value): +def instance_check_certificate_expiration(): return True -def instance_collect_response_time(field, value): +def instance_collect_response_time(): return True -def instance_connect_timeout(field, value): - return get_default_field_value(field, value) - - -def instance_content_match(field, value): - return get_default_field_value(field, value) - - -def instance_data(field, value): - return get_default_field_value(field, value) - - -def instance_days_critical(field, value): - return get_default_field_value(field, value) - - -def instance_days_warning(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_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_http_response_status_code(field, value): +def instance_http_response_status_code(): return '(1|2|3)\\d\\d' -def instance_include_content(field, value): +def instance_include_content(): return False -def instance_include_default_headers(field, value): +def instance_include_default_headers(): return True -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_method(field, value): +def instance_method(): return 'get' -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 False -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_reverse_content_match(field, value): +def instance_reverse_content_match(): return False -def instance_seconds_critical(field, value): - return get_default_field_value(field, value) - - -def instance_seconds_warning(field, value): - return get_default_field_value(field, value) - - -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_ssl_server_name(field, value): - return get_default_field_value(field, value) - - -def instance_stream(field, value): +def instance_stream(): 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_private_key_password(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_retrieve_non_validated_cert(field, value): +def instance_tls_retrieve_non_validated_cert(): return False -def instance_tls_use_host_header(field, value): +def instance_tls_use_host_header(): return False -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 False -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/http_check/datadog_checks/http_check/config_models/instance.py b/http_check/datadog_checks/http_check/config_models/instance.py index d598116148b0f..d9d7ff6479833 100644 --- a/http_check/datadog_checks/http_check/config_models/instance.py +++ b/http_check/datadog_checks/http_check/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,113 +20,122 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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] - check_certificate_expiration: Optional[bool] - collect_response_time: Optional[bool] - connect_timeout: Optional[float] - content_match: Optional[str] - data: Optional[Union[Mapping[str, Any], str]] - days_critical: Optional[int] - days_warning: Optional[int] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - extra_headers: Optional[Mapping[str, Any]] - headers: Optional[Mapping[str, Any]] - http_response_status_code: Optional[str] - include_content: Optional[bool] - include_default_headers: Optional[bool] - 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] - method: Optional[str] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] + model_config = ConfigDict( + validate_default=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 + check_certificate_expiration: Optional[bool] = None + collect_response_time: Optional[bool] = None + connect_timeout: Optional[float] = None + content_match: Optional[str] = None + data: Optional[Union[Mapping[str, Any], str]] = None + days_critical: Optional[int] = None + days_warning: Optional[int] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + extra_headers: Optional[Mapping[str, Any]] = None + headers: Optional[Mapping[str, Any]] = None + http_response_status_code: Optional[str] = None + include_content: Optional[bool] = None + include_default_headers: Optional[bool] = 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 + method: Optional[str] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None name: str - ntlm_domain: Optional[str] - password: Optional[str] - persist_connections: Optional[bool] - proxy: Optional[Proxy] - read_timeout: Optional[float] - request_size: Optional[float] - reverse_content_match: Optional[bool] - seconds_critical: Optional[int] - seconds_warning: Optional[int] - service: Optional[str] - skip_proxy: Optional[bool] - ssl_server_name: Optional[str] - stream: 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_private_key_password: Optional[str] - tls_protocols_allowed: Optional[Sequence[str]] - tls_retrieve_non_validated_cert: Optional[bool] - tls_use_host_header: Optional[bool] - tls_validate_hostname: Optional[bool] - tls_verify: Optional[bool] + ntlm_domain: Optional[str] = None + password: Optional[str] = None + persist_connections: Optional[bool] = None + proxy: Optional[Proxy] = None + read_timeout: Optional[float] = None + request_size: Optional[float] = None + reverse_content_match: Optional[bool] = None + seconds_critical: Optional[int] = None + seconds_warning: Optional[int] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + ssl_server_name: Optional[str] = None + stream: Optional[bool] = None + tags: Optional[Sequence[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_private_key_password: Optional[str] = None + tls_protocols_allowed: Optional[Sequence[str]] = None + tls_retrieve_non_validated_cert: Optional[bool] = None + tls_use_host_header: Optional[bool] = None + tls_validate_hostname: Optional[bool] = None + tls_verify: Optional[bool] = None url: str - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] + use_legacy_auth_encoding: Optional[bool] = None + username: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/http_check/datadog_checks/http_check/config_models/shared.py b/http_check/datadog_checks/http_check/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/http_check/datadog_checks/http_check/config_models/shared.py +++ b/http_check/datadog_checks/http_check/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/hudi/datadog_checks/hudi/config_models/defaults.py b/hudi/datadog_checks/hudi/config_models/defaults.py index b9702a06b9ed7..42c096be40fdd 100644 --- a/hudi/datadog_checks/hudi/config_models/defaults.py +++ b/hudi/datadog_checks/hudi/config_models/defaults.py @@ -7,108 +7,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/hudi/datadog_checks/hudi/config_models/instance.py b/hudi/datadog_checks/hudi/config_models/instance.py index bc4c01723f132..631a321dda3bb 100644 --- a/hudi/datadog_checks/hudi/config_models/instance.py +++ b/hudi/datadog_checks/hudi/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,51 +20,60 @@ 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, + 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[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/hudi/datadog_checks/hudi/config_models/shared.py b/hudi/datadog_checks/hudi/config_models/shared.py index 1c722ceac49bc..0db55a6d064d5 100644 --- a/hudi/datadog_checks/hudi/config_models/shared.py +++ b/hudi/datadog_checks/hudi/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,34 +20,43 @@ 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, + frozen=True, + ) + collect_default_metrics: Optional[bool] = None + conf: Optional[Sequence[Mapping[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/hyperv/datadog_checks/hyperv/config_models/defaults.py b/hyperv/datadog_checks/hyperv/config_models/defaults.py index 4f39e93679a20..3d179e23b96bc 100644 --- a/hyperv/datadog_checks/hyperv/config_models/defaults.py +++ b/hyperv/datadog_checks/hyperv/config_models/defaults.py @@ -7,84 +7,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 shared_use_localized_counters(field, value): +def shared_use_localized_counters(): return False -def instance_additional_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_counter_data_types(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_extra_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_host(field, value): +def instance_host(): return '.' -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_password(field, value): - return get_default_field_value(field, value) - - -def instance_server(field, value): - return get_default_field_value(field, value) - - -def instance_server_tag(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_use_legacy_check_version(field, value): +def instance_use_legacy_check_version(): return False - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/hyperv/datadog_checks/hyperv/config_models/instance.py b/hyperv/datadog_checks/hyperv/config_models/instance.py index 6f8a26fe45109..5edb57d89d89e 100644 --- a/hyperv/datadog_checks/hyperv/config_models/instance.py +++ b/hyperv/datadog_checks/hyperv/config_models/instance.py @@ -9,9 +9,10 @@ from __future__ import annotations -from typing import Literal, Mapping, Optional, Sequence, Union +from typing import Mapping, Optional, Sequence, Union -from pydantic import BaseModel, Extra, Field, root_validator, validator +from pydantic import BaseModel, ConfigDict, Field, 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 @@ -20,101 +21,110 @@ class Counter(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - aggregate: Optional[Union[bool, Literal['only']]] - average: Optional[bool] - metric_name: Optional[str] - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + extra='allow', + frozen=True, + ) + aggregate: Optional[Union[bool, Literal['only']]] = None + average: Optional[bool] = None + metric_name: Optional[str] = None + name: Optional[str] = None + type: Optional[str] = None class InstanceCounts(BaseModel): - class Config: - allow_mutation = False - - monitored: Optional[str] - total: Optional[str] - unique: Optional[str] + model_config = ConfigDict( + frozen=True, + ) + monitored: Optional[str] = None + total: Optional[str] = None + unique: Optional[str] = None class ExtraMetrics(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + frozen=True, + ) counters: Sequence[Mapping[str, Union[str, Counter]]] - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] - instance_counts: Optional[InstanceCounts] + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None + instance_counts: Optional[InstanceCounts] = None name: str - tag_name: Optional[str] - use_localized_counters: Optional[bool] + tag_name: Optional[str] = None + use_localized_counters: Optional[bool] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metrics(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + frozen=True, + ) counters: Sequence[Mapping[str, Union[str, Counter]]] - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] - instance_counts: Optional[InstanceCounts] + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None + instance_counts: Optional[InstanceCounts] = None name: str - tag_name: Optional[str] - use_localized_counters: Optional[bool] + tag_name: Optional[str] = None + use_localized_counters: Optional[bool] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - additional_metrics: Optional[Sequence[Sequence[str]]] - counter_data_types: Optional[Sequence[str]] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - enable_health_service_check: Optional[bool] - extra_metrics: Optional[Mapping[str, ExtraMetrics]] - host: Optional[str] - metric_patterns: Optional[MetricPatterns] - metrics: Optional[Mapping[str, Metrics]] - min_collection_interval: Optional[float] - namespace: Optional[str] = Field(None, regex='\\w*') - password: Optional[str] - server: Optional[str] - server_tag: Optional[str] - service: Optional[str] - tags: Optional[Sequence[str]] - use_legacy_check_version: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + additional_metrics: Optional[Sequence[Sequence[str]]] = None + counter_data_types: Optional[Sequence[str]] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + enable_health_service_check: Optional[bool] = None + extra_metrics: Optional[Mapping[str, ExtraMetrics]] = None + host: Optional[str] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[Mapping[str, Metrics]] = None + min_collection_interval: Optional[float] = None + namespace: Optional[str] = Field(None, pattern='\\w*') + password: Optional[str] = None + server: Optional[str] = None + server_tag: Optional[str] = None + service: Optional[str] = None + tags: Optional[Sequence[str]] = None + use_legacy_check_version: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/hyperv/datadog_checks/hyperv/config_models/shared.py b/hyperv/datadog_checks/hyperv/config_models/shared.py index eefbab173ede1..aa58639466c05 100644 --- a/hyperv/datadog_checks/hyperv/config_models/shared.py +++ b/hyperv/datadog_checks/hyperv/config_models/shared.py @@ -11,7 +11,7 @@ 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 @@ -20,30 +20,39 @@ class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - service: Optional[str] - use_localized_counters: Optional[bool] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None + use_localized_counters: Optional[bool] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/ibm_ace/datadog_checks/ibm_ace/config_models/defaults.py b/ibm_ace/datadog_checks/ibm_ace/config_models/defaults.py index 8ddc9800e3b79..7f16f5652e2ad 100644 --- a/ibm_ace/datadog_checks/ibm_ace/config_models/defaults.py +++ b/ibm_ace/datadog_checks/ibm_ace/config_models/defaults.py @@ -7,72 +7,42 @@ # 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_message_flows(field, value): +def instance_message_flows(): return True -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_mq_password(field, value): - return get_default_field_value(field, value) - - -def instance_mq_user(field, value): - return get_default_field_value(field, value) - - -def instance_mqcd_version(field, value): +def instance_mqcd_version(): return 9 -def instance_persist_connections(field, value): +def instance_persist_connections(): return False -def instance_resource_statistics(field, value): +def instance_resource_statistics(): return True -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_tls_auth(field, value): +def instance_tls_auth(): return False -def instance_tls_certificate_label(field, value): - return get_default_field_value(field, value) - - -def instance_tls_cipher_spec(field, value): +def instance_tls_cipher_spec(): return 'TLS_RSA_WITH_AES_256_CBC_SHA' -def instance_tls_key_repository_location(field, value): +def instance_tls_key_repository_location(): return '/var/mqm/tls-db/client/KeyringClient' diff --git a/ibm_ace/datadog_checks/ibm_ace/config_models/instance.py b/ibm_ace/datadog_checks/ibm_ace/config_models/instance.py index e526d3b11b870..374c33c3127ac 100644 --- a/ibm_ace/datadog_checks/ibm_ace/config_models/instance.py +++ b/ibm_ace/datadog_checks/ibm_ace/config_models/instance.py @@ -9,9 +9,10 @@ from __future__ import annotations -from typing import Literal, Optional, Sequence +from typing import Optional, Sequence -from pydantic import BaseModel, Field, root_validator, validator +from pydantic import BaseModel, ConfigDict, Field, 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 @@ -20,56 +21,65 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) channel: str = Field(..., min_length=1) - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - message_flows: Optional[bool] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + message_flows: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None mq_password: Optional[str] = Field(None, min_length=1) mq_port: int mq_server: str = Field(..., min_length=1) mq_user: Optional[str] = Field(None, min_length=1) - mqcd_version: Optional[Literal[1, 2, 3, 4, 5, 6, 7, 8, 9]] - persist_connections: Optional[bool] + mqcd_version: Optional[Literal[1, 2, 3, 4, 5, 6, 7, 8, 9]] = None + persist_connections: Optional[bool] = None queue_manager: str = Field(..., min_length=1) - resource_statistics: Optional[bool] - service: Optional[str] - tags: Optional[Sequence[str]] - tls_auth: Optional[bool] - tls_certificate_label: Optional[str] - tls_cipher_spec: Optional[str] + resource_statistics: Optional[bool] = None + service: Optional[str] = None + tags: Optional[Sequence[str]] = None + tls_auth: Optional[bool] = None + tls_certificate_label: Optional[str] = None + tls_cipher_spec: Optional[str] = None tls_key_repository_location: Optional[str] = Field(None, min_length=1) - @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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/ibm_ace/datadog_checks/ibm_ace/config_models/shared.py b/ibm_ace/datadog_checks/ibm_ace/config_models/shared.py index de215afcbdd5e..d7f4dd28de478 100644 --- a/ibm_ace/datadog_checks/ibm_ace/config_models/shared.py +++ b/ibm_ace/datadog_checks/ibm_ace/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/ibm_db2/datadog_checks/ibm_db2/config_models/defaults.py b/ibm_db2/datadog_checks/ibm_db2/config_models/defaults.py index 27db49732beca..04c53e3a212e8 100644 --- a/ibm_db2/datadog_checks/ibm_db2/config_models/defaults.py +++ b/ibm_db2/datadog_checks/ibm_db2/config_models/defaults.py @@ -7,64 +7,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_global_custom_queries(field, value): - return get_default_field_value(field, value) - - -def shared_service(field, value): - return get_default_field_value(field, value) - - -def instance_custom_queries(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_host(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_only_custom_queries(field, value): +def instance_only_custom_queries(): return False -def instance_port(field, value): +def instance_port(): return 50000 -def instance_security(field, value): +def instance_security(): return 'none' -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_tls_cert(field, value): - return get_default_field_value(field, value) - - -def instance_use_global_custom_queries(field, value): +def instance_use_global_custom_queries(): return 'true' diff --git a/ibm_db2/datadog_checks/ibm_db2/config_models/instance.py b/ibm_db2/datadog_checks/ibm_db2/config_models/instance.py index 7eaa80a432930..2fe2a731edf9a 100644 --- a/ibm_db2/datadog_checks/ibm_db2/config_models/instance.py +++ b/ibm_db2/datadog_checks/ibm_db2/config_models/instance.py @@ -9,9 +9,10 @@ from __future__ import annotations -from typing import Any, Literal, Mapping, Optional, Sequence +from typing import Any, Mapping, Optional, Sequence -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 @@ -20,62 +21,71 @@ class CustomQuery(BaseModel): - class Config: - allow_mutation = False - - columns: Optional[Sequence[Mapping[str, Any]]] - metric_prefix: Optional[str] - query: Optional[str] - tags: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + columns: Optional[Sequence[Mapping[str, Any]]] = None + metric_prefix: Optional[str] = None + query: Optional[str] = None + tags: Optional[Sequence[str]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - custom_queries: Optional[Sequence[CustomQuery]] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + custom_queries: Optional[Sequence[CustomQuery]] = None db: str - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - host: Optional[str] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - only_custom_queries: Optional[bool] + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + host: Optional[str] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + only_custom_queries: Optional[bool] = None password: str - port: Optional[int] - security: Optional[Literal['none', 'ssl']] - service: Optional[str] - tags: Optional[Sequence[str]] - tls_cert: Optional[str] - use_global_custom_queries: Optional[str] + port: Optional[int] = None + security: Optional[Literal['none', 'ssl']] = None + service: Optional[str] = None + tags: Optional[Sequence[str]] = None + tls_cert: Optional[str] = None + use_global_custom_queries: Optional[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/ibm_db2/datadog_checks/ibm_db2/config_models/shared.py b/ibm_db2/datadog_checks/ibm_db2/config_models/shared.py index 5e538415ce396..45d1293f12b20 100644 --- a/ibm_db2/datadog_checks/ibm_db2/config_models/shared.py +++ b/ibm_db2/datadog_checks/ibm_db2/config_models/shared.py @@ -11,39 +11,39 @@ from typing import Any, Mapping, Optional, Sequence -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 - - global_custom_queries: Optional[Sequence[Mapping[str, Any]]] - service: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + global_custom_queries: Optional[Sequence[Mapping[str, Any]]] = None + 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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/ibm_i/datadog_checks/ibm_i/config_models/defaults.py b/ibm_i/datadog_checks/ibm_i/config_models/defaults.py index b8692356f4ff6..2a34377fd39c6 100644 --- a/ibm_i/datadog_checks/ibm_i/config_models/defaults.py +++ b/ibm_i/datadog_checks/ibm_i/config_models/defaults.py @@ -7,54 +7,28 @@ # 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_connection_string(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_driver(field, value): +def instance_driver(): return 'iSeries Access ODBC Driver' -def instance_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return False -def instance_hostname(field, value): - return get_default_field_value(field, value) - - -def instance_job_query_timeout(field, value): +def instance_job_query_timeout(): return 240 -def instance_message_queue_info(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_password(field, value): - return get_default_field_value(field, value) - - -def instance_queries(field, value): +def instance_queries(): return [ {'name': 'disk_usage'}, {'name': 'cpu_usage'}, @@ -68,29 +42,13 @@ def instance_queries(field, value): ] -def instance_query_timeout(field, value): +def instance_query_timeout(): return 30 -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_severity_threshold(field, value): +def instance_severity_threshold(): return 50 -def instance_system(field, value): - return get_default_field_value(field, value) - - -def instance_system_mq_query_timeout(field, value): +def instance_system_mq_query_timeout(): return 80 - - -def instance_tags(field, value): - return get_default_field_value(field, value) - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/ibm_i/datadog_checks/ibm_i/config_models/instance.py b/ibm_i/datadog_checks/ibm_i/config_models/instance.py index b6f8572409e11..f246be0ce38d9 100644 --- a/ibm_i/datadog_checks/ibm_i/config_models/instance.py +++ b/ibm_i/datadog_checks/ibm_i/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -from pydantic import BaseModel, 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 @@ -20,68 +20,77 @@ class MessageQueueInfo(BaseModel): - class Config: - allow_mutation = False - - selected_message_queues: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + selected_message_queues: Optional[Sequence[str]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Query(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + frozen=True, + ) name: str class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - connection_string: Optional[str] - disable_generic_tags: Optional[bool] - driver: Optional[str] - empty_default_hostname: Optional[bool] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + connection_string: Optional[str] = None + disable_generic_tags: Optional[bool] = None + driver: Optional[str] = None + empty_default_hostname: Optional[bool] = None hostname: Optional[str] = Field(None, max_length=255, min_length=1) job_query_timeout: Optional[int] = Field(None, gt=0) - message_queue_info: Optional[MessageQueueInfo] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - password: Optional[str] - queries: Optional[Sequence[Query]] + message_queue_info: Optional[MessageQueueInfo] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + password: Optional[str] = None + queries: Optional[Sequence[Query]] = None query_timeout: Optional[int] = Field(None, gt=0) - service: Optional[str] + service: Optional[str] = None severity_threshold: Optional[int] = Field(None, ge=0, le=99) - system: Optional[str] + system: Optional[str] = None system_mq_query_timeout: Optional[int] = Field(None, gt=0) - tags: Optional[Sequence[str]] - username: Optional[str] + tags: Optional[Sequence[str]] = None + username: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/ibm_i/datadog_checks/ibm_i/config_models/shared.py b/ibm_i/datadog_checks/ibm_i/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/ibm_i/datadog_checks/ibm_i/config_models/shared.py +++ b/ibm_i/datadog_checks/ibm_i/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/ibm_i/tests/test_sql_queries.py b/ibm_i/tests/test_sql_queries.py index a20a3132e214a..70d569e1ff084 100644 --- a/ibm_i/tests/test_sql_queries.py +++ b/ibm_i/tests/test_sql_queries.py @@ -5,7 +5,6 @@ import pytest from datadog_checks.ibm_i.config_models import InstanceConfig -from datadog_checks.ibm_i.config_models.instance import MessageQueueInfo from datadog_checks.ibm_i.queries import query_map @@ -35,10 +34,11 @@ def test_get_message_queue_info(selected_message_queues, expected): "job_query_timeout": 2, "system_mq_query_timeout": 3, "severity_threshold": 50, + "message_queue_info": {"selected_message_queues": selected_message_queues}, } - instance_conf = InstanceConfig( - **instance_conf_attr, - message_queue_info=MessageQueueInfo(selected_message_queues=selected_message_queues), + instance_conf = InstanceConfig.model_validate( + instance_conf_attr, + context={'configured_fields': frozenset(instance_conf_attr)}, ) qmap_output = query_map(instance_conf) assert qmap_output['message_queue_info']['name'] == 'message_queue_info' diff --git a/ibm_mq/datadog_checks/ibm_mq/config_models/defaults.py b/ibm_mq/datadog_checks/ibm_mq/config_models/defaults.py index 0bb9e7f6a644f..91495645b73e4 100644 --- a/ibm_mq/datadog_checks/ibm_mq/config_models/defaults.py +++ b/ibm_mq/datadog_checks/ibm_mq/config_models/defaults.py @@ -7,144 +7,74 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_queue_manager_process(field, value): - return get_default_field_value(field, value) - - -def shared_queue_manager_process_limit(field, value): +def shared_queue_manager_process_limit(): return 1 -def shared_service(field, value): - return get_default_field_value(field, value) - - -def instance_auto_discover_channels(field, value): +def instance_auto_discover_channels(): return True -def instance_auto_discover_queues(field, value): +def instance_auto_discover_queues(): return False -def instance_channel_status_mapping(field, value): - return get_default_field_value(field, value) - - -def instance_channels(field, value): - return get_default_field_value(field, value) - - -def instance_collect_reset_queue_metrics(field, value): +def instance_collect_reset_queue_metrics(): return True -def instance_collect_statistics_metrics(field, value): +def instance_collect_statistics_metrics(): return False -def instance_connection_name(field, value): - return get_default_field_value(field, value) - - -def instance_convert_endianness(field, value): +def instance_convert_endianness(): return False -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_host(field, value): +def instance_host(): return 'localhost' -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_mqcd_version(field, value): +def instance_mqcd_version(): return 6 -def instance_override_hostname(field, value): +def instance_override_hostname(): return False -def instance_password(field, value): - return get_default_field_value(field, value) - - -def instance_port(field, value): +def instance_port(): return 1414 -def instance_queue_manager_process(field, value): - return get_default_field_value(field, value) - - -def instance_queue_manager_timezone(field, value): +def instance_queue_manager_timezone(): return 'Etc/UTC' -def instance_queue_patterns(field, value): - return get_default_field_value(field, value) - - -def instance_queue_regex(field, value): - return get_default_field_value(field, value) - - -def instance_queue_tag_re(field, value): - return get_default_field_value(field, value) - - -def instance_queues(field, value): - return get_default_field_value(field, value) - - -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_ssl_auth(field, value): +def instance_ssl_auth(): return False -def instance_ssl_certificate_label(field, value): - return get_default_field_value(field, value) - - -def instance_ssl_cipher_spec(field, value): - return get_default_field_value(field, value) - - -def instance_ssl_key_repository_location(field, value): +def instance_ssl_key_repository_location(): return '/var/mqm/ssl-db/client/KeyringClient' -def instance_tags(field, value): - return get_default_field_value(field, value) - - -def instance_timeout(field, value): +def instance_timeout(): return 5 -def instance_try_basic_auth(field, value): +def instance_try_basic_auth(): return True - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/ibm_mq/datadog_checks/ibm_mq/config_models/instance.py b/ibm_mq/datadog_checks/ibm_mq/config_models/instance.py index 1df85491a937a..7d867a411947d 100644 --- a/ibm_mq/datadog_checks/ibm_mq/config_models/instance.py +++ b/ibm_mq/datadog_checks/ibm_mq/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -from pydantic import BaseModel, 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 @@ -20,70 +20,79 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - auto_discover_channels: Optional[bool] - auto_discover_queues: Optional[bool] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + auto_discover_channels: Optional[bool] = None + auto_discover_queues: Optional[bool] = None channel: str = Field(..., min_length=1) - channel_status_mapping: Optional[Mapping[str, Any]] - channels: Optional[Sequence[str]] - collect_reset_queue_metrics: Optional[bool] - collect_statistics_metrics: Optional[bool] + channel_status_mapping: Optional[Mapping[str, Any]] = None + channels: Optional[Sequence[str]] = None + collect_reset_queue_metrics: Optional[bool] = None + collect_statistics_metrics: Optional[bool] = None connection_name: Optional[str] = Field(None, min_length=1) - convert_endianness: Optional[bool] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] + convert_endianness: Optional[bool] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None host: Optional[str] = Field(None, min_length=1) - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None mqcd_version: Optional[float] = Field(None, ge=1.0) - override_hostname: Optional[bool] + override_hostname: Optional[bool] = None password: Optional[str] = Field(None, min_length=1) - port: Optional[int] + port: Optional[int] = None queue_manager: str = Field(..., min_length=1) - queue_manager_process: Optional[str] + queue_manager_process: Optional[str] = None queue_manager_timezone: Optional[str] = Field(None, min_length=1) - queue_patterns: Optional[Sequence[str]] - queue_regex: Optional[Sequence[str]] - queue_tag_re: Optional[Mapping[str, Any]] - queues: Optional[Sequence[str]] - service: Optional[str] - ssl_auth: Optional[bool] - ssl_certificate_label: Optional[str] - ssl_cipher_spec: Optional[str] + queue_patterns: Optional[Sequence[str]] = None + queue_regex: Optional[Sequence[str]] = None + queue_tag_re: Optional[Mapping[str, Any]] = None + queues: Optional[Sequence[str]] = None + service: Optional[str] = None + ssl_auth: Optional[bool] = None + ssl_certificate_label: Optional[str] = None + ssl_cipher_spec: Optional[str] = None ssl_key_repository_location: Optional[str] = Field(None, min_length=1) - tags: Optional[Sequence[str]] - timeout: Optional[int] - try_basic_auth: Optional[bool] + tags: Optional[Sequence[str]] = None + timeout: Optional[int] = None + try_basic_auth: Optional[bool] = None username: Optional[str] = Field(None, min_length=1) - @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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/ibm_mq/datadog_checks/ibm_mq/config_models/shared.py b/ibm_mq/datadog_checks/ibm_mq/config_models/shared.py index 19c50d6e855bc..980a6f2d7be75 100644 --- a/ibm_mq/datadog_checks/ibm_mq/config_models/shared.py +++ b/ibm_mq/datadog_checks/ibm_mq/config_models/shared.py @@ -11,7 +11,7 @@ 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 @@ -20,31 +20,40 @@ class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - queue_manager_process: Optional[str] - queue_manager_process_limit: Optional[int] - service: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + queue_manager_process: Optional[str] = None + queue_manager_process_limit: Optional[int] = None + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/ibm_was/datadog_checks/ibm_was/config_models/defaults.py b/ibm_was/datadog_checks/ibm_was/config_models/defaults.py index 31336889d73e5..2fcbcff8c1c19 100644 --- a/ibm_was/datadog_checks/ibm_was/config_models/defaults.py +++ b/ibm_was/datadog_checks/ibm_was/config_models/defaults.py @@ -7,196 +7,86 @@ # 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_custom_queries(field, value): - return get_default_field_value(field, value) - - -def instance_custom_queries_units_gauge(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_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_only_custom_queries(field, value): +def instance_only_custom_queries(): return False -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_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_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_global_custom_queries(field, value): +def instance_use_global_custom_queries(): 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/ibm_was/datadog_checks/ibm_was/config_models/instance.py b/ibm_was/datadog_checks/ibm_was/config_models/instance.py index 335d08ef2c0ee..484f6fb8b9aec 100644 --- a/ibm_was/datadog_checks/ibm_was/config_models/instance.py +++ b/ibm_was/datadog_checks/ibm_was/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,107 +20,116 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class CustomQuery(BaseModel): - class Config: - allow_mutation = False - - metric_prefix: Optional[str] - stat: Optional[str] - tag_keys: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + metric_prefix: Optional[str] = None + stat: Optional[str] = None + tag_keys: Optional[Sequence[str]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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] - custom_queries: Optional[Sequence[CustomQuery]] - custom_queries_units_gauge: Optional[Sequence[str]] - 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] - only_custom_queries: Optional[bool] - password: Optional[str] - persist_connections: Optional[bool] - proxy: Optional[Proxy] - read_timeout: Optional[float] - request_size: Optional[float] - service: Optional[str] + model_config = ConfigDict( + validate_default=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 + custom_queries: Optional[Sequence[CustomQuery]] = None + custom_queries_units_gauge: Optional[Sequence[str]] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + extra_headers: Optional[Mapping[str, Any]] = None + headers: Optional[Mapping[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 + only_custom_queries: Optional[bool] = None + password: Optional[str] = None + persist_connections: Optional[bool] = None + proxy: Optional[Proxy] = None + read_timeout: Optional[float] = None + request_size: Optional[float] = None + service: Optional[str] = None servlet_url: 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] - use_global_custom_queries: Optional[str] - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + use_global_custom_queries: Optional[str] = None + use_legacy_auth_encoding: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/ibm_was/datadog_checks/ibm_was/config_models/shared.py b/ibm_was/datadog_checks/ibm_was/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/ibm_was/datadog_checks/ibm_was/config_models/shared.py +++ b/ibm_was/datadog_checks/ibm_was/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/ignite/datadog_checks/ignite/config_models/defaults.py b/ignite/datadog_checks/ignite/config_models/defaults.py index b9702a06b9ed7..42c096be40fdd 100644 --- a/ignite/datadog_checks/ignite/config_models/defaults.py +++ b/ignite/datadog_checks/ignite/config_models/defaults.py @@ -7,108 +7,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/ignite/datadog_checks/ignite/config_models/instance.py b/ignite/datadog_checks/ignite/config_models/instance.py index bc4c01723f132..631a321dda3bb 100644 --- a/ignite/datadog_checks/ignite/config_models/instance.py +++ b/ignite/datadog_checks/ignite/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,51 +20,60 @@ 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, + 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[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/ignite/datadog_checks/ignite/config_models/shared.py b/ignite/datadog_checks/ignite/config_models/shared.py index 1c722ceac49bc..0db55a6d064d5 100644 --- a/ignite/datadog_checks/ignite/config_models/shared.py +++ b/ignite/datadog_checks/ignite/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,34 +20,43 @@ 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, + frozen=True, + ) + collect_default_metrics: Optional[bool] = None + conf: Optional[Sequence[Mapping[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/iis/datadog_checks/iis/config_models/defaults.py b/iis/datadog_checks/iis/config_models/defaults.py index c177c2474ebd6..3d179e23b96bc 100644 --- a/iis/datadog_checks/iis/config_models/defaults.py +++ b/iis/datadog_checks/iis/config_models/defaults.py @@ -7,92 +7,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 shared_use_localized_counters(field, value): +def shared_use_localized_counters(): return False -def instance_additional_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_app_pools(field, value): - return get_default_field_value(field, value) - - -def instance_counter_data_types(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_extra_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_host(field, value): +def instance_host(): return '.' -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_password(field, value): - return get_default_field_value(field, value) - - -def instance_server(field, value): - return get_default_field_value(field, value) - - -def instance_server_tag(field, value): - return get_default_field_value(field, value) - - -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_sites(field, value): - return get_default_field_value(field, value) - - -def instance_tags(field, value): - return get_default_field_value(field, value) - - -def instance_use_legacy_check_version(field, value): +def instance_use_legacy_check_version(): return False - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/iis/datadog_checks/iis/config_models/instance.py b/iis/datadog_checks/iis/config_models/instance.py index 9370ebd6dd0b8..c7122a2901ca0 100644 --- a/iis/datadog_checks/iis/config_models/instance.py +++ b/iis/datadog_checks/iis/config_models/instance.py @@ -9,9 +9,10 @@ from __future__ import annotations -from typing import Literal, Mapping, Optional, Sequence, Union +from typing import Mapping, Optional, Sequence, Union -from pydantic import BaseModel, Extra, Field, root_validator, validator +from pydantic import BaseModel, ConfigDict, Field, 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 @@ -20,119 +21,128 @@ class AppPool(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Counter(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - aggregate: Optional[Union[bool, Literal['only']]] - average: Optional[bool] - metric_name: Optional[str] - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + extra='allow', + frozen=True, + ) + aggregate: Optional[Union[bool, Literal['only']]] = None + average: Optional[bool] = None + metric_name: Optional[str] = None + name: Optional[str] = None + type: Optional[str] = None class InstanceCounts(BaseModel): - class Config: - allow_mutation = False - - monitored: Optional[str] - total: Optional[str] - unique: Optional[str] + model_config = ConfigDict( + frozen=True, + ) + monitored: Optional[str] = None + total: Optional[str] = None + unique: Optional[str] = None class ExtraMetrics(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + frozen=True, + ) counters: Sequence[Mapping[str, Union[str, Counter]]] - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] - instance_counts: Optional[InstanceCounts] + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None + instance_counts: Optional[InstanceCounts] = None name: str - tag_name: Optional[str] - use_localized_counters: Optional[bool] + tag_name: Optional[str] = None + use_localized_counters: Optional[bool] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metrics(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + frozen=True, + ) counters: Sequence[Mapping[str, Union[str, Counter]]] - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] - instance_counts: Optional[InstanceCounts] + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None + instance_counts: Optional[InstanceCounts] = None name: str - tag_name: Optional[str] - use_localized_counters: Optional[bool] + tag_name: Optional[str] = None + use_localized_counters: Optional[bool] = None class Site(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - additional_metrics: Optional[Sequence[Sequence[str]]] - app_pools: Optional[Union[Sequence[str], AppPool]] - counter_data_types: Optional[Sequence[str]] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - enable_health_service_check: Optional[bool] - extra_metrics: Optional[Mapping[str, ExtraMetrics]] - host: Optional[str] - metric_patterns: Optional[MetricPatterns] - metrics: Optional[Mapping[str, Metrics]] - min_collection_interval: Optional[float] - namespace: Optional[str] = Field(None, regex='\\w*') - password: Optional[str] - server: Optional[str] - server_tag: Optional[str] - service: Optional[str] - sites: Optional[Union[Sequence[str], Site]] - tags: Optional[Sequence[str]] - use_legacy_check_version: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + additional_metrics: Optional[Sequence[Sequence[str]]] = None + app_pools: Optional[Union[Sequence[str], AppPool]] = None + counter_data_types: Optional[Sequence[str]] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + enable_health_service_check: Optional[bool] = None + extra_metrics: Optional[Mapping[str, ExtraMetrics]] = None + host: Optional[str] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[Mapping[str, Metrics]] = None + min_collection_interval: Optional[float] = None + namespace: Optional[str] = Field(None, pattern='\\w*') + password: Optional[str] = None + server: Optional[str] = None + server_tag: Optional[str] = None + service: Optional[str] = None + sites: Optional[Union[Sequence[str], Site]] = None + tags: Optional[Sequence[str]] = None + use_legacy_check_version: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/iis/datadog_checks/iis/config_models/shared.py b/iis/datadog_checks/iis/config_models/shared.py index eefbab173ede1..aa58639466c05 100644 --- a/iis/datadog_checks/iis/config_models/shared.py +++ b/iis/datadog_checks/iis/config_models/shared.py @@ -11,7 +11,7 @@ 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 @@ -20,30 +20,39 @@ class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - service: Optional[str] - use_localized_counters: Optional[bool] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None + use_localized_counters: Optional[bool] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/impala/datadog_checks/impala/config_models/defaults.py b/impala/datadog_checks/impala/config_models/defaults.py index a76129227677c..2a49e1453f118 100644 --- a/impala/datadog_checks/impala/config_models/defaults.py +++ b/impala/datadog_checks/impala/config_models/defaults.py @@ -7,284 +7,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/impala/datadog_checks/impala/config_models/instance.py b/impala/datadog_checks/impala/config_models/instance.py index a0b7fd4ab9817..316d8f5856387 100644 --- a/impala/datadog_checks/impala/config_models/instance.py +++ b/impala/datadog_checks/impala/config_models/instance.py @@ -9,9 +9,10 @@ from __future__ import annotations -from typing import Any, Literal, Mapping, Optional, Sequence, Union +from typing import Any, Mapping, Optional, Sequence, Union -from pydantic import BaseModel, Extra, Field, root_validator, validator +from pydantic import BaseModel, ConfigDict, Field, 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 @@ -20,147 +21,156 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + labels: Optional[Sequence[str]] = None + match: Optional[Sequence[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, + 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[Sequence[str]] = None + exclude_metrics: Optional[Sequence[str]] = None + exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] = None + extra_headers: Optional[Mapping[str, Any]] = None + extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] = None + headers: Optional[Mapping[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[Sequence[str]] = None + include_labels: Optional[Sequence[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[Sequence[Union[str, Mapping[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] + password: Optional[str] = None + persist_connections: Optional[bool] = None + proxy: Optional[Proxy] = None + raw_line_filters: Optional[Sequence[str]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[Mapping[str, Any]] = None + request_size: Optional[float] = None + service: Optional[str] = None service_type: Literal['daemon', 'statestore', 'catalog'] - 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) + share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/impala/datadog_checks/impala/config_models/shared.py b/impala/datadog_checks/impala/config_models/shared.py index fd4cb4cdf9bd6..cddf15255ec30 100644 --- a/impala/datadog_checks/impala/config_models/shared.py +++ b/impala/datadog_checks/impala/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/impala/tests/test_config.py b/impala/tests/test_config.py index 85014f95e2eba..9e1458e305131 100644 --- a/impala/tests/test_config.py +++ b/impala/tests/test_config.py @@ -29,7 +29,7 @@ def test_config_unknown_service_type(service_type): assert ( exception_info.value.args[0] == 'Detected 1 error while loading configuration model `InstanceConfig`:\nservice_type\n ' - 'unexpected value; permitted: \'daemon\', \'statestore\', \'catalog\'' + 'Input should be \'daemon\', \'statestore\' or \'catalog\'' ) @@ -45,7 +45,7 @@ def test_config_service_type_mandatory(): assert ( exception_info.value.args[0] == 'Detected 1 error while loading configuration model `InstanceConfig`:\nservice_type\n ' - 'field required' + 'Field required' ) @@ -62,7 +62,7 @@ def test_config_service_type_can_not_be_none(): assert ( exception_info.value.args[0] == 'Detected 1 error while loading configuration model `InstanceConfig`:\nservice_type\n ' - 'none is not an allowed value' + 'Input should be \'daemon\', \'statestore\' or \'catalog\'' ) diff --git a/istio/datadog_checks/istio/config_models/defaults.py b/istio/datadog_checks/istio/config_models/defaults.py index 9e027c2025140..4cf4dab11267b 100644 --- a/istio/datadog_checks/istio/config_models/defaults.py +++ b/istio/datadog_checks/istio/config_models/defaults.py @@ -7,372 +7,162 @@ # 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_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_health_service_check(field, value): +def instance_health_service_check(): return True -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_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_istio_mesh_endpoint(field, value): - return get_default_field_value(field, value) - - -def instance_istiod_endpoint(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): - 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_prometheus_metrics_prefix(field, value): - return get_default_field_value(field, value) - - -def instance_prometheus_url(field, value): - return get_default_field_value(field, value) - - -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_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_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_type_overrides(field, value): - return get_default_field_value(field, value) - - -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_openmetrics(field, value): +def instance_use_openmetrics(): return False -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/istio/datadog_checks/istio/config_models/instance.py b/istio/datadog_checks/istio/config_models/instance.py index 0e569e9813993..c9118b04f664a 100644 --- a/istio/datadog_checks/istio/config_models/instance.py +++ b/istio/datadog_checks/istio/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,190 +20,199 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + extra='allow', + frozen=True, + ) + name: Optional[str] = None + type: Optional[str] = None class IgnoreMetricsByLabels(BaseModel): - class Config: - allow_mutation = False - - target_label_key: Optional[str] - target_label_value_list: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + target_label_key: Optional[str] = None + target_label_value_list: Optional[Sequence[str]] = None class TargetMetric(BaseModel): - class Config: - allow_mutation = False - - label_to_match: Optional[str] - labels_to_get: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + label_to_match: Optional[str] = None + labels_to_get: Optional[Sequence[str]] = None class LabelJoins(BaseModel): - class Config: - allow_mutation = False - - target_metric: Optional[TargetMetric] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + labels: Optional[Sequence[str]] = None + match: Optional[Sequence[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] - 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]] - health_service_check: Optional[bool] - histogram_buckets_as_distributions: Optional[bool] - hostname_format: Optional[str] - hostname_label: Optional[str] - ignore_connection_errors: Optional[bool] - ignore_metrics: Optional[Sequence[str]] - ignore_metrics_by_labels: Optional[IgnoreMetricsByLabels] - ignore_tags: Optional[Sequence[str]] - include_labels: Optional[Sequence[str]] - istio_mesh_endpoint: Optional[str] - istiod_endpoint: Optional[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, 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] - prometheus_metrics_prefix: Optional[str] - prometheus_url: Optional[str] - 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] - 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] - 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] - type_overrides: Optional[Mapping[str, Any]] - use_latest_spec: Optional[bool] - use_legacy_auth_encoding: Optional[bool] - use_openmetrics: Optional[bool] - use_process_start_time: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=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 + 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[Sequence[str]] = None + exclude_metrics: Optional[Sequence[str]] = None + exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] = None + extra_headers: Optional[Mapping[str, Any]] = None + extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] = None + headers: Optional[Mapping[str, Any]] = None + health_service_check: Optional[bool] = 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_metrics: Optional[Sequence[str]] = None + ignore_metrics_by_labels: Optional[IgnoreMetricsByLabels] = None + ignore_tags: Optional[Sequence[str]] = None + include_labels: Optional[Sequence[str]] = None + istio_mesh_endpoint: Optional[str] = None + istiod_endpoint: Optional[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[Mapping[str, Any]] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[Sequence[Union[str, Mapping[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 + prometheus_metrics_prefix: Optional[str] = None + prometheus_url: Optional[str] = None + proxy: Optional[Proxy] = None + raw_line_filters: Optional[Sequence[str]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[Mapping[str, Any]] = 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 + share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + type_overrides: Optional[Mapping[str, Any]] = None + use_latest_spec: Optional[bool] = None + use_legacy_auth_encoding: Optional[bool] = None + use_openmetrics: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/istio/datadog_checks/istio/config_models/shared.py b/istio/datadog_checks/istio/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/istio/datadog_checks/istio/config_models/shared.py +++ b/istio/datadog_checks/istio/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/jboss_wildfly/datadog_checks/jboss_wildfly/config_models/defaults.py b/jboss_wildfly/datadog_checks/jboss_wildfly/config_models/defaults.py index 20f8a0d7a0213..42c096be40fdd 100644 --- a/jboss_wildfly/datadog_checks/jboss_wildfly/config_models/defaults.py +++ b/jboss_wildfly/datadog_checks/jboss_wildfly/config_models/defaults.py @@ -7,112 +7,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_custom_jar_paths(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 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_host(field, value): - return get_default_field_value(field, value) - - -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_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_port(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/jboss_wildfly/datadog_checks/jboss_wildfly/config_models/instance.py b/jboss_wildfly/datadog_checks/jboss_wildfly/config_models/instance.py index 20bdc22879459..27518398030cb 100644 --- a/jboss_wildfly/datadog_checks/jboss_wildfly/config_models/instance.py +++ b/jboss_wildfly/datadog_checks/jboss_wildfly/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,51 +20,60 @@ class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - collect_default_jvm_metrics: Optional[bool] - empty_default_hostname: Optional[bool] - host: Optional[str] - is_jmx: Optional[bool] - java_bin_path: Optional[str] - java_options: Optional[str] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + collect_default_jvm_metrics: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + host: Optional[str] = None + is_jmx: Optional[bool] = None + java_bin_path: Optional[str] = None + java_options: Optional[str] = None jmx_url: str - key_store_password: Optional[str] - key_store_path: Optional[str] - min_collection_interval: Optional[float] - name: Optional[str] - password: Optional[str] - port: Optional[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] + 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: Optional[int] = None + 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[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/jboss_wildfly/datadog_checks/jboss_wildfly/config_models/shared.py b/jboss_wildfly/datadog_checks/jboss_wildfly/config_models/shared.py index 7d932c7e1af4f..4450cb75df5e6 100644 --- a/jboss_wildfly/datadog_checks/jboss_wildfly/config_models/shared.py +++ b/jboss_wildfly/datadog_checks/jboss_wildfly/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,35 +20,44 @@ class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - collect_default_metrics: Optional[bool] - conf: Optional[Sequence[Mapping[str, Any]]] - custom_jar_paths: Optional[Sequence[str]] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + collect_default_metrics: Optional[bool] = None + conf: Optional[Sequence[Mapping[str, Any]]] = None + custom_jar_paths: Optional[Sequence[str]] = None is_jmx: bool - new_gc_metrics: Optional[bool] - service: Optional[str] + new_gc_metrics: Optional[bool] = None + service: Optional[str] = None service_check_prefix: str - @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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/kafka/datadog_checks/kafka/config_models/defaults.py b/kafka/datadog_checks/kafka/config_models/defaults.py index 91f55843f388b..07982a605ce4a 100644 --- a/kafka/datadog_checks/kafka/config_models/defaults.py +++ b/kafka/datadog_checks/kafka/config_models/defaults.py @@ -7,108 +7,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 True -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/kafka/datadog_checks/kafka/config_models/instance.py b/kafka/datadog_checks/kafka/config_models/instance.py index bc4c01723f132..631a321dda3bb 100644 --- a/kafka/datadog_checks/kafka/config_models/instance.py +++ b/kafka/datadog_checks/kafka/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,51 +20,60 @@ 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, + 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[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/kafka/datadog_checks/kafka/config_models/shared.py b/kafka/datadog_checks/kafka/config_models/shared.py index 1c722ceac49bc..0db55a6d064d5 100644 --- a/kafka/datadog_checks/kafka/config_models/shared.py +++ b/kafka/datadog_checks/kafka/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,34 +20,43 @@ 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, + frozen=True, + ) + collect_default_metrics: Optional[bool] = None + conf: Optional[Sequence[Mapping[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/kafka_consumer/datadog_checks/kafka_consumer/config.py b/kafka_consumer/datadog_checks/kafka_consumer/config.py index d52c8f09652e8..af2de2aebcf1c 100644 --- a/kafka_consumer/datadog_checks/kafka_consumer/config.py +++ b/kafka_consumer/datadog_checks/kafka_consumer/config.py @@ -59,7 +59,7 @@ def validate_config(self): if not self._kafka_connect_str: raise ConfigurationError('`kafka_connect_str` is required') - if not isinstance(self._kafka_connect_str, (str, list)): + if self._kafka_connect_str is not None and not isinstance(self._kafka_connect_str, (str, list)): raise ConfigurationError('`kafka_connect_str` should be string or list of strings') if isinstance(self._kafka_connect_str, list): diff --git a/kafka_consumer/datadog_checks/kafka_consumer/config_models/defaults.py b/kafka_consumer/datadog_checks/kafka_consumer/config_models/defaults.py index 9202c7c36ee8c..5ee10d396c6b3 100644 --- a/kafka_consumer/datadog_checks/kafka_consumer/config_models/defaults.py +++ b/kafka_consumer/datadog_checks/kafka_consumer/config_models/defaults.py @@ -7,120 +7,46 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_kafka_timeout(field, value): +def shared_kafka_timeout(): return 5 -def shared_service(field, value): - return get_default_field_value(field, value) - - -def instance_consumer_groups(field, value): - return get_default_field_value(field, value) - - -def instance_consumer_groups_regex(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_kafka_client_api_version(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_monitor_all_broker_highwatermarks(field, value): +def instance_monitor_all_broker_highwatermarks(): return False -def instance_monitor_unlisted_consumer_groups(field, value): +def instance_monitor_unlisted_consumer_groups(): return False -def instance_sasl_kerberos_domain_name(field, value): - return get_default_field_value(field, value) - - -def instance_sasl_kerberos_keytab(field, value): - return get_default_field_value(field, value) - - -def instance_sasl_kerberos_principal(field, value): +def instance_sasl_kerberos_principal(): return 'kafkaclient' -def instance_sasl_kerberos_service_name(field, value): +def instance_sasl_kerberos_service_name(): return 'kafka' -def instance_sasl_mechanism(field, value): - return get_default_field_value(field, value) - - -def instance_sasl_oauth_token_provider(field, value): - return get_default_field_value(field, value) - - -def instance_sasl_plain_password(field, value): - return get_default_field_value(field, value) - - -def instance_sasl_plain_username(field, value): - return get_default_field_value(field, value) - - -def instance_security_protocol(field, value): +def instance_security_protocol(): return 'PLAINTEXT' -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_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_crlfile(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/kafka_consumer/datadog_checks/kafka_consumer/config_models/instance.py b/kafka_consumer/datadog_checks/kafka_consumer/config_models/instance.py index 0b168860dad11..55c8a77f3824c 100644 --- a/kafka_consumer/datadog_checks/kafka_consumer/config_models/instance.py +++ b/kafka_consumer/datadog_checks/kafka_consumer/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,73 +20,82 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class SaslOauthTokenProvider(BaseModel): - class Config: - allow_mutation = False - - client_id: Optional[str] - client_secret: Optional[str] - url: Optional[str] + model_config = ConfigDict( + frozen=True, + ) + client_id: Optional[str] = None + client_secret: Optional[str] = None + url: Optional[str] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - consumer_groups: Optional[Mapping[str, Any]] - consumer_groups_regex: Optional[Mapping[str, Any]] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - kafka_client_api_version: Optional[str] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + consumer_groups: Optional[Mapping[str, Any]] = None + consumer_groups_regex: Optional[Mapping[str, Any]] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + kafka_client_api_version: Optional[str] = None kafka_connect_str: Union[str, Sequence[str]] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - monitor_all_broker_highwatermarks: Optional[bool] - monitor_unlisted_consumer_groups: Optional[bool] - sasl_kerberos_domain_name: Optional[str] - sasl_kerberos_keytab: Optional[str] - sasl_kerberos_principal: Optional[str] - sasl_kerberos_service_name: Optional[str] - sasl_mechanism: Optional[str] - sasl_oauth_token_provider: Optional[SaslOauthTokenProvider] - sasl_plain_password: Optional[str] - sasl_plain_username: Optional[str] - security_protocol: Optional[str] - service: Optional[str] - tags: Optional[Sequence[str]] - tls_ca_cert: Optional[str] - tls_cert: Optional[str] - tls_crlfile: 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) + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + monitor_all_broker_highwatermarks: Optional[bool] = None + monitor_unlisted_consumer_groups: Optional[bool] = None + sasl_kerberos_domain_name: Optional[str] = None + sasl_kerberos_keytab: Optional[str] = None + sasl_kerberos_principal: Optional[str] = None + sasl_kerberos_service_name: Optional[str] = None + sasl_mechanism: Optional[str] = None + sasl_oauth_token_provider: Optional[SaslOauthTokenProvider] = None + sasl_plain_password: Optional[str] = None + sasl_plain_username: Optional[str] = None + security_protocol: Optional[str] = None + service: Optional[str] = None + tags: Optional[Sequence[str]] = None + tls_ca_cert: Optional[str] = None + tls_cert: Optional[str] = None + tls_crlfile: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/kafka_consumer/datadog_checks/kafka_consumer/config_models/shared.py b/kafka_consumer/datadog_checks/kafka_consumer/config_models/shared.py index 3183c3d22ad97..1209ce0b60d1b 100644 --- a/kafka_consumer/datadog_checks/kafka_consumer/config_models/shared.py +++ b/kafka_consumer/datadog_checks/kafka_consumer/config_models/shared.py @@ -11,7 +11,7 @@ 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 @@ -20,30 +20,39 @@ class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - kafka_timeout: Optional[int] - service: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + kafka_timeout: Optional[int] = None + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/kafka_consumer/datadog_checks/kafka_consumer/kafka_consumer.py b/kafka_consumer/datadog_checks/kafka_consumer/kafka_consumer.py index de83a4f360a7d..9d79390d9aa27 100644 --- a/kafka_consumer/datadog_checks/kafka_consumer/kafka_consumer.py +++ b/kafka_consumer/datadog_checks/kafka_consumer/kafka_consumer.py @@ -26,7 +26,7 @@ def __init__(self, name, init_config, instances): self.config = KafkaConfig(self.init_config, self.instance, self.log) self._context_limit = self.config._context_limit self.client = KafkaClient(self.config, self.get_tls_context(), self.log) - self.check_initializations.append(self.config.validate_config) + self.check_initializations.insert(0, self.config.validate_config) def check(self, _): """The main entrypoint of the check.""" diff --git a/kafka_consumer/tests/test_integration.py b/kafka_consumer/tests/test_integration.py index 2a8e545d4630e..5131288ccbb05 100644 --- a/kafka_consumer/tests/test_integration.py +++ b/kafka_consumer/tests/test_integration.py @@ -111,12 +111,6 @@ def test_monitor_broker_highwatermarks( 0, id="Empty consumer_groups", ), - pytest.param( - {'kafka_connect_str': None}, - pytest.raises(Exception, match='kafka_connect_str\n none is not an allowed value'), - 0, - id="Invalid Nonetype kafka_connect_str", - ), pytest.param( {'kafka_connect_str': ['localhost:9092', 'localhost:9093'], 'monitor_unlisted_consumer_groups': True}, does_not_raise(), diff --git a/kong/datadog_checks/kong/config_models/defaults.py b/kong/datadog_checks/kong/config_models/defaults.py index 379a807108f58..8d8817a727f92 100644 --- a/kong/datadog_checks/kong/config_models/defaults.py +++ b/kong/datadog_checks/kong/config_models/defaults.py @@ -7,292 +7,134 @@ # 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_kong_status_url(field, value): +def instance_kong_status_url(): return 'http://localhost:8001/status/' -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://localhost:8001/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/kong/datadog_checks/kong/config_models/instance.py b/kong/datadog_checks/kong/config_models/instance.py index bf1d3c9a6c0b6..3ea2106b6038d 100644 --- a/kong/datadog_checks/kong/config_models/instance.py +++ b/kong/datadog_checks/kong/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,147 +20,156 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + labels: Optional[Sequence[str]] = None + match: Optional[Sequence[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] - kong_status_url: 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, + 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[Sequence[str]] = None + exclude_metrics: Optional[Sequence[str]] = None + exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] = None + extra_headers: Optional[Mapping[str, Any]] = None + extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] = None + headers: Optional[Mapping[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[Sequence[str]] = None + include_labels: Optional[Sequence[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 + kong_status_url: Optional[str] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[Sequence[Union[str, Mapping[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[Sequence[str]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[Mapping[str, Any]] = None + request_size: Optional[float] = None + service: Optional[str] = None + share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/kong/datadog_checks/kong/config_models/shared.py b/kong/datadog_checks/kong/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/kong/datadog_checks/kong/config_models/shared.py +++ b/kong/datadog_checks/kong/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/kube_apiserver_metrics/datadog_checks/kube_apiserver_metrics/config_models/defaults.py b/kube_apiserver_metrics/datadog_checks/kube_apiserver_metrics/config_models/defaults.py index 71cb526970c55..964d08ceb2711 100644 --- a/kube_apiserver_metrics/datadog_checks/kube_apiserver_metrics/config_models/defaults.py +++ b/kube_apiserver_metrics/datadog_checks/kube_apiserver_metrics/config_models/defaults.py @@ -7,276 +7,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_bearer_token_auth(field, value): +def instance_bearer_token_auth(): return True -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_scheme(field, value): +def instance_scheme(): return 'https' -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/kube_apiserver_metrics/datadog_checks/kube_apiserver_metrics/config_models/instance.py b/kube_apiserver_metrics/datadog_checks/kube_apiserver_metrics/config_models/instance.py index 63cc98cac8b62..08bcf458d13e8 100644 --- a/kube_apiserver_metrics/datadog_checks/kube_apiserver_metrics/config_models/instance.py +++ b/kube_apiserver_metrics/datadog_checks/kube_apiserver_metrics/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,141 +20,150 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[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( + frozen=True, + ) + target_label_key: Optional[str] = None + target_label_value_list: Optional[Sequence[str]] = None class TargetMetric(BaseModel): - class Config: - allow_mutation = False - - label_to_match: Optional[str] - labels_to_get: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + label_to_match: Optional[str] = None + labels_to_get: Optional[Sequence[str]] = None class LabelJoins(BaseModel): - class Config: - allow_mutation = False - - target_metric: Optional[TargetMetric] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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]] - 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] + model_config = ConfigDict( + validate_default=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[Sequence[str]] = None + extra_headers: Optional[Mapping[str, Any]] = None + headers: Optional[Mapping[str, Any]] = None + health_service_check: Optional[bool] = None + ignore_metrics: Optional[Sequence[str]] = None + ignore_metrics_by_labels: Optional[IgnoreMetricsByLabels] = None + ignore_tags: Optional[Sequence[str]] = None + include_labels: Optional[Sequence[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[Mapping[str, Any]] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[Sequence[Union[str, Mapping[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] - scheme: Optional[str] - 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 + scheme: Optional[str] = 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[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + type_overrides: Optional[Mapping[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/kube_apiserver_metrics/datadog_checks/kube_apiserver_metrics/config_models/shared.py b/kube_apiserver_metrics/datadog_checks/kube_apiserver_metrics/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/kube_apiserver_metrics/datadog_checks/kube_apiserver_metrics/config_models/shared.py +++ b/kube_apiserver_metrics/datadog_checks/kube_apiserver_metrics/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/kube_dns/datadog_checks/kube_dns/config_models/defaults.py b/kube_dns/datadog_checks/kube_dns/config_models/defaults.py index 131abbd03d115..b7748b92c8872 100644 --- a/kube_dns/datadog_checks/kube_dns/config_models/defaults.py +++ b/kube_dns/datadog_checks/kube_dns/config_models/defaults.py @@ -7,276 +7,122 @@ # 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_health_url(field, value): +def instance_health_url(): return 'http://localhost:8081/readiness' -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/kube_dns/datadog_checks/kube_dns/config_models/instance.py b/kube_dns/datadog_checks/kube_dns/config_models/instance.py index b70ce02bbfeab..db57870d93a16 100644 --- a/kube_dns/datadog_checks/kube_dns/config_models/instance.py +++ b/kube_dns/datadog_checks/kube_dns/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,142 +20,151 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[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( + frozen=True, + ) + target_label_key: Optional[str] = None + target_label_value_list: Optional[Sequence[str]] = None class TargetMetric(BaseModel): - class Config: - allow_mutation = False - - label_to_match: Optional[str] - labels_to_get: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + label_to_match: Optional[str] = None + labels_to_get: Optional[Sequence[str]] = None class LabelJoins(BaseModel): - class Config: - allow_mutation = False - - target_metric: Optional[TargetMetric] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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]] - headers: Optional[Mapping[str, Any]] - health_service_check: Optional[bool] - health_url: Optional[str] - 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] + model_config = ConfigDict( + validate_default=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[Sequence[str]] = None + extra_headers: Optional[Mapping[str, Any]] = None + headers: Optional[Mapping[str, Any]] = None + health_service_check: Optional[bool] = None + health_url: Optional[str] = None + ignore_metrics: Optional[Sequence[str]] = None + ignore_metrics_by_labels: Optional[IgnoreMetricsByLabels] = None + ignore_tags: Optional[Sequence[str]] = None + include_labels: Optional[Sequence[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[Mapping[str, Any]] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[Sequence[Union[str, Mapping[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_endpoint: str - prometheus_metrics_prefix: Optional[str] + 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[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + type_overrides: Optional[Mapping[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/kube_dns/datadog_checks/kube_dns/config_models/shared.py b/kube_dns/datadog_checks/kube_dns/config_models/shared.py index fd4cb4cdf9bd6..cddf15255ec30 100644 --- a/kube_dns/datadog_checks/kube_dns/config_models/shared.py +++ b/kube_dns/datadog_checks/kube_dns/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/kube_metrics_server/datadog_checks/kube_metrics_server/config_models/defaults.py b/kube_metrics_server/datadog_checks/kube_metrics_server/config_models/defaults.py index adb79ffdf8feb..3594e9cce7ba0 100644 --- a/kube_metrics_server/datadog_checks/kube_metrics_server/config_models/defaults.py +++ b/kube_metrics_server/datadog_checks/kube_metrics_server/config_models/defaults.py @@ -7,276 +7,122 @@ # 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_health_url(field, value): +def instance_health_url(): return 'http://localhost:443/livez' -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/kube_metrics_server/datadog_checks/kube_metrics_server/config_models/instance.py b/kube_metrics_server/datadog_checks/kube_metrics_server/config_models/instance.py index a72992e787a06..860d9668d06d8 100644 --- a/kube_metrics_server/datadog_checks/kube_metrics_server/config_models/instance.py +++ b/kube_metrics_server/datadog_checks/kube_metrics_server/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,141 +20,150 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[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( + frozen=True, + ) + target_label_key: Optional[str] = None + target_label_value_list: Optional[Sequence[str]] = None class TargetMetric(BaseModel): - class Config: - allow_mutation = False - - label_to_match: Optional[str] - labels_to_get: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + label_to_match: Optional[str] = None + labels_to_get: Optional[Sequence[str]] = None class LabelJoins(BaseModel): - class Config: - allow_mutation = False - - target_metric: Optional[TargetMetric] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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]] - headers: Optional[Mapping[str, Any]] - health_service_check: Optional[bool] - health_url: Optional[str] - 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] + model_config = ConfigDict( + validate_default=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[Sequence[str]] = None + extra_headers: Optional[Mapping[str, Any]] = None + headers: Optional[Mapping[str, Any]] = None + health_service_check: Optional[bool] = None + health_url: Optional[str] = None + ignore_metrics: Optional[Sequence[str]] = None + ignore_metrics_by_labels: Optional[IgnoreMetricsByLabels] = None + ignore_tags: Optional[Sequence[str]] = None + include_labels: Optional[Sequence[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[Mapping[str, Any]] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[Sequence[Union[str, Mapping[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[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + type_overrides: Optional[Mapping[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/kube_metrics_server/datadog_checks/kube_metrics_server/config_models/shared.py b/kube_metrics_server/datadog_checks/kube_metrics_server/config_models/shared.py index fd4cb4cdf9bd6..cddf15255ec30 100644 --- a/kube_metrics_server/datadog_checks/kube_metrics_server/config_models/shared.py +++ b/kube_metrics_server/datadog_checks/kube_metrics_server/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/kube_proxy/datadog_checks/kube_proxy/config_models/defaults.py b/kube_proxy/datadog_checks/kube_proxy/config_models/defaults.py index e6cbeaacf4745..0788cda3a8301 100644 --- a/kube_proxy/datadog_checks/kube_proxy/config_models/defaults.py +++ b/kube_proxy/datadog_checks/kube_proxy/config_models/defaults.py @@ -7,276 +7,122 @@ # 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_health_url(field, value): +def instance_health_url(): return 'http://localhost:10256/healthz' -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/kube_proxy/datadog_checks/kube_proxy/config_models/instance.py b/kube_proxy/datadog_checks/kube_proxy/config_models/instance.py index a72992e787a06..860d9668d06d8 100644 --- a/kube_proxy/datadog_checks/kube_proxy/config_models/instance.py +++ b/kube_proxy/datadog_checks/kube_proxy/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,141 +20,150 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[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( + frozen=True, + ) + target_label_key: Optional[str] = None + target_label_value_list: Optional[Sequence[str]] = None class TargetMetric(BaseModel): - class Config: - allow_mutation = False - - label_to_match: Optional[str] - labels_to_get: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + label_to_match: Optional[str] = None + labels_to_get: Optional[Sequence[str]] = None class LabelJoins(BaseModel): - class Config: - allow_mutation = False - - target_metric: Optional[TargetMetric] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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]] - headers: Optional[Mapping[str, Any]] - health_service_check: Optional[bool] - health_url: Optional[str] - 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] + model_config = ConfigDict( + validate_default=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[Sequence[str]] = None + extra_headers: Optional[Mapping[str, Any]] = None + headers: Optional[Mapping[str, Any]] = None + health_service_check: Optional[bool] = None + health_url: Optional[str] = None + ignore_metrics: Optional[Sequence[str]] = None + ignore_metrics_by_labels: Optional[IgnoreMetricsByLabels] = None + ignore_tags: Optional[Sequence[str]] = None + include_labels: Optional[Sequence[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[Mapping[str, Any]] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[Sequence[Union[str, Mapping[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[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + type_overrides: Optional[Mapping[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/kube_proxy/datadog_checks/kube_proxy/config_models/shared.py b/kube_proxy/datadog_checks/kube_proxy/config_models/shared.py index fd4cb4cdf9bd6..cddf15255ec30 100644 --- a/kube_proxy/datadog_checks/kube_proxy/config_models/shared.py +++ b/kube_proxy/datadog_checks/kube_proxy/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/kube_scheduler/datadog_checks/kube_scheduler/config_models/defaults.py b/kube_scheduler/datadog_checks/kube_scheduler/config_models/defaults.py index 6ee371d2b5dac..07501e01d2bf8 100644 --- a/kube_scheduler/datadog_checks/kube_scheduler/config_models/defaults.py +++ b/kube_scheduler/datadog_checks/kube_scheduler/config_models/defaults.py @@ -7,284 +7,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_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_health_url(field, value): +def instance_health_url(): return 'http://localhost:10251/healthz' -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_leader_election(field, value): +def instance_leader_election(): return True -def instance_leader_election_kind(field, value): +def instance_leader_election_kind(): return 'auto' -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/kube_scheduler/datadog_checks/kube_scheduler/config_models/instance.py b/kube_scheduler/datadog_checks/kube_scheduler/config_models/instance.py index 061f8ef9b1115..9994d4ff14809 100644 --- a/kube_scheduler/datadog_checks/kube_scheduler/config_models/instance.py +++ b/kube_scheduler/datadog_checks/kube_scheduler/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,143 +20,152 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[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( + frozen=True, + ) + target_label_key: Optional[str] = None + target_label_value_list: Optional[Sequence[str]] = None class TargetMetric(BaseModel): - class Config: - allow_mutation = False - - label_to_match: Optional[str] - labels_to_get: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + label_to_match: Optional[str] = None + labels_to_get: Optional[Sequence[str]] = None class LabelJoins(BaseModel): - class Config: - allow_mutation = False - - target_metric: Optional[TargetMetric] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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]] - headers: Optional[Mapping[str, Any]] - health_service_check: Optional[bool] - health_url: Optional[str] - 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]] - leader_election: Optional[bool] - leader_election_kind: Optional[str] - 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] + model_config = ConfigDict( + validate_default=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[Sequence[str]] = None + extra_headers: Optional[Mapping[str, Any]] = None + headers: Optional[Mapping[str, Any]] = None + health_service_check: Optional[bool] = None + health_url: Optional[str] = None + ignore_metrics: Optional[Sequence[str]] = None + ignore_metrics_by_labels: Optional[IgnoreMetricsByLabels] = None + ignore_tags: Optional[Sequence[str]] = None + include_labels: Optional[Sequence[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[Mapping[str, Any]] = None + leader_election: Optional[bool] = None + leader_election_kind: Optional[str] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[Sequence[Union[str, Mapping[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[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + type_overrides: Optional[Mapping[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/kube_scheduler/datadog_checks/kube_scheduler/config_models/shared.py b/kube_scheduler/datadog_checks/kube_scheduler/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/kube_scheduler/datadog_checks/kube_scheduler/config_models/shared.py +++ b/kube_scheduler/datadog_checks/kube_scheduler/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/kubelet/datadog_checks/kubelet/config_models/defaults.py b/kubelet/datadog_checks/kubelet/config_models/defaults.py index 94148e52bcd29..b847e62a08602 100644 --- a/kubelet/datadog_checks/kubelet/config_models/defaults.py +++ b/kubelet/datadog_checks/kubelet/config_models/defaults.py @@ -7,300 +7,134 @@ # 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_cadvisor_metrics_endpoint(field, value): +def instance_cadvisor_metrics_endpoint(): return 'http://10.8.0.1:10255/metrics/cadvisor' -def instance_cadvisor_port(field, value): +def instance_cadvisor_port(): return 4194 -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_enabled_gauges(field, value): - return get_default_field_value(field, value) - - -def instance_enabled_rates(field, value): - return get_default_field_value(field, value) - - -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_kubelet_metrics_endpoint(field, value): +def instance_kubelet_metrics_endpoint(): return 'http://10.8.0.1:10255/metrics' -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 20 -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_probes_metrics_endpoint(field, value): +def instance_probes_metrics_endpoint(): return 'http://10.8.0.1:10255/metrics/probes' -def instance_prometheus_metrics_prefix(field, value): - return get_default_field_value(field, value) - - -def instance_prometheus_url(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/kubelet/datadog_checks/kubelet/config_models/instance.py b/kubelet/datadog_checks/kubelet/config_models/instance.py index faec914d12be2..94a9cf2bfcb6a 100644 --- a/kubelet/datadog_checks/kubelet/config_models/instance.py +++ b/kubelet/datadog_checks/kubelet/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,146 +20,155 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[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( + frozen=True, + ) + target_label_key: Optional[str] = None + target_label_value_list: Optional[Sequence[str]] = None class TargetMetric(BaseModel): - class Config: - allow_mutation = False - - label_to_match: Optional[str] - labels_to_get: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + label_to_match: Optional[str] = None + labels_to_get: Optional[Sequence[str]] = None class LabelJoins(BaseModel): - class Config: - allow_mutation = False - - target_metric: Optional[TargetMetric] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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] - cadvisor_metrics_endpoint: Optional[str] - cadvisor_port: Optional[int] - connect_timeout: Optional[float] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - enabled_gauges: Optional[Sequence[str]] - enabled_rates: Optional[Sequence[str]] - exclude_labels: Optional[Sequence[str]] - extra_headers: Optional[Mapping[str, Any]] - 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] - kubelet_metrics_endpoint: 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] - probes_metrics_endpoint: Optional[str] - prometheus_metrics_prefix: Optional[str] - prometheus_url: Optional[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) + model_config = ConfigDict( + validate_default=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 + cadvisor_metrics_endpoint: Optional[str] = None + cadvisor_port: Optional[int] = None + connect_timeout: Optional[float] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + enabled_gauges: Optional[Sequence[str]] = None + enabled_rates: Optional[Sequence[str]] = None + exclude_labels: Optional[Sequence[str]] = None + extra_headers: Optional[Mapping[str, Any]] = None + headers: Optional[Mapping[str, Any]] = None + health_service_check: Optional[bool] = None + ignore_metrics: Optional[Sequence[str]] = None + ignore_metrics_by_labels: Optional[IgnoreMetricsByLabels] = None + ignore_tags: Optional[Sequence[str]] = None + include_labels: Optional[Sequence[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 + kubelet_metrics_endpoint: Optional[str] = None + label_joins: Optional[LabelJoins] = None + label_to_hostname: Optional[str] = None + labels_mapper: Optional[Mapping[str, Any]] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[Sequence[Union[str, Mapping[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 + probes_metrics_endpoint: Optional[str] = None + prometheus_metrics_prefix: Optional[str] = None + prometheus_url: Optional[str] = None + 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[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + type_overrides: Optional[Mapping[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/kubelet/datadog_checks/kubelet/config_models/shared.py b/kubelet/datadog_checks/kubelet/config_models/shared.py index 5bf22be279a60..59c534d071001 100644 --- a/kubelet/datadog_checks/kubelet/config_models/shared.py +++ b/kubelet/datadog_checks/kubelet/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/kyototycoon/datadog_checks/kyototycoon/config_models/defaults.py b/kyototycoon/datadog_checks/kyototycoon/config_models/defaults.py index 06e10824f6fdc..81b466607723e 100644 --- a/kyototycoon/datadog_checks/kyototycoon/config_models/defaults.py +++ b/kyototycoon/datadog_checks/kyototycoon/config_models/defaults.py @@ -7,184 +7,78 @@ # 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 False -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_name(field, value): - return get_default_field_value(field, value) - - -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_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_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/kyototycoon/datadog_checks/kyototycoon/config_models/instance.py b/kyototycoon/datadog_checks/kyototycoon/config_models/instance.py index c0524928924dc..2b910204564cc 100644 --- a/kyototycoon/datadog_checks/kyototycoon/config_models/instance.py +++ b/kyototycoon/datadog_checks/kyototycoon/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,95 +20,104 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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] - name: Optional[str] - ntlm_domain: Optional[str] - password: Optional[str] - persist_connections: Optional[bool] - proxy: Optional[Proxy] - read_timeout: Optional[float] + model_config = ConfigDict( + validate_default=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[Mapping[str, Any]] = None + headers: Optional[Mapping[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 + name: Optional[str] = None + ntlm_domain: Optional[str] = None + password: Optional[str] = None + persist_connections: Optional[bool] = None + proxy: Optional[Proxy] = None + read_timeout: Optional[float] = None report_url: str - request_size: Optional[float] - 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] - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + request_size: Optional[float] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + use_legacy_auth_encoding: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/kyototycoon/datadog_checks/kyototycoon/config_models/shared.py b/kyototycoon/datadog_checks/kyototycoon/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/kyototycoon/datadog_checks/kyototycoon/config_models/shared.py +++ b/kyototycoon/datadog_checks/kyototycoon/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/lighttpd/datadog_checks/lighttpd/config_models/defaults.py b/lighttpd/datadog_checks/lighttpd/config_models/defaults.py index 0a32cc4dc3c7a..81b466607723e 100644 --- a/lighttpd/datadog_checks/lighttpd/config_models/defaults.py +++ b/lighttpd/datadog_checks/lighttpd/config_models/defaults.py @@ -7,180 +7,78 @@ # 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 False -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 False -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_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/lighttpd/datadog_checks/lighttpd/config_models/instance.py b/lighttpd/datadog_checks/lighttpd/config_models/instance.py index 77c6876ff062c..c9aaef1aef14b 100644 --- a/lighttpd/datadog_checks/lighttpd/config_models/instance.py +++ b/lighttpd/datadog_checks/lighttpd/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,94 +20,103 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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] + model_config = ConfigDict( + validate_default=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[Mapping[str, Any]] = None + headers: Optional[Mapping[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 lighttpd_status_url: 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] - read_timeout: Optional[float] - request_size: Optional[float] - 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] - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + 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 + read_timeout: Optional[float] = None + request_size: Optional[float] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + use_legacy_auth_encoding: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/lighttpd/datadog_checks/lighttpd/config_models/shared.py b/lighttpd/datadog_checks/lighttpd/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/lighttpd/datadog_checks/lighttpd/config_models/shared.py +++ b/lighttpd/datadog_checks/lighttpd/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/linkerd/datadog_checks/linkerd/config_models/defaults.py b/linkerd/datadog_checks/linkerd/config_models/defaults.py index 380abe228dfc5..5703afb0b927c 100644 --- a/linkerd/datadog_checks/linkerd/config_models/defaults.py +++ b/linkerd/datadog_checks/linkerd/config_models/defaults.py @@ -7,360 +7,162 @@ # 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_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_health_service_check(field, value): +def instance_health_service_check(): return True -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_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): - 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://localhost:9990/admin/metrics/prometheus' -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_prometheus_url(field, value): - return get_default_field_value(field, value) - - -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_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_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_type_overrides(field, value): - return get_default_field_value(field, value) - - -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/linkerd/datadog_checks/linkerd/config_models/instance.py b/linkerd/datadog_checks/linkerd/config_models/instance.py index bceeec6655b2e..e57304ed42cee 100644 --- a/linkerd/datadog_checks/linkerd/config_models/instance.py +++ b/linkerd/datadog_checks/linkerd/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,187 +20,196 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + extra='allow', + frozen=True, + ) + name: Optional[str] = None + type: Optional[str] = None class IgnoreMetricsByLabels(BaseModel): - class Config: - allow_mutation = False - - target_label_key: Optional[str] - target_label_value_list: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + target_label_key: Optional[str] = None + target_label_value_list: Optional[Sequence[str]] = None class TargetMetric(BaseModel): - class Config: - allow_mutation = False - - label_to_match: Optional[str] - labels_to_get: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + label_to_match: Optional[str] = None + labels_to_get: Optional[Sequence[str]] = None class LabelJoins(BaseModel): - class Config: - allow_mutation = False - - target_metric: Optional[TargetMetric] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + labels: Optional[Sequence[str]] = None + match: Optional[Sequence[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] - 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]] - health_service_check: Optional[bool] - histogram_buckets_as_distributions: Optional[bool] - hostname_format: Optional[str] - hostname_label: Optional[str] - ignore_connection_errors: 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, 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] - prometheus_metrics_prefix: Optional[str] - prometheus_url: Optional[str] - 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] - 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] - 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] - type_overrides: Optional[Mapping[str, Any]] - 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, + 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 + 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[Sequence[str]] = None + exclude_metrics: Optional[Sequence[str]] = None + exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] = None + extra_headers: Optional[Mapping[str, Any]] = None + extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] = None + headers: Optional[Mapping[str, Any]] = None + health_service_check: Optional[bool] = 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_metrics: Optional[Sequence[str]] = None + ignore_metrics_by_labels: Optional[IgnoreMetricsByLabels] = None + ignore_tags: Optional[Sequence[str]] = None + include_labels: Optional[Sequence[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[Mapping[str, Any]] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[Sequence[Union[str, Mapping[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 + prometheus_metrics_prefix: Optional[str] = None + prometheus_url: Optional[str] = None + proxy: Optional[Proxy] = None + raw_line_filters: Optional[Sequence[str]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[Mapping[str, Any]] = 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 + share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + type_overrides: Optional[Mapping[str, Any]] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/linkerd/datadog_checks/linkerd/config_models/shared.py b/linkerd/datadog_checks/linkerd/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/linkerd/datadog_checks/linkerd/config_models/shared.py +++ b/linkerd/datadog_checks/linkerd/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/linux_proc_extras/datadog_checks/linux_proc_extras/config_models/defaults.py b/linux_proc_extras/datadog_checks/linux_proc_extras/config_models/defaults.py index 9641cc8f1579f..1a1d26f0fcd3e 100644 --- a/linux_proc_extras/datadog_checks/linux_proc_extras/config_models/defaults.py +++ b/linux_proc_extras/datadog_checks/linux_proc_extras/config_models/defaults.py @@ -7,36 +7,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_include_interrupt_metrics(field, value): +def instance_include_interrupt_metrics(): 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/linux_proc_extras/datadog_checks/linux_proc_extras/config_models/instance.py b/linux_proc_extras/datadog_checks/linux_proc_extras/config_models/instance.py index 0d30eaa1b76db..32d51a43106c7 100644 --- a/linux_proc_extras/datadog_checks/linux_proc_extras/config_models/instance.py +++ b/linux_proc_extras/datadog_checks/linux_proc_extras/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,43 +20,52 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - include_interrupt_metrics: 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, + frozen=True, + ) + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + include_interrupt_metrics: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + service: Optional[str] = None + tags: Optional[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/linux_proc_extras/datadog_checks/linux_proc_extras/config_models/shared.py b/linux_proc_extras/datadog_checks/linux_proc_extras/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/linux_proc_extras/datadog_checks/linux_proc_extras/config_models/shared.py +++ b/linux_proc_extras/datadog_checks/linux_proc_extras/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/mapr/datadog_checks/mapr/config_models/defaults.py b/mapr/datadog_checks/mapr/config_models/defaults.py index fe35b1d3778ba..fbfe94ce8d8cc 100644 --- a/mapr/datadog_checks/mapr/config_models/defaults.py +++ b/mapr/datadog_checks/mapr/config_models/defaults.py @@ -7,56 +7,26 @@ # 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_disable_legacy_cluster_tag(field, value): +def instance_disable_legacy_cluster_tag(): return False -def instance_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return False -def instance_hostname(field, value): - return get_default_field_value(field, value) - - -def instance_metric_patterns(field, value): - return get_default_field_value(field, value) - - -def instance_metric_whitelist(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_stream_path(field, value): +def instance_stream_path(): return '/var/mapr/mapr.monitoring/metricstreams' -def instance_streams_count(field, value): +def instance_streams_count(): return 1 - - -def instance_tags(field, value): - return get_default_field_value(field, value) - - -def instance_ticket_location(field, value): - return get_default_field_value(field, value) diff --git a/mapr/datadog_checks/mapr/config_models/instance.py b/mapr/datadog_checks/mapr/config_models/instance.py index 73e61f5d724dd..1c96a015ba27d 100644 --- a/mapr/datadog_checks/mapr/config_models/instance.py +++ b/mapr/datadog_checks/mapr/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,48 +20,57 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - disable_generic_tags: Optional[bool] - disable_legacy_cluster_tag: Optional[bool] - empty_default_hostname: Optional[bool] - hostname: Optional[str] - metric_patterns: Optional[MetricPatterns] - metric_whitelist: Optional[Sequence[str]] - min_collection_interval: Optional[float] - service: Optional[str] - stream_path: Optional[str] - streams_count: Optional[int] - tags: Optional[Sequence[str]] - ticket_location: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + disable_generic_tags: Optional[bool] = None + disable_legacy_cluster_tag: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + hostname: Optional[str] = None + metric_patterns: Optional[MetricPatterns] = None + metric_whitelist: Optional[Sequence[str]] = None + min_collection_interval: Optional[float] = None + service: Optional[str] = None + stream_path: Optional[str] = None + streams_count: Optional[int] = None + tags: Optional[Sequence[str]] = None + ticket_location: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/mapr/datadog_checks/mapr/config_models/shared.py b/mapr/datadog_checks/mapr/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/mapr/datadog_checks/mapr/config_models/shared.py +++ b/mapr/datadog_checks/mapr/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/mapreduce/datadog_checks/mapreduce/config_models/defaults.py b/mapreduce/datadog_checks/mapreduce/config_models/defaults.py index 2a715ef332899..e540761f98391 100644 --- a/mapreduce/datadog_checks/mapreduce/config_models/defaults.py +++ b/mapreduce/datadog_checks/mapreduce/config_models/defaults.py @@ -7,192 +7,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_general_counters(field, value): - return get_default_field_value(field, value) - - -def shared_job_specific_counters(field, value): - return get_default_field_value(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_disable_legacy_cluster_tag(field, value): +def instance_disable_legacy_cluster_tag(): return False -def instance_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return False -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 False -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_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/mapreduce/datadog_checks/mapreduce/config_models/instance.py b/mapreduce/datadog_checks/mapreduce/config_models/instance.py index ac17b5af1b9eb..28d64960f3f86 100644 --- a/mapreduce/datadog_checks/mapreduce/config_models/instance.py +++ b/mapreduce/datadog_checks/mapreduce/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,96 +20,105 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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] + model_config = ConfigDict( + validate_default=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 cluster_name: str - connect_timeout: Optional[float] - disable_generic_tags: Optional[bool] - disable_legacy_cluster_tag: 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] - read_timeout: Optional[float] - request_size: Optional[float] + connect_timeout: Optional[float] = None + disable_generic_tags: Optional[bool] = None + disable_legacy_cluster_tag: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + extra_headers: Optional[Mapping[str, Any]] = None + headers: Optional[Mapping[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 + read_timeout: Optional[float] = None + request_size: Optional[float] = None resourcemanager_uri: str - 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] - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + service: Optional[str] = None + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + use_legacy_auth_encoding: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/mapreduce/datadog_checks/mapreduce/config_models/shared.py b/mapreduce/datadog_checks/mapreduce/config_models/shared.py index fafce18bf47bf..0134382ffc5b8 100644 --- a/mapreduce/datadog_checks/mapreduce/config_models/shared.py +++ b/mapreduce/datadog_checks/mapreduce/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,43 +20,52 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - general_counters: Optional[Sequence[Mapping[str, Any]]] - job_specific_counters: Optional[Sequence[Mapping[str, Any]]] - proxy: Optional[Proxy] - service: Optional[str] - skip_proxy: Optional[bool] - timeout: Optional[float] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + general_counters: Optional[Sequence[Mapping[str, Any]]] = None + job_specific_counters: Optional[Sequence[Mapping[str, Any]]] = None + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/marathon/datadog_checks/marathon/config_models/defaults.py b/marathon/datadog_checks/marathon/config_models/defaults.py index eb63eb5394e7d..81b466607723e 100644 --- a/marathon/datadog_checks/marathon/config_models/defaults.py +++ b/marathon/datadog_checks/marathon/config_models/defaults.py @@ -7,192 +7,78 @@ # 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_acs_url(field, value): - return get_default_field_value(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_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_extra_headers(field, value): - return get_default_field_value(field, value) - - -def instance_group(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_label_tags(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 False -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_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/marathon/datadog_checks/marathon/config_models/instance.py b/marathon/datadog_checks/marathon/config_models/instance.py index 543344f5a563a..ba80721d113ae 100644 --- a/marathon/datadog_checks/marathon/config_models/instance.py +++ b/marathon/datadog_checks/marathon/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,97 +20,106 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - acs_url: Optional[str] - 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]] - group: Optional[str] - 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] - label_tags: Optional[Sequence[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] - read_timeout: Optional[float] - request_size: Optional[float] - 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] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + acs_url: Optional[str] = None + 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[Mapping[str, Any]] = None + group: Optional[str] = None + headers: Optional[Mapping[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 + label_tags: Optional[Sequence[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 + read_timeout: Optional[float] = None + request_size: Optional[float] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None url: str - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] + use_legacy_auth_encoding: Optional[bool] = None + username: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/marathon/datadog_checks/marathon/config_models/shared.py b/marathon/datadog_checks/marathon/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/marathon/datadog_checks/marathon/config_models/shared.py +++ b/marathon/datadog_checks/marathon/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/marklogic/datadog_checks/marklogic/config_models/defaults.py b/marklogic/datadog_checks/marklogic/config_models/defaults.py index 5bf8db6e02bc2..72be81892e16b 100644 --- a/marklogic/datadog_checks/marklogic/config_models/defaults.py +++ b/marklogic/datadog_checks/marklogic/config_models/defaults.py @@ -7,188 +7,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 False -def instance_enable_health_service_checks(field, value): +def instance_enable_health_service_checks(): return False -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 False -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_resource_filters(field, value): - return get_default_field_value(field, value) - - -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_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/marklogic/datadog_checks/marklogic/config_models/instance.py b/marklogic/datadog_checks/marklogic/config_models/instance.py index a8beb410683df..374308be96131 100644 --- a/marklogic/datadog_checks/marklogic/config_models/instance.py +++ b/marklogic/datadog_checks/marklogic/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,96 +20,105 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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] - enable_health_service_checks: 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] - read_timeout: Optional[float] - request_size: Optional[float] - resource_filters: Optional[Sequence[Mapping[str, Any]]] - 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] + model_config = ConfigDict( + validate_default=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 + enable_health_service_checks: Optional[bool] = None + extra_headers: Optional[Mapping[str, Any]] = None + headers: Optional[Mapping[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 + read_timeout: Optional[float] = None + request_size: Optional[float] = None + resource_filters: Optional[Sequence[Mapping[str, Any]]] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None url: str - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] + use_legacy_auth_encoding: Optional[bool] = None + username: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/marklogic/datadog_checks/marklogic/config_models/shared.py b/marklogic/datadog_checks/marklogic/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/marklogic/datadog_checks/marklogic/config_models/shared.py +++ b/marklogic/datadog_checks/marklogic/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/mcache/datadog_checks/mcache/config_models/defaults.py b/mcache/datadog_checks/mcache/config_models/defaults.py index 102ead273abbb..873ca1020d064 100644 --- a/mcache/datadog_checks/mcache/config_models/defaults.py +++ b/mcache/datadog_checks/mcache/config_models/defaults.py @@ -7,56 +7,22 @@ # 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_options(field, value): - return get_default_field_value(field, value) - - -def instance_password(field, value): - return get_default_field_value(field, value) - - -def instance_port(field, value): +def instance_port(): return 11211 -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_socket(field, value): - return get_default_field_value(field, value) - - -def instance_tags(field, value): - return get_default_field_value(field, value) - - -def instance_url(field, value): +def instance_url(): return 'localhost' - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/mcache/datadog_checks/mcache/config_models/instance.py b/mcache/datadog_checks/mcache/config_models/instance.py index 825bee310082f..a7d97edbeb977 100644 --- a/mcache/datadog_checks/mcache/config_models/instance.py +++ b/mcache/datadog_checks/mcache/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,48 +20,57 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[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] - options: Optional[Mapping[str, Any]] - password: Optional[str] - port: Optional[int] - service: Optional[str] - socket: Optional[str] - tags: Optional[Sequence[str]] - url: Optional[str] - username: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=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 + options: Optional[Mapping[str, Any]] = None + password: Optional[str] = None + port: Optional[int] = None + service: Optional[str] = None + socket: Optional[str] = None + tags: Optional[Sequence[str]] = None + url: Optional[str] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/mcache/datadog_checks/mcache/config_models/shared.py b/mcache/datadog_checks/mcache/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/mcache/datadog_checks/mcache/config_models/shared.py +++ b/mcache/datadog_checks/mcache/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/mesos_master/datadog_checks/mesos_master/config_models/defaults.py b/mesos_master/datadog_checks/mesos_master/config_models/defaults.py index 0a32cc4dc3c7a..81b466607723e 100644 --- a/mesos_master/datadog_checks/mesos_master/config_models/defaults.py +++ b/mesos_master/datadog_checks/mesos_master/config_models/defaults.py @@ -7,180 +7,78 @@ # 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 False -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 False -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_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/mesos_master/datadog_checks/mesos_master/config_models/instance.py b/mesos_master/datadog_checks/mesos_master/config_models/instance.py index 22d2339b17335..b0c9dd6112c5c 100644 --- a/mesos_master/datadog_checks/mesos_master/config_models/instance.py +++ b/mesos_master/datadog_checks/mesos_master/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,94 +20,103 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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] - read_timeout: Optional[float] - request_size: Optional[float] - 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] + model_config = ConfigDict( + validate_default=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[Mapping[str, Any]] = None + headers: Optional[Mapping[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 + read_timeout: Optional[float] = None + request_size: Optional[float] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None url: str - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] + use_legacy_auth_encoding: Optional[bool] = None + username: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/mesos_master/datadog_checks/mesos_master/config_models/shared.py b/mesos_master/datadog_checks/mesos_master/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/mesos_master/datadog_checks/mesos_master/config_models/shared.py +++ b/mesos_master/datadog_checks/mesos_master/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/mesos_slave/datadog_checks/mesos_slave/config_models/defaults.py b/mesos_slave/datadog_checks/mesos_slave/config_models/defaults.py index 8ea35f2af4b55..4898acbe2ef75 100644 --- a/mesos_slave/datadog_checks/mesos_slave/config_models/defaults.py +++ b/mesos_slave/datadog_checks/mesos_slave/config_models/defaults.py @@ -7,192 +7,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_cluster_name(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 False -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_master_port(field, value): +def instance_master_port(): return 5050 -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 False -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_skip_proxy(field, value): +def instance_skip_proxy(): return False -def instance_tags(field, value): - return get_default_field_value(field, value) - - -def instance_tasks(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/mesos_slave/datadog_checks/mesos_slave/config_models/instance.py b/mesos_slave/datadog_checks/mesos_slave/config_models/instance.py index 59d1af403c048..032e50574fccc 100644 --- a/mesos_slave/datadog_checks/mesos_slave/config_models/instance.py +++ b/mesos_slave/datadog_checks/mesos_slave/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,97 +20,106 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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] - cluster_name: 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] - master_port: Optional[int] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - ntlm_domain: Optional[str] - password: Optional[str] - persist_connections: Optional[bool] - proxy: Optional[Proxy] - read_timeout: Optional[float] - request_size: Optional[float] - service: Optional[str] - skip_proxy: Optional[bool] - tags: Optional[Sequence[str]] - tasks: 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] + model_config = ConfigDict( + validate_default=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 + cluster_name: Optional[str] = None + connect_timeout: Optional[float] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + extra_headers: Optional[Mapping[str, Any]] = None + headers: Optional[Mapping[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 + master_port: Optional[int] = 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 + read_timeout: Optional[float] = None + request_size: Optional[float] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[str]] = None + tasks: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None url: str - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] + use_legacy_auth_encoding: Optional[bool] = None + username: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/mesos_slave/datadog_checks/mesos_slave/config_models/shared.py b/mesos_slave/datadog_checks/mesos_slave/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/mesos_slave/datadog_checks/mesos_slave/config_models/shared.py +++ b/mesos_slave/datadog_checks/mesos_slave/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/mongo/datadog_checks/mongo/config_models/defaults.py b/mongo/datadog_checks/mongo/config_models/defaults.py index fe25b43bc5437..5c94c2fa5d7f3 100644 --- a/mongo/datadog_checks/mongo/config_models/defaults.py +++ b/mongo/datadog_checks/mongo/config_models/defaults.py @@ -7,108 +7,42 @@ # 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_additional_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_collections(field, value): - return get_default_field_value(field, value) - - -def instance_collections_indexes_stats(field, value): +def instance_collections_indexes_stats(): return False -def instance_connection_scheme(field, value): +def instance_connection_scheme(): return 'mongodb' -def instance_custom_queries(field, value): - return get_default_field_value(field, value) - - -def instance_database(field, value): - return get_default_field_value(field, value) - - -def instance_dbnames(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_hosts(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_options(field, value): - return get_default_field_value(field, value) - - -def instance_password(field, value): - return get_default_field_value(field, value) - - -def instance_replica_check(field, value): +def instance_replica_check(): return True -def instance_server(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 30 -def instance_tls(field, value): +def instance_tls(): return False -def instance_tls_allow_invalid_certificates(field, value): +def instance_tls_allow_invalid_certificates(): return False -def instance_tls_allow_invalid_hostnames(field, value): +def instance_tls_allow_invalid_hostnames(): return False - - -def instance_tls_ca_file(field, value): - return get_default_field_value(field, value) - - -def instance_tls_certificate_key_file(field, value): - return get_default_field_value(field, value) - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/mongo/datadog_checks/mongo/config_models/instance.py b/mongo/datadog_checks/mongo/config_models/instance.py index 0b3295d97b358..cfd5dd0d29e78 100644 --- a/mongo/datadog_checks/mongo/config_models/instance.py +++ b/mongo/datadog_checks/mongo/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,86 +20,96 @@ class Field(BaseModel): - class Config: - allow_mutation = False - - field_name: Optional[str] - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + frozen=True, + ) + field_name: Optional[str] = None + name: Optional[str] = None + type: Optional[str] = None class CustomQuery(BaseModel): - class Config: - allow_mutation = False - - database: Optional[str] - fields: Optional[Sequence[Field]] - metric_prefix: Optional[str] - query: Optional[Mapping[str, Any]] - tags: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + database: Optional[str] = None + fields: Optional[Sequence[Field]] = None + metric_prefix: Optional[str] = None + query: Optional[Mapping[str, Any]] = None + tags: Optional[Sequence[str]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - additional_metrics: Optional[Sequence[str]] - collections: Optional[Sequence[str]] - collections_indexes_stats: Optional[bool] - connection_scheme: Optional[str] - custom_queries: Optional[Sequence[CustomQuery]] - database: Optional[str] - dbnames: Optional[Sequence[str]] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - hosts: Optional[Union[str, Sequence[str]]] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - options: Optional[Mapping[str, Any]] - password: Optional[str] - replica_check: Optional[bool] - server: Optional[str] - service: Optional[str] - tags: Optional[Sequence[str]] - timeout: Optional[int] - tls: Optional[bool] - tls_allow_invalid_certificates: Optional[bool] - tls_allow_invalid_hostnames: Optional[bool] - tls_ca_file: Optional[str] - tls_certificate_key_file: Optional[str] - username: Optional[str] - - @root_validator(pre=True) - def _handle_deprecations(cls, values): - validation.utils.handle_deprecations('instances', deprecations.instance(), values) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + additional_metrics: Optional[Sequence[str]] = None + collections: Optional[Sequence[str]] = None + collections_indexes_stats: Optional[bool] = None + connection_scheme: Optional[str] = None + custom_queries: Optional[Sequence[CustomQuery]] = None + database: Optional[str] = None + dbnames: Optional[Sequence[str]] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + hosts: Optional[Union[str, Sequence[str]]] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + options: Optional[Mapping[str, Any]] = None + password: Optional[str] = None + replica_check: Optional[bool] = None + server: Optional[str] = None + service: Optional[str] = None + tags: Optional[Sequence[str]] = None + timeout: Optional[int] = None + tls: Optional[bool] = None + tls_allow_invalid_certificates: Optional[bool] = None + tls_allow_invalid_hostnames: Optional[bool] = None + tls_ca_file: Optional[str] = None + tls_certificate_key_file: Optional[str] = None + username: Optional[str] = None + + @model_validator(mode='before') + def _handle_deprecations(cls, values, info): + fields = info.context['configured_fields'] + validation.utils.handle_deprecations('instances', deprecations.instance(), fields, info.context) return values - @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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/mongo/datadog_checks/mongo/config_models/shared.py b/mongo/datadog_checks/mongo/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/mongo/datadog_checks/mongo/config_models/shared.py +++ b/mongo/datadog_checks/mongo/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/mysql/datadog_checks/mysql/config_models/defaults.py b/mysql/datadog_checks/mysql/config_models/defaults.py index b249cc154d2b0..fc51654597d27 100644 --- a/mysql/datadog_checks/mysql/config_models/defaults.py +++ b/mysql/datadog_checks/mysql/config_models/defaults.py @@ -7,148 +7,46 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_global_custom_queries(field, value): - return get_default_field_value(field, value) - - -def shared_service(field, value): - return get_default_field_value(field, value) - - -def instance_additional_status(field, value): - return get_default_field_value(field, value) - - -def instance_additional_variable(field, value): - return get_default_field_value(field, value) - - -def instance_aws(field, value): - return get_default_field_value(field, value) - - -def instance_azure(field, value): - return get_default_field_value(field, value) - - -def instance_charset(field, value): - return get_default_field_value(field, value) - - -def instance_connect_timeout(field, value): +def instance_connect_timeout(): return 10 -def instance_custom_queries(field, value): - return get_default_field_value(field, value) - - -def instance_dbm(field, value): +def instance_dbm(): return False -def instance_defaults_file(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_gcp(field, value): - return get_default_field_value(field, value) - - -def instance_host(field, value): - return get_default_field_value(field, value) - - -def instance_log_unobfuscated_plans(field, value): +def instance_log_unobfuscated_plans(): return False -def instance_log_unobfuscated_queries(field, value): +def instance_log_unobfuscated_queries(): return False -def instance_max_custom_queries(field, value): +def instance_max_custom_queries(): return 20 -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_obfuscator_options(field, value): - return get_default_field_value(field, value) - - -def instance_only_custom_queries(field, value): +def instance_only_custom_queries(): return False -def instance_options(field, value): - return get_default_field_value(field, value) - - -def instance_password(field, value): - return get_default_field_value(field, value) - - -def instance_port(field, value): +def instance_port(): return 3306 -def instance_queries(field, value): - return get_default_field_value(field, value) - - -def instance_query_activity(field, value): - return get_default_field_value(field, value) - - -def instance_query_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_query_samples(field, value): - return get_default_field_value(field, value) - - -def instance_reported_hostname(field, value): - return get_default_field_value(field, value) - - -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_sock(field, value): - return get_default_field_value(field, value) - - -def instance_ssl(field, value): - return get_default_field_value(field, value) - - -def instance_tags(field, value): - return get_default_field_value(field, value) - - -def instance_use_global_custom_queries(field, value): +def instance_use_global_custom_queries(): return 'true' - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/mysql/datadog_checks/mysql/config_models/instance.py b/mysql/datadog_checks/mysql/config_models/instance.py index a41539b451a4d..9e05824b265d6 100644 --- a/mysql/datadog_checks/mysql/config_models/instance.py +++ b/mysql/datadog_checks/mysql/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,177 +20,186 @@ class Aws(BaseModel): - class Config: - allow_mutation = False - - instance_endpoint: Optional[str] + model_config = ConfigDict( + frozen=True, + ) + instance_endpoint: Optional[str] = None class Azure(BaseModel): - class Config: - allow_mutation = False - - deployment_type: Optional[str] - fully_qualified_domain_name: Optional[str] + model_config = ConfigDict( + frozen=True, + ) + deployment_type: Optional[str] = None + fully_qualified_domain_name: Optional[str] = None class CustomQuery(BaseModel): - class Config: - allow_mutation = False - - columns: Optional[Sequence[Mapping[str, Any]]] - query: Optional[str] - tags: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + columns: Optional[Sequence[Mapping[str, Any]]] = None + query: Optional[str] = None + tags: Optional[Sequence[str]] = None class Gcp(BaseModel): - class Config: - allow_mutation = False - - instance_id: Optional[str] - project_id: Optional[str] + model_config = ConfigDict( + frozen=True, + ) + instance_id: Optional[str] = None + project_id: Optional[str] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class ObfuscatorOptions(BaseModel): - class Config: - allow_mutation = False - - collect_commands: Optional[bool] - collect_comments: Optional[bool] - collect_metadata: Optional[bool] - collect_tables: Optional[bool] - keep_sql_alias: Optional[bool] - replace_digits: Optional[bool] + model_config = ConfigDict( + frozen=True, + ) + collect_commands: Optional[bool] = None + collect_comments: Optional[bool] = None + collect_metadata: Optional[bool] = None + collect_tables: Optional[bool] = None + keep_sql_alias: Optional[bool] = None + replace_digits: Optional[bool] = None class Options(BaseModel): - class Config: - allow_mutation = False - - disable_innodb_metrics: Optional[bool] - extra_innodb_metrics: Optional[bool] - extra_performance_metrics: Optional[bool] - extra_status_metrics: Optional[bool] - galera_cluster: Optional[bool] - replication: Optional[bool] - replication_channel: Optional[str] - replication_non_blocking_status: Optional[bool] - schema_size_metrics: Optional[bool] - system_table_size_metrics: Optional[bool] - table_rows_stats_metrics: Optional[bool] - table_size_metrics: Optional[bool] + model_config = ConfigDict( + frozen=True, + ) + disable_innodb_metrics: Optional[bool] = None + extra_innodb_metrics: Optional[bool] = None + extra_performance_metrics: Optional[bool] = None + extra_status_metrics: Optional[bool] = None + galera_cluster: Optional[bool] = None + replication: Optional[bool] = None + replication_channel: Optional[str] = None + replication_non_blocking_status: Optional[bool] = None + schema_size_metrics: Optional[bool] = None + system_table_size_metrics: Optional[bool] = None + table_rows_stats_metrics: Optional[bool] = None + table_size_metrics: Optional[bool] = None class QueryActivity(BaseModel): - class Config: - allow_mutation = False - - collection_interval: Optional[float] - enabled: Optional[bool] + model_config = ConfigDict( + frozen=True, + ) + collection_interval: Optional[float] = None + enabled: Optional[bool] = None class QueryMetrics(BaseModel): - class Config: - allow_mutation = False - - collection_interval: Optional[float] - enabled: Optional[bool] + model_config = ConfigDict( + frozen=True, + ) + collection_interval: Optional[float] = None + enabled: Optional[bool] = None class QuerySamples(BaseModel): - class Config: - allow_mutation = False - - collection_interval: Optional[float] - collection_strategy_cache_maxsize: Optional[int] - collection_strategy_cache_ttl: Optional[int] - enabled: Optional[bool] - events_statements_enable_procedure: Optional[str] - events_statements_row_limit: Optional[int] - events_statements_temp_table_name: Optional[str] - explain_procedure: Optional[str] - explained_queries_cache_maxsize: Optional[int] - explained_queries_per_hour_per_query: Optional[int] - fully_qualified_explain_procedure: Optional[str] - samples_per_hour_per_query: Optional[int] - seen_samples_cache_maxsize: Optional[int] + model_config = ConfigDict( + frozen=True, + ) + collection_interval: Optional[float] = None + collection_strategy_cache_maxsize: Optional[int] = None + collection_strategy_cache_ttl: Optional[int] = None + enabled: Optional[bool] = None + events_statements_enable_procedure: Optional[str] = None + events_statements_row_limit: Optional[int] = None + events_statements_temp_table_name: Optional[str] = None + explain_procedure: Optional[str] = None + explained_queries_cache_maxsize: Optional[int] = None + explained_queries_per_hour_per_query: Optional[int] = None + fully_qualified_explain_procedure: Optional[str] = None + samples_per_hour_per_query: Optional[int] = None + seen_samples_cache_maxsize: Optional[int] = None class Ssl(BaseModel): - class Config: - allow_mutation = False - - ca: Optional[str] - cert: Optional[str] - check_hostname: Optional[bool] - key: Optional[str] + model_config = ConfigDict( + frozen=True, + ) + ca: Optional[str] = None + cert: Optional[str] = None + check_hostname: Optional[bool] = None + key: Optional[str] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - additional_status: Optional[Sequence[Mapping[str, Any]]] - additional_variable: Optional[Sequence[Mapping[str, Any]]] - aws: Optional[Aws] - azure: Optional[Azure] - charset: Optional[str] - connect_timeout: Optional[float] - custom_queries: Optional[Sequence[CustomQuery]] - dbm: Optional[bool] - defaults_file: Optional[str] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - gcp: Optional[Gcp] - host: Optional[str] - log_unobfuscated_plans: Optional[bool] - log_unobfuscated_queries: Optional[bool] - max_custom_queries: Optional[int] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - obfuscator_options: Optional[ObfuscatorOptions] - only_custom_queries: Optional[bool] - options: Optional[Options] - password: Optional[str] - port: Optional[float] - queries: Optional[Sequence[Mapping[str, Any]]] - query_activity: Optional[QueryActivity] - query_metrics: Optional[QueryMetrics] - query_samples: Optional[QuerySamples] - reported_hostname: Optional[str] - service: Optional[str] - sock: Optional[str] - ssl: Optional[Ssl] - tags: Optional[Sequence[str]] - use_global_custom_queries: Optional[str] - username: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + additional_status: Optional[Sequence[Mapping[str, Any]]] = None + additional_variable: Optional[Sequence[Mapping[str, Any]]] = None + aws: Optional[Aws] = None + azure: Optional[Azure] = None + charset: Optional[str] = None + connect_timeout: Optional[float] = None + custom_queries: Optional[Sequence[CustomQuery]] = None + dbm: Optional[bool] = None + defaults_file: Optional[str] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + gcp: Optional[Gcp] = None + host: Optional[str] = None + log_unobfuscated_plans: Optional[bool] = None + log_unobfuscated_queries: Optional[bool] = None + max_custom_queries: Optional[int] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + obfuscator_options: Optional[ObfuscatorOptions] = None + only_custom_queries: Optional[bool] = None + options: Optional[Options] = None + password: Optional[str] = None + port: Optional[float] = None + queries: Optional[Sequence[Mapping[str, Any]]] = None + query_activity: Optional[QueryActivity] = None + query_metrics: Optional[QueryMetrics] = None + query_samples: Optional[QuerySamples] = None + reported_hostname: Optional[str] = None + service: Optional[str] = None + sock: Optional[str] = None + ssl: Optional[Ssl] = None + tags: Optional[Sequence[str]] = None + use_global_custom_queries: Optional[str] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/mysql/datadog_checks/mysql/config_models/shared.py b/mysql/datadog_checks/mysql/config_models/shared.py index 5e538415ce396..45d1293f12b20 100644 --- a/mysql/datadog_checks/mysql/config_models/shared.py +++ b/mysql/datadog_checks/mysql/config_models/shared.py @@ -11,39 +11,39 @@ from typing import Any, Mapping, Optional, Sequence -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 - - global_custom_queries: Optional[Sequence[Mapping[str, Any]]] - service: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + global_custom_queries: Optional[Sequence[Mapping[str, Any]]] = None + 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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/nagios/datadog_checks/nagios/config_models/defaults.py b/nagios/datadog_checks/nagios/config_models/defaults.py index 589415ce20d19..616be2d933d8d 100644 --- a/nagios/datadog_checks/nagios/config_models/defaults.py +++ b/nagios/datadog_checks/nagios/config_models/defaults.py @@ -7,48 +7,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_collect_events(field, value): +def instance_collect_events(): return True -def instance_collect_host_performance_data(field, value): +def instance_collect_host_performance_data(): return False -def instance_collect_service_performance_data(field, value): +def instance_collect_service_performance_data(): return False -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_passive_checks_events(field, value): +def instance_passive_checks_events(): 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) diff --git a/nagios/datadog_checks/nagios/config_models/instance.py b/nagios/datadog_checks/nagios/config_models/instance.py index e1c3011ba93db..89bcad3570e22 100644 --- a/nagios/datadog_checks/nagios/config_models/instance.py +++ b/nagios/datadog_checks/nagios/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,47 +20,56 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - collect_events: Optional[bool] - collect_host_performance_data: Optional[bool] - collect_service_performance_data: Optional[bool] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + collect_events: Optional[bool] = None + collect_host_performance_data: Optional[bool] = None + collect_service_performance_data: Optional[bool] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None nagios_conf: str - passive_checks_events: Optional[bool] - service: Optional[str] - tags: Optional[Sequence[str]] + passive_checks_events: Optional[bool] = None + service: Optional[str] = None + tags: Optional[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/nagios/datadog_checks/nagios/config_models/shared.py b/nagios/datadog_checks/nagios/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/nagios/datadog_checks/nagios/config_models/shared.py +++ b/nagios/datadog_checks/nagios/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/network/datadog_checks/network/config_models/defaults.py b/network/datadog_checks/network/config_models/defaults.py index 0f40e937f17f2..d047a81baa43c 100644 --- a/network/datadog_checks/network/config_models/defaults.py +++ b/network/datadog_checks/network/config_models/defaults.py @@ -7,84 +7,54 @@ # 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_blacklist_conntrack_metrics(field, value): +def instance_blacklist_conntrack_metrics(): return [] -def instance_collect_aws_ena_metrics(field, value): +def instance_collect_aws_ena_metrics(): return False -def instance_collect_connection_queues(field, value): +def instance_collect_connection_queues(): return False -def instance_collect_connection_state(field, value): +def instance_collect_connection_state(): return False -def instance_collect_count_metrics(field, value): +def instance_collect_count_metrics(): return False -def instance_collect_ethtool_metrics(field, value): +def instance_collect_ethtool_metrics(): return False -def instance_collect_rate_metrics(field, value): +def instance_collect_rate_metrics(): return True -def instance_combine_connection_states(field, value): +def instance_combine_connection_states(): return True -def instance_conntrack_path(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_excluded_interface_re(field, value): - return get_default_field_value(field, value) - - -def instance_excluded_interfaces(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_service(field, value): - return get_default_field_value(field, value) - - -def instance_tags(field, value): - return get_default_field_value(field, value) - - -def instance_use_sudo_conntrack(field, value): +def instance_use_sudo_conntrack(): return True -def instance_whitelist_conntrack_metrics(field, value): +def instance_whitelist_conntrack_metrics(): return ['max', 'count'] diff --git a/network/datadog_checks/network/config_models/instance.py b/network/datadog_checks/network/config_models/instance.py index fdd3e818f4413..a54b47ef2a2c1 100644 --- a/network/datadog_checks/network/config_models/instance.py +++ b/network/datadog_checks/network/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,55 +20,64 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - blacklist_conntrack_metrics: Optional[Sequence[str]] - collect_aws_ena_metrics: Optional[bool] - collect_connection_queues: Optional[bool] - collect_connection_state: Optional[bool] - collect_count_metrics: Optional[bool] - collect_ethtool_metrics: Optional[bool] - collect_rate_metrics: Optional[bool] - combine_connection_states: Optional[bool] - conntrack_path: Optional[str] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - excluded_interface_re: Optional[str] - excluded_interfaces: Optional[Sequence[str]] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - service: Optional[str] - tags: Optional[Sequence[str]] - use_sudo_conntrack: Optional[bool] - whitelist_conntrack_metrics: Optional[Sequence[str]] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + blacklist_conntrack_metrics: Optional[Sequence[str]] = None + collect_aws_ena_metrics: Optional[bool] = None + collect_connection_queues: Optional[bool] = None + collect_connection_state: Optional[bool] = None + collect_count_metrics: Optional[bool] = None + collect_ethtool_metrics: Optional[bool] = None + collect_rate_metrics: Optional[bool] = None + combine_connection_states: Optional[bool] = None + conntrack_path: Optional[str] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + excluded_interface_re: Optional[str] = None + excluded_interfaces: Optional[Sequence[str]] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + service: Optional[str] = None + tags: Optional[Sequence[str]] = None + use_sudo_conntrack: Optional[bool] = None + whitelist_conntrack_metrics: Optional[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/network/datadog_checks/network/config_models/shared.py b/network/datadog_checks/network/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/network/datadog_checks/network/config_models/shared.py +++ b/network/datadog_checks/network/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/nfsstat/datadog_checks/nfsstat/config_models/defaults.py b/nfsstat/datadog_checks/nfsstat/config_models/defaults.py index 0b69846e47795..c464f76236f60 100644 --- a/nfsstat/datadog_checks/nfsstat/config_models/defaults.py +++ b/nfsstat/datadog_checks/nfsstat/config_models/defaults.py @@ -7,40 +7,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_autofs_enabled(field, value): +def shared_autofs_enabled(): return False -def shared_nfsiostat_path(field, value): - return get_default_field_value(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/nfsstat/datadog_checks/nfsstat/config_models/instance.py b/nfsstat/datadog_checks/nfsstat/config_models/instance.py index 8696c61f639f9..9fd87afb27b4b 100644 --- a/nfsstat/datadog_checks/nfsstat/config_models/instance.py +++ b/nfsstat/datadog_checks/nfsstat/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,42 +20,51 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[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, + 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[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/nfsstat/datadog_checks/nfsstat/config_models/shared.py b/nfsstat/datadog_checks/nfsstat/config_models/shared.py index ed06367dbd1c0..e262ac1b3291a 100644 --- a/nfsstat/datadog_checks/nfsstat/config_models/shared.py +++ b/nfsstat/datadog_checks/nfsstat/config_models/shared.py @@ -11,7 +11,7 @@ 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 @@ -20,31 +20,40 @@ class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - autofs_enabled: Optional[bool] - nfsiostat_path: Optional[str] - service: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + autofs_enabled: Optional[bool] = None + nfsiostat_path: Optional[str] = None + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/nginx/datadog_checks/nginx/config_models/defaults.py b/nginx/datadog_checks/nginx/config_models/defaults.py index 0c47974807f60..442cbc640842a 100644 --- a/nginx/datadog_checks/nginx/config_models/defaults.py +++ b/nginx/datadog_checks/nginx/config_models/defaults.py @@ -7,200 +7,98 @@ # 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 False -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_only_query_enabled_endpoints(field, value): +def instance_only_query_enabled_endpoints(): return False -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_plus_api_version(field, value): +def instance_plus_api_version(): return 2 -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_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_use_plus_api(field, value): +def instance_use_plus_api(): return False -def instance_use_plus_api_stream(field, value): +def instance_use_plus_api_stream(): return True -def instance_use_vts(field, value): +def instance_use_vts(): return False - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/nginx/datadog_checks/nginx/config_models/instance.py b/nginx/datadog_checks/nginx/config_models/instance.py index 8f7a8d78514a2..2eeafce0ed9fb 100644 --- a/nginx/datadog_checks/nginx/config_models/instance.py +++ b/nginx/datadog_checks/nginx/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,99 +20,108 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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] + model_config = ConfigDict( + validate_default=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[Mapping[str, Any]] = None + headers: Optional[Mapping[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 nginx_status_url: str - ntlm_domain: Optional[str] - only_query_enabled_endpoints: Optional[bool] - password: Optional[str] - persist_connections: Optional[bool] - plus_api_version: Optional[int] - proxy: Optional[Proxy] - read_timeout: Optional[float] - request_size: Optional[float] - 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] - use_legacy_auth_encoding: Optional[bool] - use_plus_api: Optional[bool] - use_plus_api_stream: Optional[bool] - use_vts: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + ntlm_domain: Optional[str] = None + only_query_enabled_endpoints: Optional[bool] = None + password: Optional[str] = None + persist_connections: Optional[bool] = None + plus_api_version: Optional[int] = None + proxy: Optional[Proxy] = None + read_timeout: Optional[float] = None + request_size: Optional[float] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + use_legacy_auth_encoding: Optional[bool] = None + use_plus_api: Optional[bool] = None + use_plus_api_stream: Optional[bool] = None + use_vts: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/nginx/datadog_checks/nginx/config_models/shared.py b/nginx/datadog_checks/nginx/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/nginx/datadog_checks/nginx/config_models/shared.py +++ b/nginx/datadog_checks/nginx/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/nginx_ingress_controller/datadog_checks/nginx_ingress_controller/config_models/defaults.py b/nginx_ingress_controller/datadog_checks/nginx_ingress_controller/config_models/defaults.py index ac37081d21df7..c69a1330ddd7d 100644 --- a/nginx_ingress_controller/datadog_checks/nginx_ingress_controller/config_models/defaults.py +++ b/nginx_ingress_controller/datadog_checks/nginx_ingress_controller/config_models/defaults.py @@ -7,276 +7,122 @@ # 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_collect_nginx_histograms(field, value): +def instance_collect_nginx_histograms(): return False -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/nginx_ingress_controller/datadog_checks/nginx_ingress_controller/config_models/instance.py b/nginx_ingress_controller/datadog_checks/nginx_ingress_controller/config_models/instance.py index d5d0ab2db4c19..f5050d760dcee 100644 --- a/nginx_ingress_controller/datadog_checks/nginx_ingress_controller/config_models/instance.py +++ b/nginx_ingress_controller/datadog_checks/nginx_ingress_controller/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,141 +20,150 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[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( + frozen=True, + ) + target_label_key: Optional[str] = None + target_label_value_list: Optional[Sequence[str]] = None class TargetMetric(BaseModel): - class Config: - allow_mutation = False - - label_to_match: Optional[str] - labels_to_get: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + label_to_match: Optional[str] = None + labels_to_get: Optional[Sequence[str]] = None class LabelJoins(BaseModel): - class Config: - allow_mutation = False - - target_metric: Optional[TargetMetric] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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] - collect_nginx_histograms: Optional[bool] - 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]] - 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] + model_config = ConfigDict( + validate_default=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 + collect_nginx_histograms: Optional[bool] = None + connect_timeout: Optional[float] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + exclude_labels: Optional[Sequence[str]] = None + extra_headers: Optional[Mapping[str, Any]] = None + headers: Optional[Mapping[str, Any]] = None + health_service_check: Optional[bool] = None + ignore_metrics: Optional[Sequence[str]] = None + ignore_metrics_by_labels: Optional[IgnoreMetricsByLabels] = None + ignore_tags: Optional[Sequence[str]] = None + include_labels: Optional[Sequence[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[Mapping[str, Any]] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[Sequence[Union[str, Mapping[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[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + type_overrides: Optional[Mapping[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/nginx_ingress_controller/datadog_checks/nginx_ingress_controller/config_models/shared.py b/nginx_ingress_controller/datadog_checks/nginx_ingress_controller/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/nginx_ingress_controller/datadog_checks/nginx_ingress_controller/config_models/shared.py +++ b/nginx_ingress_controller/datadog_checks/nginx_ingress_controller/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/openldap/datadog_checks/openldap/config_models/defaults.py b/openldap/datadog_checks/openldap/config_models/defaults.py index 3c114cdf85931..1ad66c986ea66 100644 --- a/openldap/datadog_checks/openldap/config_models/defaults.py +++ b/openldap/datadog_checks/openldap/config_models/defaults.py @@ -7,60 +7,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_custom_queries(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_password(field, value): - return get_default_field_value(field, value) - - -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_ssl_ca_certs(field, value): - return get_default_field_value(field, value) - - -def instance_ssl_cert(field, value): - return get_default_field_value(field, value) - - -def instance_ssl_key(field, value): - return get_default_field_value(field, value) - - -def instance_ssl_verify(field, value): +def instance_ssl_verify(): return True - - -def instance_tags(field, value): - return get_default_field_value(field, value) - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/openldap/datadog_checks/openldap/config_models/instance.py b/openldap/datadog_checks/openldap/config_models/instance.py index 03da1bcb583a7..480864e5965d4 100644 --- a/openldap/datadog_checks/openldap/config_models/instance.py +++ b/openldap/datadog_checks/openldap/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,50 +20,59 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - custom_queries: Optional[Sequence[Mapping[str, Any]]] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - password: Optional[str] - service: Optional[str] - ssl_ca_certs: Optional[str] - ssl_cert: Optional[str] - ssl_key: Optional[str] - ssl_verify: Optional[bool] - tags: Optional[Sequence[str]] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + custom_queries: Optional[Sequence[Mapping[str, Any]]] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + password: Optional[str] = None + service: Optional[str] = None + ssl_ca_certs: Optional[str] = None + ssl_cert: Optional[str] = None + ssl_key: Optional[str] = None + ssl_verify: Optional[bool] = None + tags: Optional[Sequence[str]] = None url: str - username: Optional[str] + username: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/openldap/datadog_checks/openldap/config_models/shared.py b/openldap/datadog_checks/openldap/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/openldap/datadog_checks/openldap/config_models/shared.py +++ b/openldap/datadog_checks/openldap/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/openmetrics/datadog_checks/openmetrics/config_models/defaults.py b/openmetrics/datadog_checks/openmetrics/config_models/defaults.py index 1b23b3a61b31f..c7cc7740c3c47 100644 --- a/openmetrics/datadog_checks/openmetrics/config_models/defaults.py +++ b/openmetrics/datadog_checks/openmetrics/config_models/defaults.py @@ -7,356 +7,158 @@ # 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_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_health_service_check(field, value): +def instance_health_service_check(): return True -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_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_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_prometheus_metrics_prefix(field, value): - return get_default_field_value(field, value) - - -def instance_prometheus_url(field, value): - return get_default_field_value(field, value) - - -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_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_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_type_overrides(field, value): - return get_default_field_value(field, value) - - -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/openmetrics/datadog_checks/openmetrics/config_models/instance.py b/openmetrics/datadog_checks/openmetrics/config_models/instance.py index cd2a517071939..2497c1d2a92b2 100644 --- a/openmetrics/datadog_checks/openmetrics/config_models/instance.py +++ b/openmetrics/datadog_checks/openmetrics/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,187 +20,196 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + extra='allow', + frozen=True, + ) + name: Optional[str] = None + type: Optional[str] = None class IgnoreMetricsByLabels(BaseModel): - class Config: - allow_mutation = False - - target_label_key: Optional[str] - target_label_value_list: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + target_label_key: Optional[str] = None + target_label_value_list: Optional[Sequence[str]] = None class TargetMetric(BaseModel): - class Config: - allow_mutation = False - - label_to_match: Optional[str] - labels_to_get: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + label_to_match: Optional[str] = None + labels_to_get: Optional[Sequence[str]] = None class LabelJoins(BaseModel): - class Config: - allow_mutation = False - - target_metric: Optional[TargetMetric] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + labels: Optional[Sequence[str]] = None + match: Optional[Sequence[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] - 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]] - health_service_check: Optional[bool] - histogram_buckets_as_distributions: Optional[bool] - hostname_format: Optional[str] - hostname_label: Optional[str] - ignore_connection_errors: 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] + model_config = ConfigDict( + validate_default=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 + 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[Sequence[str]] = None + exclude_metrics: Optional[Sequence[str]] = None + exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] = None + extra_headers: Optional[Mapping[str, Any]] = None + extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] = None + headers: Optional[Mapping[str, Any]] = None + health_service_check: Optional[bool] = 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_metrics: Optional[Sequence[str]] = None + ignore_metrics_by_labels: Optional[IgnoreMetricsByLabels] = None + ignore_tags: Optional[Sequence[str]] = None + include_labels: Optional[Sequence[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[Mapping[str, Any]] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None metrics: 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] - prometheus_metrics_prefix: Optional[str] - prometheus_url: Optional[str] - 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] - 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] - 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] - type_overrides: Optional[Mapping[str, Any]] - 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 + prometheus_metrics_prefix: Optional[str] = None + prometheus_url: Optional[str] = None + proxy: Optional[Proxy] = None + raw_line_filters: Optional[Sequence[str]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[Mapping[str, Any]] = 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 + share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + type_overrides: Optional[Mapping[str, Any]] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/openmetrics/datadog_checks/openmetrics/config_models/shared.py b/openmetrics/datadog_checks/openmetrics/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/openmetrics/datadog_checks/openmetrics/config_models/shared.py +++ b/openmetrics/datadog_checks/openmetrics/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/openstack_controller/datadog_checks/openstack_controller/config_models/defaults.py b/openstack_controller/datadog_checks/openstack_controller/config_models/defaults.py index 17549092fb0de..6e3601f0032ae 100644 --- a/openstack_controller/datadog_checks/openstack_controller/config_models/defaults.py +++ b/openstack_controller/datadog_checks/openstack_controller/config_models/defaults.py @@ -7,252 +7,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_blacklist_project_names(field, value): +def instance_blacklist_project_names(): return [] -def instance_collect_hypervisor_load(field, value): +def instance_collect_hypervisor_load(): return True -def instance_collect_hypervisor_metrics(field, value): +def instance_collect_hypervisor_metrics(): return True -def instance_collect_network_metrics(field, value): +def instance_collect_network_metrics(): return True -def instance_collect_project_metrics(field, value): +def instance_collect_project_metrics(): return True -def instance_collect_server_diagnostic_metrics(field, value): +def instance_collect_server_diagnostic_metrics(): return True -def instance_collect_server_flavor_metrics(field, value): +def instance_collect_server_flavor_metrics(): 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_exclude_network_ids(field, value): +def instance_exclude_network_ids(): return [] -def instance_exclude_server_ids(field, value): +def instance_exclude_server_ids(): return [] -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_keystone_server_url(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_name(field, value): - return get_default_field_value(field, value) - - -def instance_ntlm_domain(field, value): - return get_default_field_value(field, value) - - -def instance_openstack_cloud_name(field, value): - return get_default_field_value(field, value) - - -def instance_openstack_config_file_path(field, value): - return get_default_field_value(field, value) - - -def instance_paginated_limit(field, value): +def instance_paginated_limit(): return 1000 -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_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_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_agent_proxy(field, value): +def instance_use_agent_proxy(): return True -def instance_use_legacy_auth_encoding(field, value): +def instance_use_legacy_auth_encoding(): return True -def instance_use_shortname(field, value): +def instance_use_shortname(): return False -def instance_user(field, value): - return get_default_field_value(field, value) - - -def instance_username(field, value): - return get_default_field_value(field, value) - - -def instance_whitelist_project_names(field, value): +def instance_whitelist_project_names(): return [] diff --git a/openstack_controller/datadog_checks/openstack_controller/config_models/instance.py b/openstack_controller/datadog_checks/openstack_controller/config_models/instance.py index bc065bc853c89..8d0db0b9856d2 100644 --- a/openstack_controller/datadog_checks/openstack_controller/config_models/instance.py +++ b/openstack_controller/datadog_checks/openstack_controller/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,111 +20,120 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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] - blacklist_project_names: Optional[Sequence[str]] - collect_hypervisor_load: Optional[bool] - collect_hypervisor_metrics: Optional[bool] - collect_network_metrics: Optional[bool] - collect_project_metrics: Optional[bool] - collect_server_diagnostic_metrics: Optional[bool] - collect_server_flavor_metrics: Optional[bool] - connect_timeout: Optional[float] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - exclude_network_ids: Optional[Sequence[str]] - exclude_server_ids: Optional[Sequence[str]] - 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] - keystone_server_url: Optional[str] - log_requests: Optional[bool] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - name: Optional[str] - ntlm_domain: Optional[str] - openstack_cloud_name: Optional[str] - openstack_config_file_path: Optional[str] - paginated_limit: Optional[int] - password: Optional[str] - persist_connections: Optional[bool] - proxy: Optional[Proxy] - read_timeout: Optional[float] - request_size: Optional[float] - 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] - use_agent_proxy: Optional[bool] - use_legacy_auth_encoding: Optional[bool] - use_shortname: Optional[bool] - user: Optional[Mapping[str, Any]] - username: Optional[str] - whitelist_project_names: Optional[Sequence[str]] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=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 + blacklist_project_names: Optional[Sequence[str]] = None + collect_hypervisor_load: Optional[bool] = None + collect_hypervisor_metrics: Optional[bool] = None + collect_network_metrics: Optional[bool] = None + collect_project_metrics: Optional[bool] = None + collect_server_diagnostic_metrics: Optional[bool] = None + collect_server_flavor_metrics: Optional[bool] = None + connect_timeout: Optional[float] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + exclude_network_ids: Optional[Sequence[str]] = None + exclude_server_ids: Optional[Sequence[str]] = None + extra_headers: Optional[Mapping[str, Any]] = None + headers: Optional[Mapping[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 + keystone_server_url: Optional[str] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + name: Optional[str] = None + ntlm_domain: Optional[str] = None + openstack_cloud_name: Optional[str] = None + openstack_config_file_path: Optional[str] = None + paginated_limit: Optional[int] = None + password: Optional[str] = None + persist_connections: Optional[bool] = None + proxy: Optional[Proxy] = None + read_timeout: Optional[float] = None + request_size: Optional[float] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + use_agent_proxy: Optional[bool] = None + use_legacy_auth_encoding: Optional[bool] = None + use_shortname: Optional[bool] = None + user: Optional[Mapping[str, Any]] = None + username: Optional[str] = None + whitelist_project_names: Optional[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/openstack_controller/datadog_checks/openstack_controller/config_models/shared.py b/openstack_controller/datadog_checks/openstack_controller/config_models/shared.py index 5bf22be279a60..59c534d071001 100644 --- a/openstack_controller/datadog_checks/openstack_controller/config_models/shared.py +++ b/openstack_controller/datadog_checks/openstack_controller/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/oracle/datadog_checks/oracle/config_models/defaults.py b/oracle/datadog_checks/oracle/config_models/defaults.py index 2ce701bf7a265..04b70324ea4db 100644 --- a/oracle/datadog_checks/oracle/config_models/defaults.py +++ b/oracle/datadog_checks/oracle/config_models/defaults.py @@ -7,72 +7,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_global_custom_queries(field, value): - return get_default_field_value(field, value) - - -def shared_service(field, value): - return get_default_field_value(field, value) - - -def shared_use_instant_client(field, value): +def shared_use_instant_client(): return False -def instance_custom_queries(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_jdbc_driver_path(field, value): +def instance_jdbc_driver_path(): return '.jar' -def instance_jdbc_truststore_password(field, value): - return get_default_field_value(field, value) - - -def instance_jdbc_truststore_path(field, value): - return get_default_field_value(field, value) - - -def instance_jdbc_truststore_type(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_only_custom_queries(field, value): +def instance_only_custom_queries(): return False -def instance_protocol(field, value): +def instance_protocol(): return 'TCP' -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_use_global_custom_queries(field, value): +def instance_use_global_custom_queries(): return 'true' diff --git a/oracle/datadog_checks/oracle/config_models/instance.py b/oracle/datadog_checks/oracle/config_models/instance.py index be24baf602d60..75f1e7097531a 100644 --- a/oracle/datadog_checks/oracle/config_models/instance.py +++ b/oracle/datadog_checks/oracle/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,63 +20,72 @@ class CustomQuery(BaseModel): - class Config: - allow_mutation = False - - columns: Optional[Sequence[Mapping[str, Any]]] - query: Optional[str] - tags: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + columns: Optional[Sequence[Mapping[str, Any]]] = None + query: Optional[str] = None + tags: Optional[Sequence[str]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - custom_queries: Optional[Sequence[CustomQuery]] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - jdbc_driver_path: Optional[str] - jdbc_truststore_password: Optional[str] - jdbc_truststore_path: Optional[str] - jdbc_truststore_type: Optional[str] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - only_custom_queries: Optional[bool] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + custom_queries: Optional[Sequence[CustomQuery]] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + jdbc_driver_path: Optional[str] = None + jdbc_truststore_password: Optional[str] = None + jdbc_truststore_path: Optional[str] = None + jdbc_truststore_type: Optional[str] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + only_custom_queries: Optional[bool] = None password: str - protocol: Optional[str] + protocol: Optional[str] = None server: str - service: Optional[str] + service: Optional[str] = None service_name: str - tags: Optional[Sequence[str]] - use_global_custom_queries: Optional[str] + tags: Optional[Sequence[str]] = None + use_global_custom_queries: Optional[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/oracle/datadog_checks/oracle/config_models/shared.py b/oracle/datadog_checks/oracle/config_models/shared.py index 158c7f0f64c9a..18baeec9cb208 100644 --- a/oracle/datadog_checks/oracle/config_models/shared.py +++ b/oracle/datadog_checks/oracle/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,31 +20,40 @@ class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - global_custom_queries: Optional[Sequence[Mapping[str, Any]]] - service: Optional[str] - use_instant_client: Optional[bool] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + global_custom_queries: Optional[Sequence[Mapping[str, Any]]] = None + service: Optional[str] = None + use_instant_client: Optional[bool] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/pdh_check/datadog_checks/pdh_check/config_models/defaults.py b/pdh_check/datadog_checks/pdh_check/config_models/defaults.py index 8fb676106c124..9f02bfba44b6b 100644 --- a/pdh_check/datadog_checks/pdh_check/config_models/defaults.py +++ b/pdh_check/datadog_checks/pdh_check/config_models/defaults.py @@ -7,56 +7,22 @@ # 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_additional_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_admin_share(field, value): +def instance_admin_share(): return 'c$' -def instance_counter_data_types(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_host(field, value): +def instance_host(): return '.' -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_password(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_username(field, value): - return get_default_field_value(field, value) diff --git a/pdh_check/datadog_checks/pdh_check/config_models/instance.py b/pdh_check/datadog_checks/pdh_check/config_models/instance.py index 86721bd47f60b..b81d8fd6d013c 100644 --- a/pdh_check/datadog_checks/pdh_check/config_models/instance.py +++ b/pdh_check/datadog_checks/pdh_check/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,50 +20,59 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - additional_metrics: Optional[Sequence[Sequence[str]]] - admin_share: Optional[str] - counter_data_types: Optional[Sequence[str]] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + additional_metrics: Optional[Sequence[Sequence[str]]] = None + admin_share: Optional[str] = None + counter_data_types: Optional[Sequence[str]] = None countersetname: str - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - host: Optional[str] - metric_patterns: Optional[MetricPatterns] + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + host: Optional[str] = None + metric_patterns: Optional[MetricPatterns] = None metrics: Sequence[Sequence[str]] - min_collection_interval: Optional[float] - password: Optional[str] - service: Optional[str] - tags: Optional[Sequence[str]] - username: Optional[str] + min_collection_interval: Optional[float] = None + password: Optional[str] = None + service: Optional[str] = None + tags: Optional[Sequence[str]] = None + username: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/pdh_check/datadog_checks/pdh_check/config_models/shared.py b/pdh_check/datadog_checks/pdh_check/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/pdh_check/datadog_checks/pdh_check/config_models/shared.py +++ b/pdh_check/datadog_checks/pdh_check/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/pgbouncer/datadog_checks/pgbouncer/config_models/defaults.py b/pgbouncer/datadog_checks/pgbouncer/config_models/defaults.py index 7ab3ad1b288fa..0874bb983cd0b 100644 --- a/pgbouncer/datadog_checks/pgbouncer/config_models/defaults.py +++ b/pgbouncer/datadog_checks/pgbouncer/config_models/defaults.py @@ -7,64 +7,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_collect_per_client_metrics(field, value): +def instance_collect_per_client_metrics(): return False -def instance_collect_per_server_metrics(field, value): +def instance_collect_per_server_metrics(): return False -def instance_database_url(field, value): +def instance_database_url(): return 'postgresql://:@:/?sslmode=require' -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_host(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_password(field, value): - return get_default_field_value(field, value) - - -def instance_port(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_use_cached(field, value): +def instance_use_cached(): return True - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/pgbouncer/datadog_checks/pgbouncer/config_models/instance.py b/pgbouncer/datadog_checks/pgbouncer/config_models/instance.py index 1bfc838157afb..1a8f390a5a15e 100644 --- a/pgbouncer/datadog_checks/pgbouncer/config_models/instance.py +++ b/pgbouncer/datadog_checks/pgbouncer/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,50 +20,59 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - collect_per_client_metrics: Optional[bool] - collect_per_server_metrics: Optional[bool] - database_url: Optional[str] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - host: Optional[str] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - password: Optional[str] - port: Optional[int] - service: Optional[str] - tags: Optional[Sequence[str]] - use_cached: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + collect_per_client_metrics: Optional[bool] = None + collect_per_server_metrics: Optional[bool] = None + database_url: Optional[str] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + host: Optional[str] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + password: Optional[str] = None + port: Optional[int] = None + service: Optional[str] = None + tags: Optional[Sequence[str]] = None + use_cached: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/pgbouncer/datadog_checks/pgbouncer/config_models/shared.py b/pgbouncer/datadog_checks/pgbouncer/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/pgbouncer/datadog_checks/pgbouncer/config_models/shared.py +++ b/pgbouncer/datadog_checks/pgbouncer/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/php_fpm/datadog_checks/php_fpm/config_models/defaults.py b/php_fpm/datadog_checks/php_fpm/config_models/defaults.py index 84fed63dd5177..b6a2dde65809f 100644 --- a/php_fpm/datadog_checks/php_fpm/config_models/defaults.py +++ b/php_fpm/datadog_checks/php_fpm/config_models/defaults.py @@ -7,200 +7,94 @@ # 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 False -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_http_host(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 False -def instance_ping_reply(field, value): +def instance_ping_reply(): return 'pong' -def instance_ping_url(field, value): +def instance_ping_url(): return 'http://localhost/ping' -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_skip_proxy(field, value): +def instance_skip_proxy(): return False -def instance_status_url(field, value): +def instance_status_url(): return 'http://localhost/status' -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_fastcgi(field, value): +def instance_use_fastcgi(): return False -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/php_fpm/datadog_checks/php_fpm/config_models/instance.py b/php_fpm/datadog_checks/php_fpm/config_models/instance.py index df97b84ec8e1f..887c6ff718942 100644 --- a/php_fpm/datadog_checks/php_fpm/config_models/instance.py +++ b/php_fpm/datadog_checks/php_fpm/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,98 +20,107 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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]] - http_host: Optional[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] - min_collection_interval: Optional[float] - ntlm_domain: Optional[str] - password: Optional[str] - persist_connections: Optional[bool] - ping_reply: Optional[str] - ping_url: Optional[str] - proxy: Optional[Proxy] - read_timeout: Optional[float] - request_size: Optional[float] - service: Optional[str] - skip_proxy: Optional[bool] - status_url: Optional[str] - 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] - use_fastcgi: Optional[bool] - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=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[Mapping[str, Any]] = None + headers: Optional[Mapping[str, Any]] = None + http_host: Optional[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 + min_collection_interval: Optional[float] = None + ntlm_domain: Optional[str] = None + password: Optional[str] = None + persist_connections: Optional[bool] = None + ping_reply: Optional[str] = None + ping_url: Optional[str] = None + proxy: Optional[Proxy] = None + read_timeout: Optional[float] = None + request_size: Optional[float] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + status_url: Optional[str] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + use_fastcgi: Optional[bool] = None + use_legacy_auth_encoding: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/php_fpm/datadog_checks/php_fpm/config_models/shared.py b/php_fpm/datadog_checks/php_fpm/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/php_fpm/datadog_checks/php_fpm/config_models/shared.py +++ b/php_fpm/datadog_checks/php_fpm/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/postfix/datadog_checks/postfix/config_models/defaults.py b/postfix/datadog_checks/postfix/config_models/defaults.py index dbb5f7013e4f9..373e07c024131 100644 --- a/postfix/datadog_checks/postfix/config_models/defaults.py +++ b/postfix/datadog_checks/postfix/config_models/defaults.py @@ -7,52 +7,26 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_postfix_user(field, value): +def shared_postfix_user(): return 'root' -def shared_postqueue(field, value): +def shared_postqueue(): return False -def shared_service(field, value): - return get_default_field_value(field, value) - - -def instance_config_directory(field, value): +def instance_config_directory(): return '/etc/postfix' -def instance_directory(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_queues(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) diff --git a/postfix/datadog_checks/postfix/config_models/instance.py b/postfix/datadog_checks/postfix/config_models/instance.py index dd7de99c1f26c..37078bb780d3c 100644 --- a/postfix/datadog_checks/postfix/config_models/instance.py +++ b/postfix/datadog_checks/postfix/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,45 +20,54 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - config_directory: Optional[str] - directory: Optional[str] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - queues: Optional[Sequence[str]] - service: Optional[str] - tags: Optional[Sequence[str]] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + config_directory: Optional[str] = None + directory: Optional[str] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + queues: Optional[Sequence[str]] = None + service: Optional[str] = None + tags: Optional[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/postfix/datadog_checks/postfix/config_models/shared.py b/postfix/datadog_checks/postfix/config_models/shared.py index 310547aeaa102..8ef1ae63aed9b 100644 --- a/postfix/datadog_checks/postfix/config_models/shared.py +++ b/postfix/datadog_checks/postfix/config_models/shared.py @@ -11,7 +11,7 @@ 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 @@ -20,31 +20,40 @@ class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - postfix_user: Optional[str] - postqueue: Optional[bool] - service: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + postfix_user: Optional[str] = None + postqueue: Optional[bool] = None + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/postgres/datadog_checks/postgres/config_models/defaults.py b/postgres/datadog_checks/postgres/config_models/defaults.py index 1d1775ed71893..7ff348b983164 100644 --- a/postgres/datadog_checks/postgres/config_models/defaults.py +++ b/postgres/datadog_checks/postgres/config_models/defaults.py @@ -7,200 +7,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_service(field, value): - return get_default_field_value(field, value) - - -def instance_activity_metrics_excluded_aggregations(field, value): +def instance_activity_metrics_excluded_aggregations(): return [] -def instance_application_name(field, value): +def instance_application_name(): return 'datadog-agent' -def instance_aws(field, value): - return get_default_field_value(field, value) - - -def instance_azure(field, value): - return get_default_field_value(field, value) - - -def instance_collect_activity_metrics(field, value): +def instance_collect_activity_metrics(): return False -def instance_collect_bloat_metrics(field, value): +def instance_collect_bloat_metrics(): return False -def instance_collect_count_metrics(field, value): +def instance_collect_count_metrics(): return True -def instance_collect_database_size_metrics(field, value): +def instance_collect_database_size_metrics(): return True -def instance_collect_default_database(field, value): +def instance_collect_default_database(): return True -def instance_collect_function_metrics(field, value): +def instance_collect_function_metrics(): return False -def instance_collect_settings(field, value): - return get_default_field_value(field, value) - - -def instance_collect_wal_metrics(field, value): +def instance_collect_wal_metrics(): return False -def instance_custom_queries(field, value): - return get_default_field_value(field, value) - - -def instance_data_directory(field, value): +def instance_data_directory(): return '/usr/local/pgsql/data' -def instance_database_autodiscovery(field, value): - return get_default_field_value(field, value) - - -def instance_dbm(field, value): +def instance_dbm(): return False -def instance_dbname(field, value): +def instance_dbname(): return 'postgres' -def instance_dbstrict(field, value): +def instance_dbstrict(): return False -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_gcp(field, value): - return get_default_field_value(field, value) - - -def instance_idle_connection_timeout(field, value): +def instance_idle_connection_timeout(): return 60000 -def instance_ignore_databases(field, value): +def instance_ignore_databases(): return ['template%', 'rdsadmin', 'azure_maintenance'] -def instance_log_unobfuscated_plans(field, value): +def instance_log_unobfuscated_plans(): return False -def instance_log_unobfuscated_queries(field, value): +def instance_log_unobfuscated_queries(): return False -def instance_max_connections(field, value): +def instance_max_connections(): return 30 -def instance_max_relations(field, value): +def instance_max_relations(): return 300 -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_obfuscator_options(field, value): - return get_default_field_value(field, value) - - -def instance_password(field, value): - return get_default_field_value(field, value) - - -def instance_pg_stat_statements_view(field, value): +def instance_pg_stat_statements_view(): return 'show_pg_stat_statements()' -def instance_port(field, value): +def instance_port(): return 5432 -def instance_query_activity(field, value): - return get_default_field_value(field, value) - - -def instance_query_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_query_samples(field, value): - return get_default_field_value(field, value) - - -def instance_query_timeout(field, value): +def instance_query_timeout(): return 5000 -def instance_relations(field, value): - return get_default_field_value(field, value) - - -def instance_reported_hostname(field, value): - return get_default_field_value(field, value) - - -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_ssl(field, value): +def instance_ssl(): return False -def instance_ssl_cert(field, value): +def instance_ssl_cert(): return False -def instance_ssl_key(field, value): +def instance_ssl_key(): return False -def instance_ssl_password(field, value): +def instance_ssl_password(): return False -def instance_ssl_root_cert(field, value): +def instance_ssl_root_cert(): return False -def instance_table_count_limit(field, value): +def instance_table_count_limit(): return 200 -def instance_tag_replication_role(field, value): +def instance_tag_replication_role(): return False - - -def instance_tags(field, value): - return get_default_field_value(field, value) diff --git a/postgres/datadog_checks/postgres/config_models/instance.py b/postgres/datadog_checks/postgres/config_models/instance.py index ad4686488ebd2..6f7fad8e0a4ec 100644 --- a/postgres/datadog_checks/postgres/config_models/instance.py +++ b/postgres/datadog_checks/postgres/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,185 +20,194 @@ class Aws(BaseModel): - class Config: - allow_mutation = False - - instance_endpoint: Optional[str] - region: Optional[str] + model_config = ConfigDict( + frozen=True, + ) + instance_endpoint: Optional[str] = None + region: Optional[str] = None class Azure(BaseModel): - class Config: - allow_mutation = False - - deployment_type: Optional[str] - fully_qualified_domain_name: Optional[str] + model_config = ConfigDict( + frozen=True, + ) + deployment_type: Optional[str] = None + fully_qualified_domain_name: Optional[str] = None class CollectSettings(BaseModel): - class Config: - allow_mutation = False - - collection_interval: Optional[float] - enabled: Optional[bool] + model_config = ConfigDict( + frozen=True, + ) + collection_interval: Optional[float] = None + enabled: Optional[bool] = None class DatabaseAutodiscovery(BaseModel): - class Config: - allow_mutation = False - - enabled: Optional[bool] - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] - max_databases: Optional[int] - refresh: Optional[int] + model_config = ConfigDict( + frozen=True, + ) + enabled: Optional[bool] = None + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None + max_databases: Optional[int] = None + refresh: Optional[int] = None class Gcp(BaseModel): - class Config: - allow_mutation = False - - instance_id: Optional[str] - project_id: Optional[str] + model_config = ConfigDict( + frozen=True, + ) + instance_id: Optional[str] = None + project_id: Optional[str] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class ObfuscatorOptions(BaseModel): - class Config: - allow_mutation = False - - collect_commands: Optional[bool] - collect_comments: Optional[bool] - collect_metadata: Optional[bool] - collect_tables: Optional[bool] - keep_dollar_quoted_func: Optional[bool] - keep_sql_alias: Optional[bool] - replace_digits: Optional[bool] + model_config = ConfigDict( + frozen=True, + ) + collect_commands: Optional[bool] = None + collect_comments: Optional[bool] = None + collect_metadata: Optional[bool] = None + collect_tables: Optional[bool] = None + keep_dollar_quoted_func: Optional[bool] = None + keep_sql_alias: Optional[bool] = None + replace_digits: Optional[bool] = None class QueryActivity(BaseModel): - class Config: - allow_mutation = False - - collection_interval: Optional[float] - enabled: Optional[bool] - payload_row_limit: Optional[float] + model_config = ConfigDict( + frozen=True, + ) + collection_interval: Optional[float] = None + enabled: Optional[bool] = None + payload_row_limit: Optional[float] = None class QueryMetrics(BaseModel): - class Config: - allow_mutation = False - - collection_interval: Optional[float] - enabled: Optional[bool] - pg_stat_statements_max_warning_threshold: Optional[float] + model_config = ConfigDict( + frozen=True, + ) + collection_interval: Optional[float] = None + enabled: Optional[bool] = None + pg_stat_statements_max_warning_threshold: Optional[float] = None class QuerySamples(BaseModel): - class Config: - allow_mutation = False - - collection_interval: Optional[float] - enabled: Optional[bool] - explain_function: Optional[str] - explain_parameterized_queries: Optional[bool] - explained_queries_cache_maxsize: Optional[int] - explained_queries_per_hour_per_query: Optional[int] - samples_per_hour_per_query: Optional[int] - seen_samples_cache_maxsize: Optional[int] + model_config = ConfigDict( + frozen=True, + ) + collection_interval: Optional[float] = None + enabled: Optional[bool] = None + explain_function: Optional[str] = None + explain_parameterized_queries: Optional[bool] = None + explained_queries_cache_maxsize: Optional[int] = None + explained_queries_per_hour_per_query: Optional[int] = None + samples_per_hour_per_query: Optional[int] = None + seen_samples_cache_maxsize: Optional[int] = None class Relation(BaseModel): - class Config: - allow_mutation = False - - relation_name: Optional[str] - relation_regex: Optional[str] - relation_schema: Optional[str] - relkind: Optional[Sequence[str]] - schemas: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + relation_name: Optional[str] = None + relation_regex: Optional[str] = None + relation_schema: Optional[str] = None + relkind: Optional[Sequence[str]] = None + schemas: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - activity_metrics_excluded_aggregations: Optional[Sequence[str]] - application_name: Optional[str] - aws: Optional[Aws] - azure: Optional[Azure] - collect_activity_metrics: Optional[bool] - collect_bloat_metrics: Optional[bool] - collect_count_metrics: Optional[bool] - collect_database_size_metrics: Optional[bool] - collect_default_database: Optional[bool] - collect_function_metrics: Optional[bool] - collect_settings: Optional[CollectSettings] - collect_wal_metrics: Optional[bool] - custom_queries: Optional[Sequence[Mapping[str, Any]]] - data_directory: Optional[str] - database_autodiscovery: Optional[DatabaseAutodiscovery] - dbm: Optional[bool] - dbname: Optional[str] - dbstrict: Optional[bool] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - gcp: Optional[Gcp] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + activity_metrics_excluded_aggregations: Optional[Sequence[str]] = None + application_name: Optional[str] = None + aws: Optional[Aws] = None + azure: Optional[Azure] = None + collect_activity_metrics: Optional[bool] = None + collect_bloat_metrics: Optional[bool] = None + collect_count_metrics: Optional[bool] = None + collect_database_size_metrics: Optional[bool] = None + collect_default_database: Optional[bool] = None + collect_function_metrics: Optional[bool] = None + collect_settings: Optional[CollectSettings] = None + collect_wal_metrics: Optional[bool] = None + custom_queries: Optional[Sequence[Mapping[str, Any]]] = None + data_directory: Optional[str] = None + database_autodiscovery: Optional[DatabaseAutodiscovery] = None + dbm: Optional[bool] = None + dbname: Optional[str] = None + dbstrict: Optional[bool] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + gcp: Optional[Gcp] = None host: str - idle_connection_timeout: Optional[int] - ignore_databases: Optional[Sequence[str]] - log_unobfuscated_plans: Optional[bool] - log_unobfuscated_queries: Optional[bool] - max_connections: Optional[int] - max_relations: Optional[int] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - obfuscator_options: Optional[ObfuscatorOptions] - password: Optional[str] - pg_stat_statements_view: Optional[str] - port: Optional[int] - query_activity: Optional[QueryActivity] - query_metrics: Optional[QueryMetrics] - query_samples: Optional[QuerySamples] - query_timeout: Optional[int] - relations: Optional[Sequence[Union[str, Relation]]] - reported_hostname: Optional[str] - service: Optional[str] - ssl: Optional[str] - ssl_cert: Optional[str] - ssl_key: Optional[str] - ssl_password: Optional[str] - ssl_root_cert: Optional[str] - table_count_limit: Optional[int] - tag_replication_role: Optional[bool] - tags: Optional[Sequence[str]] + idle_connection_timeout: Optional[int] = None + ignore_databases: Optional[Sequence[str]] = None + log_unobfuscated_plans: Optional[bool] = None + log_unobfuscated_queries: Optional[bool] = None + max_connections: Optional[int] = None + max_relations: Optional[int] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + obfuscator_options: Optional[ObfuscatorOptions] = None + password: Optional[str] = None + pg_stat_statements_view: Optional[str] = None + port: Optional[int] = None + query_activity: Optional[QueryActivity] = None + query_metrics: Optional[QueryMetrics] = None + query_samples: Optional[QuerySamples] = None + query_timeout: Optional[int] = None + relations: Optional[Sequence[Union[str, Relation]]] = None + reported_hostname: Optional[str] = None + service: Optional[str] = None + ssl: Optional[str] = None + ssl_cert: Optional[str] = None + ssl_key: Optional[str] = None + ssl_password: Optional[str] = None + ssl_root_cert: Optional[str] = None + table_count_limit: Optional[int] = None + tag_replication_role: Optional[bool] = None + tags: Optional[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/postgres/datadog_checks/postgres/config_models/shared.py b/postgres/datadog_checks/postgres/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/postgres/datadog_checks/postgres/config_models/shared.py +++ b/postgres/datadog_checks/postgres/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/powerdns_recursor/datadog_checks/powerdns_recursor/config_models/defaults.py b/powerdns_recursor/datadog_checks/powerdns_recursor/config_models/defaults.py index cf76b058a4447..ea4f1c6206d59 100644 --- a/powerdns_recursor/datadog_checks/powerdns_recursor/config_models/defaults.py +++ b/powerdns_recursor/datadog_checks/powerdns_recursor/config_models/defaults.py @@ -7,184 +7,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 False -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 False -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_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) - - -def instance_version(field, value): +def instance_version(): return 3 diff --git a/powerdns_recursor/datadog_checks/powerdns_recursor/config_models/instance.py b/powerdns_recursor/datadog_checks/powerdns_recursor/config_models/instance.py index c3e079b662fc4..5ceeba7f7c159 100644 --- a/powerdns_recursor/datadog_checks/powerdns_recursor/config_models/instance.py +++ b/powerdns_recursor/datadog_checks/powerdns_recursor/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,97 +20,106 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - allow_redirects: Optional[bool] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + allow_redirects: Optional[bool] = None api_key: str - 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]] + 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[Mapping[str, Any]] = None + headers: Optional[Mapping[str, Any]] = None host: 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] - min_collection_interval: Optional[float] - ntlm_domain: Optional[str] - password: Optional[str] - persist_connections: Optional[bool] + 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 port: int - proxy: Optional[Proxy] - read_timeout: Optional[float] - request_size: Optional[float] - 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] - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] - version: Optional[int] - - @root_validator(pre=True) + proxy: Optional[Proxy] = None + read_timeout: Optional[float] = None + request_size: Optional[float] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + use_legacy_auth_encoding: Optional[bool] = None + username: Optional[str] = None + version: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/powerdns_recursor/datadog_checks/powerdns_recursor/config_models/shared.py b/powerdns_recursor/datadog_checks/powerdns_recursor/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/powerdns_recursor/datadog_checks/powerdns_recursor/config_models/shared.py +++ b/powerdns_recursor/datadog_checks/powerdns_recursor/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/presto/datadog_checks/presto/config_models/defaults.py b/presto/datadog_checks/presto/config_models/defaults.py index b9702a06b9ed7..42c096be40fdd 100644 --- a/presto/datadog_checks/presto/config_models/defaults.py +++ b/presto/datadog_checks/presto/config_models/defaults.py @@ -7,108 +7,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/presto/datadog_checks/presto/config_models/instance.py b/presto/datadog_checks/presto/config_models/instance.py index bc4c01723f132..631a321dda3bb 100644 --- a/presto/datadog_checks/presto/config_models/instance.py +++ b/presto/datadog_checks/presto/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,51 +20,60 @@ 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, + 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[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/presto/datadog_checks/presto/config_models/shared.py b/presto/datadog_checks/presto/config_models/shared.py index 1c722ceac49bc..0db55a6d064d5 100644 --- a/presto/datadog_checks/presto/config_models/shared.py +++ b/presto/datadog_checks/presto/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,34 +20,43 @@ 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, + frozen=True, + ) + collect_default_metrics: Optional[bool] = None + conf: Optional[Sequence[Mapping[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/process/datadog_checks/process/config_models/defaults.py b/process/datadog_checks/process/config_models/defaults.py index 425c9147ca20d..b58dad3ff440f 100644 --- a/process/datadog_checks/process/config_models/defaults.py +++ b/process/datadog_checks/process/config_models/defaults.py @@ -7,88 +7,46 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_access_denied_cache_duration(field, value): +def shared_access_denied_cache_duration(): return 120 -def shared_pid_cache_duration(field, value): +def shared_pid_cache_duration(): return 120 -def shared_procfs_path(field, value): - return get_default_field_value(field, value) - - -def shared_service(field, value): - return get_default_field_value(field, value) - - -def shared_shared_process_list_cache_duration(field, value): +def shared_shared_process_list_cache_duration(): return 120 -def instance_collect_children(field, value): +def instance_collect_children(): return False -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_exact_match(field, value): +def instance_exact_match(): return True -def instance_ignore_denied_access(field, value): +def instance_ignore_denied_access(): return True -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_pid(field, value): - return get_default_field_value(field, value) - - -def instance_pid_cache_duration(field, value): +def instance_pid_cache_duration(): return 120 -def instance_pid_file(field, value): - return get_default_field_value(field, value) - - -def instance_search_string(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_thresholds(field, value): - return get_default_field_value(field, value) - - -def instance_try_sudo(field, value): +def instance_try_sudo(): return False - - -def instance_user(field, value): - return get_default_field_value(field, value) diff --git a/process/datadog_checks/process/config_models/instance.py b/process/datadog_checks/process/config_models/instance.py index bb5734c61296f..981f21e38fee4 100644 --- a/process/datadog_checks/process/config_models/instance.py +++ b/process/datadog_checks/process/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,53 +20,62 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - collect_children: Optional[bool] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - exact_match: Optional[bool] - ignore_denied_access: Optional[bool] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + collect_children: Optional[bool] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + exact_match: Optional[bool] = None + ignore_denied_access: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None name: str - pid: Optional[int] - pid_cache_duration: Optional[int] - pid_file: Optional[str] - search_string: Optional[Sequence[str]] - service: Optional[str] - tags: Optional[Sequence[str]] - thresholds: Optional[Mapping[str, Any]] - try_sudo: Optional[bool] - user: Optional[str] - - @root_validator(pre=True) + pid: Optional[int] = None + pid_cache_duration: Optional[int] = None + pid_file: Optional[str] = None + search_string: Optional[Sequence[str]] = None + service: Optional[str] = None + tags: Optional[Sequence[str]] = None + thresholds: Optional[Mapping[str, Any]] = None + try_sudo: Optional[bool] = None + user: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/process/datadog_checks/process/config_models/shared.py b/process/datadog_checks/process/config_models/shared.py index c26565a725241..6a773c518a17f 100644 --- a/process/datadog_checks/process/config_models/shared.py +++ b/process/datadog_checks/process/config_models/shared.py @@ -11,7 +11,7 @@ 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 @@ -20,33 +20,42 @@ class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - access_denied_cache_duration: Optional[int] - pid_cache_duration: Optional[int] - procfs_path: Optional[str] - service: Optional[str] - shared_process_list_cache_duration: Optional[int] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + access_denied_cache_duration: Optional[int] = None + pid_cache_duration: Optional[int] = None + procfs_path: Optional[str] = None + service: Optional[str] = None + shared_process_list_cache_duration: Optional[int] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/prometheus/datadog_checks/prometheus/config_models/defaults.py b/prometheus/datadog_checks/prometheus/config_models/defaults.py index 43c6351dd128f..a0f39f6e1f753 100644 --- a/prometheus/datadog_checks/prometheus/config_models/defaults.py +++ b/prometheus/datadog_checks/prometheus/config_models/defaults.py @@ -7,64 +7,22 @@ # 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_exclude_labels(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_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_max_returned_metrics(field, value): +def instance_max_returned_metrics(): return 2000 -def instance_prometheus_metrics_prefix(field, value): - return get_default_field_value(field, value) - - -def instance_prometheus_timeout(field, value): +def instance_prometheus_timeout(): return 10 -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_ssl_ca_cert(field, value): - return get_default_field_value(field, value) - - -def instance_ssl_cert(field, value): - return get_default_field_value(field, value) - - -def instance_ssl_private_key(field, value): - return get_default_field_value(field, value) - - -def instance_type_overrides(field, value): - return get_default_field_value(field, value) diff --git a/prometheus/datadog_checks/prometheus/config_models/instance.py b/prometheus/datadog_checks/prometheus/config_models/instance.py index 0ccacc0f51fad..d1d6ff0d2fde5 100644 --- a/prometheus/datadog_checks/prometheus/config_models/instance.py +++ b/prometheus/datadog_checks/prometheus/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,60 +20,69 @@ class TargetMetric(BaseModel): - class Config: - allow_mutation = False - - label_to_match: Optional[str] - labels_to_get: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + label_to_match: Optional[str] = None + labels_to_get: Optional[Sequence[str]] = None class LabelJoins(BaseModel): - class Config: - allow_mutation = False - - target_metric: Optional[TargetMetric] + model_config = ConfigDict( + frozen=True, + ) + target_metric: Optional[TargetMetric] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - exclude_labels: Optional[Sequence[str]] - health_service_check: Optional[bool] - label_joins: Optional[LabelJoins] - label_to_hostname: Optional[str] - labels_mapper: Optional[Mapping[str, Any]] - max_returned_metrics: Optional[int] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + exclude_labels: Optional[Sequence[str]] = None + health_service_check: Optional[bool] = None + label_joins: Optional[LabelJoins] = None + label_to_hostname: Optional[str] = None + labels_mapper: Optional[Mapping[str, Any]] = None + max_returned_metrics: Optional[int] = None metrics: Sequence[Union[Mapping[str, str], str]] namespace: str - prometheus_metrics_prefix: Optional[str] - prometheus_timeout: Optional[int] + prometheus_metrics_prefix: Optional[str] = None + prometheus_timeout: Optional[int] = None prometheus_url: str - send_histograms_buckets: Optional[bool] - send_monotonic_counter: Optional[bool] - ssl_ca_cert: Optional[str] - ssl_cert: Optional[str] - ssl_private_key: Optional[str] - type_overrides: Optional[Mapping[str, Any]] - - @root_validator(pre=True) + send_histograms_buckets: Optional[bool] = None + send_monotonic_counter: Optional[bool] = None + ssl_ca_cert: Optional[str] = None + ssl_cert: Optional[str] = None + ssl_private_key: Optional[str] = None + type_overrides: Optional[Mapping[str, Any]] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/prometheus/datadog_checks/prometheus/config_models/shared.py b/prometheus/datadog_checks/prometheus/config_models/shared.py index de215afcbdd5e..d7f4dd28de478 100644 --- a/prometheus/datadog_checks/prometheus/config_models/shared.py +++ b/prometheus/datadog_checks/prometheus/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/proxysql/datadog_checks/proxysql/config_models/defaults.py b/proxysql/datadog_checks/proxysql/config_models/defaults.py index 9e04c5811c441..d8accafb33818 100644 --- a/proxysql/datadog_checks/proxysql/config_models/defaults.py +++ b/proxysql/datadog_checks/proxysql/config_models/defaults.py @@ -7,68 +7,26 @@ # 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_additional_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_connect_timeout(field, value): +def instance_connect_timeout(): return 10 -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_read_timeout(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_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 False diff --git a/proxysql/datadog_checks/proxysql/config_models/instance.py b/proxysql/datadog_checks/proxysql/config_models/instance.py index 74f3b6932283e..86141964cbc9c 100644 --- a/proxysql/datadog_checks/proxysql/config_models/instance.py +++ b/proxysql/datadog_checks/proxysql/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,55 +20,64 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - additional_metrics: Optional[Sequence[str]] - connect_timeout: Optional[int] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + additional_metrics: Optional[Sequence[str]] = None + connect_timeout: Optional[int] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None host: str - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None password: str port: int - read_timeout: Optional[int] - service: Optional[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] + read_timeout: Optional[int] = None + service: Optional[str] = None + tags: Optional[Sequence[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 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/proxysql/datadog_checks/proxysql/config_models/shared.py b/proxysql/datadog_checks/proxysql/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/proxysql/datadog_checks/proxysql/config_models/shared.py +++ b/proxysql/datadog_checks/proxysql/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/pulsar/datadog_checks/pulsar/config_models/defaults.py b/pulsar/datadog_checks/pulsar/config_models/defaults.py index a76129227677c..2a49e1453f118 100644 --- a/pulsar/datadog_checks/pulsar/config_models/defaults.py +++ b/pulsar/datadog_checks/pulsar/config_models/defaults.py @@ -7,284 +7,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/pulsar/datadog_checks/pulsar/config_models/instance.py b/pulsar/datadog_checks/pulsar/config_models/instance.py index fb94969585fdc..6634ff2831f5b 100644 --- a/pulsar/datadog_checks/pulsar/config_models/instance.py +++ b/pulsar/datadog_checks/pulsar/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,146 +20,155 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + labels: Optional[Sequence[str]] = None + match: Optional[Sequence[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, + 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[Sequence[str]] = None + exclude_metrics: Optional[Sequence[str]] = None + exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] = None + extra_headers: Optional[Mapping[str, Any]] = None + extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] = None + headers: Optional[Mapping[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[Sequence[str]] = None + include_labels: Optional[Sequence[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[Sequence[Union[str, Mapping[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[Sequence[str]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[Mapping[str, Any]] = None + request_size: Optional[float] = None + service: Optional[str] = None + share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/pulsar/datadog_checks/pulsar/config_models/shared.py b/pulsar/datadog_checks/pulsar/config_models/shared.py index fd4cb4cdf9bd6..cddf15255ec30 100644 --- a/pulsar/datadog_checks/pulsar/config_models/shared.py +++ b/pulsar/datadog_checks/pulsar/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/rabbitmq/datadog_checks/rabbitmq/config_models/defaults.py b/rabbitmq/datadog_checks/rabbitmq/config_models/defaults.py index 4d2c4bf113a9d..5813965f4b7f8 100644 --- a/rabbitmq/datadog_checks/rabbitmq/config_models/defaults.py +++ b/rabbitmq/datadog_checks/rabbitmq/config_models/defaults.py @@ -7,332 +7,138 @@ # 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_collect_node_metrics(field, value): +def instance_collect_node_metrics(): 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_exchanges(field, value): - return get_default_field_value(field, value) - - -def instance_exchanges_regexes(field, value): - return get_default_field_value(field, value) - - -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_nodes(field, value): - return get_default_field_value(field, value) - - -def instance_nodes_regexes(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_prometheus_plugin(field, value): - return get_default_field_value(field, value) - - -def instance_proxy(field, value): - return get_default_field_value(field, value) - - -def instance_queues(field, value): - return get_default_field_value(field, value) - - -def instance_queues_regexes(field, value): - return get_default_field_value(field, value) - - -def instance_rabbitmq_api_url(field, value): +def instance_rabbitmq_api_url(): return 'http://localhost:15672/api/' -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_tag_families(field, value): +def instance_tag_families(): return False -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) - - -def instance_vhosts(field, value): - return get_default_field_value(field, value) diff --git a/rabbitmq/datadog_checks/rabbitmq/config_models/instance.py b/rabbitmq/datadog_checks/rabbitmq/config_models/instance.py index cc0ea73c1f1df..6252b5547851d 100644 --- a/rabbitmq/datadog_checks/rabbitmq/config_models/instance.py +++ b/rabbitmq/datadog_checks/rabbitmq/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,166 +20,175 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + extra='allow', + frozen=True, + ) + name: Optional[str] = None + type: Optional[str] = None class PrometheusPlugin(BaseModel): - class Config: - allow_mutation = False - - include_aggregated_endpoint: Optional[bool] - unaggregated_endpoint: Optional[str] - url: Optional[str] + model_config = ConfigDict( + frozen=True, + ) + include_aggregated_endpoint: Optional[bool] = None + unaggregated_endpoint: Optional[str] = None + url: 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( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + labels: Optional[Sequence[str]] = None + match: Optional[Sequence[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] - collect_node_metrics: Optional[bool] - connect_timeout: Optional[float] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - enable_health_service_check: Optional[bool] - exchanges: Optional[Sequence[str]] - exchanges_regexes: Optional[Sequence[str]] - 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*') - nodes: Optional[Sequence[str]] - nodes_regexes: Optional[Sequence[str]] - non_cumulative_histogram_buckets: Optional[bool] - ntlm_domain: Optional[str] - openmetrics_endpoint: Optional[str] - password: Optional[str] - persist_connections: Optional[bool] - prometheus_plugin: Optional[PrometheusPlugin] - proxy: Optional[Proxy] - queues: Optional[Sequence[str]] - queues_regexes: Optional[Sequence[str]] - rabbitmq_api_url: Optional[str] - 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] - tag_families: 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] - vhosts: Optional[Sequence[str]] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=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 + collect_node_metrics: 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 + exchanges: Optional[Sequence[str]] = None + exchanges_regexes: Optional[Sequence[str]] = None + exclude_labels: Optional[Sequence[str]] = None + exclude_metrics: Optional[Sequence[str]] = None + exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] = None + extra_headers: Optional[Mapping[str, Any]] = None + extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] = None + headers: Optional[Mapping[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[Sequence[str]] = None + include_labels: Optional[Sequence[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[Sequence[Union[str, Mapping[str, Union[str, Metric]]]]] = None + min_collection_interval: Optional[float] = None + namespace: Optional[str] = Field(None, pattern='\\w*') + nodes: Optional[Sequence[str]] = None + nodes_regexes: Optional[Sequence[str]] = None + 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 + prometheus_plugin: Optional[PrometheusPlugin] = None + proxy: Optional[Proxy] = None + queues: Optional[Sequence[str]] = None + queues_regexes: Optional[Sequence[str]] = None + rabbitmq_api_url: Optional[str] = None + raw_line_filters: Optional[Sequence[str]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[Mapping[str, Any]] = None + request_size: Optional[float] = None + service: Optional[str] = None + share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tag_families: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[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 + vhosts: Optional[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/rabbitmq/datadog_checks/rabbitmq/config_models/shared.py b/rabbitmq/datadog_checks/rabbitmq/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/rabbitmq/datadog_checks/rabbitmq/config_models/shared.py +++ b/rabbitmq/datadog_checks/rabbitmq/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/rabbitmq/datadog_checks/rabbitmq/config_models/validators.py b/rabbitmq/datadog_checks/rabbitmq/config_models/validators.py index 6ec6490fe33ac..872b7675ef9bb 100644 --- a/rabbitmq/datadog_checks/rabbitmq/config_models/validators.py +++ b/rabbitmq/datadog_checks/rabbitmq/config_models/validators.py @@ -14,12 +14,12 @@ def initialize_instance(values, **kwargs): raise ValueError("'prometheus_plugin.url' field must be an HTTP or HTTPS URL.") if 'unaggregated_endpoint' in plugin_settings: unagg_ep = plugin_settings['unaggregated_endpoint'] - if not re.match(r"detailed(\?.+)?$", unagg_ep): + if isinstance(unagg_ep, str) and not re.match(r"detailed(\?.+)?$", unagg_ep): raise ValueError("'prometheus_plugin.unaggregated_endpoint' must be 'detailed', or 'detailed?'.") if 'include_aggregated_endpoint' in plugin_settings: agg_ep = plugin_settings['include_aggregated_endpoint'] if not isinstance(agg_ep, bool): - raise TypeError("'prometheus_plugin.include_aggregated_endpoint' must be a boolean.") + raise ValueError("'prometheus_plugin.include_aggregated_endpoint' must be a boolean.") if not agg_ep and 'unaggregated_endpoint' not in plugin_settings: raise ValueError( "'prometheus_plugin.include_aggregated_endpoint' field must " diff --git a/rabbitmq/tests/test_openmetrics.py b/rabbitmq/tests/test_openmetrics.py index 32397a3ce0766..f6cbfca5accbf 100644 --- a/rabbitmq/tests/test_openmetrics.py +++ b/rabbitmq/tests/test_openmetrics.py @@ -251,7 +251,7 @@ def test_aggregated_and_unaggregated_endpoints(endpoint, metrics, aggregator, dd ), pytest.param( {'url': "http://localhost", "unaggregated_endpoint": []}, - "expected string or bytes-like object", + "Input should be a valid string", id="Unaggregated_endpoint value must be a string.", ), pytest.param( diff --git a/redisdb/datadog_checks/redisdb/config_models/defaults.py b/redisdb/datadog_checks/redisdb/config_models/defaults.py index c08d1a42c2150..80d86da071c4a 100644 --- a/redisdb/datadog_checks/redisdb/config_models/defaults.py +++ b/redisdb/datadog_checks/redisdb/config_models/defaults.py @@ -7,96 +7,50 @@ # 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_collect_client_metrics(field, value): +def instance_collect_client_metrics(): return False -def instance_command_stats(field, value): +def instance_command_stats(): return False -def instance_db(field, value): +def instance_db(): return 0 -def instance_disable_connection_cache(field, value): +def instance_disable_connection_cache(): return False -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_keys(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_password(field, value): - return get_default_field_value(field, value) - - -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_slowlog_max_len(field, value): +def instance_slowlog_max_len(): return 128 -def instance_socket_timeout(field, value): +def instance_socket_timeout(): return 5 -def instance_ssl(field, value): +def instance_ssl(): return False -def instance_ssl_ca_certs(field, value): - return get_default_field_value(field, value) - - -def instance_ssl_cert_reqs(field, value): +def instance_ssl_cert_reqs(): return 2 -def instance_ssl_certfile(field, value): - return get_default_field_value(field, value) - - -def instance_ssl_keyfile(field, value): - return get_default_field_value(field, value) - - -def instance_tags(field, value): - return get_default_field_value(field, value) - - -def instance_unix_socket_path(field, value): - return get_default_field_value(field, value) - - -def instance_username(field, value): - return get_default_field_value(field, value) - - -def instance_warn_on_missing_keys(field, value): +def instance_warn_on_missing_keys(): return True diff --git a/redisdb/datadog_checks/redisdb/config_models/instance.py b/redisdb/datadog_checks/redisdb/config_models/instance.py index f3ac3a7d9f322..a466b28bc8b6d 100644 --- a/redisdb/datadog_checks/redisdb/config_models/instance.py +++ b/redisdb/datadog_checks/redisdb/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -from pydantic import BaseModel, 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 @@ -20,60 +20,69 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - collect_client_metrics: Optional[bool] - command_stats: Optional[bool] - db: Optional[int] - disable_connection_cache: Optional[bool] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + collect_client_metrics: Optional[bool] = None + command_stats: Optional[bool] = None + db: Optional[int] = None + disable_connection_cache: Optional[bool] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None host: str - keys: Optional[Sequence[str]] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - password: Optional[str] + keys: Optional[Sequence[str]] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + password: Optional[str] = None port: int - service: Optional[str] + service: Optional[str] = None slowlog_max_len: Optional[int] = Field(None, alias='slowlog-max-len') - socket_timeout: Optional[int] - ssl: Optional[bool] - ssl_ca_certs: Optional[str] - ssl_cert_reqs: Optional[int] - ssl_certfile: Optional[str] - ssl_keyfile: Optional[str] - tags: Optional[Sequence[str]] - unix_socket_path: Optional[str] - username: Optional[str] - warn_on_missing_keys: Optional[bool] - - @root_validator(pre=True) + socket_timeout: Optional[int] = None + ssl: Optional[bool] = None + ssl_ca_certs: Optional[str] = None + ssl_cert_reqs: Optional[int] = None + ssl_certfile: Optional[str] = None + ssl_keyfile: Optional[str] = None + tags: Optional[Sequence[str]] = None + unix_socket_path: Optional[str] = None + username: Optional[str] = None + warn_on_missing_keys: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/redisdb/datadog_checks/redisdb/config_models/shared.py b/redisdb/datadog_checks/redisdb/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/redisdb/datadog_checks/redisdb/config_models/shared.py +++ b/redisdb/datadog_checks/redisdb/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/rethinkdb/datadog_checks/rethinkdb/config_models/defaults.py b/rethinkdb/datadog_checks/rethinkdb/config_models/defaults.py index d5ef006de7a60..78cd9341a094f 100644 --- a/rethinkdb/datadog_checks/rethinkdb/config_models/defaults.py +++ b/rethinkdb/datadog_checks/rethinkdb/config_models/defaults.py @@ -7,52 +7,22 @@ # 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_host(field, value): +def instance_host(): return 'localhost' -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_password(field, value): - return get_default_field_value(field, value) - - -def instance_port(field, value): +def instance_port(): return 28015 - - -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_tls_ca_cert(field, value): - return get_default_field_value(field, value) - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/rethinkdb/datadog_checks/rethinkdb/config_models/instance.py b/rethinkdb/datadog_checks/rethinkdb/config_models/instance.py index a925f7f651887..ec190b2619840 100644 --- a/rethinkdb/datadog_checks/rethinkdb/config_models/instance.py +++ b/rethinkdb/datadog_checks/rethinkdb/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,47 +20,56 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - host: Optional[str] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - password: Optional[str] - port: Optional[int] - service: Optional[str] - tags: Optional[Sequence[str]] - tls_ca_cert: Optional[str] - username: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + host: Optional[str] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + password: Optional[str] = None + port: Optional[int] = None + service: Optional[str] = None + tags: Optional[Sequence[str]] = None + tls_ca_cert: Optional[str] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/rethinkdb/datadog_checks/rethinkdb/config_models/shared.py b/rethinkdb/datadog_checks/rethinkdb/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/rethinkdb/datadog_checks/rethinkdb/config_models/shared.py +++ b/rethinkdb/datadog_checks/rethinkdb/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/riak/datadog_checks/riak/config_models/defaults.py b/riak/datadog_checks/riak/config_models/defaults.py index 0a32cc4dc3c7a..81b466607723e 100644 --- a/riak/datadog_checks/riak/config_models/defaults.py +++ b/riak/datadog_checks/riak/config_models/defaults.py @@ -7,180 +7,78 @@ # 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 False -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 False -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_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/riak/datadog_checks/riak/config_models/instance.py b/riak/datadog_checks/riak/config_models/instance.py index 22d2339b17335..b0c9dd6112c5c 100644 --- a/riak/datadog_checks/riak/config_models/instance.py +++ b/riak/datadog_checks/riak/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,94 +20,103 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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] - read_timeout: Optional[float] - request_size: Optional[float] - 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] + model_config = ConfigDict( + validate_default=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[Mapping[str, Any]] = None + headers: Optional[Mapping[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 + read_timeout: Optional[float] = None + request_size: Optional[float] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None url: str - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] + use_legacy_auth_encoding: Optional[bool] = None + username: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/riak/datadog_checks/riak/config_models/shared.py b/riak/datadog_checks/riak/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/riak/datadog_checks/riak/config_models/shared.py +++ b/riak/datadog_checks/riak/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/riakcs/datadog_checks/riakcs/config_models/defaults.py b/riakcs/datadog_checks/riakcs/config_models/defaults.py index 323be3194cf25..090e714ae2a12 100644 --- a/riakcs/datadog_checks/riakcs/config_models/defaults.py +++ b/riakcs/datadog_checks/riakcs/config_models/defaults.py @@ -7,60 +7,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_access_id(field, value): - return get_default_field_value(field, value) - - -def instance_access_secret(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_host(field, value): +def instance_host(): return 'localhost' -def instance_is_secure(field, value): +def instance_is_secure(): return True -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_port(field, value): +def instance_port(): return 8080 -def instance_s3_root(field, value): +def instance_s3_root(): return 's3.amazonaws.com' - - -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/riakcs/datadog_checks/riakcs/config_models/instance.py b/riakcs/datadog_checks/riakcs/config_models/instance.py index 5277f9c4c5add..fb25a1a11912b 100644 --- a/riakcs/datadog_checks/riakcs/config_models/instance.py +++ b/riakcs/datadog_checks/riakcs/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,49 +20,58 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - access_id: Optional[str] - access_secret: Optional[str] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - host: Optional[str] - is_secure: Optional[bool] - metric_patterns: Optional[MetricPatterns] - metrics: Optional[Sequence[str]] - min_collection_interval: Optional[float] - port: Optional[int] - s3_root: Optional[str] - service: Optional[str] - tags: Optional[Sequence[str]] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + access_id: Optional[str] = None + access_secret: Optional[str] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + host: Optional[str] = None + is_secure: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[Sequence[str]] = None + min_collection_interval: Optional[float] = None + port: Optional[int] = None + s3_root: Optional[str] = None + service: Optional[str] = None + tags: Optional[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/riakcs/datadog_checks/riakcs/config_models/shared.py b/riakcs/datadog_checks/riakcs/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/riakcs/datadog_checks/riakcs/config_models/shared.py +++ b/riakcs/datadog_checks/riakcs/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/sap_hana/datadog_checks/sap_hana/config_models/defaults.py b/sap_hana/datadog_checks/sap_hana/config_models/defaults.py index 65dffadef9035..6d5b2fc6d43f3 100644 --- a/sap_hana/datadog_checks/sap_hana/config_models/defaults.py +++ b/sap_hana/datadog_checks/sap_hana/config_models/defaults.py @@ -7,108 +7,62 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_global_custom_queries(field, value): - return get_default_field_value(field, value) - - -def shared_persist_db_connections(field, value): +def shared_persist_db_connections(): return True -def shared_service(field, value): - return get_default_field_value(field, value) - - -def instance_batch_size(field, value): +def instance_batch_size(): return 1000 -def instance_connection_properties(field, value): - return get_default_field_value(field, value) - - -def instance_custom_queries(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_only_custom_queries(field, value): +def instance_only_custom_queries(): return False -def instance_persist_db_connections(field, value): +def instance_persist_db_connections(): return True -def instance_port(field, value): +def instance_port(): return 30015 -def instance_schema_(field, value): +def instance_schema_(): return 'SYS_DATABASES' -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 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_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 -def instance_use_global_custom_queries(field, value): +def instance_use_global_custom_queries(): return 'true' -def instance_use_hana_hostnames(field, value): +def instance_use_hana_hostnames(): return False -def instance_use_tls(field, value): +def instance_use_tls(): return False diff --git a/sap_hana/datadog_checks/sap_hana/config_models/instance.py b/sap_hana/datadog_checks/sap_hana/config_models/instance.py index a5fbcee6547e0..5b3dea4f94eee 100644 --- a/sap_hana/datadog_checks/sap_hana/config_models/instance.py +++ b/sap_hana/datadog_checks/sap_hana/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -from pydantic import BaseModel, 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 @@ -20,71 +20,80 @@ class CustomQuery(BaseModel): - class Config: - allow_mutation = False - - columns: Optional[Sequence[Mapping[str, Any]]] - query: Optional[str] - tags: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + columns: Optional[Sequence[Mapping[str, Any]]] = None + query: Optional[str] = None + tags: Optional[Sequence[str]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - batch_size: Optional[int] - connection_properties: Optional[Mapping[str, Any]] - custom_queries: Optional[Sequence[CustomQuery]] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - only_custom_queries: Optional[bool] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + batch_size: Optional[int] = None + connection_properties: Optional[Mapping[str, Any]] = None + custom_queries: Optional[Sequence[CustomQuery]] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + only_custom_queries: Optional[bool] = None password: str - persist_db_connections: Optional[bool] - port: Optional[int] + persist_db_connections: Optional[bool] = None + port: Optional[int] = None schema_: Optional[str] = Field(None, alias='schema') server: str - service: Optional[str] - tags: Optional[Sequence[str]] - timeout: Optional[float] - 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] - use_global_custom_queries: Optional[str] - use_hana_hostnames: Optional[bool] - use_tls: Optional[bool] + service: Optional[str] = None + tags: Optional[Sequence[str]] = None + timeout: Optional[float] = 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 + use_global_custom_queries: Optional[str] = None + use_hana_hostnames: Optional[bool] = None + use_tls: Optional[bool] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/sap_hana/datadog_checks/sap_hana/config_models/shared.py b/sap_hana/datadog_checks/sap_hana/config_models/shared.py index af98064d06b35..314a5343f67bf 100644 --- a/sap_hana/datadog_checks/sap_hana/config_models/shared.py +++ b/sap_hana/datadog_checks/sap_hana/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,31 +20,40 @@ class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - global_custom_queries: Optional[Sequence[Mapping[str, Any]]] - persist_db_connections: Optional[bool] - service: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + global_custom_queries: Optional[Sequence[Mapping[str, Any]]] = None + persist_db_connections: Optional[bool] = None + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/scylla/datadog_checks/scylla/config_models/defaults.py b/scylla/datadog_checks/scylla/config_models/defaults.py index 5e6ad4215c389..6cc07ac1c3a3e 100644 --- a/scylla/datadog_checks/scylla/config_models/defaults.py +++ b/scylla/datadog_checks/scylla/config_models/defaults.py @@ -7,276 +7,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_groups(field, value): - return get_default_field_value(field, value) - - -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/scylla/datadog_checks/scylla/config_models/instance.py b/scylla/datadog_checks/scylla/config_models/instance.py index bb428d9526b62..4db066610b71d 100644 --- a/scylla/datadog_checks/scylla/config_models/instance.py +++ b/scylla/datadog_checks/scylla/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,141 +20,150 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[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( + frozen=True, + ) + target_label_key: Optional[str] = None + target_label_value_list: Optional[Sequence[str]] = None class TargetMetric(BaseModel): - class Config: - allow_mutation = False - - label_to_match: Optional[str] - labels_to_get: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + label_to_match: Optional[str] = None + labels_to_get: Optional[Sequence[str]] = None class LabelJoins(BaseModel): - class Config: - allow_mutation = False - - target_metric: Optional[TargetMetric] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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]] - 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_groups: Optional[Sequence[str]] - 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] + model_config = ConfigDict( + validate_default=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[Sequence[str]] = None + extra_headers: Optional[Mapping[str, Any]] = None + headers: Optional[Mapping[str, Any]] = None + health_service_check: Optional[bool] = None + ignore_metrics: Optional[Sequence[str]] = None + ignore_metrics_by_labels: Optional[IgnoreMetricsByLabels] = None + ignore_tags: Optional[Sequence[str]] = None + include_labels: Optional[Sequence[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[Mapping[str, Any]] = None + log_requests: Optional[bool] = None + metric_groups: Optional[Sequence[str]] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[Sequence[Union[str, Mapping[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[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + type_overrides: Optional[Mapping[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/scylla/datadog_checks/scylla/config_models/shared.py b/scylla/datadog_checks/scylla/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/scylla/datadog_checks/scylla/config_models/shared.py +++ b/scylla/datadog_checks/scylla/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/silk/datadog_checks/silk/config_models/defaults.py b/silk/datadog_checks/silk/config_models/defaults.py index cd096942c35a1..a85f6c04a22bc 100644 --- a/silk/datadog_checks/silk/config_models/defaults.py +++ b/silk/datadog_checks/silk/config_models/defaults.py @@ -7,188 +7,86 @@ # 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 False -def instance_enable_blocksize_statistics(field, value): +def instance_enable_blocksize_statistics(): return False -def instance_enable_read_write_statistics(field, value): +def instance_enable_read_write_statistics(): return False -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 False -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_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/silk/datadog_checks/silk/config_models/instance.py b/silk/datadog_checks/silk/config_models/instance.py index 5f72f37525233..249a49fadd219 100644 --- a/silk/datadog_checks/silk/config_models/instance.py +++ b/silk/datadog_checks/silk/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,96 +20,105 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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] - enable_blocksize_statistics: Optional[bool] - enable_read_write_statistics: Optional[bool] - extra_headers: Optional[Mapping[str, Any]] - headers: Optional[Mapping[str, Any]] + model_config = ConfigDict( + validate_default=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 + enable_blocksize_statistics: Optional[bool] = None + enable_read_write_statistics: Optional[bool] = None + extra_headers: Optional[Mapping[str, Any]] = None + headers: Optional[Mapping[str, Any]] = None host_address: 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] - min_collection_interval: Optional[float] - ntlm_domain: Optional[str] - password: Optional[str] - persist_connections: Optional[bool] - proxy: Optional[Proxy] - read_timeout: Optional[float] - request_size: Optional[float] - 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] - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + 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 + read_timeout: Optional[float] = None + request_size: Optional[float] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + use_legacy_auth_encoding: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/silk/datadog_checks/silk/config_models/shared.py b/silk/datadog_checks/silk/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/silk/datadog_checks/silk/config_models/shared.py +++ b/silk/datadog_checks/silk/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/singlestore/datadog_checks/singlestore/config_models/defaults.py b/singlestore/datadog_checks/singlestore/config_models/defaults.py index 98b54ade9b5eb..20c7c8c66d8cd 100644 --- a/singlestore/datadog_checks/singlestore/config_models/defaults.py +++ b/singlestore/datadog_checks/singlestore/config_models/defaults.py @@ -7,100 +7,46 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_global_custom_queries(field, value): - return get_default_field_value(field, value) - - -def shared_service(field, value): - return get_default_field_value(field, value) - - -def instance_collect_system_metrics(field, value): +def instance_collect_system_metrics(): return False -def instance_connect_timeout(field, value): +def instance_connect_timeout(): return 10 -def instance_custom_queries(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_only_custom_queries(field, value): +def instance_only_custom_queries(): return False -def instance_password(field, value): - return get_default_field_value(field, value) - - -def instance_port(field, value): +def instance_port(): return 3306 -def instance_read_timeout(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_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 -def instance_use_global_custom_queries(field, value): +def instance_use_global_custom_queries(): return 'true' -def instance_use_tls(field, value): +def instance_use_tls(): return False - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/singlestore/datadog_checks/singlestore/config_models/instance.py b/singlestore/datadog_checks/singlestore/config_models/instance.py index fe8485dc8e8cc..9400f1b6e557e 100644 --- a/singlestore/datadog_checks/singlestore/config_models/instance.py +++ b/singlestore/datadog_checks/singlestore/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,68 +20,77 @@ class CustomQuery(BaseModel): - class Config: - allow_mutation = False - - columns: Optional[Sequence[Mapping[str, Any]]] - query: Optional[str] - tags: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + columns: Optional[Sequence[Mapping[str, Any]]] = None + query: Optional[str] = None + tags: Optional[Sequence[str]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - collect_system_metrics: Optional[bool] - connect_timeout: Optional[int] - custom_queries: Optional[Sequence[CustomQuery]] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + collect_system_metrics: Optional[bool] = None + connect_timeout: Optional[int] = None + custom_queries: Optional[Sequence[CustomQuery]] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None host: str - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - only_custom_queries: Optional[bool] - password: Optional[str] - port: Optional[int] - read_timeout: Optional[int] - service: Optional[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] - use_global_custom_queries: Optional[str] - use_tls: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + only_custom_queries: Optional[bool] = None + password: Optional[str] = None + port: Optional[int] = None + read_timeout: Optional[int] = None + service: Optional[str] = None + tags: Optional[Sequence[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 + use_global_custom_queries: Optional[str] = None + use_tls: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/singlestore/datadog_checks/singlestore/config_models/shared.py b/singlestore/datadog_checks/singlestore/config_models/shared.py index 5e538415ce396..45d1293f12b20 100644 --- a/singlestore/datadog_checks/singlestore/config_models/shared.py +++ b/singlestore/datadog_checks/singlestore/config_models/shared.py @@ -11,39 +11,39 @@ from typing import Any, Mapping, Optional, Sequence -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 - - global_custom_queries: Optional[Sequence[Mapping[str, Any]]] - service: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + global_custom_queries: Optional[Sequence[Mapping[str, Any]]] = None + 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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/snowflake/datadog_checks/snowflake/config_models/defaults.py b/snowflake/datadog_checks/snowflake/config_models/defaults.py index 3153a7a28a3be..b07bfc77e0941 100644 --- a/snowflake/datadog_checks/snowflake/config_models/defaults.py +++ b/snowflake/datadog_checks/snowflake/config_models/defaults.py @@ -7,124 +7,54 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_global_custom_queries(field, value): - return get_default_field_value(field, value) - - -def shared_proxy_host(field, value): - return get_default_field_value(field, value) - - -def shared_proxy_password(field, value): - return get_default_field_value(field, value) - - -def shared_proxy_port(field, value): - return get_default_field_value(field, value) - - -def shared_proxy_user(field, value): - return get_default_field_value(field, value) - - -def shared_service(field, value): - return get_default_field_value(field, value) - - -def instance_aggregate_last_24_hours(field, value): +def instance_aggregate_last_24_hours(): return False -def instance_authenticator(field, value): +def instance_authenticator(): return 'snowflake' -def instance_client_prefetch_threads(field, value): +def instance_client_prefetch_threads(): return 4 -def instance_client_session_keep_alive(field, value): +def instance_client_session_keep_alive(): return False -def instance_custom_queries(field, value): - return get_default_field_value(field, value) - - -def instance_database(field, value): +def instance_database(): return 'SNOWFLAKE' -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_login_timeout(field, value): +def instance_login_timeout(): return 60 -def instance_metric_groups(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 3600 -def instance_ocsp_response_cache_filename(field, value): - return get_default_field_value(field, value) - - -def instance_only_custom_queries(field, value): +def instance_only_custom_queries(): return False -def instance_password(field, value): - return get_default_field_value(field, value) - - -def instance_private_key_password(field, value): - return get_default_field_value(field, value) - - -def instance_private_key_path(field, value): - return get_default_field_value(field, value) - - -def instance_schema_(field, value): +def instance_schema_(): return 'ACCOUNT_USAGE' -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_token(field, value): - return get_default_field_value(field, value) - - -def instance_token_path(field, value): +def instance_token_path(): return '/path/to/token' -def instance_use_global_custom_queries(field, value): +def instance_use_global_custom_queries(): return 'true' - - -def instance_warehouse(field, value): - return get_default_field_value(field, value) diff --git a/snowflake/datadog_checks/snowflake/config_models/instance.py b/snowflake/datadog_checks/snowflake/config_models/instance.py index c374f47a1cbc2..e307b0710ed5e 100644 --- a/snowflake/datadog_checks/snowflake/config_models/instance.py +++ b/snowflake/datadog_checks/snowflake/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -from pydantic import BaseModel, 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 @@ -20,72 +20,81 @@ class CustomQuery(BaseModel): - class Config: - allow_mutation = False - - columns: Optional[Sequence[Mapping[str, Any]]] - query: Optional[str] - tags: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + columns: Optional[Sequence[Mapping[str, Any]]] = None + query: Optional[str] = None + tags: Optional[Sequence[str]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) account: str - aggregate_last_24_hours: Optional[bool] - authenticator: Optional[str] - client_prefetch_threads: Optional[int] - client_session_keep_alive: Optional[bool] - custom_queries: Optional[Sequence[CustomQuery]] - database: Optional[str] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - login_timeout: Optional[int] - metric_groups: Optional[Sequence[str]] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - ocsp_response_cache_filename: Optional[str] - only_custom_queries: Optional[bool] - password: Optional[str] - private_key_password: Optional[str] - private_key_path: Optional[str] + aggregate_last_24_hours: Optional[bool] = None + authenticator: Optional[str] = None + client_prefetch_threads: Optional[int] = None + client_session_keep_alive: Optional[bool] = None + custom_queries: Optional[Sequence[CustomQuery]] = None + database: Optional[str] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + login_timeout: Optional[int] = None + metric_groups: Optional[Sequence[str]] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + ocsp_response_cache_filename: Optional[str] = None + only_custom_queries: Optional[bool] = None + password: Optional[str] = None + private_key_password: Optional[str] = None + private_key_path: Optional[str] = None role: str schema_: Optional[str] = Field(None, alias='schema') - service: Optional[str] - tags: Optional[Sequence[str]] - token: Optional[str] - token_path: Optional[str] - use_global_custom_queries: Optional[str] + service: Optional[str] = None + tags: Optional[Sequence[str]] = None + token: Optional[str] = None + token_path: Optional[str] = None + use_global_custom_queries: Optional[str] = None username: str - warehouse: Optional[str] + warehouse: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/snowflake/datadog_checks/snowflake/config_models/shared.py b/snowflake/datadog_checks/snowflake/config_models/shared.py index e47a7ec5b73c8..562a329103e69 100644 --- a/snowflake/datadog_checks/snowflake/config_models/shared.py +++ b/snowflake/datadog_checks/snowflake/config_models/shared.py @@ -11,43 +11,43 @@ from typing import Any, Mapping, Optional, Sequence -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 - - global_custom_queries: Optional[Sequence[Mapping[str, Any]]] - proxy_host: Optional[str] - proxy_password: Optional[str] - proxy_port: Optional[int] - proxy_user: Optional[str] - service: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + global_custom_queries: Optional[Sequence[Mapping[str, Any]]] = None + proxy_host: Optional[str] = None + proxy_password: Optional[str] = None + proxy_port: Optional[int] = None + proxy_user: Optional[str] = None + 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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/snowflake/tests/test_config.py b/snowflake/tests/test_config.py index df114dbab196f..1301bb1f9eb62 100644 --- a/snowflake/tests/test_config.py +++ b/snowflake/tests/test_config.py @@ -70,7 +70,7 @@ def test_authenticator_option_pass(options): 'database': 'SNOWFLAKE', 'schema': 'ACCOUNT_USAGE', 'role': 'ACCOUNTADMIN', - 'user': 'testuser', + 'username': 'testuser', } instance.update(options) diff --git a/solr/datadog_checks/solr/config_models/defaults.py b/solr/datadog_checks/solr/config_models/defaults.py index dd4e89c31b649..dd1f1cf9fc462 100644 --- a/solr/datadog_checks/solr/config_models/defaults.py +++ b/solr/datadog_checks/solr/config_models/defaults.py @@ -7,108 +7,42 @@ # 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): +def instance_name(): return 'solr_instance' -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/solr/datadog_checks/solr/config_models/instance.py b/solr/datadog_checks/solr/config_models/instance.py index bc4c01723f132..631a321dda3bb 100644 --- a/solr/datadog_checks/solr/config_models/instance.py +++ b/solr/datadog_checks/solr/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,51 +20,60 @@ 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, + 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[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/solr/datadog_checks/solr/config_models/shared.py b/solr/datadog_checks/solr/config_models/shared.py index 1c722ceac49bc..0db55a6d064d5 100644 --- a/solr/datadog_checks/solr/config_models/shared.py +++ b/solr/datadog_checks/solr/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,34 +20,43 @@ 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, + frozen=True, + ) + collect_default_metrics: Optional[bool] = None + conf: Optional[Sequence[Mapping[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/sonarqube/datadog_checks/sonarqube/config_models/defaults.py b/sonarqube/datadog_checks/sonarqube/config_models/defaults.py index d70d1e90820ea..a9a53dd5744e8 100644 --- a/sonarqube/datadog_checks/sonarqube/config_models/defaults.py +++ b/sonarqube/datadog_checks/sonarqube/config_models/defaults.py @@ -7,288 +7,110 @@ # 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_is_jmx(field, value): +def shared_is_jmx(): return False -def shared_new_gc_metrics(field, value): +def shared_new_gc_metrics(): return False -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_service_check_prefix(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_collect_default_jvm_metrics(field, value): +def instance_collect_default_jvm_metrics(): return True -def instance_components(field, value): - return get_default_field_value(field, value) - - -def instance_components_discovery(field, value): - return get_default_field_value(field, value) - - -def instance_connect_timeout(field, value): - return get_default_field_value(field, value) - - -def instance_default_exclude(field, value): - return get_default_field_value(field, value) - - -def instance_default_include(field, value): - return get_default_field_value(field, value) - - -def instance_default_tag(field, value): +def instance_default_tag(): return 'component' -def instance_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return False -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_host(field, value): - return get_default_field_value(field, value) - - -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_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_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_log_requests(field, value): +def instance_log_requests(): return False -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_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_port(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_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_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_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_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_use_legacy_auth_encoding(field, value): +def instance_use_legacy_auth_encoding(): return True - - -def instance_user(field, value): - return get_default_field_value(field, value) - - -def instance_username(field, value): - return get_default_field_value(field, value) - - -def instance_web_endpoint(field, value): - return get_default_field_value(field, value) diff --git a/sonarqube/datadog_checks/sonarqube/config_models/instance.py b/sonarqube/datadog_checks/sonarqube/config_models/instance.py index 8d99708425558..378d5d10b95f9 100644 --- a/sonarqube/datadog_checks/sonarqube/config_models/instance.py +++ b/sonarqube/datadog_checks/sonarqube/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,116 +20,125 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class ComponentsDiscovery(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Mapping[str, Any]] - limit: Optional[int] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Mapping[str, Any]] = None + limit: Optional[int] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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] - collect_default_jvm_metrics: Optional[bool] - components: Optional[Mapping[str, Any]] - components_discovery: Optional[ComponentsDiscovery] - connect_timeout: Optional[float] - default_exclude: Optional[Sequence[str]] - default_include: Optional[Sequence[str]] - default_tag: Optional[str] - empty_default_hostname: Optional[bool] - extra_headers: Optional[Mapping[str, Any]] - headers: Optional[Mapping[str, Any]] - host: Optional[str] - is_jmx: Optional[bool] - java_bin_path: Optional[str] - java_options: Optional[str] - jmx_url: Optional[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] - key_store_password: Optional[str] - key_store_path: Optional[str] - log_requests: Optional[bool] - min_collection_interval: Optional[float] - name: Optional[str] - ntlm_domain: Optional[str] - password: Optional[str] - persist_connections: Optional[bool] - port: Optional[int] - process_name_regex: Optional[str] - proxy: Optional[Proxy] - read_timeout: Optional[float] - request_size: Optional[float] - rmi_client_timeout: Optional[float] - rmi_connection_timeout: Optional[float] - rmi_registry_ssl: 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] - tools_jar_path: Optional[str] - trust_store_password: Optional[str] - trust_store_path: Optional[str] - use_legacy_auth_encoding: Optional[bool] - user: Optional[str] - username: Optional[str] - web_endpoint: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=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 + collect_default_jvm_metrics: Optional[bool] = None + components: Optional[Mapping[str, Any]] = None + components_discovery: Optional[ComponentsDiscovery] = None + connect_timeout: Optional[float] = None + default_exclude: Optional[Sequence[str]] = None + default_include: Optional[Sequence[str]] = None + default_tag: Optional[str] = None + empty_default_hostname: Optional[bool] = None + extra_headers: Optional[Mapping[str, Any]] = None + headers: Optional[Mapping[str, Any]] = None + host: Optional[str] = None + is_jmx: Optional[bool] = None + java_bin_path: Optional[str] = None + java_options: Optional[str] = None + jmx_url: Optional[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 + key_store_password: Optional[str] = None + key_store_path: Optional[str] = None + log_requests: Optional[bool] = None + min_collection_interval: Optional[float] = None + name: Optional[str] = None + ntlm_domain: Optional[str] = None + password: Optional[str] = None + persist_connections: Optional[bool] = None + port: Optional[int] = None + process_name_regex: Optional[str] = None + proxy: Optional[Proxy] = None + read_timeout: Optional[float] = None + request_size: Optional[float] = None + rmi_client_timeout: Optional[float] = None + rmi_connection_timeout: Optional[float] = None + rmi_registry_ssl: Optional[bool] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + tools_jar_path: Optional[str] = None + trust_store_password: Optional[str] = None + trust_store_path: Optional[str] = None + use_legacy_auth_encoding: Optional[bool] = None + user: Optional[str] = None + username: Optional[str] = None + web_endpoint: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/sonarqube/datadog_checks/sonarqube/config_models/shared.py b/sonarqube/datadog_checks/sonarqube/config_models/shared.py index 0215d6ad00e3b..83534741d4019 100644 --- a/sonarqube/datadog_checks/sonarqube/config_models/shared.py +++ b/sonarqube/datadog_checks/sonarqube/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,46 +20,55 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - collect_default_metrics: Optional[bool] - conf: Optional[Sequence[Mapping[str, Any]]] - is_jmx: Optional[bool] - new_gc_metrics: Optional[bool] - proxy: Optional[Proxy] - service: Optional[str] - service_check_prefix: Optional[str] - skip_proxy: Optional[bool] - timeout: Optional[float] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + collect_default_metrics: Optional[bool] = None + conf: Optional[Sequence[Mapping[str, Any]]] = None + is_jmx: Optional[bool] = None + new_gc_metrics: Optional[bool] = None + proxy: Optional[Proxy] = None + service: Optional[str] = None + service_check_prefix: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/spark/datadog_checks/spark/config_models/defaults.py b/spark/datadog_checks/spark/config_models/defaults.py index 30ebbb0df826f..564cd45b1722c 100644 --- a/spark/datadog_checks/spark/config_models/defaults.py +++ b/spark/datadog_checks/spark/config_models/defaults.py @@ -7,216 +7,110 @@ # 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_disable_legacy_cluster_tag(field, value): +def instance_disable_legacy_cluster_tag(): return False -def instance_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return False -def instance_enable_query_name_tag(field, value): +def instance_enable_query_name_tag(): return False -def instance_executor_level_metrics(field, value): +def instance_executor_level_metrics(): return False -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_metricsservlet_path(field, value): +def instance_metricsservlet_path(): return '/metrics/json' -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 False -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_skip_proxy(field, value): +def instance_skip_proxy(): return False -def instance_spark_cluster_mode(field, value): +def instance_spark_cluster_mode(): return 'spark_yarn_mode' -def instance_spark_pre_20_mode(field, value): +def instance_spark_pre_20_mode(): return False -def instance_spark_proxy_enabled(field, value): +def instance_spark_proxy_enabled(): return False -def instance_spark_ui_ports(field, value): - return get_default_field_value(field, value) - - -def instance_streaming_metrics(field, value): +def instance_streaming_metrics(): return True -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/spark/datadog_checks/spark/config_models/instance.py b/spark/datadog_checks/spark/config_models/instance.py index d316fb8943a7a..d5833281005c9 100644 --- a/spark/datadog_checks/spark/config_models/instance.py +++ b/spark/datadog_checks/spark/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,104 +20,113 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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] + model_config = ConfigDict( + validate_default=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 cluster_name: str - connect_timeout: Optional[float] - disable_generic_tags: Optional[bool] - disable_legacy_cluster_tag: Optional[bool] - empty_default_hostname: Optional[bool] - enable_query_name_tag: Optional[bool] - executor_level_metrics: 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] - metricsservlet_path: Optional[str] - min_collection_interval: Optional[float] - ntlm_domain: Optional[str] - password: Optional[str] - persist_connections: Optional[bool] - proxy: Optional[Proxy] - read_timeout: Optional[float] - request_size: Optional[float] - service: Optional[str] - skip_proxy: Optional[bool] - spark_cluster_mode: Optional[str] - spark_pre_20_mode: Optional[bool] - spark_proxy_enabled: Optional[bool] - spark_ui_ports: Optional[Sequence[int]] + connect_timeout: Optional[float] = None + disable_generic_tags: Optional[bool] = None + disable_legacy_cluster_tag: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + enable_query_name_tag: Optional[bool] = None + executor_level_metrics: Optional[bool] = None + extra_headers: Optional[Mapping[str, Any]] = None + headers: Optional[Mapping[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 + metricsservlet_path: Optional[str] = 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 + read_timeout: Optional[float] = None + request_size: Optional[float] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + spark_cluster_mode: Optional[str] = None + spark_pre_20_mode: Optional[bool] = None + spark_proxy_enabled: Optional[bool] = None + spark_ui_ports: Optional[Sequence[int]] = None spark_url: str - streaming_metrics: 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] - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + streaming_metrics: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + use_legacy_auth_encoding: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/spark/datadog_checks/spark/config_models/shared.py b/spark/datadog_checks/spark/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/spark/datadog_checks/spark/config_models/shared.py +++ b/spark/datadog_checks/spark/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/sqlserver/datadog_checks/sqlserver/config_models/defaults.py b/sqlserver/datadog_checks/sqlserver/config_models/defaults.py index 285c8961bc987..13164a120d4bc 100644 --- a/sqlserver/datadog_checks/sqlserver/config_models/defaults.py +++ b/sqlserver/datadog_checks/sqlserver/config_models/defaults.py @@ -7,208 +7,106 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_custom_metrics(field, value): - return get_default_field_value(field, value) - - -def shared_global_custom_queries(field, value): - return get_default_field_value(field, value) - - -def shared_service(field, value): - return get_default_field_value(field, value) - - -def instance_adoprovider(field, value): +def instance_adoprovider(): return 'SQLOLEDB' -def instance_ao_database(field, value): - return get_default_field_value(field, value) - - -def instance_autodiscovery_db_service_check(field, value): +def instance_autodiscovery_db_service_check(): return True -def instance_autodiscovery_exclude(field, value): - return get_default_field_value(field, value) - - -def instance_autodiscovery_include(field, value): - return get_default_field_value(field, value) - - -def instance_availability_group(field, value): - return get_default_field_value(field, value) - - -def instance_aws(field, value): - return get_default_field_value(field, value) - - -def instance_azure(field, value): - return get_default_field_value(field, value) - - -def instance_command_timeout(field, value): +def instance_command_timeout(): return 10 -def instance_connection_string(field, value): - return get_default_field_value(field, value) - - -def instance_connector(field, value): +def instance_connector(): return 'adodbapi' -def instance_custom_queries(field, value): - return get_default_field_value(field, value) - - -def instance_database(field, value): +def instance_database(): return 'master' -def instance_database_autodiscovery(field, value): +def instance_database_autodiscovery(): return False -def instance_database_autodiscovery_interval(field, value): +def instance_database_autodiscovery_interval(): return 3600 -def instance_db_fragmentation_object_names(field, value): - return get_default_field_value(field, value) - - -def instance_dbm(field, value): +def instance_dbm(): return False -def instance_disable_generic_tags(field, value): +def instance_disable_generic_tags(): return False -def instance_driver(field, value): +def instance_driver(): return 'SQL Server' -def instance_dsn(field, value): - return get_default_field_value(field, value) - - -def instance_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return False -def instance_gcp(field, value): - return get_default_field_value(field, value) - - -def instance_ignore_missing_database(field, value): +def instance_ignore_missing_database(): return False -def instance_include_ao_metrics(field, value): +def instance_include_ao_metrics(): return False -def instance_include_db_fragmentation_metrics(field, value): +def instance_include_db_fragmentation_metrics(): return False -def instance_include_fci_metrics(field, value): +def instance_include_fci_metrics(): return False -def instance_include_instance_metrics(field, value): +def instance_include_instance_metrics(): return True -def instance_include_master_files_metrics(field, value): +def instance_include_master_files_metrics(): return False -def instance_include_task_scheduler_metrics(field, value): +def instance_include_task_scheduler_metrics(): return False -def instance_log_unobfuscated_plans(field, value): +def instance_log_unobfuscated_plans(): return False -def instance_log_unobfuscated_queries(field, value): +def instance_log_unobfuscated_queries(): 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_obfuscator_options(field, value): - return get_default_field_value(field, value) - - -def instance_only_custom_queries(field, value): +def instance_only_custom_queries(): return False -def instance_only_emit_local(field, value): +def instance_only_emit_local(): return False -def instance_password(field, value): - return get_default_field_value(field, value) - - -def instance_proc_only_if(field, value): - return get_default_field_value(field, value) - - -def instance_proc_only_if_database(field, value): +def instance_proc_only_if_database(): return 'master' -def instance_query_activity(field, value): - return get_default_field_value(field, value) - - -def instance_query_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_reported_hostname(field, value): - return get_default_field_value(field, value) - - -def instance_server_version(field, value): +def instance_server_version(): return '2014' -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_stored_procedure(field, value): - return get_default_field_value(field, value) - - -def instance_tags(field, value): - return get_default_field_value(field, value) - - -def instance_use_global_custom_queries(field, value): +def instance_use_global_custom_queries(): return 'true' - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/sqlserver/datadog_checks/sqlserver/config_models/instance.py b/sqlserver/datadog_checks/sqlserver/config_models/instance.py index bfbaf485efc13..c7a2d3dd7b7e9 100644 --- a/sqlserver/datadog_checks/sqlserver/config_models/instance.py +++ b/sqlserver/datadog_checks/sqlserver/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,150 +20,159 @@ class Aws(BaseModel): - class Config: - allow_mutation = False - - instance_endpoint: Optional[str] + model_config = ConfigDict( + frozen=True, + ) + instance_endpoint: Optional[str] = None class Azure(BaseModel): - class Config: - allow_mutation = False - - deployment_type: Optional[str] - fully_qualified_domain_name: Optional[str] + model_config = ConfigDict( + frozen=True, + ) + deployment_type: Optional[str] = None + fully_qualified_domain_name: Optional[str] = None class CustomQuery(BaseModel): - class Config: - allow_mutation = False - - columns: Optional[Sequence[Mapping[str, Any]]] - query: Optional[str] - tags: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + columns: Optional[Sequence[Mapping[str, Any]]] = None + query: Optional[str] = None + tags: Optional[Sequence[str]] = None class Gcp(BaseModel): - class Config: - allow_mutation = False - - instance_id: Optional[str] - project_id: Optional[str] + model_config = ConfigDict( + frozen=True, + ) + instance_id: Optional[str] = None + project_id: Optional[str] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class ObfuscatorOptions(BaseModel): - class Config: - allow_mutation = False - - collect_commands: Optional[bool] - collect_comments: Optional[bool] - collect_metadata: Optional[bool] - collect_tables: Optional[bool] - keep_sql_alias: Optional[bool] - replace_digits: Optional[bool] + model_config = ConfigDict( + frozen=True, + ) + collect_commands: Optional[bool] = None + collect_comments: Optional[bool] = None + collect_metadata: Optional[bool] = None + collect_tables: Optional[bool] = None + keep_sql_alias: Optional[bool] = None + replace_digits: Optional[bool] = None class QueryActivity(BaseModel): - class Config: - allow_mutation = False - - collection_interval: Optional[float] - enabled: Optional[bool] + model_config = ConfigDict( + frozen=True, + ) + collection_interval: Optional[float] = None + enabled: Optional[bool] = None class QueryMetrics(BaseModel): - class Config: - allow_mutation = False - - collection_interval: Optional[float] - disable_secondary_tags: Optional[bool] - dm_exec_query_stats_row_limit: Optional[int] - enabled: Optional[bool] - enforce_collection_interval_deadline: Optional[bool] - max_queries: Optional[int] - samples_per_hour_per_query: Optional[int] + model_config = ConfigDict( + frozen=True, + ) + collection_interval: Optional[float] = None + disable_secondary_tags: Optional[bool] = None + dm_exec_query_stats_row_limit: Optional[int] = None + enabled: Optional[bool] = None + enforce_collection_interval_deadline: Optional[bool] = None + max_queries: Optional[int] = None + samples_per_hour_per_query: Optional[int] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - adoprovider: Optional[str] - ao_database: Optional[str] - autodiscovery_db_service_check: Optional[bool] - autodiscovery_exclude: Optional[Sequence[str]] - autodiscovery_include: Optional[Sequence[str]] - availability_group: Optional[str] - aws: Optional[Aws] - azure: Optional[Azure] - command_timeout: Optional[int] - connection_string: Optional[str] - connector: Optional[str] - custom_queries: Optional[Sequence[CustomQuery]] - database: Optional[str] - database_autodiscovery: Optional[bool] - database_autodiscovery_interval: Optional[int] - db_fragmentation_object_names: Optional[Sequence[str]] - dbm: Optional[bool] - disable_generic_tags: Optional[bool] - driver: Optional[str] - dsn: Optional[str] - empty_default_hostname: Optional[bool] - gcp: Optional[Gcp] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + adoprovider: Optional[str] = None + ao_database: Optional[str] = None + autodiscovery_db_service_check: Optional[bool] = None + autodiscovery_exclude: Optional[Sequence[str]] = None + autodiscovery_include: Optional[Sequence[str]] = None + availability_group: Optional[str] = None + aws: Optional[Aws] = None + azure: Optional[Azure] = None + command_timeout: Optional[int] = None + connection_string: Optional[str] = None + connector: Optional[str] = None + custom_queries: Optional[Sequence[CustomQuery]] = None + database: Optional[str] = None + database_autodiscovery: Optional[bool] = None + database_autodiscovery_interval: Optional[int] = None + db_fragmentation_object_names: Optional[Sequence[str]] = None + dbm: Optional[bool] = None + disable_generic_tags: Optional[bool] = None + driver: Optional[str] = None + dsn: Optional[str] = None + empty_default_hostname: Optional[bool] = None + gcp: Optional[Gcp] = None host: str - ignore_missing_database: Optional[bool] - include_ao_metrics: Optional[bool] - include_db_fragmentation_metrics: Optional[bool] - include_fci_metrics: Optional[bool] - include_instance_metrics: Optional[bool] - include_master_files_metrics: Optional[bool] - include_task_scheduler_metrics: Optional[bool] - log_unobfuscated_plans: Optional[bool] - log_unobfuscated_queries: Optional[bool] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - obfuscator_options: Optional[ObfuscatorOptions] - only_custom_queries: Optional[bool] - only_emit_local: Optional[bool] - password: Optional[str] - proc_only_if: Optional[str] - proc_only_if_database: Optional[str] - query_activity: Optional[QueryActivity] - query_metrics: Optional[QueryMetrics] - reported_hostname: Optional[str] - server_version: Optional[str] - service: Optional[str] - stored_procedure: Optional[str] - tags: Optional[Sequence[str]] - use_global_custom_queries: Optional[str] - username: Optional[str] - - @root_validator(pre=True) + ignore_missing_database: Optional[bool] = None + include_ao_metrics: Optional[bool] = None + include_db_fragmentation_metrics: Optional[bool] = None + include_fci_metrics: Optional[bool] = None + include_instance_metrics: Optional[bool] = None + include_master_files_metrics: Optional[bool] = None + include_task_scheduler_metrics: Optional[bool] = None + log_unobfuscated_plans: Optional[bool] = None + log_unobfuscated_queries: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + obfuscator_options: Optional[ObfuscatorOptions] = None + only_custom_queries: Optional[bool] = None + only_emit_local: Optional[bool] = None + password: Optional[str] = None + proc_only_if: Optional[str] = None + proc_only_if_database: Optional[str] = None + query_activity: Optional[QueryActivity] = None + query_metrics: Optional[QueryMetrics] = None + reported_hostname: Optional[str] = None + server_version: Optional[str] = None + service: Optional[str] = None + stored_procedure: Optional[str] = None + tags: Optional[Sequence[str]] = None + use_global_custom_queries: Optional[str] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/sqlserver/datadog_checks/sqlserver/config_models/shared.py b/sqlserver/datadog_checks/sqlserver/config_models/shared.py index 1ced0ddf53845..12d1bc5787102 100644 --- a/sqlserver/datadog_checks/sqlserver/config_models/shared.py +++ b/sqlserver/datadog_checks/sqlserver/config_models/shared.py @@ -11,40 +11,40 @@ from typing import Any, Mapping, Optional, Sequence -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 - - custom_metrics: Optional[Sequence[Mapping[str, Any]]] - global_custom_queries: Optional[Sequence[Mapping[str, Any]]] - service: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + custom_metrics: Optional[Sequence[Mapping[str, Any]]] = None + global_custom_queries: Optional[Sequence[Mapping[str, Any]]] = None + 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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/squid/datadog_checks/squid/config_models/defaults.py b/squid/datadog_checks/squid/config_models/defaults.py index 7925e2c1b9265..a24e87cdad10b 100644 --- a/squid/datadog_checks/squid/config_models/defaults.py +++ b/squid/datadog_checks/squid/config_models/defaults.py @@ -7,188 +7,86 @@ # 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 False -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_host(field, value): +def instance_host(): return 'localhost' -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 False -def instance_port(field, value): +def instance_port(): return 3128 -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_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/squid/datadog_checks/squid/config_models/instance.py b/squid/datadog_checks/squid/config_models/instance.py index 3236fe14f6166..3c25b1571159d 100644 --- a/squid/datadog_checks/squid/config_models/instance.py +++ b/squid/datadog_checks/squid/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,96 +20,105 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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]] - host: Optional[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] - min_collection_interval: Optional[float] + model_config = ConfigDict( + validate_default=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[Mapping[str, Any]] = None + headers: Optional[Mapping[str, Any]] = None + host: Optional[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 + min_collection_interval: Optional[float] = None name: str - ntlm_domain: Optional[str] - password: Optional[str] - persist_connections: Optional[bool] - port: Optional[int] - proxy: Optional[Proxy] - read_timeout: Optional[float] - request_size: Optional[float] - 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] - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + ntlm_domain: Optional[str] = None + password: Optional[str] = None + persist_connections: Optional[bool] = None + port: Optional[int] = None + proxy: Optional[Proxy] = None + read_timeout: Optional[float] = None + request_size: Optional[float] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + use_legacy_auth_encoding: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/squid/datadog_checks/squid/config_models/shared.py b/squid/datadog_checks/squid/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/squid/datadog_checks/squid/config_models/shared.py +++ b/squid/datadog_checks/squid/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/ssh_check/datadog_checks/ssh_check/config_models/defaults.py b/ssh_check/datadog_checks/ssh_check/config_models/defaults.py index d7b23390b026e..ddb5539ad34e7 100644 --- a/ssh_check/datadog_checks/ssh_check/config_models/defaults.py +++ b/ssh_check/datadog_checks/ssh_check/config_models/defaults.py @@ -7,56 +7,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_add_missing_keys(field, value): +def instance_add_missing_keys(): return False -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_password(field, value): - return get_default_field_value(field, value) - - -def instance_port(field, value): +def instance_port(): return 22 -def instance_private_key_file(field, value): - return get_default_field_value(field, value) - - -def instance_private_key_type(field, value): +def instance_private_key_type(): return 'rsa' -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_sftp_check(field, value): +def instance_sftp_check(): return True - - -def instance_tags(field, value): - return get_default_field_value(field, value) diff --git a/ssh_check/datadog_checks/ssh_check/config_models/instance.py b/ssh_check/datadog_checks/ssh_check/config_models/instance.py index 4d0ab3ba2a23c..93c090ff165a3 100644 --- a/ssh_check/datadog_checks/ssh_check/config_models/instance.py +++ b/ssh_check/datadog_checks/ssh_check/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,50 +20,59 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - add_missing_keys: Optional[bool] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + add_missing_keys: Optional[bool] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None host: str - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - password: Optional[str] - port: Optional[int] - private_key_file: Optional[str] - private_key_type: Optional[str] - service: Optional[str] - sftp_check: Optional[bool] - tags: Optional[Sequence[str]] + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + password: Optional[str] = None + port: Optional[int] = None + private_key_file: Optional[str] = None + private_key_type: Optional[str] = None + service: Optional[str] = None + sftp_check: Optional[bool] = None + tags: Optional[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/ssh_check/datadog_checks/ssh_check/config_models/shared.py b/ssh_check/datadog_checks/ssh_check/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/ssh_check/datadog_checks/ssh_check/config_models/shared.py +++ b/ssh_check/datadog_checks/ssh_check/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/statsd/datadog_checks/statsd/config_models/defaults.py b/statsd/datadog_checks/statsd/config_models/defaults.py index cd614318b0947..c71a80eec96be 100644 --- a/statsd/datadog_checks/statsd/config_models/defaults.py +++ b/statsd/datadog_checks/statsd/config_models/defaults.py @@ -7,44 +7,26 @@ # 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_host(field, value): +def instance_host(): return 'localhost' -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_port(field, value): +def instance_port(): return 8126 -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 10 diff --git a/statsd/datadog_checks/statsd/config_models/instance.py b/statsd/datadog_checks/statsd/config_models/instance.py index bf047f2d5feb7..89f10fefd2b8c 100644 --- a/statsd/datadog_checks/statsd/config_models/instance.py +++ b/statsd/datadog_checks/statsd/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,45 +20,54 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - host: Optional[str] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - port: Optional[int] - service: Optional[str] - tags: Optional[Sequence[str]] - timeout: Optional[float] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + host: Optional[str] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + port: Optional[int] = None + service: Optional[str] = None + tags: Optional[Sequence[str]] = None + timeout: Optional[float] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/statsd/datadog_checks/statsd/config_models/shared.py b/statsd/datadog_checks/statsd/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/statsd/datadog_checks/statsd/config_models/shared.py +++ b/statsd/datadog_checks/statsd/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/strimzi/datadog_checks/strimzi/config_models/defaults.py b/strimzi/datadog_checks/strimzi/config_models/defaults.py index 8082074d3cd6a..ce57e52bb4d03 100644 --- a/strimzi/datadog_checks/strimzi/config_models/defaults.py +++ b/strimzi/datadog_checks/strimzi/config_models/defaults.py @@ -7,300 +7,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_cluster_operator_endpoint(field, value): - return get_default_field_value(field, value) - - -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_topic_operator_endpoint(field, value): - return get_default_field_value(field, value) - - -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_user_operator_endpoint(field, value): - return get_default_field_value(field, value) - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/strimzi/datadog_checks/strimzi/config_models/instance.py b/strimzi/datadog_checks/strimzi/config_models/instance.py index 23db31d75b43d..040fc5bd6ec7a 100644 --- a/strimzi/datadog_checks/strimzi/config_models/instance.py +++ b/strimzi/datadog_checks/strimzi/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,149 +20,158 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + labels: Optional[Sequence[str]] = None + match: Optional[Sequence[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] - cluster_operator_endpoint: Optional[str] - 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] - topic_operator_endpoint: Optional[str] - use_latest_spec: Optional[bool] - use_legacy_auth_encoding: Optional[bool] - use_process_start_time: Optional[bool] - user_operator_endpoint: Optional[str] - username: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=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 + cluster_operator_endpoint: Optional[str] = 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[Sequence[str]] = None + exclude_metrics: Optional[Sequence[str]] = None + exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] = None + extra_headers: Optional[Mapping[str, Any]] = None + extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] = None + headers: Optional[Mapping[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[Sequence[str]] = None + include_labels: Optional[Sequence[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[Sequence[Union[str, Mapping[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[Sequence[str]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[Mapping[str, Any]] = None + request_size: Optional[float] = None + service: Optional[str] = None + share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + topic_operator_endpoint: Optional[str] = None + use_latest_spec: Optional[bool] = None + use_legacy_auth_encoding: Optional[bool] = None + use_process_start_time: Optional[bool] = None + user_operator_endpoint: Optional[str] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/strimzi/datadog_checks/strimzi/config_models/shared.py b/strimzi/datadog_checks/strimzi/config_models/shared.py index 5bf22be279a60..59c534d071001 100644 --- a/strimzi/datadog_checks/strimzi/config_models/shared.py +++ b/strimzi/datadog_checks/strimzi/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/supervisord/datadog_checks/supervisord/config_models/defaults.py b/supervisord/datadog_checks/supervisord/config_models/defaults.py index b0332671337ea..e049e004fc80f 100644 --- a/supervisord/datadog_checks/supervisord/config_models/defaults.py +++ b/supervisord/datadog_checks/supervisord/config_models/defaults.py @@ -7,60 +7,22 @@ # 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_host(field, value): +def instance_host(): return 'localhost' -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_password(field, value): - return get_default_field_value(field, value) - - -def instance_port(field, value): +def instance_port(): return 9001 - - -def instance_proc_names(field, value): - return get_default_field_value(field, value) - - -def instance_proc_regex(field, value): - return get_default_field_value(field, value) - - -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_socket(field, value): - return get_default_field_value(field, value) - - -def instance_tags(field, value): - return get_default_field_value(field, value) - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/supervisord/datadog_checks/supervisord/config_models/instance.py b/supervisord/datadog_checks/supervisord/config_models/instance.py index c2f21961624a1..17d891e0cf7e6 100644 --- a/supervisord/datadog_checks/supervisord/config_models/instance.py +++ b/supervisord/datadog_checks/supervisord/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,50 +20,59 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - host: Optional[str] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + host: Optional[str] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None name: str - password: Optional[str] - port: Optional[int] - proc_names: Optional[Sequence[str]] - proc_regex: Optional[Sequence[str]] - service: Optional[str] - socket: Optional[str] - tags: Optional[Sequence[str]] - username: Optional[str] - - @root_validator(pre=True) + password: Optional[str] = None + port: Optional[int] = None + proc_names: Optional[Sequence[str]] = None + proc_regex: Optional[Sequence[str]] = None + service: Optional[str] = None + socket: Optional[str] = None + tags: Optional[Sequence[str]] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/supervisord/datadog_checks/supervisord/config_models/shared.py b/supervisord/datadog_checks/supervisord/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/supervisord/datadog_checks/supervisord/config_models/shared.py +++ b/supervisord/datadog_checks/supervisord/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/system_core/datadog_checks/system_core/config_models/defaults.py b/system_core/datadog_checks/system_core/config_models/defaults.py index 728306cdf2c5a..a4a110493a7fe 100644 --- a/system_core/datadog_checks/system_core/config_models/defaults.py +++ b/system_core/datadog_checks/system_core/config_models/defaults.py @@ -7,32 +7,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/system_core/datadog_checks/system_core/config_models/instance.py b/system_core/datadog_checks/system_core/config_models/instance.py index 8696c61f639f9..9fd87afb27b4b 100644 --- a/system_core/datadog_checks/system_core/config_models/instance.py +++ b/system_core/datadog_checks/system_core/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,42 +20,51 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[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, + 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[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/system_core/datadog_checks/system_core/config_models/shared.py b/system_core/datadog_checks/system_core/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/system_core/datadog_checks/system_core/config_models/shared.py +++ b/system_core/datadog_checks/system_core/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/system_swap/datadog_checks/system_swap/config_models/defaults.py b/system_swap/datadog_checks/system_swap/config_models/defaults.py index 728306cdf2c5a..a4a110493a7fe 100644 --- a/system_swap/datadog_checks/system_swap/config_models/defaults.py +++ b/system_swap/datadog_checks/system_swap/config_models/defaults.py @@ -7,32 +7,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/system_swap/datadog_checks/system_swap/config_models/instance.py b/system_swap/datadog_checks/system_swap/config_models/instance.py index 8696c61f639f9..9fd87afb27b4b 100644 --- a/system_swap/datadog_checks/system_swap/config_models/instance.py +++ b/system_swap/datadog_checks/system_swap/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,42 +20,51 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[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, + 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[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/system_swap/datadog_checks/system_swap/config_models/shared.py b/system_swap/datadog_checks/system_swap/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/system_swap/datadog_checks/system_swap/config_models/shared.py +++ b/system_swap/datadog_checks/system_swap/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/tcp_check/assets/configuration/spec.yaml b/tcp_check/assets/configuration/spec.yaml index a16ee964bdb7a..e38a0ccce881a 100644 --- a/tcp_check/assets/configuration/spec.yaml +++ b/tcp_check/assets/configuration/spec.yaml @@ -27,7 +27,7 @@ files: - name: timeout description: Timeout of the TCP query in second. value: - type: integer + type: number example: 10 - name: collect_response_time description: | diff --git a/tcp_check/datadog_checks/tcp_check/config_models/defaults.py b/tcp_check/datadog_checks/tcp_check/config_models/defaults.py index 913d5e7668896..d146fb28dc1bd 100644 --- a/tcp_check/datadog_checks/tcp_check/config_models/defaults.py +++ b/tcp_check/datadog_checks/tcp_check/config_models/defaults.py @@ -7,52 +7,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_collect_response_time(field, value): +def instance_collect_response_time(): return False -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_ip_cache_duration(field, value): - return get_default_field_value(field, value) - - -def instance_ipv4_only(field, value): +def instance_ipv4_only(): 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_multiple_ips(field, value): +def instance_multiple_ips(): 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_timeout(field, value): +def instance_timeout(): return 10 diff --git a/tcp_check/datadog_checks/tcp_check/config_models/instance.py b/tcp_check/datadog_checks/tcp_check/config_models/instance.py index fd07477213d97..e2a8ae99e2c47 100644 --- a/tcp_check/datadog_checks/tcp_check/config_models/instance.py +++ b/tcp_check/datadog_checks/tcp_check/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,50 +20,59 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - collect_response_time: Optional[bool] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + collect_response_time: Optional[bool] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None host: str - ip_cache_duration: Optional[float] - ipv4_only: Optional[bool] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - multiple_ips: Optional[bool] + ip_cache_duration: Optional[float] = None + ipv4_only: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + multiple_ips: Optional[bool] = None name: str port: int - service: Optional[str] - tags: Optional[Sequence[str]] - timeout: Optional[int] + service: Optional[str] = None + tags: Optional[Sequence[str]] = None + timeout: Optional[float] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/tcp_check/datadog_checks/tcp_check/config_models/shared.py b/tcp_check/datadog_checks/tcp_check/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/tcp_check/datadog_checks/tcp_check/config_models/shared.py +++ b/tcp_check/datadog_checks/tcp_check/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/tcp_check/datadog_checks/tcp_check/data/conf.yaml.example b/tcp_check/datadog_checks/tcp_check/data/conf.yaml.example index f678629cecc8a..66b12fcf8598b 100644 --- a/tcp_check/datadog_checks/tcp_check/data/conf.yaml.example +++ b/tcp_check/datadog_checks/tcp_check/data/conf.yaml.example @@ -28,7 +28,7 @@ instances: # port: - ## @param timeout - integer - optional - default: 10 + ## @param timeout - number - optional - default: 10 ## Timeout of the TCP query in second. # # timeout: 10 diff --git a/teamcity/datadog_checks/teamcity/config_models/defaults.py b/teamcity/datadog_checks/teamcity/config_models/defaults.py index 73967855d6250..a757a2ee2a832 100644 --- a/teamcity/datadog_checks/teamcity/config_models/defaults.py +++ b/teamcity/datadog_checks/teamcity/config_models/defaults.py @@ -7,328 +7,154 @@ # 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_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_build_config_metrics(field, value): +def instance_build_config_metrics(): return True -def instance_build_configuration(field, value): - return get_default_field_value(field, value) - - -def instance_build_problem_health_check(field, value): +def instance_build_problem_health_check(): return True -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_events(field, value): +def instance_collect_events(): return True -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_default_build_configs_limit(field, value): +def instance_default_build_configs_limit(): return 5 -def instance_default_projects_limit(field, value): +def instance_default_projects_limit(): return 5 -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_experimental_metrics(field, value): +def instance_experimental_metrics(): return False -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_global_build_configs_exclude(field, value): - return get_default_field_value(field, value) - - -def instance_global_build_configs_include(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_projects(field, value): - return get_default_field_value(field, value) - - -def instance_projects_refresh_interval(field, value): +def instance_projects_refresh_interval(): return 3600 -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_tests_health_check(field, value): +def instance_tests_health_check(): return True -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_openmetrics(field, value): +def instance_use_openmetrics(): return False -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/teamcity/datadog_checks/teamcity/config_models/instance.py b/teamcity/datadog_checks/teamcity/config_models/instance.py index a5ab73c513fbb..924b244acb9c7 100644 --- a/teamcity/datadog_checks/teamcity/config_models/instance.py +++ b/teamcity/datadog_checks/teamcity/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,178 +20,187 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + extra='allow', + frozen=True, + ) + name: Optional[str] = None + type: Optional[str] = None class IncludeItem(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None limit: Optional[int] = 5 class Projects(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[IncludeItem]] + model_config = ConfigDict( + extra='allow', + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[IncludeItem]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + labels: Optional[Sequence[str]] = None + match: Optional[Sequence[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] - build_config_metrics: Optional[bool] - build_configuration: Optional[str] - build_problem_health_check: Optional[bool] - cache_metric_wildcards: Optional[bool] - cache_shared_labels: Optional[bool] - collect_counters_with_distributions: Optional[bool] - collect_events: Optional[bool] - collect_histogram_buckets: Optional[bool] - connect_timeout: Optional[float] - default_build_configs_limit: Optional[int] - default_projects_limit: Optional[int] - 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]]]] - experimental_metrics: Optional[bool] - extra_headers: Optional[Mapping[str, Any]] - extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] - global_build_configs_exclude: Optional[Sequence[str]] - global_build_configs_include: Optional[Sequence[str]] - 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] - projects: Optional[Projects] - projects_refresh_interval: Optional[int] - 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] + model_config = ConfigDict( + validate_default=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 + build_config_metrics: Optional[bool] = None + build_configuration: Optional[str] = None + build_problem_health_check: Optional[bool] = None + cache_metric_wildcards: Optional[bool] = None + cache_shared_labels: Optional[bool] = None + collect_counters_with_distributions: Optional[bool] = None + collect_events: Optional[bool] = None + collect_histogram_buckets: Optional[bool] = None + connect_timeout: Optional[float] = None + default_build_configs_limit: Optional[int] = None + default_projects_limit: Optional[int] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + enable_health_service_check: Optional[bool] = None + exclude_labels: Optional[Sequence[str]] = None + exclude_metrics: Optional[Sequence[str]] = None + exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] = None + experimental_metrics: Optional[bool] = None + extra_headers: Optional[Mapping[str, Any]] = None + extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] = None + global_build_configs_exclude: Optional[Sequence[str]] = None + global_build_configs_include: Optional[Sequence[str]] = None + headers: Optional[Mapping[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[Sequence[str]] = None + include_labels: Optional[Sequence[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[Sequence[Union[str, Mapping[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 + projects: Optional[Projects] = None + projects_refresh_interval: Optional[int] = None + proxy: Optional[Proxy] = None + raw_line_filters: Optional[Sequence[str]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[Mapping[str, Any]] = None + request_size: Optional[float] = None server: str - 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] - tests_health_check: 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_openmetrics: Optional[bool] - use_process_start_time: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + service: Optional[str] = None + share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tags: Optional[Sequence[str]] = None + telemetry: Optional[bool] = None + tests_health_check: 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[Sequence[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_openmetrics: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/teamcity/datadog_checks/teamcity/config_models/shared.py b/teamcity/datadog_checks/teamcity/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/teamcity/datadog_checks/teamcity/config_models/shared.py +++ b/teamcity/datadog_checks/teamcity/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/temporal/datadog_checks/temporal/config_models/defaults.py b/temporal/datadog_checks/temporal/config_models/defaults.py index c7f245d1a5e04..ce57e52bb4d03 100644 --- a/temporal/datadog_checks/temporal/config_models/defaults.py +++ b/temporal/datadog_checks/temporal/config_models/defaults.py @@ -7,284 +7,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/temporal/datadog_checks/temporal/config_models/instance.py b/temporal/datadog_checks/temporal/config_models/instance.py index 5a32f2666573e..364568d359afa 100644 --- a/temporal/datadog_checks/temporal/config_models/instance.py +++ b/temporal/datadog_checks/temporal/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,146 +20,155 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + labels: Optional[Sequence[str]] = None + match: Optional[Sequence[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, + 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[Sequence[str]] = None + exclude_metrics: Optional[Sequence[str]] = None + exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] = None + extra_headers: Optional[Mapping[str, Any]] = None + extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] = None + headers: Optional[Mapping[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[Sequence[str]] = None + include_labels: Optional[Sequence[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[Sequence[Union[str, Mapping[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[Sequence[str]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[Mapping[str, Any]] = None + request_size: Optional[float] = None + service: Optional[str] = None + share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/temporal/datadog_checks/temporal/config_models/shared.py b/temporal/datadog_checks/temporal/config_models/shared.py index 5bf22be279a60..59c534d071001 100644 --- a/temporal/datadog_checks/temporal/config_models/shared.py +++ b/temporal/datadog_checks/temporal/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/teradata/datadog_checks/teradata/check.py b/teradata/datadog_checks/teradata/check.py index 937b65447d28c..b7597edfeaa1e 100644 --- a/teradata/datadog_checks/teradata/check.py +++ b/teradata/datadog_checks/teradata/check.py @@ -74,16 +74,16 @@ def initialize_config(self): self._connect_params = json.dumps( { 'host': self.config.server, - 'account': self.config.account, + 'account': self.config.account if self.config.account is not None else '', 'database': self.config.database, 'dbs_port': str(self.config.port), 'logmech': self.config.auth_mechanism, - 'logdata': self.config.auth_data, - 'user': self.config.username, - 'password': self.config.password, + 'logdata': self.config.auth_data if self.config.auth_data is not None else '', + 'user': self.config.username if self.config.username is not None else '', + 'password': self.config.password if self.config.password is not None else '', 'https_port': str(self.config.https_port), - 'sslmode': self.config.ssl_mode, - 'sslprotocol': self.config.ssl_protocol, + 'sslmode': self.config.ssl_mode if self.config.ssl_mode is not None else '', + 'sslprotocol': self.config.ssl_protocol if self.config.ssl_protocol is not None else '', } ) @@ -91,8 +91,9 @@ def initialize_config(self): 'teradata_server:{}'.format(self.instance.get('server')), 'teradata_port:{}'.format(self.instance.get('port', 1025)), ] - self._tags = list(self.config.tags) - self._tags.extend(global_tags) + if self.config.tags is not None: + global_tags.extend(self.config.tags) + self._tags = global_tags self._query_manager.tags = self._tags self._tables_filter = create_tables_filter(self.config.tables) diff --git a/teradata/datadog_checks/teradata/config_models/defaults.py b/teradata/datadog_checks/teradata/config_models/defaults.py index 6811df4dfe40a..711c32746aaca 100644 --- a/teradata/datadog_checks/teradata/config_models/defaults.py +++ b/teradata/datadog_checks/teradata/config_models/defaults.py @@ -7,96 +7,46 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_global_custom_queries(field, value): - return get_default_field_value(field, value) - - -def shared_service(field, value): - return get_default_field_value(field, value) - - -def instance_account(field, value): - return get_default_field_value(field, value) - - -def instance_auth_data(field, value): - return get_default_field_value(field, value) - - -def instance_auth_mechanism(field, value): - return get_default_field_value(field, value) - - -def instance_collect_res_usage_metrics(field, value): +def instance_collect_res_usage_metrics(): return False -def instance_collect_table_disk_metrics(field, value): +def instance_collect_table_disk_metrics(): return False -def instance_custom_queries(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_https_port(field, value): +def instance_https_port(): return 443 -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_only_custom_queries(field, value): +def instance_only_custom_queries(): return False -def instance_password(field, value): - return get_default_field_value(field, value) - - -def instance_port(field, value): +def instance_port(): return 1025 -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_ssl_mode(field, value): +def instance_ssl_mode(): return 'Prefer' -def instance_ssl_protocol(field, value): +def instance_ssl_protocol(): return 'TLSv1.2' -def instance_tables(field, value): - return get_default_field_value(field, value) - - -def instance_tags(field, value): - return get_default_field_value(field, value) - - -def instance_use_global_custom_queries(field, value): +def instance_use_global_custom_queries(): return 'true' - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/teradata/datadog_checks/teradata/config_models/instance.py b/teradata/datadog_checks/teradata/config_models/instance.py index ab3731f65e650..603c66a0857d0 100644 --- a/teradata/datadog_checks/teradata/config_models/instance.py +++ b/teradata/datadog_checks/teradata/config_models/instance.py @@ -9,9 +9,10 @@ from __future__ import annotations -from typing import Any, Literal, Mapping, Optional, Sequence, Union +from typing import Any, Mapping, Optional, Sequence, Union -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 @@ -20,76 +21,85 @@ class CustomQuery(BaseModel): - class Config: - allow_mutation = False - - columns: Optional[Sequence[Mapping[str, Any]]] - query: Optional[str] - tags: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + columns: Optional[Sequence[Mapping[str, Any]]] = None + query: Optional[str] = None + tags: Optional[Sequence[str]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Table(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - account: Optional[str] - auth_data: Optional[str] - auth_mechanism: Optional[Literal['TD2', 'TDNEGO', 'LDAP', 'KRB5', 'JWT']] - collect_res_usage_metrics: Optional[bool] - collect_table_disk_metrics: Optional[bool] - custom_queries: Optional[Sequence[CustomQuery]] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + account: Optional[str] = None + auth_data: Optional[str] = None + auth_mechanism: Optional[Literal['TD2', 'TDNEGO', 'LDAP', 'KRB5', 'JWT']] = None + collect_res_usage_metrics: Optional[bool] = None + collect_table_disk_metrics: Optional[bool] = None + custom_queries: Optional[Sequence[CustomQuery]] = None database: str - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - https_port: Optional[int] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - only_custom_queries: Optional[bool] - password: Optional[str] - port: Optional[int] + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + https_port: Optional[int] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + only_custom_queries: Optional[bool] = None + password: Optional[str] = None + port: Optional[int] = None server: str - service: Optional[str] - ssl_mode: Optional[Literal['Allow', 'Disable', 'Prefer', 'Require']] - ssl_protocol: Optional[str] - tables: Optional[Union[Sequence[str], Table]] - tags: Optional[Sequence[str]] - use_global_custom_queries: Optional[str] - username: Optional[str] - - @root_validator(pre=True) + service: Optional[str] = None + ssl_mode: Optional[Literal['Allow', 'Disable', 'Prefer', 'Require']] = None + ssl_protocol: Optional[str] = None + tables: Optional[Union[Sequence[str], Table]] = None + tags: Optional[Sequence[str]] = None + use_global_custom_queries: Optional[str] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/teradata/datadog_checks/teradata/config_models/shared.py b/teradata/datadog_checks/teradata/config_models/shared.py index accb5fb83c0e1..505547fd024b3 100644 --- a/teradata/datadog_checks/teradata/config_models/shared.py +++ b/teradata/datadog_checks/teradata/config_models/shared.py @@ -11,39 +11,39 @@ from typing import Any, Mapping, Optional, Sequence -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 - - global_custom_queries: Optional[Sequence[Mapping[str, Any]]] - service: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + global_custom_queries: Optional[Sequence[Mapping[str, Any]]] = None + 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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/teradata/datadog_checks/teradata/utils.py b/teradata/datadog_checks/teradata/utils.py index e14eb7cbe953e..c196af6738fb7 100644 --- a/teradata/datadog_checks/teradata/utils.py +++ b/teradata/datadog_checks/teradata/utils.py @@ -31,6 +31,9 @@ def create_tables_filter(tables): tables_to_collect = set() tables_to_exclude = set() + if tables is None: + return tables_to_collect, tables_to_exclude + if isinstance(tables, tuple): tables_to_collect = set(tables) return tables_to_collect, tables_to_exclude diff --git a/teradata/tests/test_config.py b/teradata/tests/test_config.py index 1bcc07e2c1ed4..f3c75a2ee48ef 100644 --- a/teradata/tests/test_config.py +++ b/teradata/tests/test_config.py @@ -24,7 +24,7 @@ {'server': 'localhost', 'username': 'dd_user', 'password': 'db_pass'}, re.compile( 'ConfigurationError: Detected 1 error while loading configuration model `InstanceConfig`:' - '\\n.*(database)\\n.*field required' + '\\n.*(database)\\n.*Field required' ), False, id='Invalid config: missing database', @@ -33,7 +33,7 @@ {'database': 'main_db', 'username': 'dd_user', 'password': 'db_pass'}, re.compile( 'ConfigurationError: Detected 1 error while loading configuration model `InstanceConfig`:\\n.*(server)' - '\\n.*field required' + '\\n.*Field required' ), False, id='Invalid config: missing server', @@ -71,8 +71,8 @@ pytest.param( {'server': 'tdserver', 'database': 'db', 'auth_mechanism': 'TD2'}, re.compile( - 'Detected 1 error while loading configuration model `InstanceConfig`:\n__root__\n' - ' `username` and `password` are required.' + 'Detected 1 error while loading configuration model `InstanceConfig`:\n\n' + ' Value error, `username` and `password` are required.' ), False, id='TD2 auth: missing username and password', @@ -138,7 +138,8 @@ 'password': 'pass123', 'auth_mechanism': 'wrong', }, - 'Detected 1 error while loading configuration model `InstanceConfig`:\nauth_mechanism\n unexpected value', + "Detected 1 error while loading configuration model `InstanceConfig`:\nauth_mechanism\n" + " Input should be 'TD2', 'TDNEGO', 'LDAP', 'KRB5' or 'JWT'", False, id='Auth Mechanism: invalid option', ), @@ -175,13 +176,15 @@ ), pytest.param( {'server': 'tdserver', 'database': 'db', 'ssl_mode': 'WRONG', 'username': 'bob', 'password': 'pass123'}, - 'Detected 1 error while loading configuration model `InstanceConfig`:\nssl_mode\n unexpected value', + "Detected 1 error while loading configuration model `InstanceConfig`:\nssl_mode\n" + " Input should be 'Allow', 'Disable', 'Prefer' or 'Require'", False, id='SSL auth: invalid mode', ), pytest.param( {'server': 'tdserver', 'database': 'db', 'ssl_mode': 'VERIFY-CA', 'username': 'bob', 'password': 'pass123'}, - 'Detected 1 error while loading configuration model `InstanceConfig`:\nssl_mode\n unexpected value', + "Detected 1 error while loading configuration model `InstanceConfig`:\nssl_mode\n" + " Input should be 'Allow', 'Disable', 'Prefer' or 'Require'", False, id='SSL auth: invalid unsupported mode', ), diff --git a/tls/datadog_checks/tls/config_models/defaults.py b/tls/datadog_checks/tls/config_models/defaults.py index b077aa2dd7402..3991e958d8e41 100644 --- a/tls/datadog_checks/tls/config_models/defaults.py +++ b/tls/datadog_checks/tls/config_models/defaults.py @@ -7,124 +7,58 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_allowed_versions(field, value): - return get_default_field_value(field, value) - - -def shared_fetch_intermediate_certs(field, value): +def shared_fetch_intermediate_certs(): return False -def shared_service(field, value): - return get_default_field_value(field, value) - - -def instance_allowed_versions(field, value): - return get_default_field_value(field, value) - - -def instance_days_critical(field, value): +def instance_days_critical(): return 7.0 -def instance_days_warning(field, value): +def instance_days_warning(): return 14.0 -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_fetch_intermediate_certs(field, value): +def instance_fetch_intermediate_certs(): return False -def instance_intermediate_cert_refresh_interval(field, value): +def instance_intermediate_cert_refresh_interval(): return 60 -def instance_local_cert_path(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_name(field, value): - return get_default_field_value(field, value) - - -def instance_port(field, value): +def instance_port(): return 443 -def instance_seconds_critical(field, value): - return get_default_field_value(field, value) - - -def instance_seconds_warning(field, value): - return get_default_field_value(field, value) - - -def instance_send_cert_duration(field, value): +def instance_send_cert_duration(): return False -def instance_server_hostname(field, value): - return get_default_field_value(field, value) - - -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_start_tls(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 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_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 -def instance_transport(field, value): +def instance_transport(): return 'TCP' diff --git a/tls/datadog_checks/tls/config_models/instance.py b/tls/datadog_checks/tls/config_models/instance.py index 9a37b81081aec..8020a455598d3 100644 --- a/tls/datadog_checks/tls/config_models/instance.py +++ b/tls/datadog_checks/tls/config_models/instance.py @@ -9,9 +9,10 @@ from __future__ import annotations -from typing import Literal, Optional, Sequence +from typing import Optional, Sequence -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 @@ -20,64 +21,73 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - allowed_versions: Optional[Sequence[str]] - days_critical: Optional[float] - days_warning: Optional[float] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - fetch_intermediate_certs: Optional[bool] - intermediate_cert_refresh_interval: Optional[float] - local_cert_path: Optional[str] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - name: Optional[str] - port: Optional[int] - seconds_critical: Optional[int] - seconds_warning: Optional[int] - send_cert_duration: Optional[bool] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + allowed_versions: Optional[Sequence[str]] = None + days_critical: Optional[float] = None + days_warning: Optional[float] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + fetch_intermediate_certs: Optional[bool] = None + intermediate_cert_refresh_interval: Optional[float] = None + local_cert_path: Optional[str] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + name: Optional[str] = None + port: Optional[int] = None + seconds_critical: Optional[int] = None + seconds_warning: Optional[int] = None + send_cert_duration: Optional[bool] = None server: str - server_hostname: Optional[str] - service: Optional[str] - start_tls: Optional[Literal['postgres', 'mysql']] - tags: Optional[Sequence[str]] - timeout: Optional[int] - 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] - transport: Optional[str] - - @root_validator(pre=True) + server_hostname: Optional[str] = None + service: Optional[str] = None + start_tls: Optional[Literal['postgres', 'mysql']] = None + tags: Optional[Sequence[str]] = None + timeout: Optional[int] = 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 + transport: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/tls/datadog_checks/tls/config_models/shared.py b/tls/datadog_checks/tls/config_models/shared.py index d6fdf53e963f5..b8e50175791f5 100644 --- a/tls/datadog_checks/tls/config_models/shared.py +++ b/tls/datadog_checks/tls/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,31 +20,40 @@ class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - allowed_versions: Optional[Sequence[str]] - fetch_intermediate_certs: Optional[bool] - service: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + allowed_versions: Optional[Sequence[str]] = None + fetch_intermediate_certs: Optional[bool] = None + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/tomcat/datadog_checks/tomcat/config_models/defaults.py b/tomcat/datadog_checks/tomcat/config_models/defaults.py index 91f55843f388b..07982a605ce4a 100644 --- a/tomcat/datadog_checks/tomcat/config_models/defaults.py +++ b/tomcat/datadog_checks/tomcat/config_models/defaults.py @@ -7,108 +7,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 True -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/tomcat/datadog_checks/tomcat/config_models/instance.py b/tomcat/datadog_checks/tomcat/config_models/instance.py index bc4c01723f132..631a321dda3bb 100644 --- a/tomcat/datadog_checks/tomcat/config_models/instance.py +++ b/tomcat/datadog_checks/tomcat/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,51 +20,60 @@ 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, + 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[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/tomcat/datadog_checks/tomcat/config_models/shared.py b/tomcat/datadog_checks/tomcat/config_models/shared.py index 1c722ceac49bc..0db55a6d064d5 100644 --- a/tomcat/datadog_checks/tomcat/config_models/shared.py +++ b/tomcat/datadog_checks/tomcat/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,34 +20,43 @@ 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, + frozen=True, + ) + collect_default_metrics: Optional[bool] = None + conf: Optional[Sequence[Mapping[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/torchserve/datadog_checks/torchserve/config_models/defaults.py b/torchserve/datadog_checks/torchserve/config_models/defaults.py index cfe1d5b3d0fd8..5bc2dba9eaf72 100644 --- a/torchserve/datadog_checks/torchserve/config_models/defaults.py +++ b/torchserve/datadog_checks/torchserve/config_models/defaults.py @@ -7,316 +7,146 @@ # 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(field, value): - return get_default_field_value(field, value) - - -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(field, value): - return get_default_field_value(field, value) - - -def instance_include_labels(field, value): - return get_default_field_value(field, value) - - -def instance_inference_api_url(field, value): +def instance_inference_api_url(): return 'http://localhost:8080' -def instance_interval(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_limit(field, value): +def instance_limit(): return 100 -def instance_log_requests(field, value): +def instance_log_requests(): return False -def instance_management_api_url(field, value): +def instance_management_api_url(): return 'http://localhost:8081' -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://localhost: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_submit_events(field, value): +def instance_submit_events(): return True -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/torchserve/datadog_checks/torchserve/config_models/instance.py b/torchserve/datadog_checks/torchserve/config_models/instance.py index ce16e068022c4..173a9700a8f92 100644 --- a/torchserve/datadog_checks/torchserve/config_models/instance.py +++ b/torchserve/datadog_checks/torchserve/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,153 +20,162 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + labels: Optional[Sequence[str]] = None + match: Optional[Sequence[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: Optional[Sequence[str]] - 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: Optional[Sequence[str]] - include_labels: Optional[Sequence[str]] - inference_api_url: Optional[str] - interval: Optional[int] - 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] - limit: Optional[int] - log_requests: Optional[bool] - management_api_url: Optional[str] - 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] - submit_events: 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, + 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: Optional[Sequence[str]] = None + exclude_labels: Optional[Sequence[str]] = None + exclude_metrics: Optional[Sequence[str]] = None + exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] = None + extra_headers: Optional[Mapping[str, Any]] = None + extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] = None + headers: Optional[Mapping[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[Sequence[str]] = None + include: Optional[Sequence[str]] = None + include_labels: Optional[Sequence[str]] = None + inference_api_url: Optional[str] = None + interval: Optional[int] = 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 + limit: Optional[int] = None + log_requests: Optional[bool] = None + management_api_url: Optional[str] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[Sequence[Union[str, Mapping[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[Sequence[str]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[Mapping[str, Any]] = None + request_size: Optional[float] = None + service: Optional[str] = None + share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + submit_events: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/torchserve/datadog_checks/torchserve/config_models/shared.py b/torchserve/datadog_checks/torchserve/config_models/shared.py index 5bf22be279a60..59c534d071001 100644 --- a/torchserve/datadog_checks/torchserve/config_models/shared.py +++ b/torchserve/datadog_checks/torchserve/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/traffic_server/datadog_checks/traffic_server/config_models/defaults.py b/traffic_server/datadog_checks/traffic_server/config_models/defaults.py index 38db62785bcb4..e5a464e03d0a9 100644 --- a/traffic_server/datadog_checks/traffic_server/config_models/defaults.py +++ b/traffic_server/datadog_checks/traffic_server/config_models/defaults.py @@ -7,168 +7,70 @@ # 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_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 False -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 False -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_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/traffic_server/datadog_checks/traffic_server/config_models/instance.py b/traffic_server/datadog_checks/traffic_server/config_models/instance.py index cef67981421a8..ba7171e7584f0 100644 --- a/traffic_server/datadog_checks/traffic_server/config_models/instance.py +++ b/traffic_server/datadog_checks/traffic_server/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,94 +20,103 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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] - read_timeout: Optional[float] - request_size: Optional[float] - 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] + model_config = ConfigDict( + validate_default=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[Mapping[str, Any]] = None + headers: Optional[Mapping[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 + read_timeout: Optional[float] = None + request_size: Optional[float] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None traffic_server_url: str - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] + use_legacy_auth_encoding: Optional[bool] = None + username: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/traffic_server/datadog_checks/traffic_server/config_models/shared.py b/traffic_server/datadog_checks/traffic_server/config_models/shared.py index de215afcbdd5e..d7f4dd28de478 100644 --- a/traffic_server/datadog_checks/traffic_server/config_models/shared.py +++ b/traffic_server/datadog_checks/traffic_server/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/twemproxy/datadog_checks/twemproxy/config_models/defaults.py b/twemproxy/datadog_checks/twemproxy/config_models/defaults.py index 728306cdf2c5a..a4a110493a7fe 100644 --- a/twemproxy/datadog_checks/twemproxy/config_models/defaults.py +++ b/twemproxy/datadog_checks/twemproxy/config_models/defaults.py @@ -7,32 +7,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/twemproxy/datadog_checks/twemproxy/config_models/instance.py b/twemproxy/datadog_checks/twemproxy/config_models/instance.py index b2b75f09f88c6..3dc6609fbfe2a 100644 --- a/twemproxy/datadog_checks/twemproxy/config_models/instance.py +++ b/twemproxy/datadog_checks/twemproxy/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,44 +20,53 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[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, + frozen=True, + ) + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None host: str - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None port: int - service: Optional[str] - tags: Optional[Sequence[str]] + service: Optional[str] = None + tags: Optional[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/twemproxy/datadog_checks/twemproxy/config_models/shared.py b/twemproxy/datadog_checks/twemproxy/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/twemproxy/datadog_checks/twemproxy/config_models/shared.py +++ b/twemproxy/datadog_checks/twemproxy/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/twistlock/datadog_checks/twistlock/config_models/defaults.py b/twistlock/datadog_checks/twistlock/config_models/defaults.py index 909e06a2f84df..81b466607723e 100644 --- a/twistlock/datadog_checks/twistlock/config_models/defaults.py +++ b/twistlock/datadog_checks/twistlock/config_models/defaults.py @@ -7,184 +7,78 @@ # 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 False -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 False -def instance_project(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 16 -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_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/twistlock/datadog_checks/twistlock/config_models/instance.py b/twistlock/datadog_checks/twistlock/config_models/instance.py index 5079c9c945b7d..7694701addcd6 100644 --- a/twistlock/datadog_checks/twistlock/config_models/instance.py +++ b/twistlock/datadog_checks/twistlock/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,95 +20,104 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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] - project: Optional[str] - proxy: Optional[Proxy] - read_timeout: Optional[float] - request_size: Optional[float] - 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] + model_config = ConfigDict( + validate_default=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[Mapping[str, Any]] = None + headers: Optional[Mapping[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 + project: Optional[str] = None + proxy: Optional[Proxy] = None + read_timeout: Optional[float] = None + request_size: Optional[float] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None url: str - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] + use_legacy_auth_encoding: Optional[bool] = None + username: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/twistlock/datadog_checks/twistlock/config_models/shared.py b/twistlock/datadog_checks/twistlock/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/twistlock/datadog_checks/twistlock/config_models/shared.py +++ b/twistlock/datadog_checks/twistlock/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/varnish/datadog_checks/varnish/config_models/defaults.py b/varnish/datadog_checks/varnish/config_models/defaults.py index 5131b6a777f81..03ee3d1c7ccdc 100644 --- a/varnish/datadog_checks/varnish/config_models/defaults.py +++ b/varnish/datadog_checks/varnish/config_models/defaults.py @@ -7,56 +7,26 @@ # 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_daemon_host(field, value): +def instance_daemon_host(): return 'localhost' -def instance_daemon_port(field, value): +def instance_daemon_port(): return 6082 -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_metrics_filter(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_secretfile(field, value): +def instance_secretfile(): return '/etc/varnish/secret' - - -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_varnishadm(field, value): - return get_default_field_value(field, value) diff --git a/varnish/datadog_checks/varnish/config_models/instance.py b/varnish/datadog_checks/varnish/config_models/instance.py index d2cffd7478219..b5c4b5be06528 100644 --- a/varnish/datadog_checks/varnish/config_models/instance.py +++ b/varnish/datadog_checks/varnish/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,49 +20,58 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - daemon_host: Optional[str] - daemon_port: Optional[int] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - metric_patterns: Optional[MetricPatterns] - metrics_filter: Optional[Sequence[str]] - min_collection_interval: Optional[float] - name: Optional[str] - secretfile: Optional[str] - service: Optional[str] - tags: Optional[Sequence[str]] - varnishadm: Optional[str] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + daemon_host: Optional[str] = None + daemon_port: Optional[int] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + metrics_filter: Optional[Sequence[str]] = None + min_collection_interval: Optional[float] = None + name: Optional[str] = None + secretfile: Optional[str] = None + service: Optional[str] = None + tags: Optional[Sequence[str]] = None + varnishadm: Optional[str] = None varnishstat: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/varnish/datadog_checks/varnish/config_models/shared.py b/varnish/datadog_checks/varnish/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/varnish/datadog_checks/varnish/config_models/shared.py +++ b/varnish/datadog_checks/varnish/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/vault/datadog_checks/vault/config_models/defaults.py b/vault/datadog_checks/vault/config_models/defaults.py index 10894285ff664..af7679cdf032b 100644 --- a/vault/datadog_checks/vault/config_models/defaults.py +++ b/vault/datadog_checks/vault/config_models/defaults.py @@ -7,312 +7,142 @@ # 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_client_token(field, value): - return get_default_field_value(field, value) - - -def instance_client_token_path(field, value): - return get_default_field_value(field, value) - - -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_collect_secondary_dr(field, value): +def instance_collect_secondary_dr(): return False -def instance_connect_timeout(field, value): - return get_default_field_value(field, value) - - -def instance_detect_leader(field, value): +def instance_detect_leader(): return False -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_no_token(field, value): +def instance_no_token(): return False -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_openmetrics(field, value): +def instance_use_openmetrics(): return False -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/vault/datadog_checks/vault/config_models/instance.py b/vault/datadog_checks/vault/config_models/instance.py index 71785e7a76c56..723f4c3a0c09e 100644 --- a/vault/datadog_checks/vault/config_models/instance.py +++ b/vault/datadog_checks/vault/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,153 +20,162 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + labels: Optional[Sequence[str]] = None + match: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - allow_redirects: Optional[bool] - api_url: str = Field(..., regex='\\w+') - 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] - client_token: Optional[str] - client_token_path: Optional[str] - collect_counters_with_distributions: Optional[bool] - collect_histogram_buckets: Optional[bool] - collect_secondary_dr: Optional[bool] - connect_timeout: Optional[float] - detect_leader: Optional[bool] - 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*') - no_token: Optional[bool] - 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_openmetrics: Optional[bool] - use_process_start_time: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + allow_redirects: Optional[bool] = None + api_url: str = Field(..., pattern='\\w+') + 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 + client_token: Optional[str] = None + client_token_path: Optional[str] = None + collect_counters_with_distributions: Optional[bool] = None + collect_histogram_buckets: Optional[bool] = None + collect_secondary_dr: Optional[bool] = None + connect_timeout: Optional[float] = None + detect_leader: Optional[bool] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + enable_health_service_check: Optional[bool] = None + exclude_labels: Optional[Sequence[str]] = None + exclude_metrics: Optional[Sequence[str]] = None + exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] = None + extra_headers: Optional[Mapping[str, Any]] = None + extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] = None + headers: Optional[Mapping[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[Sequence[str]] = None + include_labels: Optional[Sequence[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[Sequence[Union[str, Mapping[str, Union[str, Metric]]]]] = None + min_collection_interval: Optional[float] = None + namespace: Optional[str] = Field(None, pattern='\\w*') + no_token: Optional[bool] = None + 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[Sequence[str]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[Mapping[str, Any]] = None + request_size: Optional[float] = None + service: Optional[str] = None + share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[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_openmetrics: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/vault/datadog_checks/vault/config_models/shared.py b/vault/datadog_checks/vault/config_models/shared.py index 657ead5480cf7..fa44821e002af 100644 --- a/vault/datadog_checks/vault/config_models/shared.py +++ b/vault/datadog_checks/vault/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/vertica/datadog_checks/vertica/config_models/defaults.py b/vertica/datadog_checks/vertica/config_models/defaults.py index 9ba84f25ced25..310c75902144e 100644 --- a/vertica/datadog_checks/vertica/config_models/defaults.py +++ b/vertica/datadog_checks/vertica/config_models/defaults.py @@ -7,116 +7,50 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_global_custom_queries(field, value): - return get_default_field_value(field, value) - - -def shared_service(field, value): - return get_default_field_value(field, value) - - -def instance_backup_servers(field, value): - return get_default_field_value(field, value) - - -def instance_client_lib_log_level(field, value): - return get_default_field_value(field, value) - - -def instance_connection_load_balance(field, value): +def instance_connection_load_balance(): return False -def instance_custom_queries(field, value): - return get_default_field_value(field, value) - - -def instance_db(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_groups(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_only_custom_queries(field, value): +def instance_only_custom_queries(): return False -def instance_password(field, value): - return get_default_field_value(field, value) - - -def instance_port(field, value): +def instance_port(): return 5433 -def instance_server(field, value): +def instance_server(): return 'localhost' -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 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_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 -def instance_use_global_custom_queries(field, value): +def instance_use_global_custom_queries(): return 'true' -def instance_use_tls(field, value): +def instance_use_tls(): return False - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/vertica/datadog_checks/vertica/config_models/instance.py b/vertica/datadog_checks/vertica/config_models/instance.py index 0309a48ee78e3..5ff3252ebf90e 100644 --- a/vertica/datadog_checks/vertica/config_models/instance.py +++ b/vertica/datadog_checks/vertica/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,71 +20,80 @@ class CustomQuery(BaseModel): - class Config: - allow_mutation = False - - columns: Optional[Sequence[Mapping[str, Any]]] - query: Optional[str] - tags: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + columns: Optional[Sequence[Mapping[str, Any]]] = None + query: Optional[str] = None + tags: Optional[Sequence[str]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - backup_servers: Optional[Sequence[Mapping[str, Any]]] - client_lib_log_level: Optional[str] - connection_load_balance: Optional[bool] - custom_queries: Optional[Sequence[CustomQuery]] - db: Optional[str] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - metric_groups: Optional[Sequence[str]] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - only_custom_queries: Optional[bool] - password: Optional[str] - port: Optional[int] - server: Optional[str] - service: Optional[str] - tags: Optional[Sequence[str]] - timeout: Optional[int] - 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] - use_global_custom_queries: Optional[str] - use_tls: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + backup_servers: Optional[Sequence[Mapping[str, Any]]] = None + client_lib_log_level: Optional[str] = None + connection_load_balance: Optional[bool] = None + custom_queries: Optional[Sequence[CustomQuery]] = None + db: Optional[str] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + metric_groups: Optional[Sequence[str]] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + only_custom_queries: Optional[bool] = None + password: Optional[str] = None + port: Optional[int] = None + server: Optional[str] = None + service: Optional[str] = None + tags: Optional[Sequence[str]] = None + timeout: Optional[int] = 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 + use_global_custom_queries: Optional[str] = None + use_tls: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/vertica/datadog_checks/vertica/config_models/shared.py b/vertica/datadog_checks/vertica/config_models/shared.py index 5e538415ce396..45d1293f12b20 100644 --- a/vertica/datadog_checks/vertica/config_models/shared.py +++ b/vertica/datadog_checks/vertica/config_models/shared.py @@ -11,39 +11,39 @@ from typing import Any, Mapping, Optional, Sequence -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 - - global_custom_queries: Optional[Sequence[Mapping[str, Any]]] - service: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + global_custom_queries: Optional[Sequence[Mapping[str, Any]]] = None + 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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/voltdb/datadog_checks/voltdb/config_models/defaults.py b/voltdb/datadog_checks/voltdb/config_models/defaults.py index 6b8320a20329a..d698cb1b7d155 100644 --- a/voltdb/datadog_checks/voltdb/config_models/defaults.py +++ b/voltdb/datadog_checks/voltdb/config_models/defaults.py @@ -7,196 +7,90 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_global_custom_queries(field, value): - return get_default_field_value(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_custom_queries(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_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_only_custom_queries(field, value): +def instance_only_custom_queries(): return False -def instance_password_hashed(field, value): +def instance_password_hashed(): return False -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_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_skip_proxy(field, value): +def instance_skip_proxy(): return False -def instance_statistics_components(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 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_global_custom_queries(field, value): +def instance_use_global_custom_queries(): return 'true' -def instance_use_legacy_auth_encoding(field, value): +def instance_use_legacy_auth_encoding(): return True diff --git a/voltdb/datadog_checks/voltdb/config_models/instance.py b/voltdb/datadog_checks/voltdb/config_models/instance.py index 72c5906b19f4b..c8f00330406fb 100644 --- a/voltdb/datadog_checks/voltdb/config_models/instance.py +++ b/voltdb/datadog_checks/voltdb/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,108 +20,117 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class CustomQuery(BaseModel): - class Config: - allow_mutation = False - - columns: Optional[Sequence[Mapping[str, Any]]] - query: Optional[str] - tags: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + columns: Optional[Sequence[Mapping[str, Any]]] = None + query: Optional[str] = None + tags: Optional[Sequence[str]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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] - custom_queries: Optional[Sequence[CustomQuery]] - 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] - only_custom_queries: Optional[bool] + model_config = ConfigDict( + validate_default=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 + custom_queries: Optional[Sequence[CustomQuery]] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + extra_headers: Optional[Mapping[str, Any]] = None + headers: Optional[Mapping[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 + only_custom_queries: Optional[bool] = None password: str - password_hashed: Optional[bool] - persist_connections: Optional[bool] - proxy: Optional[Proxy] - read_timeout: Optional[float] - request_size: Optional[float] - service: Optional[str] - skip_proxy: Optional[bool] - statistics_components: Optional[Sequence[str]] - 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] + password_hashed: Optional[bool] = None + persist_connections: Optional[bool] = None + proxy: Optional[Proxy] = None + read_timeout: Optional[float] = None + request_size: Optional[float] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + statistics_components: Optional[Sequence[str]] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None url: str - use_global_custom_queries: Optional[str] - use_legacy_auth_encoding: Optional[bool] + use_global_custom_queries: Optional[str] = None + use_legacy_auth_encoding: Optional[bool] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/voltdb/datadog_checks/voltdb/config_models/shared.py b/voltdb/datadog_checks/voltdb/config_models/shared.py index e47d5a2715b24..175a57ff6454f 100644 --- a/voltdb/datadog_checks/voltdb/config_models/shared.py +++ b/voltdb/datadog_checks/voltdb/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,42 +20,51 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - global_custom_queries: Optional[Sequence[Mapping[str, Any]]] - proxy: Optional[Proxy] - service: Optional[str] - skip_proxy: Optional[bool] - timeout: Optional[float] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + global_custom_queries: Optional[Sequence[Mapping[str, Any]]] = None + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/vsphere/datadog_checks/vsphere/config_models/defaults.py b/vsphere/datadog_checks/vsphere/config_models/defaults.py index d104c4859215b..56124b1f62db3 100644 --- a/vsphere/datadog_checks/vsphere/config_models/defaults.py +++ b/vsphere/datadog_checks/vsphere/config_models/defaults.py @@ -7,144 +7,94 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_rest_api_options(field, value): - return get_default_field_value(field, value) - - -def shared_service(field, value): - return get_default_field_value(field, value) - - -def instance_attributes_prefix(field, value): +def instance_attributes_prefix(): return '' -def instance_batch_property_collector_size(field, value): +def instance_batch_property_collector_size(): return 500 -def instance_batch_tags_collector_size(field, value): +def instance_batch_tags_collector_size(): return 200 -def instance_collect_attributes(field, value): +def instance_collect_attributes(): return False -def instance_collect_events(field, value): - return get_default_field_value(field, value) - - -def instance_collect_events_only(field, value): +def instance_collect_events_only(): return False -def instance_collect_per_instance_filters(field, value): - return get_default_field_value(field, value) - - -def instance_collect_tags(field, value): +def instance_collect_tags(): return False -def instance_collection_level(field, value): +def instance_collection_level(): return 1 -def instance_collection_type(field, value): +def instance_collection_type(): return 'realtime' -def instance_connection_reset_timeout(field, value): +def instance_connection_reset_timeout(): return 900 -def instance_disable_generic_tags(field, value): +def instance_disable_generic_tags(): return False -def instance_excluded_host_tags(field, value): +def instance_excluded_host_tags(): return [] -def instance_include_datastore_cluster_folder_tag(field, value): +def instance_include_datastore_cluster_folder_tag(): return True -def instance_max_historical_metrics(field, value): +def instance_max_historical_metrics(): return 256 -def instance_metric_filters(field, value): - return get_default_field_value(field, value) - - -def instance_metric_patterns(field, value): - return get_default_field_value(field, value) - - -def instance_metrics_per_query(field, value): +def instance_metrics_per_query(): return 500 -def instance_min_collection_interval(field, value): +def instance_min_collection_interval(): return 15 -def instance_refresh_infrastructure_cache_interval(field, value): +def instance_refresh_infrastructure_cache_interval(): return 300 -def instance_refresh_metrics_metadata_cache_interval(field, value): +def instance_refresh_metrics_metadata_cache_interval(): return 1800 -def instance_resource_filters(field, value): - return get_default_field_value(field, value) - - -def instance_rest_api_options(field, value): - return get_default_field_value(field, value) - - -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_ssl_capath(field, value): - return get_default_field_value(field, value) - - -def instance_ssl_verify(field, value): +def instance_ssl_verify(): return True -def instance_tags(field, value): - return get_default_field_value(field, value) - - -def instance_tags_prefix(field, value): +def instance_tags_prefix(): return '' -def instance_threads_count(field, value): +def instance_threads_count(): return 4 -def instance_tls_ignore_warning(field, value): +def instance_tls_ignore_warning(): return False -def instance_use_collect_events_fallback(field, value): +def instance_use_collect_events_fallback(): return False -def instance_use_guest_hostname(field, value): +def instance_use_guest_hostname(): return False - - -def instance_vm_hostname_suffix_tag(field, value): - return get_default_field_value(field, value) diff --git a/vsphere/datadog_checks/vsphere/config_models/instance.py b/vsphere/datadog_checks/vsphere/config_models/instance.py index b992d2f548dfa..0dd11a1255934 100644 --- a/vsphere/datadog_checks/vsphere/config_models/instance.py +++ b/vsphere/datadog_checks/vsphere/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,162 +20,171 @@ class CollectPerInstanceFilters(BaseModel): - class Config: - allow_mutation = False - - cluster: Optional[Sequence[str]] - datastore: Optional[Sequence[str]] - host: Optional[Sequence[str]] - vm: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + cluster: Optional[Sequence[str]] = None + datastore: Optional[Sequence[str]] = None + host: Optional[Sequence[str]] = None + vm: Optional[Sequence[str]] = None class MetricFilters(BaseModel): - class Config: - allow_mutation = False - - cluster: Optional[Sequence[str]] - datacenter: Optional[Sequence[str]] - datastore: Optional[Sequence[str]] - host: Optional[Sequence[str]] - vm: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + cluster: Optional[Sequence[str]] = None + datacenter: Optional[Sequence[str]] = None + datastore: Optional[Sequence[str]] = None + host: Optional[Sequence[str]] = None + vm: Optional[Sequence[str]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class ResourceFilter(BaseModel): - class Config: - allow_mutation = False - - patterns: Optional[Sequence[str]] - property: Optional[str] - resource: Optional[str] - type: Optional[str] + model_config = ConfigDict( + frozen=True, + ) + patterns: Optional[Sequence[str]] = None + property: Optional[str] = None + resource: Optional[str] = None + type: Optional[str] = None class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class RestApiOptions(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] - 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] - ntlm_domain: Optional[str] - password: Optional[str] - persist_connections: Optional[bool] - proxy: Optional[Proxy] - read_timeout: Optional[float] - request_size: Optional[float] - skip_proxy: 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_legacy_auth_encoding: Optional[bool] - username: Optional[str] + model_config = ConfigDict( + 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 + extra_headers: Optional[Mapping[str, Any]] = None + headers: Optional[Mapping[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 + ntlm_domain: Optional[str] = None + password: Optional[str] = None + persist_connections: Optional[bool] = None + proxy: Optional[Proxy] = None + read_timeout: Optional[float] = None + request_size: Optional[float] = None + skip_proxy: 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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + use_legacy_auth_encoding: Optional[bool] = None + username: Optional[str] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - attributes_prefix: Optional[str] - batch_property_collector_size: Optional[int] - batch_tags_collector_size: Optional[int] - collect_attributes: Optional[bool] - collect_events: Optional[bool] - collect_events_only: Optional[bool] - collect_per_instance_filters: Optional[CollectPerInstanceFilters] - collect_tags: Optional[bool] - collection_level: Optional[int] - collection_type: Optional[str] - connection_reset_timeout: Optional[int] - disable_generic_tags: Optional[bool] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + attributes_prefix: Optional[str] = None + batch_property_collector_size: Optional[int] = None + batch_tags_collector_size: Optional[int] = None + collect_attributes: Optional[bool] = None + collect_events: Optional[bool] = None + collect_events_only: Optional[bool] = None + collect_per_instance_filters: Optional[CollectPerInstanceFilters] = None + collect_tags: Optional[bool] = None + collection_level: Optional[int] = None + collection_type: Optional[str] = None + connection_reset_timeout: Optional[int] = None + disable_generic_tags: Optional[bool] = None empty_default_hostname: bool - excluded_host_tags: Optional[Sequence[str]] + excluded_host_tags: Optional[Sequence[str]] = None host: str - include_datastore_cluster_folder_tag: Optional[bool] - max_historical_metrics: Optional[int] - metric_filters: Optional[MetricFilters] - metric_patterns: Optional[MetricPatterns] - metrics_per_query: Optional[int] - min_collection_interval: Optional[float] + include_datastore_cluster_folder_tag: Optional[bool] = None + max_historical_metrics: Optional[int] = None + metric_filters: Optional[MetricFilters] = None + metric_patterns: Optional[MetricPatterns] = None + metrics_per_query: Optional[int] = None + min_collection_interval: Optional[float] = None password: str - refresh_infrastructure_cache_interval: Optional[int] - refresh_metrics_metadata_cache_interval: Optional[int] - resource_filters: Optional[Sequence[ResourceFilter]] - rest_api_options: Optional[RestApiOptions] - service: Optional[str] - ssl_capath: Optional[str] - ssl_verify: Optional[bool] - tags: Optional[Sequence[str]] - tags_prefix: Optional[str] - threads_count: Optional[int] - tls_ignore_warning: Optional[bool] - use_collect_events_fallback: Optional[bool] - use_guest_hostname: Optional[bool] + refresh_infrastructure_cache_interval: Optional[int] = None + refresh_metrics_metadata_cache_interval: Optional[int] = None + resource_filters: Optional[Sequence[ResourceFilter]] = None + rest_api_options: Optional[RestApiOptions] = None + service: Optional[str] = None + ssl_capath: Optional[str] = None + ssl_verify: Optional[bool] = None + tags: Optional[Sequence[str]] = None + tags_prefix: Optional[str] = None + threads_count: Optional[int] = None + tls_ignore_warning: Optional[bool] = None + use_collect_events_fallback: Optional[bool] = None + use_guest_hostname: Optional[bool] = None use_legacy_check_version: bool username: str - vm_hostname_suffix_tag: Optional[str] + vm_hostname_suffix_tag: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/vsphere/datadog_checks/vsphere/config_models/shared.py b/vsphere/datadog_checks/vsphere/config_models/shared.py index 16287f29d2125..f87d2a23237cd 100644 --- a/vsphere/datadog_checks/vsphere/config_models/shared.py +++ b/vsphere/datadog_checks/vsphere/config_models/shared.py @@ -11,57 +11,57 @@ from typing import Optional, Sequence -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 Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class RestApiOptions(BaseModel): - class Config: - allow_mutation = False - - proxy: Optional[Proxy] - skip_proxy: Optional[bool] - timeout: Optional[float] + model_config = ConfigDict( + frozen=True, + ) + proxy: Optional[Proxy] = None + skip_proxy: Optional[bool] = None + timeout: Optional[float] = None class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - rest_api_options: Optional[RestApiOptions] - service: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + rest_api_options: Optional[RestApiOptions] = None + 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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/weaviate/datadog_checks/weaviate/config_models/defaults.py b/weaviate/datadog_checks/weaviate/config_models/defaults.py index 19813c2cce760..ce57e52bb4d03 100644 --- a/weaviate/datadog_checks/weaviate/config_models/defaults.py +++ b/weaviate/datadog_checks/weaviate/config_models/defaults.py @@ -7,288 +7,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) - - -def instance_weaviate_api_endpoint(field, value): - return get_default_field_value(field, value) diff --git a/weaviate/datadog_checks/weaviate/config_models/instance.py b/weaviate/datadog_checks/weaviate/config_models/instance.py index d87fc81a3a885..ea66679c7482e 100644 --- a/weaviate/datadog_checks/weaviate/config_models/instance.py +++ b/weaviate/datadog_checks/weaviate/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,147 +20,156 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + 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( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + labels: Optional[Sequence[str]] = None + match: Optional[Sequence[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, + 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[Sequence[str]] = None + exclude_metrics: Optional[Sequence[str]] = None + exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] = None + extra_headers: Optional[Mapping[str, Any]] = None + extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] = None + headers: Optional[Mapping[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[Sequence[str]] = None + include_labels: Optional[Sequence[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[Sequence[Union[str, Mapping[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] - weaviate_api_endpoint: Optional[str] - - @root_validator(pre=True) + password: Optional[str] = None + persist_connections: Optional[bool] = None + proxy: Optional[Proxy] = None + raw_line_filters: Optional[Sequence[str]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[Mapping[str, Any]] = None + request_size: Optional[float] = None + service: Optional[str] = None + share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[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 + weaviate_api_endpoint: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/weaviate/datadog_checks/weaviate/config_models/shared.py b/weaviate/datadog_checks/weaviate/config_models/shared.py index 5bf22be279a60..59c534d071001 100644 --- a/weaviate/datadog_checks/weaviate/config_models/shared.py +++ b/weaviate/datadog_checks/weaviate/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,41 +20,50 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[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, + 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/weaviate/tests/test_unit.py b/weaviate/tests/test_unit.py index 86a5eb9d7cdb1..df51855efabb8 100644 --- a/weaviate/tests/test_unit.py +++ b/weaviate/tests/test_unit.py @@ -54,7 +54,7 @@ def test_check_failed_liveness(aggregator, mock_http_response): def test_empty_instance(dd_run_check): with pytest.raises( Exception, - match='InstanceConfig`:\nopenmetrics_endpoint\n field required', + match='InstanceConfig`:\nopenmetrics_endpoint\n Field required', ): check = WeaviateCheck('weaviate', {}, [{}]) dd_run_check(check) diff --git a/weblogic/datadog_checks/weblogic/config_models/defaults.py b/weblogic/datadog_checks/weblogic/config_models/defaults.py index b9702a06b9ed7..42c096be40fdd 100644 --- a/weblogic/datadog_checks/weblogic/config_models/defaults.py +++ b/weblogic/datadog_checks/weblogic/config_models/defaults.py @@ -7,108 +7,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/weblogic/datadog_checks/weblogic/config_models/instance.py b/weblogic/datadog_checks/weblogic/config_models/instance.py index bc4c01723f132..631a321dda3bb 100644 --- a/weblogic/datadog_checks/weblogic/config_models/instance.py +++ b/weblogic/datadog_checks/weblogic/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,51 +20,60 @@ 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, + 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[Sequence[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/weblogic/datadog_checks/weblogic/config_models/shared.py b/weblogic/datadog_checks/weblogic/config_models/shared.py index 1c722ceac49bc..0db55a6d064d5 100644 --- a/weblogic/datadog_checks/weblogic/config_models/shared.py +++ b/weblogic/datadog_checks/weblogic/config_models/shared.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -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 @@ -20,34 +20,43 @@ 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, + frozen=True, + ) + collect_default_metrics: Optional[bool] = None + conf: Optional[Sequence[Mapping[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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/win32_event_log/assets/configuration/spec.yaml b/win32_event_log/assets/configuration/spec.yaml index 14e2d957c29ba..180495950af89 100644 --- a/win32_event_log/assets/configuration/spec.yaml +++ b/win32_event_log/assets/configuration/spec.yaml @@ -110,7 +110,7 @@ files: /\ WARNING /\ Due to a limitation in the Windows events API, the maximum filtering on event IDs is 20 IDs per instance. Because of this, you may need to split the ID filtering into multiple instances. - + For advanced and more granular filtering, define a `query`. If `filters` nor `query` is specified, then all events from the subscribed `path` will be collected. @@ -279,13 +279,12 @@ files: This is useful for preventing duplicate events being sent as a consequence of Agent restarts. value: type: integer - display_default: - name: legacy_mode description: | Whether or not to use a mode of operation that is now unmaintained and will be removed in a future version. - /\ WARNING /\ - This mode, by nature of the underlying technology, is significantly more resource intensive. + /\ WARNING /\ + This mode, by nature of the underlying technology, is significantly more resource intensive. Setting this option to `false` is only supported on Agent versions 7 and above. enabled: true diff --git a/win32_event_log/datadog_checks/win32_event_log/check.py b/win32_event_log/datadog_checks/win32_event_log/check.py index 80ad7995eaf68..a7c00dff1903d 100644 --- a/win32_event_log/datadog_checks/win32_event_log/check.py +++ b/win32_event_log/datadog_checks/win32_event_log/check.py @@ -139,7 +139,7 @@ def check(self, _): event_payload = { 'source_type_name': self.SOURCE_TYPE_NAME, 'priority': self._event_priority, - 'tags': list(self.config.tags), + 'tags': list(self.config.tags) if self.config.tags is not None else [], } # As seen in every collector, before using members of the enum you need to check for existence. See: diff --git a/win32_event_log/datadog_checks/win32_event_log/config_models/defaults.py b/win32_event_log/datadog_checks/win32_event_log/config_models/defaults.py index af983f43d1d73..cffa4f204d77b 100644 --- a/win32_event_log/datadog_checks/win32_event_log/config_models/defaults.py +++ b/win32_event_log/datadog_checks/win32_event_log/config_models/defaults.py @@ -7,156 +7,86 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_default_event_priority(field, value): +def shared_default_event_priority(): return 'normal' -def shared_event_priority(field, value): +def shared_event_priority(): return 'normal' -def shared_interpret_messages(field, value): +def shared_interpret_messages(): return True -def shared_service(field, value): - return get_default_field_value(field, value) - - -def shared_tag_event_id(field, value): +def shared_tag_event_id(): return False -def shared_tag_sid(field, value): +def shared_tag_sid(): return False -def instance_auth_type(field, value): +def instance_auth_type(): return 'default' -def instance_bookmark_frequency(field, value): - return '' - - -def instance_disable_generic_tags(field, value): +def instance_disable_generic_tags(): return False -def instance_domain(field, value): - return get_default_field_value(field, value) - - -def instance_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return False -def instance_event_format(field, value): +def instance_event_format(): return ['Message'] -def instance_event_id(field, value): - return get_default_field_value(field, value) - - -def instance_event_priority(field, value): +def instance_event_priority(): return 'normal' -def instance_excluded_messages(field, value): - return get_default_field_value(field, value) - - -def instance_filters(field, value): - return get_default_field_value(field, value) - - -def instance_host(field, value): +def instance_host(): return 'localhost' -def instance_included_messages(field, value): - return get_default_field_value(field, value) - - -def instance_interpret_messages(field, value): +def instance_interpret_messages(): return True -def instance_legacy_mode(field, value): +def instance_legacy_mode(): return True -def instance_log_file(field, value): - return get_default_field_value(field, value) - - -def instance_message_filters(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_password(field, value): - return get_default_field_value(field, value) - - -def instance_path(field, value): - return get_default_field_value(field, value) - - -def instance_payload_size(field, value): +def instance_payload_size(): return 10 -def instance_query(field, value): - return get_default_field_value(field, value) - - -def instance_server(field, value): +def instance_server(): return 'localhost' -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_source_name(field, value): - return get_default_field_value(field, value) - - -def instance_start(field, value): +def instance_start(): return 'now' -def instance_tag_event_id(field, value): +def instance_tag_event_id(): return False -def instance_tag_sid(field, value): +def instance_tag_sid(): return False -def instance_tags(field, value): - return get_default_field_value(field, value) - - -def instance_timeout(field, value): +def instance_timeout(): return 5 -def instance_type(field, value): +def instance_type(): return ['information'] - - -def instance_user(field, value): - return get_default_field_value(field, value) diff --git a/win32_event_log/datadog_checks/win32_event_log/config_models/instance.py b/win32_event_log/datadog_checks/win32_event_log/config_models/instance.py index 34710c1f8a6c2..1c13248580c2f 100644 --- a/win32_event_log/datadog_checks/win32_event_log/config_models/instance.py +++ b/win32_event_log/datadog_checks/win32_event_log/config_models/instance.py @@ -9,9 +9,10 @@ from __future__ import annotations -from typing import Literal, Optional, Sequence +from typing import Optional, Sequence -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 @@ -20,77 +21,88 @@ class Filters(BaseModel): - class Config: - allow_mutation = False - - id: Optional[Sequence[int]] - source: Optional[Sequence[str]] - type: Optional[Sequence[Literal['success', 'error', 'warning', 'information', 'success audit', 'failure audit']]] + model_config = ConfigDict( + frozen=True, + ) + id: Optional[Sequence[int]] = None + source: Optional[Sequence[str]] = None + type: Optional[ + Sequence[Literal['success', 'error', 'warning', 'information', 'success audit', 'failure audit']] + ] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - auth_type: Optional[Literal['default', 'negotiate', 'kerberos', 'ntlm']] - bookmark_frequency: Optional[int] - disable_generic_tags: Optional[bool] - domain: Optional[str] - empty_default_hostname: Optional[bool] - event_format: Optional[Sequence[str]] - event_id: Optional[Sequence[str]] - event_priority: Optional[Literal['normal', 'low']] - excluded_messages: Optional[Sequence[str]] - filters: Optional[Filters] - host: Optional[str] - included_messages: Optional[Sequence[str]] - interpret_messages: Optional[bool] - legacy_mode: Optional[bool] - log_file: Optional[Sequence[str]] - message_filters: Optional[Sequence[str]] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - password: Optional[str] - path: Optional[str] - payload_size: Optional[int] - query: Optional[str] - server: Optional[str] - service: Optional[str] - source_name: Optional[Sequence[str]] - start: Optional[Literal['now', 'oldest']] - tag_event_id: Optional[bool] - tag_sid: Optional[bool] - tags: Optional[Sequence[str]] - timeout: Optional[float] - type: Optional[Sequence[str]] - user: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + auth_type: Optional[Literal['default', 'negotiate', 'kerberos', 'ntlm']] = None + bookmark_frequency: Optional[int] = None + disable_generic_tags: Optional[bool] = None + domain: Optional[str] = None + empty_default_hostname: Optional[bool] = None + event_format: Optional[Sequence[str]] = None + event_id: Optional[Sequence[str]] = None + event_priority: Optional[Literal['normal', 'low']] = None + excluded_messages: Optional[Sequence[str]] = None + filters: Optional[Filters] = None + host: Optional[str] = None + included_messages: Optional[Sequence[str]] = None + interpret_messages: Optional[bool] = None + legacy_mode: Optional[bool] = None + log_file: Optional[Sequence[str]] = None + message_filters: Optional[Sequence[str]] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + password: Optional[str] = None + path: Optional[str] = None + payload_size: Optional[int] = None + query: Optional[str] = None + server: Optional[str] = None + service: Optional[str] = None + source_name: Optional[Sequence[str]] = None + start: Optional[Literal['now', 'oldest']] = None + tag_event_id: Optional[bool] = None + tag_sid: Optional[bool] = None + tags: Optional[Sequence[str]] = None + timeout: Optional[float] = None + type: Optional[Sequence[str]] = None + user: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/win32_event_log/datadog_checks/win32_event_log/config_models/shared.py b/win32_event_log/datadog_checks/win32_event_log/config_models/shared.py index 3d2131442e887..f9bffdbac0436 100644 --- a/win32_event_log/datadog_checks/win32_event_log/config_models/shared.py +++ b/win32_event_log/datadog_checks/win32_event_log/config_models/shared.py @@ -9,9 +9,10 @@ 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 @@ -20,34 +21,43 @@ class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - default_event_priority: Optional[str] - event_priority: Optional[Literal['normal', 'low']] - interpret_messages: Optional[bool] - service: Optional[str] - tag_event_id: Optional[bool] - tag_sid: Optional[bool] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + default_event_priority: Optional[str] = None + event_priority: Optional[Literal['normal', 'low']] = None + interpret_messages: Optional[bool] = None + service: Optional[str] = None + tag_event_id: Optional[bool] = None + tag_sid: Optional[bool] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/win32_event_log/datadog_checks/win32_event_log/data/conf.yaml.example b/win32_event_log/datadog_checks/win32_event_log/data/conf.yaml.example index e8624f2471d67..5ef40767a2157 100644 --- a/win32_event_log/datadog_checks/win32_event_log/data/conf.yaml.example +++ b/win32_event_log/datadog_checks/win32_event_log/data/conf.yaml.example @@ -102,7 +102,7 @@ instances: ## /\ WARNING /\ ## Due to a limitation in the Windows events API, the maximum filtering on event IDs is 20 IDs per instance. ## Because of this, you may need to split the ID filtering into multiple instances. - ## + ## ## For advanced and more granular filtering, define a `query`. ## ## If `filters` nor `query` is specified, then all events from the subscribed `path` will be collected. @@ -224,7 +224,7 @@ instances: # # payload_size: 10 - ## @param bookmark_frequency - integer - optional - default: + ## @param bookmark_frequency - integer - optional ## How often to save the last seen event as a factor of the number of seen events. ## By default, the value of `payload_size` will be used. ## @@ -235,8 +235,8 @@ instances: ## @param legacy_mode - boolean - optional - default: true ## Whether or not to use a mode of operation that is now unmaintained and will be removed in a future version. ## - ## /\ WARNING /\ - ## This mode, by nature of the underlying technology, is significantly more resource intensive. + ## /\ WARNING /\ + ## This mode, by nature of the underlying technology, is significantly more resource intensive. ## ## Setting this option to `false` is only supported on Agent versions 7 and above. # diff --git a/windows_performance_counters/datadog_checks/windows_performance_counters/config_models/defaults.py b/windows_performance_counters/datadog_checks/windows_performance_counters/config_models/defaults.py index 421c8e13ee05d..f92a37d90b60c 100644 --- a/windows_performance_counters/datadog_checks/windows_performance_counters/config_models/defaults.py +++ b/windows_performance_counters/datadog_checks/windows_performance_counters/config_models/defaults.py @@ -7,68 +7,26 @@ # 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 shared_use_localized_counters(field, value): +def shared_use_localized_counters(): return False -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_extra_metrics(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_namespace(field, value): - return get_default_field_value(field, value) - - -def instance_password(field, value): - return get_default_field_value(field, value) - - -def instance_server(field, value): - return get_default_field_value(field, value) - - -def instance_server_tag(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_use_legacy_check_version(field, value): +def instance_use_legacy_check_version(): return False - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/windows_performance_counters/datadog_checks/windows_performance_counters/config_models/instance.py b/windows_performance_counters/datadog_checks/windows_performance_counters/config_models/instance.py index 1617fbc1c2496..45a72e9e57bdb 100644 --- a/windows_performance_counters/datadog_checks/windows_performance_counters/config_models/instance.py +++ b/windows_performance_counters/datadog_checks/windows_performance_counters/config_models/instance.py @@ -9,9 +9,10 @@ from __future__ import annotations -from typing import Literal, Mapping, Optional, Sequence, Union +from typing import Mapping, Optional, Sequence, Union -from pydantic import BaseModel, Extra, Field, root_validator, validator +from pydantic import BaseModel, ConfigDict, Field, 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 @@ -20,98 +21,107 @@ class Counter(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - aggregate: Optional[Union[bool, Literal['only']]] - average: Optional[bool] - metric_name: Optional[str] - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + extra='allow', + frozen=True, + ) + aggregate: Optional[Union[bool, Literal['only']]] = None + average: Optional[bool] = None + metric_name: Optional[str] = None + name: Optional[str] = None + type: Optional[str] = None class InstanceCounts(BaseModel): - class Config: - allow_mutation = False - - monitored: Optional[str] - total: Optional[str] - unique: Optional[str] + model_config = ConfigDict( + frozen=True, + ) + monitored: Optional[str] = None + total: Optional[str] = None + unique: Optional[str] = None class ExtraMetrics(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + frozen=True, + ) counters: Sequence[Mapping[str, Union[str, Counter]]] - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] - instance_counts: Optional[InstanceCounts] + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None + instance_counts: Optional[InstanceCounts] = None name: str - tag_name: Optional[str] - use_localized_counters: Optional[bool] + tag_name: Optional[str] = None + use_localized_counters: Optional[bool] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Metrics(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + frozen=True, + ) counters: Sequence[Mapping[str, Union[str, Counter]]] - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] - instance_counts: Optional[InstanceCounts] + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None + instance_counts: Optional[InstanceCounts] = None name: str - tag_name: Optional[str] - use_localized_counters: Optional[bool] + tag_name: Optional[str] = None + use_localized_counters: Optional[bool] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - enable_health_service_check: Optional[bool] - extra_metrics: Optional[Mapping[str, ExtraMetrics]] - metric_patterns: Optional[MetricPatterns] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + enable_health_service_check: Optional[bool] = None + extra_metrics: Optional[Mapping[str, ExtraMetrics]] = None + metric_patterns: Optional[MetricPatterns] = None metrics: Mapping[str, Metrics] - min_collection_interval: Optional[float] - namespace: Optional[str] = Field(None, regex='\\w*') - password: Optional[str] - server: Optional[str] - server_tag: Optional[str] - service: Optional[str] - tags: Optional[Sequence[str]] - use_legacy_check_version: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + min_collection_interval: Optional[float] = None + namespace: Optional[str] = Field(None, pattern='\\w*') + password: Optional[str] = None + server: Optional[str] = None + server_tag: Optional[str] = None + service: Optional[str] = None + tags: Optional[Sequence[str]] = None + use_legacy_check_version: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/windows_performance_counters/datadog_checks/windows_performance_counters/config_models/shared.py b/windows_performance_counters/datadog_checks/windows_performance_counters/config_models/shared.py index eefbab173ede1..aa58639466c05 100644 --- a/windows_performance_counters/datadog_checks/windows_performance_counters/config_models/shared.py +++ b/windows_performance_counters/datadog_checks/windows_performance_counters/config_models/shared.py @@ -11,7 +11,7 @@ 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 @@ -20,30 +20,39 @@ class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - service: Optional[str] - use_localized_counters: Optional[bool] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None + use_localized_counters: Optional[bool] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/windows_service/datadog_checks/windows_service/config_models/defaults.py b/windows_service/datadog_checks/windows_service/config_models/defaults.py index 371db9f4847ae..6dc77155d16f7 100644 --- a/windows_service/datadog_checks/windows_service/config_models/defaults.py +++ b/windows_service/datadog_checks/windows_service/config_models/defaults.py @@ -7,40 +7,22 @@ # 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_disable_legacy_service_tag(field, value): +def instance_disable_legacy_service_tag(): 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) - - -def instance_windows_service_startup_type_tag(field, value): +def instance_windows_service_startup_type_tag(): return False diff --git a/windows_service/datadog_checks/windows_service/config_models/instance.py b/windows_service/datadog_checks/windows_service/config_models/instance.py index 1cb2413c02adf..704d28d35a1e2 100644 --- a/windows_service/datadog_checks/windows_service/config_models/instance.py +++ b/windows_service/datadog_checks/windows_service/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence, 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 @@ -20,45 +20,54 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - disable_generic_tags: Optional[bool] - disable_legacy_service_tag: Optional[bool] - empty_default_hostname: Optional[bool] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - service: Optional[str] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + disable_generic_tags: Optional[bool] = None + disable_legacy_service_tag: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + service: Optional[str] = None services: Sequence[Union[str, Mapping[str, Any]]] - tags: Optional[Sequence[str]] - windows_service_startup_type_tag: Optional[bool] + tags: Optional[Sequence[str]] = None + windows_service_startup_type_tag: Optional[bool] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/windows_service/datadog_checks/windows_service/config_models/shared.py b/windows_service/datadog_checks/windows_service/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/windows_service/datadog_checks/windows_service/config_models/shared.py +++ b/windows_service/datadog_checks/windows_service/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/wmi_check/datadog_checks/wmi_check/config_models/defaults.py b/wmi_check/datadog_checks/wmi_check/config_models/defaults.py index 1a23f0a0a0567..00c3c88ec2fa1 100644 --- a/wmi_check/datadog_checks/wmi_check/config_models/defaults.py +++ b/wmi_check/datadog_checks/wmi_check/config_models/defaults.py @@ -7,64 +7,26 @@ # 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_filters(field, value): - return get_default_field_value(field, value) - - -def instance_host(field, value): +def instance_host(): return 'localhost' -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_namespace(field, value): +def instance_namespace(): return 'root\\cimv2' -def instance_password(field, value): - return get_default_field_value(field, value) - - -def instance_provider(field, value): +def instance_provider(): return 64 - - -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_tag_by(field, value): - return get_default_field_value(field, value) - - -def instance_tag_queries(field, value): - return get_default_field_value(field, value) - - -def instance_tags(field, value): - return get_default_field_value(field, value) - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/wmi_check/datadog_checks/wmi_check/config_models/instance.py b/wmi_check/datadog_checks/wmi_check/config_models/instance.py index 5e409f87eacaf..7f208ac9d3c4b 100644 --- a/wmi_check/datadog_checks/wmi_check/config_models/instance.py +++ b/wmi_check/datadog_checks/wmi_check/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Any, Mapping, Optional, Sequence -from pydantic import BaseModel, 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 @@ -20,52 +20,61 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) class_: str = Field(..., alias='class') - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - filters: Optional[Sequence[Mapping[str, Any]]] - host: Optional[str] - metric_patterns: Optional[MetricPatterns] + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + filters: Optional[Sequence[Mapping[str, Any]]] = None + host: Optional[str] = None + metric_patterns: Optional[MetricPatterns] = None metrics: Sequence[Sequence[str]] - min_collection_interval: Optional[float] - namespace: Optional[str] - password: Optional[str] - provider: Optional[int] - service: Optional[str] - tag_by: Optional[str] - tag_queries: Optional[Sequence[Sequence[str]]] - tags: Optional[Sequence[str]] - username: Optional[str] - - @root_validator(pre=True) + min_collection_interval: Optional[float] = None + namespace: Optional[str] = None + password: Optional[str] = None + provider: Optional[int] = None + service: Optional[str] = None + tag_by: Optional[str] = None + tag_queries: Optional[Sequence[Sequence[str]]] = None + tags: Optional[Sequence[str]] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/wmi_check/datadog_checks/wmi_check/config_models/shared.py b/wmi_check/datadog_checks/wmi_check/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/wmi_check/datadog_checks/wmi_check/config_models/shared.py +++ b/wmi_check/datadog_checks/wmi_check/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/yarn/datadog_checks/yarn/config_models/defaults.py b/yarn/datadog_checks/yarn/config_models/defaults.py index 9503c2b1ec5c0..deeb4d81cd84f 100644 --- a/yarn/datadog_checks/yarn/config_models/defaults.py +++ b/yarn/datadog_checks/yarn/config_models/defaults.py @@ -7,232 +7,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_collect_apps_all_states(field, value): +def shared_collect_apps_all_states(): return False -def shared_collect_apps_states_list(field, value): +def shared_collect_apps_states_list(): return ['RUNNING'] -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_application_status_mapping(field, value): - return get_default_field_value(field, value) - - -def instance_application_tags(field, value): - return get_default_field_value(field, value) - - -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_cluster_name(field, value): +def instance_cluster_name(): return 'default_cluster' -def instance_collect_app_metrics(field, value): +def instance_collect_app_metrics(): return True -def instance_collect_apps_all_states(field, value): +def instance_collect_apps_all_states(): return False -def instance_collect_apps_states_list(field, value): +def instance_collect_apps_states_list(): return ['RUNNING'] -def instance_collect_node_metrics(field, value): +def instance_collect_node_metrics(): 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_disable_legacy_cluster_tag(field, value): +def instance_disable_legacy_cluster_tag(): return False -def instance_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return False -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 False -def instance_proxy(field, value): - return get_default_field_value(field, value) - - -def instance_queue_blacklist(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_resourcemanager_uri(field, value): +def instance_resourcemanager_uri(): return 'http://localhost:8088' -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_split_yarn_application_tags(field, value): +def instance_split_yarn_application_tags(): 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/yarn/datadog_checks/yarn/config_models/instance.py b/yarn/datadog_checks/yarn/config_models/instance.py index 6b68eb17a3a0f..b45568e8f0844 100644 --- a/yarn/datadog_checks/yarn/config_models/instance.py +++ b/yarn/datadog_checks/yarn/config_models/instance.py @@ -9,9 +9,10 @@ from __future__ import annotations -from typing import Any, Literal, Mapping, Optional, Sequence +from typing import Any, Mapping, Optional, Sequence -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 @@ -20,108 +21,117 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + frozen=True, + ) + reader: Optional[Mapping[str, Any]] = None + writer: Optional[Mapping[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - allow_redirects: Optional[bool] - application_status_mapping: Optional[Mapping[str, Any]] - application_tags: Optional[Mapping[str, Any]] - auth_token: Optional[AuthToken] - auth_type: Optional[str] - aws_host: Optional[str] - aws_region: Optional[str] - aws_service: Optional[str] - cluster_name: Optional[str] - collect_app_metrics: Optional[bool] - collect_apps_all_states: Optional[bool] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + allow_redirects: Optional[bool] = None + application_status_mapping: Optional[Mapping[str, Any]] = None + application_tags: Optional[Mapping[str, Any]] = 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 + cluster_name: Optional[str] = None + collect_app_metrics: Optional[bool] = None + collect_apps_all_states: Optional[bool] = None collect_apps_states_list: Optional[ Sequence[ Literal['ALL', 'NEW', 'NEW_SAVING', 'SUBMITTED', 'ACCEPTED', 'RUNNING', 'FINISHED', 'FAILED', 'KILLED'] ] - ] - collect_node_metrics: Optional[bool] - connect_timeout: Optional[float] - disable_generic_tags: Optional[bool] - disable_legacy_cluster_tag: 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] - queue_blacklist: Optional[Sequence[str]] - read_timeout: Optional[float] - request_size: Optional[float] - resourcemanager_uri: Optional[str] - service: Optional[str] - skip_proxy: Optional[bool] - split_yarn_application_tags: 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] - use_legacy_auth_encoding: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + ] = None + collect_node_metrics: Optional[bool] = None + connect_timeout: Optional[float] = None + disable_generic_tags: Optional[bool] = None + disable_legacy_cluster_tag: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + extra_headers: Optional[Mapping[str, Any]] = None + headers: Optional[Mapping[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 + queue_blacklist: Optional[Sequence[str]] = None + read_timeout: Optional[float] = None + request_size: Optional[float] = None + resourcemanager_uri: Optional[str] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + split_yarn_application_tags: Optional[bool] = None + tags: Optional[Sequence[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[Sequence[str]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + use_legacy_auth_encoding: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/yarn/datadog_checks/yarn/config_models/shared.py b/yarn/datadog_checks/yarn/config_models/shared.py index db24fbb537878..f7577f84507f0 100644 --- a/yarn/datadog_checks/yarn/config_models/shared.py +++ b/yarn/datadog_checks/yarn/config_models/shared.py @@ -9,9 +9,10 @@ from __future__ import annotations -from typing import Literal, Optional, Sequence +from typing import Optional, Sequence -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 @@ -20,47 +21,56 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[Sequence[str]] = None class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - collect_apps_all_states: Optional[bool] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + collect_apps_all_states: Optional[bool] = None collect_apps_states_list: Optional[ Sequence[ Literal['ALL', 'NEW', 'NEW_SAVING', 'SUBMITTED', 'ACCEPTED', 'RUNNING', 'FINISHED', 'FAILED', 'KILLED'] ] - ] - proxy: Optional[Proxy] - service: Optional[str] - skip_proxy: Optional[bool] - timeout: Optional[float] + ] = None + proxy: Optional[Proxy] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + timeout: Optional[float] = 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(defaults, f'shared_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/zk/datadog_checks/zk/config_models/defaults.py b/zk/datadog_checks/zk/config_models/defaults.py index d8dc54ed924e9..511e701d10dab 100644 --- a/zk/datadog_checks/zk/config_models/defaults.py +++ b/zk/datadog_checks/zk/config_models/defaults.py @@ -7,76 +7,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_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_expected_mode(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_port(field, value): +def instance_port(): return 2181 -def instance_report_instance_mode(field, value): +def instance_report_instance_mode(): return True -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 3 -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 -def instance_use_tls(field, value): +def instance_use_tls(): return False diff --git a/zk/datadog_checks/zk/config_models/instance.py b/zk/datadog_checks/zk/config_models/instance.py index 2fddb989c8c23..ee76eaa040628 100644 --- a/zk/datadog_checks/zk/config_models/instance.py +++ b/zk/datadog_checks/zk/config_models/instance.py @@ -11,7 +11,7 @@ from typing import Optional, Sequence -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 @@ -20,54 +20,63 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + frozen=True, + ) + exclude: Optional[Sequence[str]] = None + include: Optional[Sequence[str]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - expected_mode: Optional[str] + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + expected_mode: Optional[str] = None host: str - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - port: Optional[int] - report_instance_mode: Optional[bool] - service: Optional[str] - tags: Optional[Sequence[str]] - timeout: Optional[int] - 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] - use_tls: Optional[bool] - - @root_validator(pre=True) + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + port: Optional[int] = None + report_instance_mode: Optional[bool] = None + service: Optional[str] = None + tags: Optional[Sequence[str]] = None + timeout: Optional[int] = 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 + use_tls: 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 + @field_validator('*', mode='before') + def _ensure_defaults(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']: + return value + + return getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(defaults, f'instance_{field.name}')(field, v) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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/zk/datadog_checks/zk/config_models/shared.py b/zk/datadog_checks/zk/config_models/shared.py index a6de26a779888..9de2608b18ec1 100644 --- a/zk/datadog_checks/zk/config_models/shared.py +++ b/zk/datadog_checks/zk/config_models/shared.py @@ -11,38 +11,38 @@ 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 + model_config = ConfigDict( + validate_default=True, + frozen=True, + ) + service: Optional[str] = None - service: Optional[str] - - @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) + @field_validator('*') + def _run_validations(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name not in info.context['configured_fields']: + return value - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + return getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + @field_validator('*', mode='after') + def _make_immutable(cls, value): + 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))