mirror of
https://github.com/checktheroads/hyperglass
synced 2024-05-11 05:55:08 +00:00
43 lines
1.3 KiB
Python
43 lines
1.3 KiB
Python
"""Validate credential configuration variables."""
|
|
|
|
# Standard Library
|
|
from typing import Optional
|
|
|
|
# Third Party
|
|
from pydantic import FilePath, SecretStr, StrictStr, constr, root_validator
|
|
|
|
# Local
|
|
from ..main import HyperglassModel
|
|
|
|
Methods = constr(regex=r"(password|unencrypted_key|encrypted_key)")
|
|
|
|
|
|
class Credential(HyperglassModel, extra="allow"):
|
|
"""Model for per-credential config in devices.yaml."""
|
|
|
|
username: StrictStr
|
|
password: Optional[SecretStr]
|
|
key: Optional[FilePath]
|
|
|
|
@root_validator
|
|
def validate_credential(cls, values):
|
|
"""Ensure either a password or an SSH key is set."""
|
|
if values["key"] is None and values["password"] is None:
|
|
raise ValueError(
|
|
"Either a password or an SSH key must be specified for user '{}'".format(
|
|
values["username"]
|
|
)
|
|
)
|
|
return values
|
|
|
|
def __init__(self, **kwargs):
|
|
"""Set private attribute _method based on validated model."""
|
|
super().__init__(**kwargs)
|
|
self._method = None
|
|
if self.password is not None and self.key is not None:
|
|
self._method = "encrypted_key"
|
|
elif self.password is None:
|
|
self._method = "unencrypted_key"
|
|
elif self.key is None:
|
|
self._method = "password"
|