nebu 0.1.2__py3-none-any.whl → 0.1.4__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.
- nebu/containers/container.py +123 -1
- nebu/containers/models.py +39 -0
- {nebu-0.1.2.dist-info → nebu-0.1.4.dist-info}/METADATA +1 -1
- {nebu-0.1.2.dist-info → nebu-0.1.4.dist-info}/RECORD +7 -7
- {nebu-0.1.2.dist-info → nebu-0.1.4.dist-info}/WHEEL +0 -0
- {nebu-0.1.2.dist-info → nebu-0.1.4.dist-info}/licenses/LICENSE +0 -0
- {nebu-0.1.2.dist-info → nebu-0.1.4.dist-info}/top_level.txt +0 -0
nebu/containers/container.py
CHANGED
@@ -10,6 +10,7 @@ from nebu.containers.models import (
|
|
10
10
|
V1ContainerRequest,
|
11
11
|
V1ContainerResources,
|
12
12
|
V1Containers,
|
13
|
+
V1ContainerSearch,
|
13
14
|
V1EnvVar,
|
14
15
|
V1Meter,
|
15
16
|
V1PortRequest,
|
@@ -23,9 +24,9 @@ class Container:
|
|
23
24
|
def __init__(
|
24
25
|
self,
|
25
26
|
name: str,
|
27
|
+
image: str,
|
26
28
|
namespace: str = "default",
|
27
29
|
platform: Optional[str] = None,
|
28
|
-
image: str = "",
|
29
30
|
env: Optional[List[V1EnvVar]] = None,
|
30
31
|
command: Optional[str] = None,
|
31
32
|
volumes: Optional[List[V1VolumePath]] = None,
|
@@ -48,6 +49,7 @@ class Container:
|
|
48
49
|
raise ValueError("No current server config found")
|
49
50
|
self.api_key = current_server.api_key
|
50
51
|
self.nebu_host = current_server.server
|
52
|
+
self.config = config
|
51
53
|
|
52
54
|
# print(f"nebu_host: {self.nebu_host}")
|
53
55
|
# print(f"api_key: {self.api_key}")
|
@@ -240,3 +242,123 @@ class Container:
|
|
240
242
|
)
|
241
243
|
response.raise_for_status()
|
242
244
|
print(f"Deleted container {self.name} in namespace {self.namespace}")
|
245
|
+
|
246
|
+
@classmethod
|
247
|
+
def get(
|
248
|
+
cls,
|
249
|
+
name: Optional[str] = None,
|
250
|
+
namespace: Optional[str] = None,
|
251
|
+
config: Optional[GlobalConfig] = None,
|
252
|
+
) -> List[V1Container]:
|
253
|
+
"""
|
254
|
+
Get a list of containers that match the optional name and/or namespace filters.
|
255
|
+
"""
|
256
|
+
config = config or GlobalConfig.read()
|
257
|
+
current_server = config.get_current_server_config()
|
258
|
+
if not current_server:
|
259
|
+
raise ValueError("No current server config found")
|
260
|
+
api_key = current_server.api_key
|
261
|
+
nebu_host = current_server.server
|
262
|
+
|
263
|
+
containers_url = f"{nebu_host}/v1/containers"
|
264
|
+
|
265
|
+
response = requests.get(
|
266
|
+
containers_url, headers={"Authorization": f"Bearer {api_key}"}
|
267
|
+
)
|
268
|
+
response.raise_for_status()
|
269
|
+
|
270
|
+
containers_response = V1Containers.model_validate(response.json())
|
271
|
+
filtered_containers = containers_response.containers
|
272
|
+
|
273
|
+
if name:
|
274
|
+
filtered_containers = [
|
275
|
+
container
|
276
|
+
for container in filtered_containers
|
277
|
+
if container.metadata.name == name
|
278
|
+
]
|
279
|
+
if namespace:
|
280
|
+
filtered_containers = [
|
281
|
+
container
|
282
|
+
for container in filtered_containers
|
283
|
+
if container.metadata.namespace == namespace
|
284
|
+
]
|
285
|
+
|
286
|
+
return filtered_containers
|
287
|
+
|
288
|
+
@classmethod
|
289
|
+
def load(
|
290
|
+
cls,
|
291
|
+
name: str,
|
292
|
+
namespace: str = "default",
|
293
|
+
config: Optional[GlobalConfig] = None,
|
294
|
+
):
|
295
|
+
"""
|
296
|
+
Get a container from the remote server.
|
297
|
+
"""
|
298
|
+
containers = cls.get(namespace=namespace, name=name, config=config)
|
299
|
+
if not containers:
|
300
|
+
raise ValueError("Container not found")
|
301
|
+
container_v1 = containers[0]
|
302
|
+
|
303
|
+
out = cls.__new__(cls)
|
304
|
+
out.container = container_v1
|
305
|
+
out.config = config or GlobalConfig.read()
|
306
|
+
current_server = out.config.get_current_server_config()
|
307
|
+
if not current_server:
|
308
|
+
raise ValueError("No current server config found")
|
309
|
+
out.api_key = current_server.api_key
|
310
|
+
out.nebu_host = current_server.server
|
311
|
+
out.containers_url = f"{out.nebu_host}/v1/containers"
|
312
|
+
|
313
|
+
out = cls.from_v1(container_v1)
|
314
|
+
return out
|
315
|
+
|
316
|
+
@classmethod
|
317
|
+
def from_v1(cls, v1: V1Container) -> "Container":
|
318
|
+
out = cls.__new__(cls)
|
319
|
+
out.name = v1.metadata.name
|
320
|
+
out.namespace = v1.metadata.namespace
|
321
|
+
out.status = v1.status
|
322
|
+
out.kind = v1.kind
|
323
|
+
out.platform = v1.platform
|
324
|
+
out.metadata = v1.metadata
|
325
|
+
out.image = v1.image
|
326
|
+
out.env = v1.env
|
327
|
+
out.command = v1.command
|
328
|
+
out.volumes = v1.volumes
|
329
|
+
out.accelerators = v1.accelerators
|
330
|
+
out.resources = v1.resources
|
331
|
+
out.meters = v1.meters
|
332
|
+
out.restart = v1.restart
|
333
|
+
out.queue = v1.queue
|
334
|
+
out.timeout = v1.timeout
|
335
|
+
out.ssh_keys = v1.ssh_keys
|
336
|
+
return out
|
337
|
+
|
338
|
+
@classmethod
|
339
|
+
def search(
|
340
|
+
cls,
|
341
|
+
params: V1ContainerSearch,
|
342
|
+
config: Optional[GlobalConfig] = None,
|
343
|
+
) -> List[V1Container]:
|
344
|
+
"""
|
345
|
+
Search for containers on the remote server.
|
346
|
+
"""
|
347
|
+
config = config or GlobalConfig.read()
|
348
|
+
current_server = config.get_current_server_config()
|
349
|
+
if not current_server:
|
350
|
+
raise ValueError("No current server config found")
|
351
|
+
api_key = current_server.api_key
|
352
|
+
nebu_host = current_server.server
|
353
|
+
|
354
|
+
search_url = f"{nebu_host}/v1/containers/search"
|
355
|
+
|
356
|
+
response = requests.post(
|
357
|
+
search_url,
|
358
|
+
headers={"Authorization": f"Bearer {api_key}"},
|
359
|
+
json=params.model_dump(),
|
360
|
+
)
|
361
|
+
response.raise_for_status()
|
362
|
+
|
363
|
+
containers_response = V1Containers.model_validate(response.json())
|
364
|
+
return containers_response.containers
|
nebu/containers/models.py
CHANGED
@@ -116,6 +116,16 @@ class V1AuthzConfig(BaseModel):
|
|
116
116
|
rules: Optional[List[V1AuthzRule]] = None
|
117
117
|
|
118
118
|
|
119
|
+
class V1ContainerHealthCheck(BaseModel):
|
120
|
+
interval: Optional[str] = None
|
121
|
+
timeout: Optional[str] = None
|
122
|
+
retries: Optional[int] = None
|
123
|
+
start_period: Optional[str] = None
|
124
|
+
path: Optional[str] = None
|
125
|
+
port: Optional[int] = None
|
126
|
+
protocol: Optional[str] = None
|
127
|
+
|
128
|
+
|
119
129
|
class V1PortRequest(BaseModel):
|
120
130
|
port: int
|
121
131
|
protocol: Optional[str] = None
|
@@ -146,6 +156,7 @@ class V1ContainerRequest(BaseModel):
|
|
146
156
|
ports: Optional[List[V1PortRequest]] = None
|
147
157
|
proxy_port: Optional[int] = None
|
148
158
|
authz: Optional[V1AuthzConfig] = None
|
159
|
+
health_check: Optional[V1ContainerHealthCheck] = None
|
149
160
|
|
150
161
|
model_config = ConfigDict(use_enum_values=True)
|
151
162
|
|
@@ -169,6 +180,7 @@ class V1Container(BaseModel):
|
|
169
180
|
ports: Optional[List[V1Port]] = None
|
170
181
|
proxy_port: Optional[int] = None
|
171
182
|
authz: Optional[V1AuthzConfig] = None
|
183
|
+
health_check: Optional[V1ContainerHealthCheck] = None
|
172
184
|
|
173
185
|
model_config = ConfigDict(use_enum_values=True)
|
174
186
|
|
@@ -189,6 +201,9 @@ class V1UpdateContainer(BaseModel):
|
|
189
201
|
timeout: Optional[str] = None
|
190
202
|
resources: Optional[V1ContainerResources] = None
|
191
203
|
proxy_port: Optional[int] = None
|
204
|
+
authz: Optional[V1AuthzConfig] = None
|
205
|
+
health_check: Optional[V1ContainerHealthCheck] = None
|
206
|
+
no_delete: Optional[bool] = None
|
192
207
|
|
193
208
|
model_config = ConfigDict(use_enum_values=True)
|
194
209
|
|
@@ -197,3 +212,27 @@ class V1Containers(BaseModel):
|
|
197
212
|
containers: List[V1Container]
|
198
213
|
|
199
214
|
model_config = ConfigDict(use_enum_values=True)
|
215
|
+
|
216
|
+
|
217
|
+
class V1ContainerSearch(BaseModel):
|
218
|
+
namespace: Optional[str] = None
|
219
|
+
image: Optional[str] = None
|
220
|
+
env: Optional[List[V1EnvVar]] = None
|
221
|
+
command: Optional[str] = None
|
222
|
+
args: Optional[str] = None
|
223
|
+
volumes: Optional[List[V1VolumePath]] = None
|
224
|
+
accelerators: Optional[List[str]] = None
|
225
|
+
labels: Optional[Dict[str, str]] = None
|
226
|
+
cpu_request: Optional[str] = None
|
227
|
+
memory_request: Optional[str] = None
|
228
|
+
platform: Optional[str] = None
|
229
|
+
health_check: Optional[V1ContainerHealthCheck] = None
|
230
|
+
meters: Optional[List[V1Meter]] = None
|
231
|
+
restart: Optional[str] = None
|
232
|
+
queue: Optional[str] = None
|
233
|
+
timeout: Optional[str] = None
|
234
|
+
resources: Optional[V1ContainerResources] = None
|
235
|
+
proxy_port: Optional[int] = None
|
236
|
+
authz: Optional[V1AuthzConfig] = None
|
237
|
+
|
238
|
+
model_config = ConfigDict(use_enum_values=True)
|
@@ -1,16 +1,16 @@
|
|
1
1
|
nebu/__init__.py,sha256=EbdC8ZKnRTt6jkX0WN0p1pnaDEzb2InqZ1r8QZWzph0,195
|
2
2
|
nebu/config.py,sha256=XBY7uKgcJX9d1HGxqqpx87o_9DuF3maUlUnKkcpUrKU,4565
|
3
3
|
nebu/meta.py,sha256=AnvrtP0mc7a-YP4zVhErHPsU0FSmwMejYgKWnV8wqqE,566
|
4
|
-
nebu/containers/container.py,sha256=
|
4
|
+
nebu/containers/container.py,sha256=sCi96l5CJ-wt0xf0ELjXN1MOTljzCzJ-qN-xgYs7Pw0,13217
|
5
5
|
nebu/containers/decorator.py,sha256=sZQ4ZwqQk_jLDJ-n9P6N0MlxvWL9Ac7eCPIHVxYq58c,5576
|
6
|
-
nebu/containers/models.py,sha256=
|
6
|
+
nebu/containers/models.py,sha256=_d6BS6puoVWvyHhWX-74WFHJSOE8WJaFt2zGMTm9EEA,6782
|
7
7
|
nebu/containers/server.py,sha256=yFa2Y9PzBn59E1HftKiv0iapPonli2rbGAiU6r-wwe0,2513
|
8
8
|
nebu/processors/models.py,sha256=6XSw4iM77XYJf6utm8QReN9fyMS0dK40a5sVwsC7RRA,1970
|
9
9
|
nebu/processors/processor.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
10
10
|
nebu/redis/models.py,sha256=coPovAcVXnOU1Xh_fpJL4PO3QctgK9nBe5QYoqEcnxg,1230
|
11
11
|
nebu/services/service.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
12
|
-
nebu-0.1.
|
13
|
-
nebu-0.1.
|
14
|
-
nebu-0.1.
|
15
|
-
nebu-0.1.
|
16
|
-
nebu-0.1.
|
12
|
+
nebu-0.1.4.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
13
|
+
nebu-0.1.4.dist-info/METADATA,sha256=bfMCjbLisYyBt-JXZT1Bu9MS2aLePTjz1cWjcxpPKqc,1587
|
14
|
+
nebu-0.1.4.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
|
15
|
+
nebu-0.1.4.dist-info/top_level.txt,sha256=uLIbEKJeGSHWOAJN5S0i5XBGwybALlF9bYoB1UhdEgQ,5
|
16
|
+
nebu-0.1.4.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|