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.

Files changed (80) hide show
  1. sovereign/__init__.py +13 -81
  2. sovereign/app.py +59 -48
  3. sovereign/cache/__init__.py +172 -0
  4. sovereign/cache/backends/__init__.py +110 -0
  5. sovereign/cache/backends/s3.py +143 -0
  6. sovereign/cache/filesystem.py +73 -0
  7. sovereign/cache/types.py +15 -0
  8. sovereign/configuration.py +573 -0
  9. sovereign/constants.py +1 -0
  10. sovereign/context.py +271 -104
  11. sovereign/dynamic_config/__init__.py +113 -0
  12. sovereign/dynamic_config/deser.py +78 -0
  13. sovereign/dynamic_config/loaders.py +120 -0
  14. sovereign/events.py +49 -0
  15. sovereign/logging/access_logger.py +85 -0
  16. sovereign/logging/application_logger.py +54 -0
  17. sovereign/logging/base_logger.py +41 -0
  18. sovereign/logging/bootstrapper.py +36 -0
  19. sovereign/logging/types.py +10 -0
  20. sovereign/middlewares.py +8 -7
  21. sovereign/modifiers/lib.py +1 -0
  22. sovereign/rendering.py +192 -0
  23. sovereign/response_class.py +18 -0
  24. sovereign/server.py +93 -35
  25. sovereign/sources/file.py +1 -1
  26. sovereign/sources/inline.py +1 -0
  27. sovereign/sources/lib.py +1 -0
  28. sovereign/sources/poller.py +296 -53
  29. sovereign/statistics.py +17 -20
  30. sovereign/templates/base.html +59 -46
  31. sovereign/templates/resources.html +203 -102
  32. sovereign/testing/loaders.py +8 -0
  33. sovereign/{modifiers/test.py → testing/modifiers.py} +0 -2
  34. sovereign/tracing.py +102 -0
  35. sovereign/types.py +299 -0
  36. sovereign/utils/auth.py +26 -13
  37. sovereign/utils/crypto/__init__.py +0 -0
  38. sovereign/utils/crypto/crypto.py +135 -0
  39. sovereign/utils/crypto/suites/__init__.py +21 -0
  40. sovereign/utils/crypto/suites/aes_gcm_cipher.py +42 -0
  41. sovereign/utils/crypto/suites/base_cipher.py +21 -0
  42. sovereign/utils/crypto/suites/disabled_cipher.py +25 -0
  43. sovereign/utils/crypto/suites/fernet_cipher.py +29 -0
  44. sovereign/utils/dictupdate.py +2 -1
  45. sovereign/utils/eds.py +37 -21
  46. sovereign/utils/mock.py +54 -16
  47. sovereign/utils/resources.py +17 -0
  48. sovereign/utils/version_info.py +8 -0
  49. sovereign/views/__init__.py +4 -0
  50. sovereign/views/api.py +61 -0
  51. sovereign/views/crypto.py +46 -15
  52. sovereign/views/discovery.py +37 -116
  53. sovereign/views/healthchecks.py +87 -18
  54. sovereign/views/interface.py +112 -112
  55. sovereign/worker.py +204 -0
  56. {sovereign-0.19.3.dist-info → sovereign-1.0.0b148.dist-info}/METADATA +79 -76
  57. sovereign-1.0.0b148.dist-info/RECORD +77 -0
  58. {sovereign-0.19.3.dist-info → sovereign-1.0.0b148.dist-info}/WHEEL +1 -1
  59. sovereign-1.0.0b148.dist-info/entry_points.txt +38 -0
  60. sovereign_files/__init__.py +0 -0
  61. sovereign_files/static/darkmode.js +51 -0
  62. sovereign_files/static/node_expression.js +42 -0
  63. sovereign_files/static/panel.js +76 -0
  64. sovereign_files/static/resources.css +246 -0
  65. sovereign_files/static/resources.js +642 -0
  66. sovereign_files/static/sass/style.scss +33 -0
  67. sovereign_files/static/style.css +16143 -0
  68. sovereign_files/static/style.css.map +1 -0
  69. sovereign/config_loader.py +0 -225
  70. sovereign/discovery.py +0 -175
  71. sovereign/logs.py +0 -131
  72. sovereign/schemas.py +0 -780
  73. sovereign/static/sass/style.scss +0 -27
  74. sovereign/static/style.css +0 -13553
  75. sovereign/templates/ul_filter.html +0 -22
  76. sovereign/utils/crypto.py +0 -103
  77. sovereign/views/admin.py +0 -120
  78. sovereign-0.19.3.dist-info/LICENSE.txt +0 -13
  79. sovereign-0.19.3.dist-info/RECORD +0 -47
  80. 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