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
@@ -1,22 +0,0 @@
1
- <script>
2
- function filter_results(id, list) {
3
- // Declare variables
4
- let input, filter, container, iterable, resource, i, txtValue;
5
- input = document.getElementById(id);
6
- filter = input.value.toUpperCase();
7
-
8
- container = document.getElementById(list);
9
- iterable = container.getElementsByTagName("a");
10
-
11
- // Loop through all list items, and hide those who don't match the search query
12
- for (i = 0; i < iterable.length; i++) {
13
- resource = iterable[i];
14
- txtValue = resource.textContent;
15
- if (txtValue.toUpperCase().indexOf(filter) > -1) {
16
- iterable[i].style.display = "";
17
- } else {
18
- iterable[i].style.display = "none";
19
- }
20
- }
21
- }
22
- </script>
sovereign/utils/crypto.py DELETED
@@ -1,64 +0,0 @@
1
- from functools import partial
2
- from collections import namedtuple
3
- from typing import Optional, Any
4
- from cryptography.fernet import Fernet, InvalidToken
5
- from fastapi.exceptions import HTTPException
6
-
7
-
8
- CipherSuite = namedtuple("CipherSuite", "encrypt decrypt key_available")
9
-
10
-
11
- class DisabledSuite:
12
- @staticmethod
13
- def encrypt(_: bytes) -> bytes:
14
- return b"Unavailable (No Secret Key)"
15
-
16
- @staticmethod
17
- def decrypt(*_: bytes) -> str:
18
- return "Unavailable (No Secret Key)"
19
-
20
-
21
- def create_cipher_suite(key: bytes, logger: Any) -> CipherSuite:
22
- try:
23
- fernet = Fernet(key)
24
- return CipherSuite(partial(encrypt, fernet), partial(decrypt, fernet), True)
25
- except TypeError:
26
- pass
27
- except ValueError as e:
28
- if key not in (b"", ""):
29
- logger.application_log(
30
- event=f"Fernet key was provided, but appears to be invalid: {repr(e)}"
31
- )
32
- return CipherSuite(DisabledSuite.encrypt, DisabledSuite.decrypt, False)
33
-
34
-
35
- def generate_key() -> str:
36
- secret: bytes = Fernet.generate_key()
37
- return secret.decode()
38
-
39
-
40
- def encrypt(cipher_suite: Fernet, data: str, key: Optional[str] = None) -> str:
41
- _local_cipher_suite = cipher_suite
42
- if isinstance(key, str):
43
- _local_cipher_suite = Fernet(key.encode())
44
- try:
45
- encrypted: bytes = _local_cipher_suite.encrypt(data.encode())
46
- except (InvalidToken, AttributeError):
47
- # TODO: defer this http error to later, return a normal error here
48
- raise HTTPException(status_code=400, detail="Encryption failed")
49
- return encrypted.decode()
50
-
51
-
52
- def decrypt(cipher_suite: Fernet, data: str, key: Optional[str] = None) -> str:
53
- _local_cipher_suite = cipher_suite
54
- if key is not None:
55
- _local_cipher_suite = Fernet(key.encode())
56
- try:
57
- decrypted = _local_cipher_suite.decrypt(data.encode())
58
- except (InvalidToken, AttributeError):
59
- # TODO: defer this http error to later, return a normal error here
60
- raise HTTPException(status_code=400, detail="Decryption failed")
61
- if isinstance(decrypted, bytes):
62
- return decrypted.decode()
63
- else:
64
- return decrypted
sovereign/views/admin.py DELETED
@@ -1,120 +0,0 @@
1
- import yaml
2
- from typing import Any, Dict, List
3
- from collections import defaultdict
4
- from fastapi import APIRouter, Query
5
- from fastapi.responses import JSONResponse
6
- from fastapi.encoders import jsonable_encoder
7
- from sovereign import config, stats, poller, template_context
8
- from sovereign.discovery import select_template
9
- from sovereign.schemas import Resources
10
- from sovereign.utils.mock import mock_discovery_request
11
- from sovereign.views.discovery import perform_discovery
12
-
13
- router = APIRouter()
14
-
15
-
16
- @router.get("/xds_dump", summary="Displays all xDS resources as JSON")
17
- async def display_config(
18
- xds_type: str = Query(
19
- ..., title="xDS type", description="The type of request", example="clusters"
20
- ),
21
- service_cluster: str = Query(
22
- "*", title="The clients service cluster to emulate in this XDS request"
23
- ),
24
- resource_names: List[str] = Query([], title="Envoy Resource names to request"),
25
- region: str = Query(
26
- None, title="The clients region to emulate in this XDS request"
27
- ),
28
- version: str = Query(
29
- "1.11.1", title="The clients envoy version to emulate in this XDS request"
30
- ),
31
- ) -> JSONResponse:
32
- ret: Dict[str, List[Dict[str, Any]]] = defaultdict(list)
33
- mock_request = mock_discovery_request(
34
- service_cluster=service_cluster,
35
- resource_names=Resources(resource_names),
36
- version=version,
37
- region=region,
38
- )
39
- response = perform_discovery(mock_request, "v3", xds_type, skip_auth=True)
40
- ret["resources"] += response.resources
41
- safe_response = jsonable_encoder(ret)
42
- return JSONResponse(content=safe_response)
43
-
44
-
45
- @router.get(
46
- "/debug_template",
47
- summary="Dumps raw representation of template output before serialization/extra processing",
48
- )
49
- async def debug_template(
50
- xds_type: str = Query(
51
- ..., title="xDS type", description="The type of request", example="clusters"
52
- ),
53
- service_cluster: str = Query(
54
- "*", title="The clients service cluster to emulate in this XDS request"
55
- ),
56
- resource_names: str = Query("", title="Envoy Resource names to request"),
57
- region: str = Query(
58
- None, title="The clients region to emulate in this XDS request"
59
- ),
60
- version: str = Query(
61
- "1.11.1", title="The clients envoy version to emulate in this XDS request"
62
- ),
63
- ) -> JSONResponse:
64
- mock_request = mock_discovery_request(
65
- service_cluster=service_cluster,
66
- resource_names=resource_names.split(","),
67
- version=version,
68
- region=region,
69
- )
70
- template = select_template(mock_request, xds_type)
71
- context = template_context.get_context(mock_request, template)
72
- context = dict(
73
- discovery_request=mock_request,
74
- host_header="debug",
75
- resource_names=mock_request.resources,
76
- **context,
77
- )
78
- raw_template_content = template(**context)
79
- safe_response = jsonable_encoder(raw_template_content)
80
- return JSONResponse(content=safe_response)
81
-
82
-
83
- @router.get(
84
- "/source_dump",
85
- summary="Displays all sources that this Sovereign has polled as JSON",
86
- )
87
- def instances(
88
- service_cluster: str = Query(
89
- "*", title="The clients service cluster to emulate in this XDS request"
90
- ),
91
- modified: str = Query(
92
- "yes",
93
- title="Whether the sources should run Modifiers/Global Modifiers prior to being returned",
94
- ),
95
- ) -> JSONResponse:
96
- node = mock_discovery_request(service_cluster=service_cluster).node
97
- args = {
98
- "modify": yaml.safe_load(modified),
99
- "node_value": poller.extract_node_key(node),
100
- }
101
- ret = poller.match_node(**args)
102
- safe_response = jsonable_encoder(ret)
103
- return JSONResponse(content=safe_response)
104
-
105
-
106
- @router.get("/config", summary="Display the current Sovereign configuration")
107
- def show_configuration() -> JSONResponse:
108
- safe_response = jsonable_encoder(config.show())
109
- return JSONResponse(content=safe_response)
110
-
111
-
112
- @router.get("/stats", summary="Displays all metrics emitted and their counters")
113
- def show_stats() -> JSONResponse:
114
- return JSONResponse(content=stats.emitted)
115
-
116
-
117
- @router.get("/templates", summary="Display the currently loaded XDS templates")
118
- def show_templates() -> JSONResponse:
119
- safe_response = jsonable_encoder(config.xds_templates())
120
- return JSONResponse(content=safe_response)
@@ -1,13 +0,0 @@
1
- Copyright @ 2018 Atlassian Pty Ltd
2
-
3
- Licensed under the Apache License, Version 2.0 (the "License");
4
- you may not use this file except in compliance with the License.
5
- You may obtain a copy of the License at
6
-
7
- http://www.apache.org/licenses/LICENSE-2.0
8
-
9
- Unless required by applicable law or agreed to in writing, software
10
- distributed under the License is distributed on an "AS IS" BASIS,
11
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- See the License for the specific language governing permissions and
13
- limitations under the License.
@@ -1,45 +0,0 @@
1
- sovereign/__init__.py,sha256=tF3gyrsCZuk0rRiM-ug8btl-ozU8A0gXf_dZZ_heFW0,3017
2
- sovereign/app.py,sha256=zuqiwqXbZVlR0rl1aJ_J1axiLuUNqeRZYwRJtY-azvc,4020
3
- sovereign/config_loader.py,sha256=uapcAZlfhchuJEhlnO9oSl400Ykzi3Ies_F9qEiE5sg,6396
4
- sovereign/context.py,sha256=SwYDpqYWD8QvGLSpJ_P0l2_6uvxBWqsWPC4wd2XWPlA,4191
5
- sovereign/discovery.py,sha256=P_qRgjjE5hX7SOGl5BBWnbm_k2KmVCBx_qiKynpTUeM,5846
6
- sovereign/logs.py,sha256=DZK6F3LMxhch96qFasdXA6NPlQHJcKbjD83_S8W6Rds,4340
7
- sovereign/middlewares.py,sha256=LMSNISF0nZEzSVVsRHbpC0BIH51iz0G1hkG1sQEEhtw,3026
8
- sovereign/modifiers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
- sovereign/modifiers/lib.py,sha256=DbXsxrrjnFE4Y7rbwpeiM5tS5w5NBwSdYH58AtDTP0I,2884
10
- sovereign/modifiers/test.py,sha256=7_c2hWXn_sYJ6997N1_uSWtClOikcOzu1yRCY56-l-4,361
11
- sovereign/schemas.py,sha256=S5On-xy2IKna2jjS0nglhdZw3fKcWYtiGyQ48kQPo0M,24978
12
- sovereign/server.py,sha256=K9Zfw2d-I20s0F8-DeFHTg0B65IRluDalqSyJHQo67Y,825
13
- sovereign/sources/__init__.py,sha256=g9hEpFk8j5i1ApHQpbc9giTyJW41Ppgsqv5P9zGxOJk,78
14
- sovereign/sources/file.py,sha256=A4UWoRU39v2Ex5Mtdl_uw53iMkslYylF4CiiwW7LOpk,689
15
- sovereign/sources/inline.py,sha256=bNqVZyelcUofYBWHFOUIhOUU9az32CdBEfaYRzNzFFE,1002
16
- sovereign/sources/lib.py,sha256=LIbnlKkL0bQT10y4GT2E8yypjYxqfJYbB9FkGB5C2oc,1030
17
- sovereign/sources/poller.py,sha256=u1XMjkw6oCXWL8Uh3TPuHYKwIIj-86VF-iVzlHPkIKU,11044
18
- sovereign/static/sass/style.scss,sha256=tPHPEm3sZeBFGDyyn3pHcA-nbaKT-h-UsSTsf6dHNDU,1158
19
- sovereign/static/style.css,sha256=vG8HPsbCbPIZfHgy7gSeof97Pnp0okkyaXyJzIEEW-8,447517
20
- sovereign/statistics.py,sha256=Xfj4oWMfCkbYc2ibF7rDUpbw6Zw6dI4N5BpCLDQc4j4,2336
21
- sovereign/templates/base.html,sha256=5vw3-NmN291pXRdArpCwhSce9bAYBWCJVRhvO5EmE9g,2296
22
- sovereign/templates/err.html,sha256=a3cEzOqyqWOIe3YxfTEjkxbTfxBxq1knD6GwzEFljfs,603
23
- sovereign/templates/resources.html,sha256=NnrnamWg_vJjY88efsMcjNsldg-K9TZnp6tFS5tkZOU,6366
24
- sovereign/templates/ul_filter.html,sha256=LrzZv5408Qq5UP4lcHVRwY2G6lXd3IiSNiJn1aH7Yqo,666
25
- sovereign/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
- sovereign/utils/auth.py,sha256=9rruWP-Ok8ec9l_MzWY3oUZKI8s7jt0Dmx3kHWnTRgQ,1772
27
- sovereign/utils/crypto.py,sha256=1PmPYL8kb9OlXp0074UHLqVJHPpj9p65Yts_2IEECT8,2156
28
- sovereign/utils/dictupdate.py,sha256=CMBJRV4cATY06n6hfWcl9Euo-tOG6QuKad8wXyyabRY,2555
29
- sovereign/utils/eds.py,sha256=3NwvQpFMxeWJ8pT1XhzqikrgT26HjObms4Ieh3hivOM,3894
30
- sovereign/utils/mock.py,sha256=jB6ehRdoGcgbrzAoSBnlr_zOuN1ghzVtVg4QiUcFENQ,1110
31
- sovereign/utils/templates.py,sha256=FE_H_oE7VrS3X_VN1z_g10b9-rpmi1_gL-cMxi5XtXU,1057
32
- sovereign/utils/timer.py,sha256=_dUtEasj0BKbWYuQ_T3HFIyjurXXj-La-dNSMAwKMSo,795
33
- sovereign/utils/version_info.py,sha256=vbAiUyz6v3-zSOoS-7HwrvJie729RgIKy0Bt091Z6RE,349
34
- sovereign/utils/weighted_clusters.py,sha256=bPzuRE7Qgvv04HcR2AhMDvBrFlZ8AfteweLKhY9SvWg,1166
35
- sovereign/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
- sovereign/views/admin.py,sha256=CO2Herse3yUmwX656I13TpOtaxLhEbejUW_ChMEFTVA,4300
37
- sovereign/views/crypto.py,sha256=nxp6bkPU9GZw_zOk0fsJdz_XRQPXxPI6cXQDL9-cigU,2041
38
- sovereign/views/discovery.py,sha256=qE4Gf8U8F3N1UzhObN6Qwa0G9kBOvi7KceG7qhN-Qgg,3953
39
- sovereign/views/healthchecks.py,sha256=QqTwut2igV1-033khsqKSOTTju-b7w7UYioy_PQ2cjY,1351
40
- sovereign/views/interface.py,sha256=s7GGBdxh1ZiRxPfQttIZTc0bMXxt7cvh4XlaD1KAYHE,7075
41
- sovereign-0.14.2.dist-info/entry_points.txt,sha256=kOn848ucVbNvtsGABDuwzOHmNiOb0Ey8dV85Z3dLv3Y,222
42
- sovereign-0.14.2.dist-info/LICENSE.txt,sha256=2X125zvAb9AYLjCgdMDQZuufhm0kwcg31A8pGKj_-VY,560
43
- sovereign-0.14.2.dist-info/WHEEL,sha256=V7iVckP-GYreevsTDnv1eAinQt_aArwnAxmnP0gygBY,83
44
- sovereign-0.14.2.dist-info/METADATA,sha256=8LCGci3a_eZdBe8DqBUpSQTabt-Xnbd2uCO8Z__3fmg,6082
45
- sovereign-0.14.2.dist-info/RECORD,,
@@ -1,10 +0,0 @@
1
- [console_scripts]
2
- sovereign=sovereign.server:main
3
-
4
- [sovereign.modifiers]
5
- sovereign_3rd_party_test=sovereign.modifiers.test:Test
6
-
7
- [sovereign.sources]
8
- file=sovereign.sources.file:File
9
- inline=sovereign.sources.inline:Inline
10
-