Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add runtime configuration validation #9003

Merged
merged 1 commit into from May 17, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
18 changes: 18 additions & 0 deletions vertica/datadog_checks/vertica/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
88 changes: 88 additions & 0 deletions vertica/datadog_checks/vertica/config_models/defaults.py
@@ -0,0 +1,88 @@
# (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_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):
return False


def instance_custom_queries(field, value):
return get_default_field_value(field, value)


def instance_empty_default_hostname(field, value):
return False


def instance_metric_groups(field, value):
return get_default_field_value(field, value)


def instance_min_collection_interval(field, value):
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_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_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):
return True


def instance_tls_verify(field, value):
return True


def instance_use_global_custom_queries(field, value):
return 'true'


def instance_use_tls(field, value):
return False
73 changes: 73 additions & 0 deletions vertica/datadog_checks/vertica/config_models/instance.py
@@ -0,0 +1,73 @@
# (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 CustomQuery(BaseModel):
class Config:
allow_mutation = False

columns: Optional[Sequence[Mapping[str, Any]]]
query: Optional[str]
tags: Optional[Sequence[str]]


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: str
empty_default_hostname: Optional[bool]
metric_groups: Optional[Sequence[str]]
min_collection_interval: Optional[float]
password: Optional[str]
port: int
server: 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: 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))
43 changes: 43 additions & 0 deletions vertica/datadog_checks/vertica/config_models/shared.py
@@ -0,0 +1,43 @@
# (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 SharedConfig(BaseModel):
class Config:
allow_mutation = False

global_custom_queries: Optional[Sequence[Mapping[str, Any]]]
service: Optional[str]

@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))
3 changes: 3 additions & 0 deletions vertica/datadog_checks/vertica/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)