sovereign 0.19.3__py3-none-any.whl → 1.0.0b148__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of sovereign might be problematic. Click here for more details.
- sovereign/__init__.py +13 -81
- sovereign/app.py +59 -48
- sovereign/cache/__init__.py +172 -0
- sovereign/cache/backends/__init__.py +110 -0
- sovereign/cache/backends/s3.py +143 -0
- sovereign/cache/filesystem.py +73 -0
- sovereign/cache/types.py +15 -0
- sovereign/configuration.py +573 -0
- sovereign/constants.py +1 -0
- sovereign/context.py +271 -104
- sovereign/dynamic_config/__init__.py +113 -0
- sovereign/dynamic_config/deser.py +78 -0
- sovereign/dynamic_config/loaders.py +120 -0
- sovereign/events.py +49 -0
- sovereign/logging/access_logger.py +85 -0
- sovereign/logging/application_logger.py +54 -0
- sovereign/logging/base_logger.py +41 -0
- sovereign/logging/bootstrapper.py +36 -0
- sovereign/logging/types.py +10 -0
- sovereign/middlewares.py +8 -7
- sovereign/modifiers/lib.py +1 -0
- sovereign/rendering.py +192 -0
- sovereign/response_class.py +18 -0
- sovereign/server.py +93 -35
- sovereign/sources/file.py +1 -1
- sovereign/sources/inline.py +1 -0
- sovereign/sources/lib.py +1 -0
- sovereign/sources/poller.py +296 -53
- sovereign/statistics.py +17 -20
- sovereign/templates/base.html +59 -46
- sovereign/templates/resources.html +203 -102
- sovereign/testing/loaders.py +8 -0
- sovereign/{modifiers/test.py → testing/modifiers.py} +0 -2
- sovereign/tracing.py +102 -0
- sovereign/types.py +299 -0
- sovereign/utils/auth.py +26 -13
- sovereign/utils/crypto/__init__.py +0 -0
- sovereign/utils/crypto/crypto.py +135 -0
- sovereign/utils/crypto/suites/__init__.py +21 -0
- sovereign/utils/crypto/suites/aes_gcm_cipher.py +42 -0
- sovereign/utils/crypto/suites/base_cipher.py +21 -0
- sovereign/utils/crypto/suites/disabled_cipher.py +25 -0
- sovereign/utils/crypto/suites/fernet_cipher.py +29 -0
- sovereign/utils/dictupdate.py +2 -1
- sovereign/utils/eds.py +37 -21
- sovereign/utils/mock.py +54 -16
- sovereign/utils/resources.py +17 -0
- sovereign/utils/version_info.py +8 -0
- sovereign/views/__init__.py +4 -0
- sovereign/views/api.py +61 -0
- sovereign/views/crypto.py +46 -15
- sovereign/views/discovery.py +37 -116
- sovereign/views/healthchecks.py +87 -18
- sovereign/views/interface.py +112 -112
- sovereign/worker.py +204 -0
- {sovereign-0.19.3.dist-info → sovereign-1.0.0b148.dist-info}/METADATA +79 -76
- sovereign-1.0.0b148.dist-info/RECORD +77 -0
- {sovereign-0.19.3.dist-info → sovereign-1.0.0b148.dist-info}/WHEEL +1 -1
- sovereign-1.0.0b148.dist-info/entry_points.txt +38 -0
- sovereign_files/__init__.py +0 -0
- sovereign_files/static/darkmode.js +51 -0
- sovereign_files/static/node_expression.js +42 -0
- sovereign_files/static/panel.js +76 -0
- sovereign_files/static/resources.css +246 -0
- sovereign_files/static/resources.js +642 -0
- sovereign_files/static/sass/style.scss +33 -0
- sovereign_files/static/style.css +16143 -0
- sovereign_files/static/style.css.map +1 -0
- sovereign/config_loader.py +0 -225
- sovereign/discovery.py +0 -175
- sovereign/logs.py +0 -131
- sovereign/schemas.py +0 -780
- sovereign/static/sass/style.scss +0 -27
- sovereign/static/style.css +0 -13553
- sovereign/templates/ul_filter.html +0 -22
- sovereign/utils/crypto.py +0 -103
- sovereign/views/admin.py +0 -120
- sovereign-0.19.3.dist-info/LICENSE.txt +0 -13
- sovereign-0.19.3.dist-info/RECORD +0 -47
- sovereign-0.19.3.dist-info/entry_points.txt +0 -10
sovereign/logs.py
DELETED
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
import json
|
|
2
|
-
import threading
|
|
3
|
-
from typing import Dict, Any, Optional, Tuple, Mapping, MutableMapping, Union
|
|
4
|
-
|
|
5
|
-
import structlog
|
|
6
|
-
from structlog.exceptions import DropEvent
|
|
7
|
-
|
|
8
|
-
from sovereign.schemas import SovereignConfigv2
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
LOG_QUEUE = threading.local()
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
def default_log_fmt() -> Dict[str, str]:
|
|
15
|
-
return {
|
|
16
|
-
"env": "{ENVIRONMENT}",
|
|
17
|
-
"site": "{HOST}",
|
|
18
|
-
"method": "{METHOD}",
|
|
19
|
-
"uri_path": "{PATH}",
|
|
20
|
-
"uri_query": "{QUERY}",
|
|
21
|
-
"src_ip": "{SOURCE_IP}",
|
|
22
|
-
"src_port": "{SOURCE_PORT}",
|
|
23
|
-
"pid": "{PID}",
|
|
24
|
-
"user_agent": "{USER_AGENT}",
|
|
25
|
-
"bytes_in": "{BYTES_RX}",
|
|
26
|
-
"bytes_out": "{BYTES_TX}",
|
|
27
|
-
"status": "{STATUS_CODE}",
|
|
28
|
-
"duration": "{DURATION}",
|
|
29
|
-
"request_id": "{REQUEST_ID}",
|
|
30
|
-
"resource_version": "{XDS_CLIENT_VERSION} -> {XDS_SERVER_VERSION}",
|
|
31
|
-
"resource_names": "{XDS_RESOURCES}",
|
|
32
|
-
"envoy_ver": "{XDS_ENVOY_VERSION}",
|
|
33
|
-
"traceback": "{TRACEBACK}",
|
|
34
|
-
"error": "{ERROR}",
|
|
35
|
-
"detail": "{ERROR_DETAIL}",
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
_configured_log_fmt: Optional[Dict[str, str]] = None
|
|
40
|
-
|
|
41
|
-
EventDict = MutableMapping[str, Any]
|
|
42
|
-
ProcessedMessage = Union[Mapping[str, Any], str, bytes, Tuple[Any, ...]]
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
class LoggerBootstrapper:
|
|
46
|
-
def __init__(self, config: SovereignConfigv2) -> None:
|
|
47
|
-
self.debug = config.debug
|
|
48
|
-
self.app_logs_enabled = config.logging.application_logs.enabled
|
|
49
|
-
self.access_logs_enabled = config.logging.access_logs.enabled
|
|
50
|
-
self.ignore_empty = config.logging.access_logs.ignore_empty_fields
|
|
51
|
-
self.log_fmt = config.logging.access_logs.log_fmt
|
|
52
|
-
self.logger = self.bootstrap()
|
|
53
|
-
|
|
54
|
-
def bootstrap(self) -> Any:
|
|
55
|
-
structlog.configure(
|
|
56
|
-
processors=[
|
|
57
|
-
self.access_logs_enabled_processor,
|
|
58
|
-
self.debug_logs_processor,
|
|
59
|
-
self.merge_in_threadlocal,
|
|
60
|
-
self.format_log_fields,
|
|
61
|
-
structlog.processors.JSONRenderer(),
|
|
62
|
-
]
|
|
63
|
-
)
|
|
64
|
-
logger = structlog.getLogger()
|
|
65
|
-
self.configured_log_fmt = self.configured_log_format()
|
|
66
|
-
return logger
|
|
67
|
-
|
|
68
|
-
def access_logs_enabled_processor(
|
|
69
|
-
self, logger: Any, method_name: str, event_dict: EventDict
|
|
70
|
-
) -> ProcessedMessage:
|
|
71
|
-
if not self.access_logs_enabled:
|
|
72
|
-
raise DropEvent
|
|
73
|
-
return event_dict
|
|
74
|
-
|
|
75
|
-
def debug_logs_processor(
|
|
76
|
-
self, logger: Any, method_name: str, event_dict: EventDict
|
|
77
|
-
) -> ProcessedMessage:
|
|
78
|
-
if event_dict.get("level") == "debug" and not self.debug:
|
|
79
|
-
raise DropEvent
|
|
80
|
-
return event_dict
|
|
81
|
-
|
|
82
|
-
def application_log(self, **kwargs: Any) -> None:
|
|
83
|
-
if self.app_logs_enabled:
|
|
84
|
-
self.logger.msg(**kwargs)
|
|
85
|
-
|
|
86
|
-
def merge_in_threadlocal(
|
|
87
|
-
self, logger: Any, method_name: str, event_dict: EventDict
|
|
88
|
-
) -> ProcessedMessage:
|
|
89
|
-
self._ensure_threadlocal()
|
|
90
|
-
fields: Dict[str, Any] = LOG_QUEUE.fields.copy()
|
|
91
|
-
fields.update(event_dict)
|
|
92
|
-
return fields
|
|
93
|
-
|
|
94
|
-
def clear_log_fields(self) -> None:
|
|
95
|
-
LOG_QUEUE.fields = dict()
|
|
96
|
-
|
|
97
|
-
def _ensure_threadlocal(self) -> None:
|
|
98
|
-
if not hasattr(LOG_QUEUE, "fields"):
|
|
99
|
-
LOG_QUEUE.fields = dict()
|
|
100
|
-
|
|
101
|
-
def queue_log_fields(self, **kwargs: Any) -> None:
|
|
102
|
-
self._ensure_threadlocal()
|
|
103
|
-
LOG_QUEUE.fields.update(kwargs)
|
|
104
|
-
|
|
105
|
-
def configured_log_format(
|
|
106
|
-
self, format: Optional[Dict[str, str]] = _configured_log_fmt
|
|
107
|
-
) -> Dict[str, str]:
|
|
108
|
-
if format is not None:
|
|
109
|
-
return format
|
|
110
|
-
if isinstance(self.log_fmt, str) and self.log_fmt != "":
|
|
111
|
-
format = json.loads(self.log_fmt)
|
|
112
|
-
if not isinstance(format, dict):
|
|
113
|
-
raise RuntimeError(
|
|
114
|
-
f"Failed to parse log format as JSON: {self.log_fmt}"
|
|
115
|
-
)
|
|
116
|
-
return format
|
|
117
|
-
return default_log_fmt()
|
|
118
|
-
|
|
119
|
-
def format_log_fields(
|
|
120
|
-
self, logger: Any, method_name: str, event_dict: EventDict
|
|
121
|
-
) -> ProcessedMessage:
|
|
122
|
-
formatted_dict: Dict[str, Any] = dict()
|
|
123
|
-
for k, v in self.configured_log_format().items():
|
|
124
|
-
try:
|
|
125
|
-
value: str = v.format(**event_dict)
|
|
126
|
-
except KeyError:
|
|
127
|
-
value = "-"
|
|
128
|
-
if value in (None, "-") and self.ignore_empty:
|
|
129
|
-
continue
|
|
130
|
-
formatted_dict[k] = value
|
|
131
|
-
return formatted_dict
|