sovereign 0.14.2__py3-none-any.whl → 1.0.0a4__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 (99) hide show
  1. sovereign/__init__.py +17 -78
  2. sovereign/app.py +74 -59
  3. sovereign/cache/__init__.py +245 -0
  4. sovereign/cache/backends/__init__.py +110 -0
  5. sovereign/cache/backends/s3.py +161 -0
  6. sovereign/cache/filesystem.py +74 -0
  7. sovereign/cache/types.py +17 -0
  8. sovereign/configuration.py +607 -0
  9. sovereign/constants.py +1 -0
  10. sovereign/context.py +271 -100
  11. sovereign/dynamic_config/__init__.py +112 -0
  12. sovereign/dynamic_config/deser.py +78 -0
  13. sovereign/dynamic_config/loaders.py +120 -0
  14. sovereign/error_info.py +61 -0
  15. sovereign/events.py +49 -0
  16. sovereign/logging/access_logger.py +85 -0
  17. sovereign/logging/application_logger.py +54 -0
  18. sovereign/logging/base_logger.py +41 -0
  19. sovereign/logging/bootstrapper.py +36 -0
  20. sovereign/logging/types.py +10 -0
  21. sovereign/middlewares.py +8 -7
  22. sovereign/modifiers/lib.py +2 -1
  23. sovereign/rendering.py +124 -0
  24. sovereign/rendering_common.py +91 -0
  25. sovereign/response_class.py +18 -0
  26. sovereign/server.py +123 -28
  27. sovereign/statistics.py +19 -21
  28. sovereign/templates/base.html +59 -46
  29. sovereign/templates/resources.html +203 -102
  30. sovereign/testing/loaders.py +9 -0
  31. sovereign/{modifiers/test.py → testing/modifiers.py} +0 -2
  32. sovereign/tracing.py +103 -0
  33. sovereign/types.py +304 -0
  34. sovereign/utils/auth.py +27 -13
  35. sovereign/utils/crypto/__init__.py +0 -0
  36. sovereign/utils/crypto/crypto.py +135 -0
  37. sovereign/utils/crypto/suites/__init__.py +21 -0
  38. sovereign/utils/crypto/suites/aes_gcm_cipher.py +42 -0
  39. sovereign/utils/crypto/suites/base_cipher.py +21 -0
  40. sovereign/utils/crypto/suites/disabled_cipher.py +25 -0
  41. sovereign/utils/crypto/suites/fernet_cipher.py +29 -0
  42. sovereign/utils/dictupdate.py +3 -2
  43. sovereign/utils/eds.py +40 -22
  44. sovereign/utils/entry_point_loader.py +18 -0
  45. sovereign/utils/mock.py +60 -17
  46. sovereign/utils/resources.py +17 -0
  47. sovereign/utils/templates.py +4 -2
  48. sovereign/utils/timer.py +5 -3
  49. sovereign/utils/version_info.py +8 -0
  50. sovereign/utils/weighted_clusters.py +2 -1
  51. sovereign/v2/__init__.py +0 -0
  52. sovereign/v2/data/data_store.py +621 -0
  53. sovereign/v2/data/render_discovery_response.py +24 -0
  54. sovereign/v2/data/repositories.py +90 -0
  55. sovereign/v2/data/utils.py +33 -0
  56. sovereign/v2/data/worker_queue.py +273 -0
  57. sovereign/v2/jobs/refresh_context.py +117 -0
  58. sovereign/v2/jobs/render_discovery_job.py +145 -0
  59. sovereign/v2/logging.py +81 -0
  60. sovereign/v2/types.py +41 -0
  61. sovereign/v2/web.py +101 -0
  62. sovereign/v2/worker.py +199 -0
  63. sovereign/views/__init__.py +7 -0
  64. sovereign/views/api.py +82 -0
  65. sovereign/views/crypto.py +46 -15
  66. sovereign/views/discovery.py +52 -67
  67. sovereign/views/healthchecks.py +107 -20
  68. sovereign/views/interface.py +173 -117
  69. sovereign/worker.py +193 -0
  70. {sovereign-0.14.2.dist-info → sovereign-1.0.0a4.dist-info}/METADATA +81 -73
  71. sovereign-1.0.0a4.dist-info/RECORD +85 -0
  72. {sovereign-0.14.2.dist-info → sovereign-1.0.0a4.dist-info}/WHEEL +1 -1
  73. sovereign-1.0.0a4.dist-info/entry_points.txt +46 -0
  74. sovereign_files/__init__.py +0 -0
  75. sovereign_files/static/darkmode.js +51 -0
  76. sovereign_files/static/node_expression.js +42 -0
  77. sovereign_files/static/panel.js +76 -0
  78. sovereign_files/static/resources.css +246 -0
  79. sovereign_files/static/resources.js +642 -0
  80. sovereign_files/static/sass/style.scss +33 -0
  81. sovereign_files/static/style.css +16143 -0
  82. sovereign_files/static/style.css.map +1 -0
  83. sovereign/config_loader.py +0 -225
  84. sovereign/discovery.py +0 -175
  85. sovereign/logs.py +0 -131
  86. sovereign/schemas.py +0 -715
  87. sovereign/sources/__init__.py +0 -3
  88. sovereign/sources/file.py +0 -21
  89. sovereign/sources/inline.py +0 -38
  90. sovereign/sources/lib.py +0 -40
  91. sovereign/sources/poller.py +0 -298
  92. sovereign/static/sass/style.scss +0 -27
  93. sovereign/static/style.css +0 -13553
  94. sovereign/templates/ul_filter.html +0 -22
  95. sovereign/utils/crypto.py +0 -64
  96. sovereign/views/admin.py +0 -120
  97. sovereign-0.14.2.dist-info/LICENSE.txt +0 -13
  98. sovereign-0.14.2.dist-info/RECORD +0 -45
  99. sovereign-0.14.2.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