sovereign 1.0.0b108__tar.gz → 1.0.0b121__tar.gz

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 (66) hide show
  1. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/PKG-INFO +1 -1
  2. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/pyproject.toml +1 -1
  3. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/statistics.py +5 -18
  4. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/views/discovery.py +15 -5
  5. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/worker.py +7 -2
  6. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/LICENSE.txt +0 -0
  7. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/README.md +0 -0
  8. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/__init__.py +0 -0
  9. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/app.py +0 -0
  10. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/cache.py +0 -0
  11. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/constants.py +0 -0
  12. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/context.py +0 -0
  13. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/dynamic_config/__init__.py +0 -0
  14. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/dynamic_config/deser.py +0 -0
  15. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/dynamic_config/loaders.py +0 -0
  16. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/error_info.py +0 -0
  17. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/logging/access_logger.py +0 -0
  18. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/logging/application_logger.py +0 -0
  19. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/logging/base_logger.py +0 -0
  20. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/logging/bootstrapper.py +0 -0
  21. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/logging/types.py +0 -0
  22. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/middlewares.py +0 -0
  23. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/modifiers/__init__.py +0 -0
  24. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/modifiers/lib.py +0 -0
  25. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/rendering.py +0 -0
  26. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/response_class.py +0 -0
  27. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/schemas.py +0 -0
  28. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/server.py +0 -0
  29. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/sources/__init__.py +0 -0
  30. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/sources/file.py +0 -0
  31. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/sources/inline.py +0 -0
  32. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/sources/lib.py +0 -0
  33. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/sources/poller.py +0 -0
  34. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/static/node_expression.js +0 -0
  35. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/static/panel.js +0 -0
  36. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/static/sass/style.scss +0 -0
  37. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/static/style.css +0 -0
  38. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/templates/base.html +0 -0
  39. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/templates/err.html +0 -0
  40. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/templates/resources.html +0 -0
  41. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/testing/loaders.py +0 -0
  42. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/testing/modifiers.py +0 -0
  43. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/tracing.py +0 -0
  44. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/utils/__init__.py +0 -0
  45. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/utils/auth.py +0 -0
  46. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/utils/crypto/__init__.py +0 -0
  47. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/utils/crypto/crypto.py +0 -0
  48. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/utils/crypto/suites/__init__.py +0 -0
  49. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/utils/crypto/suites/aes_gcm_cipher.py +0 -0
  50. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/utils/crypto/suites/base_cipher.py +0 -0
  51. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/utils/crypto/suites/disabled_cipher.py +0 -0
  52. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/utils/crypto/suites/fernet_cipher.py +0 -0
  53. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/utils/dictupdate.py +0 -0
  54. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/utils/eds.py +0 -0
  55. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/utils/entry_point_loader.py +0 -0
  56. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/utils/mock.py +0 -0
  57. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/utils/resources.py +0 -0
  58. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/utils/templates.py +0 -0
  59. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/utils/timer.py +0 -0
  60. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/utils/version_info.py +0 -0
  61. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/utils/weighted_clusters.py +0 -0
  62. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/views/__init__.py +0 -0
  63. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/views/api.py +0 -0
  64. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/views/crypto.py +0 -0
  65. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/views/healthchecks.py +0 -0
  66. {sovereign-1.0.0b108 → sovereign-1.0.0b121}/src/sovereign/views/interface.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sovereign
3
- Version: 1.0.0b108
3
+ Version: 1.0.0b121
4
4
  Summary: Envoy Proxy control-plane written in Python
5
5
  Home-page: https://pypi.org/project/sovereign/
6
6
  License: Apache-2.0
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "sovereign"
3
- version = "1.0.0b108"
3
+ version = "1.0.0b121"
4
4
  description = "Envoy Proxy control-plane written in Python"
5
5
  license = "Apache-2.0"
6
6
  packages = [
@@ -3,15 +3,12 @@ from typing import Optional, Any, Callable, Dict
3
3
  from functools import wraps
4
4
  from sovereign.schemas import config as sovereign_config
5
5
 
6
- emitted: Dict[str, Any] = dict()
7
-
8
6
  STATSD: Dict[str, Optional["StatsDProxy"]] = {"instance": None}
9
7
 
10
8
 
11
9
  class StatsDProxy:
12
10
  def __init__(self, statsd_instance: Optional[Any] = None) -> None:
13
11
  self.statsd = statsd_instance
14
- self.emitted = emitted
15
12
 
16
13
  def __getattr__(self, item: str) -> Any:
17
14
  if self.statsd is not None:
@@ -23,13 +20,11 @@ class StatsDProxy:
23
20
 
24
21
  def do_nothing(self, *args: Any, **kwargs: Any) -> None:
25
22
  k = args[0]
26
- emitted[k] = emitted.setdefault(k, 0) + 1
27
23
 
28
24
 
29
25
  class StatsdNoop:
30
- def __init__(self, *args: Any, **kwargs: Any) -> None:
31
- k = args[0]
32
- emitted[k] = emitted.setdefault(k, 0) + 1
26
+ def __init__(self, *args, **kwargs):
27
+ pass
33
28
 
34
29
  def __enter__(self): # type: ignore
35
30
  return self
@@ -52,17 +47,9 @@ def configure_statsd() -> StatsDProxy:
52
47
  try:
53
48
  from datadog import DogStatsd
54
49
 
55
- class CustomStatsd(DogStatsd): # type: ignore
56
- def _report(self, *args, **kwargs) -> None: # type: ignore
57
- super()._report(*args, **kwargs)
58
- # Capture the metric name and increment its count for debugging
59
- if metric := kwargs.get("metric"):
60
- self.emitted: Dict[str, Any] = dict()
61
- self.emitted[metric] = self.emitted.setdefault(metric, 0) + 1
62
-
63
- module: Optional[CustomStatsd]
64
- module = CustomStatsd()
65
- if config.enabled:
50
+ module: Optional[DogStatsd]
51
+ module = DogStatsd()
52
+ if config.enabled and module:
66
53
  module.host = config.host
67
54
  module.port = config.port
68
55
  module.namespace = config.namespace
@@ -10,8 +10,17 @@ from sovereign.schemas import (
10
10
  )
11
11
 
12
12
 
13
- def not_modified() -> Response:
14
- return Response(status_code=304)
13
+ def response_headers(
14
+ discovery_request: DiscoveryRequest, response: cache.Entry, xds: str
15
+ ) -> dict[str, str]:
16
+ return {
17
+ "X-Sovereign-Client-Build": discovery_request.envoy_version,
18
+ "X-Sovereign-Client-Version": discovery_request.version_info,
19
+ "X-Sovereign-Requested-Resources": ",".join(discovery_request.resource_names)
20
+ or "all",
21
+ "X-Sovereign-Requested-Type": xds,
22
+ "X-Sovereign-Response-Version": response.version,
23
+ }
15
24
 
16
25
 
17
26
  router = APIRouter()
@@ -51,11 +60,12 @@ async def discovery_response(
51
60
  XDS_CLIENT_VERSION=xds_req.version_info,
52
61
  XDS_SERVER_VERSION=entry.version,
53
62
  )
63
+ headers = response_headers(xds_req, entry, xds_type)
54
64
  if entry.len == 0:
55
- return Response(status_code=404)
65
+ return Response(status_code=404, headers=headers)
56
66
  if entry.version == xds_req.version_info:
57
- return not_modified()
58
- return Response(entry.text, media_type="application/json")
67
+ return Response(status_code=304, headers=headers)
68
+ return Response(entry.text, media_type="application/json", headers=headers)
59
69
 
60
70
  if entry := await cache.blocking_read(xds_req):
61
71
  return handle_response(entry)
@@ -62,12 +62,17 @@ if config.sources is not None:
62
62
 
63
63
  def render(job: rendering.RenderJob):
64
64
  log.debug(f"Spawning render process for {job.id}")
65
- Process(target=rendering.generate, args=[job]).start()
65
+ process = Process(target=rendering.generate, args=[job])
66
+ process.start()
67
+ return process
66
68
 
67
69
 
68
70
  async def submit_render(job: rendering.RenderJob):
69
71
  async with RENDER_SEMAPHORE:
70
- render(job)
72
+ process = render(job)
73
+ # Wait for the process to complete to ensure semaphore is held
74
+ # until the actual rendering work is done
75
+ await asyncio.get_event_loop().run_in_executor(None, process.join)
71
76
 
72
77
 
73
78
  async def render_on_event():
File without changes
File without changes