seto 2.2.4__tar.gz → 2.3.1__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.
Files changed (29) hide show
  1. {seto-2.2.4 → seto-2.3.1}/PKG-INFO +1 -1
  2. {seto-2.2.4 → seto-2.3.1}/pyproject.toml +1 -1
  3. {seto-2.2.4 → seto-2.3.1}/seto/commands/config.py +5 -2
  4. {seto-2.2.4 → seto-2.3.1}/seto/commands/deploy.py +9 -8
  5. {seto-2.2.4 → seto-2.3.1}/seto/core/docker.py +10 -3
  6. {seto-2.2.4 → seto-2.3.1}/LICENSE +0 -0
  7. {seto-2.2.4 → seto-2.3.1}/LICENSE_HEADER.txt +0 -0
  8. {seto-2.2.4 → seto-2.3.1}/README.md +0 -0
  9. {seto-2.2.4 → seto-2.3.1}/seto/__init__.py +0 -0
  10. {seto-2.2.4 → seto-2.3.1}/seto/__main__.py +0 -0
  11. {seto-2.2.4 → seto-2.3.1}/seto/commands/down.py +0 -0
  12. {seto-2.2.4 → seto-2.3.1}/seto/commands/mount.py +0 -0
  13. {seto-2.2.4 → seto-2.3.1}/seto/commands/setup.py +0 -0
  14. {seto-2.2.4 → seto-2.3.1}/seto/commands/umount.py +0 -0
  15. {seto-2.2.4 → seto-2.3.1}/seto/commands/volumes.py +0 -0
  16. {seto-2.2.4 → seto-2.3.1}/seto/core/command.py +0 -0
  17. {seto-2.2.4 → seto-2.3.1}/seto/core/dns.py +0 -0
  18. {seto-2.2.4 → seto-2.3.1}/seto/core/driver.py +0 -0
  19. {seto-2.2.4 → seto-2.3.1}/seto/core/network.py +0 -0
  20. {seto-2.2.4 → seto-2.3.1}/seto/core/parser.py +0 -0
  21. {seto-2.2.4 → seto-2.3.1}/seto/core/permissions.py +0 -0
  22. {seto-2.2.4 → seto-2.3.1}/seto/core/shell.py +0 -0
  23. {seto-2.2.4 → seto-2.3.1}/seto/core/swarm.py +0 -0
  24. {seto-2.2.4 → seto-2.3.1}/seto/core/traefik.py +0 -0
  25. {seto-2.2.4 → seto-2.3.1}/seto/core/volume.py +0 -0
  26. {seto-2.2.4 → seto-2.3.1}/seto/drivers/gluster.py +0 -0
  27. {seto-2.2.4 → seto-2.3.1}/seto/drivers/nfs.py +0 -0
  28. {seto-2.2.4 → seto-2.3.1}/seto/shells/local.py +0 -0
  29. {seto-2.2.4 → seto-2.3.1}/seto/shells/remote.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: seto
3
- Version: 2.2.4
3
+ Version: 2.3.1
4
4
  Summary: A Docker Swarm Deployment Manager
5
5
  License: Apache 2.0
6
6
  Keywords: docker,swarm,manager
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "seto"
7
- version = "2.2.4"
7
+ version = "2.3.1"
8
8
  description = "A Docker Swarm Deployment Manager"
9
9
  keywords = ["docker", "swarm", "manager"]
10
10
  authors = ["Sébastien Demanou <demsking@gmail.com>"]
@@ -42,6 +42,7 @@ def resolve(
42
42
 
43
43
  compose = {
44
44
  'x-placement': None,
45
+ 'x-placement-hostname': None,
45
46
  'configs': {},
46
47
  'networks': config_networks,
47
48
  'volumes': {},
@@ -50,6 +51,7 @@ def resolve(
50
51
  }
51
52
 
52
53
  def parse(resolved_compose_data: dict, volumes: list[Volume]):
54
+ placement_hostname = resolved_compose_data.get('x-placement-hostname', None)
53
55
  placement = resolved_compose_data.get('x-placement', None)
54
56
  networks_ = resolved_compose_data.get('networks', {})
55
57
  services = resolved_compose_data.get('services', {})
@@ -58,6 +60,7 @@ def resolve(
58
60
  secrets = resolved_compose_data.get('secrets', {})
59
61
 
60
62
  resolved_compose_data['networks'] = {**config_networks, **networks_}
63
+ compose['x-placement-hostname'] = placement_hostname
61
64
  compose['x-placement'] = placement
62
65
  compose['networks'].update(networks_)
63
66
  compose['services'].update(services)
@@ -65,8 +68,8 @@ def resolve(
65
68
  compose['configs'].update(configs)
66
69
  compose['secrets'].update(secrets)
67
70
 
68
- if args.compose and not placement:
69
- raise ValueError('Missing required x-placement field')
71
+ if args.compose and not placement and not placement_hostname:
72
+ raise ValueError('Missing required x-placement or x-placement-hostname field')
70
73
 
71
74
  if execute:
72
75
  execute(resolved_compose_data, placement)
@@ -83,7 +83,7 @@ def parse_compose_config(
83
83
  service_deploy = {
84
84
  'placement': {
85
85
  'constraints': [
86
- f'node.labels.{placement}',
86
+ f'node.labels.{placement}' if '=' in placement else f'node.hostname == {placement}',
87
87
  ],
88
88
  },
89
89
  }
@@ -105,7 +105,7 @@ def parse_compose_config(
105
105
  service_traefik_port = pick_label_value(service_labels, '.loadbalancer.server.port')
106
106
  service_traefik_entryPoints = pick_label_value(service_labels, '.entryPoints')
107
107
  service_traefik_tls_certresolver = pick_label_value(service_labels, '.tls.certresolver')
108
- service_traefik_service = pick_label_value(service_labels, '.service')
108
+ service_traefik_service = pick_label_value(service_labels, '.service') or service_name
109
109
  published_port = random.randint(53100, 64200)
110
110
 
111
111
  if not service_traefik_port:
@@ -114,18 +114,18 @@ def parse_compose_config(
114
114
 
115
115
  service_ports.append(f'{published_port}:{service_traefik_port}')
116
116
 
117
- traefik_http_provider_routers[service_name] = {
117
+ traefik_http_provider_routers[service_traefik_service] = {
118
118
  'entryPoints': [service_traefik_entryPoints],
119
- 'service': service_traefik_service or service_name,
119
+ 'service': service_traefik_service,
120
120
  'rule': service_traefik_rule,
121
- 'middlewares': service_traefik_middlewares.split(','),
121
+ 'middlewares': [item for item in service_traefik_middlewares.split(',') if item],
122
122
  'tls': {
123
123
  'certresolver': service_traefik_tls_certresolver,
124
124
  },
125
125
  }
126
126
 
127
127
  node_ip = resolve_hostname(compose.node_hostname)
128
- traefik_http_provider_services[service_name] = {
128
+ traefik_http_provider_services[service_traefik_service] = {
129
129
  'loadBalancer': {
130
130
  'servers': [
131
131
  {
@@ -152,6 +152,7 @@ def deploy_seto_stack(args, driver: Driver, replica: list[Setting]) -> None:
152
152
  config_networks.update(GLOBAL_NETWORKS)
153
153
 
154
154
  print('Configuring seto-http-provider...')
155
+ traefik_http_provider_data_path = '/data'
155
156
  internal_stack = {
156
157
  'networks': config_networks,
157
158
  'services': {
@@ -161,10 +162,10 @@ def deploy_seto_stack(args, driver: Driver, replica: list[Setting]) -> None:
161
162
  'environment': [
162
163
  'WORKER=1',
163
164
  'EXPIRATION_MINUTES=10',
164
- 'PROVIDERS_DATABASE=/data/providers.db',
165
+ f'DATA_PATH={traefik_http_provider_data_path}',
165
166
  ],
166
167
  'volumes-nfs': {
167
- 'data:/data',
168
+ f'data:{traefik_http_provider_data_path}',
168
169
  },
169
170
  'deploy': {
170
171
  'mode': 'global',
@@ -14,7 +14,6 @@
14
14
  # ==============================================================================
15
15
  import functools
16
16
  import json
17
- from typing import Any
18
17
 
19
18
  from docker import DockerClient
20
19
 
@@ -95,16 +94,24 @@ class Docker:
95
94
 
96
95
  class DockerCompose(Docker):
97
96
  @property
98
- def placement(self) -> dict[str, Any]:
97
+ def placement_hostname(self) -> str | None:
98
+ return self.config['x-placement-hostname']
99
+
100
+ @property
101
+ def placement(self) -> str | None:
99
102
  return self.config['x-placement']
100
103
 
101
104
  @property
102
105
  @functools.lru_cache(maxsize=128)
103
106
  def node_hostname(self) -> str | None:
107
+ if self.placement_hostname:
108
+ return self.placement_hostname
109
+
104
110
  nodes = self.client.nodes.list()
105
111
 
106
112
  label_key, label_value = self.placement.split('==')
107
- value = f'{label_value}'
113
+ label_key = f'{label_key}'.strip()
114
+ value = f'{label_value}'.strip()
108
115
 
109
116
  for node in nodes:
110
117
  if node.attrs['Spec']['Labels'].get(label_key) == value:
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes