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.
- {seto-2.2.4 → seto-2.3.1}/PKG-INFO +1 -1
- {seto-2.2.4 → seto-2.3.1}/pyproject.toml +1 -1
- {seto-2.2.4 → seto-2.3.1}/seto/commands/config.py +5 -2
- {seto-2.2.4 → seto-2.3.1}/seto/commands/deploy.py +9 -8
- {seto-2.2.4 → seto-2.3.1}/seto/core/docker.py +10 -3
- {seto-2.2.4 → seto-2.3.1}/LICENSE +0 -0
- {seto-2.2.4 → seto-2.3.1}/LICENSE_HEADER.txt +0 -0
- {seto-2.2.4 → seto-2.3.1}/README.md +0 -0
- {seto-2.2.4 → seto-2.3.1}/seto/__init__.py +0 -0
- {seto-2.2.4 → seto-2.3.1}/seto/__main__.py +0 -0
- {seto-2.2.4 → seto-2.3.1}/seto/commands/down.py +0 -0
- {seto-2.2.4 → seto-2.3.1}/seto/commands/mount.py +0 -0
- {seto-2.2.4 → seto-2.3.1}/seto/commands/setup.py +0 -0
- {seto-2.2.4 → seto-2.3.1}/seto/commands/umount.py +0 -0
- {seto-2.2.4 → seto-2.3.1}/seto/commands/volumes.py +0 -0
- {seto-2.2.4 → seto-2.3.1}/seto/core/command.py +0 -0
- {seto-2.2.4 → seto-2.3.1}/seto/core/dns.py +0 -0
- {seto-2.2.4 → seto-2.3.1}/seto/core/driver.py +0 -0
- {seto-2.2.4 → seto-2.3.1}/seto/core/network.py +0 -0
- {seto-2.2.4 → seto-2.3.1}/seto/core/parser.py +0 -0
- {seto-2.2.4 → seto-2.3.1}/seto/core/permissions.py +0 -0
- {seto-2.2.4 → seto-2.3.1}/seto/core/shell.py +0 -0
- {seto-2.2.4 → seto-2.3.1}/seto/core/swarm.py +0 -0
- {seto-2.2.4 → seto-2.3.1}/seto/core/traefik.py +0 -0
- {seto-2.2.4 → seto-2.3.1}/seto/core/volume.py +0 -0
- {seto-2.2.4 → seto-2.3.1}/seto/drivers/gluster.py +0 -0
- {seto-2.2.4 → seto-2.3.1}/seto/drivers/nfs.py +0 -0
- {seto-2.2.4 → seto-2.3.1}/seto/shells/local.py +0 -0
- {seto-2.2.4 → seto-2.3.1}/seto/shells/remote.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
|
|
|
4
4
|
|
|
5
5
|
[tool.poetry]
|
|
6
6
|
name = "seto"
|
|
7
|
-
version = "2.
|
|
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[
|
|
117
|
+
traefik_http_provider_routers[service_traefik_service] = {
|
|
118
118
|
'entryPoints': [service_traefik_entryPoints],
|
|
119
|
-
'service': service_traefik_service
|
|
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[
|
|
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
|
-
'
|
|
165
|
+
f'DATA_PATH={traefik_http_provider_data_path}',
|
|
165
166
|
],
|
|
166
167
|
'volumes-nfs': {
|
|
167
|
-
'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
|
|
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
|
-
|
|
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
|