raijin-server 0.2.39__py3-none-any.whl → 0.2.41__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 raijin-server might be problematic. Click here for more details.

raijin_server/__init__.py CHANGED
@@ -1,5 +1,5 @@
1
1
  """Pacote principal do CLI Raijin Server."""
2
2
 
3
- __version__ = "0.2.39"
3
+ __version__ = "0.2.41"
4
4
 
5
5
  __all__ = ["__version__"]
@@ -1,5 +1,6 @@
1
1
  """Deploy do MinIO via Helm com configuracoes production-ready."""
2
2
 
3
+ import json
3
4
  import secrets
4
5
  import socket
5
6
  import tempfile
@@ -15,7 +16,6 @@ LOCAL_PATH_PROVISIONER_URL = (
15
16
  "https://raw.githubusercontent.com/rancher/local-path-provisioner/"
16
17
  "v0.0.30/deploy/local-path-storage.yaml"
17
18
  )
18
- RAIJIN_LOCAL_PATH_SC_NAME = "raijin-local-path"
19
19
 
20
20
 
21
21
  def _detect_node_name(ctx: ExecutionContext) -> str:
@@ -58,28 +58,6 @@ def _apply_manifest(ctx: ExecutionContext, manifest: str, description: str) -> b
58
58
  tmp_path.unlink(missing_ok=True)
59
59
 
60
60
 
61
- def _create_raijin_local_path_sc(ctx: ExecutionContext) -> bool:
62
- """Cria StorageClass com volumeBindingMode=Immediate baseada no local-path."""
63
- manifest = textwrap.dedent(
64
- f"""
65
- apiVersion: storage.k8s.io/v1
66
- kind: StorageClass
67
- metadata:
68
- name: {RAIJIN_LOCAL_PATH_SC_NAME}
69
- provisioner: rancher.io/local-path
70
- reclaimPolicy: Delete
71
- volumeBindingMode: Immediate
72
- allowVolumeExpansion: true
73
- parameters:
74
- type: ""
75
- """
76
- ).strip()
77
- typer.echo(
78
- f"Criando StorageClass '{RAIJIN_LOCAL_PATH_SC_NAME}' com binding imediato para PVCs do MinIO..."
79
- )
80
- return _apply_manifest(ctx, manifest, f"StorageClass {RAIJIN_LOCAL_PATH_SC_NAME}")
81
-
82
-
83
61
  def _get_default_storage_class(ctx: ExecutionContext) -> str:
84
62
  """Retorna o nome da StorageClass default do cluster, se existir."""
85
63
  result = run_cmd(
@@ -107,6 +85,102 @@ def _list_storage_classes(ctx: ExecutionContext) -> list:
107
85
  return []
108
86
 
109
87
 
88
+ def _patch_local_path_provisioner_tolerations(ctx: ExecutionContext) -> None:
89
+ """Adiciona tolerations ao local-path-provisioner para rodar em control-plane."""
90
+ typer.echo(" Configurando tolerations no local-path-provisioner...")
91
+
92
+ # Patch no deployment para tolerar control-plane
93
+ patch_deployment = textwrap.dedent(
94
+ """
95
+ spec:
96
+ template:
97
+ spec:
98
+ tolerations:
99
+ - key: node-role.kubernetes.io/control-plane
100
+ operator: Exists
101
+ effect: NoSchedule
102
+ - key: node-role.kubernetes.io/master
103
+ operator: Exists
104
+ effect: NoSchedule
105
+ """
106
+ ).strip()
107
+
108
+ result = run_cmd(
109
+ [
110
+ "kubectl", "-n", "local-path-storage", "patch", "deployment",
111
+ "local-path-provisioner", "--patch", patch_deployment,
112
+ ],
113
+ ctx,
114
+ check=False,
115
+ )
116
+ if result.returncode == 0:
117
+ typer.secho(" ✓ Deployment patched com tolerations.", fg=typer.colors.GREEN)
118
+
119
+ # Patch no ConfigMap para os helper pods (que criam os dirs no node)
120
+ # O local-path-provisioner usa um ConfigMap com helperPod template
121
+ helper_pod_config = {
122
+ "nodePathMap": [
123
+ {
124
+ "node": "DEFAULT_PATH_FOR_NON_LISTED_NODES",
125
+ "paths": ["/opt/local-path-provisioner"]
126
+ }
127
+ ],
128
+ "setupCommand": None,
129
+ "teardownCommand": None,
130
+ "helperPod": {
131
+ "apiVersion": "v1",
132
+ "kind": "Pod",
133
+ "metadata": {},
134
+ "spec": {
135
+ "tolerations": [
136
+ {"key": "node-role.kubernetes.io/control-plane", "operator": "Exists", "effect": "NoSchedule"},
137
+ {"key": "node-role.kubernetes.io/master", "operator": "Exists", "effect": "NoSchedule"}
138
+ ],
139
+ "containers": [
140
+ {
141
+ "name": "helper-pod",
142
+ "image": "busybox:stable",
143
+ "imagePullPolicy": "IfNotPresent"
144
+ }
145
+ ]
146
+ }
147
+ }
148
+ }
149
+
150
+ # Converte para JSON string para o patch
151
+ config_json_str = json.dumps(helper_pod_config)
152
+ patch_data = json.dumps({"data": {"config.json": config_json_str}})
153
+
154
+ # Aplica via patch no ConfigMap
155
+ result = run_cmd(
156
+ [
157
+ "kubectl", "-n", "local-path-storage", "patch", "configmap",
158
+ "local-path-config", "--type=merge", "-p", patch_data,
159
+ ],
160
+ ctx,
161
+ check=False,
162
+ )
163
+ if result.returncode == 0:
164
+ typer.secho(" ✓ ConfigMap patched para helper pods.", fg=typer.colors.GREEN)
165
+
166
+ # Reinicia o deployment para aplicar as mudanças
167
+ run_cmd(
168
+ ["kubectl", "-n", "local-path-storage", "rollout", "restart", "deployment/local-path-provisioner"],
169
+ ctx,
170
+ check=False,
171
+ )
172
+
173
+ # Aguarda rollout
174
+ run_cmd(
175
+ [
176
+ "kubectl", "-n", "local-path-storage", "rollout", "status",
177
+ "deployment/local-path-provisioner", "--timeout=60s",
178
+ ],
179
+ ctx,
180
+ check=False,
181
+ )
182
+
183
+
110
184
  def _install_local_path_provisioner(ctx: ExecutionContext) -> bool:
111
185
  """Instala local-path-provisioner para usar storage local (NVMe/SSD)."""
112
186
  typer.echo("Instalando local-path-provisioner para storage local...")
@@ -120,7 +194,7 @@ def _install_local_path_provisioner(ctx: ExecutionContext) -> bool:
120
194
  typer.secho(" Falha ao instalar local-path-provisioner.", fg=typer.colors.RED)
121
195
  return False
122
196
 
123
- # Aguarda deployment ficar pronto
197
+ # Aguarda deployment ficar pronto inicialmente
124
198
  typer.echo(" Aguardando local-path-provisioner ficar Ready...")
125
199
  run_cmd(
126
200
  [
@@ -131,7 +205,10 @@ def _install_local_path_provisioner(ctx: ExecutionContext) -> bool:
131
205
  check=False,
132
206
  )
133
207
 
134
- typer.secho(" ✓ local-path-provisioner instalado.", fg=typer.colors.GREEN)
208
+ # Aplica tolerations para control-plane (single-node clusters)
209
+ _patch_local_path_provisioner_tolerations(ctx)
210
+
211
+ typer.secho(" ✓ local-path-provisioner instalado e configurado.", fg=typer.colors.GREEN)
135
212
  return True
136
213
 
137
214
 
@@ -169,29 +246,22 @@ def _ensure_storage_class(ctx: ExecutionContext) -> str:
169
246
  default_sc = _get_default_storage_class(ctx)
170
247
  available = _list_storage_classes(ctx)
171
248
 
172
- # Se ja houver StorageClass dedicada do Raijin, usa ela
173
- if default_sc == RAIJIN_LOCAL_PATH_SC_NAME:
174
- typer.echo(f"StorageClass default detectada: {default_sc}")
175
- return default_sc
176
- if RAIJIN_LOCAL_PATH_SC_NAME in available:
177
- typer.echo(f"StorageClass '{RAIJIN_LOCAL_PATH_SC_NAME}' detectada.")
178
- _set_default_storage_class(ctx, RAIJIN_LOCAL_PATH_SC_NAME)
179
- return RAIJIN_LOCAL_PATH_SC_NAME
180
-
181
- # Se ja existir default diferente de local-path, respeita configuracao do cluster
182
- if default_sc and default_sc != "local-path":
249
+ # Se ja existir default (qualquer uma), usa ela
250
+ if default_sc:
183
251
  typer.echo(f"StorageClass default detectada: {default_sc}")
252
+ # Se for local-path, garante que o provisioner tem tolerations
253
+ if default_sc == "local-path" or "local-path" in available:
254
+ _patch_local_path_provisioner_tolerations(ctx)
184
255
  return default_sc
185
256
 
186
- # Se local-path estiver disponivel (default ou nao), cria uma classe dedicada com binding imediato
187
- if "local-path" in available or default_sc == "local-path":
188
- if _create_raijin_local_path_sc(ctx):
189
- _set_default_storage_class(ctx, RAIJIN_LOCAL_PATH_SC_NAME)
190
- return RAIJIN_LOCAL_PATH_SC_NAME
191
- typer.echo("Nao foi possivel criar StorageClass dedicada; usando 'local-path'.")
257
+ # Se local-path estiver disponivel mas nao for default, define como default
258
+ if "local-path" in available:
259
+ typer.echo("StorageClass 'local-path' detectada.")
260
+ _patch_local_path_provisioner_tolerations(ctx)
192
261
  _set_default_storage_class(ctx, "local-path")
193
262
  return "local-path"
194
263
 
264
+ # Se houver outras classes disponiveis, pergunta qual usar
195
265
  if available:
196
266
  typer.echo(f"StorageClasses disponiveis (sem default): {', '.join(available)}")
197
267
  choice = typer.prompt(
@@ -219,10 +289,6 @@ def _ensure_storage_class(ctx: ExecutionContext) -> str:
219
289
  if not _install_local_path_provisioner(ctx):
220
290
  raise typer.Exit(1)
221
291
 
222
- if _create_raijin_local_path_sc(ctx):
223
- _set_default_storage_class(ctx, RAIJIN_LOCAL_PATH_SC_NAME)
224
- return RAIJIN_LOCAL_PATH_SC_NAME
225
-
226
292
  _set_default_storage_class(ctx, "local-path")
227
293
  return "local-path"
228
294
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: raijin-server
3
- Version: 0.2.39
3
+ Version: 0.2.41
4
4
  Summary: CLI para automacao de setup e hardening de servidores Ubuntu Server.
5
5
  Home-page: https://example.com/raijin-server
6
6
  Author: Equipe Raijin
@@ -1,4 +1,4 @@
1
- raijin_server/__init__.py,sha256=xacey6j4K59BQrjBoDCtOtRtB9BSq7vxACgXc8_pFlg,95
1
+ raijin_server/__init__.py,sha256=W9tq6k7VO0G-6o3OJv__0gbA0QirZV0MPWTWHqZmaCs,95
2
2
  raijin_server/cli.py,sha256=2m7q1znMLbBdnUwN6oOUrCZXEqC2e7SfbjYkymbP4lQ,37884
3
3
  raijin_server/config.py,sha256=QNiEVvrbW56XgvNn5-h3bkJm46Xc8mjNqPbvixXD8N0,4829
4
4
  raijin_server/healthchecks.py,sha256=lzXdFw6S0hOYbUKbqksh4phb04lXgXdTspP1Dsz4dx8,15401
@@ -22,7 +22,7 @@ raijin_server/modules/kong.py,sha256=eDSagvEP9_BCs9pZ-pCVs1BDdlYOoJfY5PnUSiTvvgc
22
22
  raijin_server/modules/kubernetes.py,sha256=9E6zV0zGQWZW92NVpxwYctpi-4JDmi6YzF3tKRI4HlU,13343
23
23
  raijin_server/modules/loki.py,sha256=aNiUpnOFppZMXoQwYhn7IoPMzwUz4aHi6pbiqj1PRjc,5022
24
24
  raijin_server/modules/metallb.py,sha256=uUuklc_RsQ-W2qDVRMQAxQm9HKGEqso444b1IwBpM6w,8554
25
- raijin_server/modules/minio.py,sha256=KSpoFP7RhXpDCaubHLo0amy6NWWVfdp5tuj8qVDB4tQ,15265
25
+ raijin_server/modules/minio.py,sha256=_OrtFMoJBDKufh3U7_Cf2X3F9R-KaAfjQm-ok8YPT1U,17230
26
26
  raijin_server/modules/network.py,sha256=QRlYdcryCCPAWG3QQ_W7ld9gJgETI7H8gwntOU7UqFE,4818
27
27
  raijin_server/modules/observability_dashboards.py,sha256=fVz0WEOQrUTF5rJ__Nu_onyBuwL_exFmysWMmg8AE9w,7319
28
28
  raijin_server/modules/observability_ingress.py,sha256=Fh1rlFWueBNHnOkHuoHYyhILmpO-iQXINybSUYbYsHQ,5738
@@ -38,9 +38,9 @@ raijin_server/scripts/checklist.sh,sha256=j6E0Kmk1EfjLvKK1VpCqzXJAXI_7Bm67LK4ndy
38
38
  raijin_server/scripts/install.sh,sha256=Y1ickbQ4siQ0NIPs6UgrqUr8WWy7U0LHmaTQbEgavoI,3949
39
39
  raijin_server/scripts/log_size_metric.sh,sha256=Iv4SsX8AuCYRou-klYn32mX41xB6j0xJGLBO6riw4rU,1208
40
40
  raijin_server/scripts/pre-deploy-check.sh,sha256=XqMo7IMIpwUHF17YEmU0-cVmTDMoCGMBFnmS39FidI4,4912
41
- raijin_server-0.2.39.dist-info/licenses/LICENSE,sha256=kJsMCjOiRZE0AQNtxWqBa32z9kMAaF4EUxyHj3hKaJo,1105
42
- raijin_server-0.2.39.dist-info/METADATA,sha256=5CikB8uMIOaqFLxSS3kQyQMbmu5C1TkpJy-l9JrLEfQ,22851
43
- raijin_server-0.2.39.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
44
- raijin_server-0.2.39.dist-info/entry_points.txt,sha256=3ZvxDX4pvcjkIRsXAJ69wIfVmKa78LKo-C3QhqN2KVM,56
45
- raijin_server-0.2.39.dist-info/top_level.txt,sha256=Yz1xneCRtsZOzbPIcTAcrSxd-1p80pohMXYAZ74dpok,14
46
- raijin_server-0.2.39.dist-info/RECORD,,
41
+ raijin_server-0.2.41.dist-info/licenses/LICENSE,sha256=kJsMCjOiRZE0AQNtxWqBa32z9kMAaF4EUxyHj3hKaJo,1105
42
+ raijin_server-0.2.41.dist-info/METADATA,sha256=rMBGEHgnwkEQ4wDLTKXqz7wnCad_yS9n7ynBPReFHhk,22851
43
+ raijin_server-0.2.41.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
44
+ raijin_server-0.2.41.dist-info/entry_points.txt,sha256=3ZvxDX4pvcjkIRsXAJ69wIfVmKa78LKo-C3QhqN2KVM,56
45
+ raijin_server-0.2.41.dist-info/top_level.txt,sha256=Yz1xneCRtsZOzbPIcTAcrSxd-1p80pohMXYAZ74dpok,14
46
+ raijin_server-0.2.41.dist-info/RECORD,,