mysqloperator/controller/api_utils.py (53 lines of code) (raw):
# Copyright (c) 2020, 2021, Oracle and/or its affiliates.
#
# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
#
from enum import Enum
import typing
from typing import Any, Generic, Optional, Type, cast
T = typing.TypeVar("T")
E = typing.TypeVar("E")
class ApiSpecError(Exception):
pass
class ImagePullPolicy(Enum):
Never = "Never"
IfNotPresent = "IfNotPresent"
Always = "Always"
class Edition(Enum):
community = "community"
enterprise = "enterprise"
def typename(type: type) -> str:
CONTENT_TYPE_NAMES = {"dict": "Map", "str": "String",
"int": "Integer", "bool": "Boolean", "list": "List"}
if type.__name__ not in CONTENT_TYPE_NAMES:
return type.__name__
return CONTENT_TYPE_NAMES[type.__name__]
def _dget(d: dict, key: str, what: str, default_value: Optional[T], expected_type: Type[T]) -> T:
if default_value is None and key not in d:
raise ApiSpecError(f"{what}.{key} is mandatory, but is not set")
value = d.get(key, default_value)
if not isinstance(value, expected_type):
raise ApiSpecError(
f"{what}.{key} expected to be a {typename(expected_type)} but is {typename(type(value)) if value is not None else 'not set'}")
return cast(T, value)
def dget_dict(d: dict, key: str, what: str, default_value: Optional[dict] = None) -> dict:
return _dget(d, key, what, default_value, dict)
def dget_list(d: dict, key: str, what: str, default_value: Optional[list] = None, content_type: Optional[type] = None) -> list:
l = _dget(d, key, what, default_value, list)
if l and content_type is not None:
for i, elem in enumerate(l):
if not isinstance(elem, content_type):
raise ApiSpecError(
f"{what}.{key}[{i}] expected to be a {typename(content_type)} but is {typename(type(elem))}")
return l
def dget_str(d: dict, key: str, what: str, *, default_value: Optional[str] = None) -> str:
return _dget(d, key, what, default_value, str)
def dget_enum(d: dict, key: str, what: str, *, default_value: Optional[E], enum_type: Type[Enum]) -> E:
s = _dget(d, key, what, default_value, str)
for v in enum_type:
if v.name == s:
return cast(E, v)
raise ApiSpecError(
f"{what}.{key} has invalid value '{s}' but must be one of {','.join([x.name for x in enum_type])}")
def dget_int(d: dict, key: str, what: str, *, default_value: Optional[int] = None) -> int:
return _dget(d, key, what, default_value, int)
def dget_float(d: dict, key: str, what: str, *, default_value: Optional[float] = None) -> int:
return _dget(d, key, what, default_value, float)
def dget_bool(d: dict, key: str, what: str, *, default_value: Optional[bool] = None) -> bool:
return _dget(d, key, what, default_value, bool)