From 2fc7c56e9aadf3393462cff97709bca6714b3487 Mon Sep 17 00:00:00 2001
From: Ofek Lev <ofekmeister@gmail.com>
Date: Wed, 19 May 2021 16:11:21 -0400
Subject: [PATCH] Sync config models (#9004)

---
 .../voltdb/config_models/__init__.py          |  18 ++
 .../voltdb/config_models/defaults.py          | 172 ++++++++++++++++++
 .../voltdb/config_models/instance.py          | 107 +++++++++++
 .../voltdb/config_models/shared.py            |  55 ++++++
 .../voltdb/config_models/validators.py        |   3 +
 voltdb/tox.ini                                |   2 +-
 6 files changed, 356 insertions(+), 1 deletion(-)
 create mode 100644 voltdb/datadog_checks/voltdb/config_models/__init__.py
 create mode 100644 voltdb/datadog_checks/voltdb/config_models/defaults.py
 create mode 100644 voltdb/datadog_checks/voltdb/config_models/instance.py
 create mode 100644 voltdb/datadog_checks/voltdb/config_models/shared.py
 create mode 100644 voltdb/datadog_checks/voltdb/config_models/validators.py

diff --git a/voltdb/datadog_checks/voltdb/config_models/__init__.py b/voltdb/datadog_checks/voltdb/config_models/__init__.py
new file mode 100644
index 0000000000000..ba42dbdc7ffb0
--- /dev/null
+++ b/voltdb/datadog_checks/voltdb/config_models/__init__.py
@@ -0,0 +1,18 @@
+# (C) Datadog, Inc. 2021-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+from .instance import InstanceConfig
+from .shared import SharedConfig
+
+
+class ConfigMixin:
+    _config_model_instance: InstanceConfig
+    _config_model_shared: SharedConfig
+
+    @property
+    def config(self) -> InstanceConfig:
+        return self._config_model_instance
+
+    @property
+    def shared_config(self) -> SharedConfig:
+        return self._config_model_shared
diff --git a/voltdb/datadog_checks/voltdb/config_models/defaults.py b/voltdb/datadog_checks/voltdb/config_models/defaults.py
new file mode 100644
index 0000000000000..d0434a3ea8327
--- /dev/null
+++ b/voltdb/datadog_checks/voltdb/config_models/defaults.py
@@ -0,0 +1,172 @@
+# (C) Datadog, Inc. 2021-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+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):
+    return False
+
+
+def shared_timeout(field, value):
+    return 10
+
+
+def instance_auth_token(field, value):
+    return get_default_field_value(field, value)
+
+
+def instance_auth_type(field, value):
+    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_empty_default_hostname(field, value):
+    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):
+    return 'disabled'
+
+
+def instance_kerberos_cache(field, value):
+    return get_default_field_value(field, value)
+
+
+def instance_kerberos_delegate(field, value):
+    return False
+
+
+def instance_kerberos_force_initiate(field, value):
+    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):
+    return False
+
+
+def instance_min_collection_interval(field, value):
+    return 15
+
+
+def instance_ntlm_domain(field, value):
+    return get_default_field_value(field, value)
+
+
+def instance_password_hashed(field, value):
+    return False
+
+
+def instance_persist_connections(field, value):
+    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_service(field, value):
+    return get_default_field_value(field, value)
+
+
+def instance_skip_proxy(field, value):
+    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):
+    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):
+    return False
+
+
+def instance_tls_private_key(field, value):
+    return get_default_field_value(field, value)
+
+
+def instance_tls_use_host_header(field, value):
+    return False
+
+
+def instance_tls_verify(field, value):
+    return True
+
+
+def instance_use_global_custom_queries(field, value):
+    return 'true'
+
+
+def instance_use_legacy_auth_encoding(field, value):
+    return True
diff --git a/voltdb/datadog_checks/voltdb/config_models/instance.py b/voltdb/datadog_checks/voltdb/config_models/instance.py
new file mode 100644
index 0000000000000..48d3c5a234d08
--- /dev/null
+++ b/voltdb/datadog_checks/voltdb/config_models/instance.py
@@ -0,0 +1,107 @@
+# (C) Datadog, Inc. 2021-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+from __future__ import annotations
+
+from typing import Any, Mapping, Optional, Sequence
+
+from pydantic import BaseModel, root_validator, validator
+
+from datadog_checks.base.utils.functions import identity
+from datadog_checks.base.utils.models import validation
+
+from . import defaults, validators
+
+
+class AuthToken(BaseModel):
+    class Config:
+        allow_mutation = False
+
+    reader: Optional[Mapping[str, Any]]
+    writer: Optional[Mapping[str, Any]]
+
+
+class CustomQuery(BaseModel):
+    class Config:
+        allow_mutation = False
+
+    columns: Optional[Sequence[Mapping[str, Any]]]
+    query: Optional[str]
+    tags: Optional[Sequence[str]]
+
+
+class Proxy(BaseModel):
+    class Config:
+        allow_mutation = False
+
+    http: Optional[str]
+    https: Optional[str]
+    no_proxy: Optional[Sequence[str]]
+
+
+class InstanceConfig(BaseModel):
+    class Config:
+        allow_mutation = False
+
+    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]]
+    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]
+    min_collection_interval: Optional[float]
+    ntlm_domain: Optional[str]
+    password: str
+    password_hashed: Optional[bool]
+    persist_connections: Optional[bool]
+    proxy: Optional[Proxy]
+    read_timeout: 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_use_host_header: Optional[bool]
+    tls_verify: Optional[bool]
+    url: str
+    use_global_custom_queries: Optional[str]
+    use_legacy_auth_encoding: Optional[bool]
+    username: str
+
+    @root_validator(pre=True)
+    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)
+
+    @root_validator(pre=False)
+    def _final_validation(cls, values):
+        return validation.core.finalize_config(getattr(validators, 'finalize_instance', identity)(values))
diff --git a/voltdb/datadog_checks/voltdb/config_models/shared.py b/voltdb/datadog_checks/voltdb/config_models/shared.py
new file mode 100644
index 0000000000000..94cfd11f616af
--- /dev/null
+++ b/voltdb/datadog_checks/voltdb/config_models/shared.py
@@ -0,0 +1,55 @@
+# (C) Datadog, Inc. 2021-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
+from __future__ import annotations
+
+from typing import Any, Mapping, Optional, Sequence
+
+from pydantic import BaseModel, root_validator, validator
+
+from datadog_checks.base.utils.functions import identity
+from datadog_checks.base.utils.models import validation
+
+from . import defaults, validators
+
+
+class Proxy(BaseModel):
+    class Config:
+        allow_mutation = False
+
+    http: Optional[str]
+    https: Optional[str]
+    no_proxy: Optional[Sequence[str]]
+
+
+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)
+    def _initial_validation(cls, values):
+        return validation.core.initialize_config(getattr(validators, 'initialize_shared', identity)(values))
+
+    @validator('*', pre=True, always=True)
+    def _ensure_defaults(cls, v, field):
+        if v is not None or field.required:
+            return v
+
+        return getattr(defaults, f'shared_{field.name}')(field, v)
+
+    @validator('*')
+    def _run_validations(cls, v, field):
+        if not v:
+            return v
+
+        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))
diff --git a/voltdb/datadog_checks/voltdb/config_models/validators.py b/voltdb/datadog_checks/voltdb/config_models/validators.py
new file mode 100644
index 0000000000000..9d0b0155542cb
--- /dev/null
+++ b/voltdb/datadog_checks/voltdb/config_models/validators.py
@@ -0,0 +1,3 @@
+# (C) Datadog, Inc. 2021-present
+# All rights reserved
+# Licensed under a 3-clause BSD style license (see LICENSE)
diff --git a/voltdb/tox.ini b/voltdb/tox.ini
index 3c3d468e341a8..581b966fcaff1 100644
--- a/voltdb/tox.ini
+++ b/voltdb/tox.ini
@@ -12,7 +12,7 @@ envdir =
     py38: {toxworkdir}/py38
 dd_check_style = true
 dd_check_types = true
-dd_mypy_args = --py2 datadog_checks/ tests/
+dd_mypy_args = datadog_checks/ tests/
 description =
     py{27,38}: e2e ready
 usedevelop = true