Skip to content

Commit d1432f5

Browse files
authored
Merge pull request #28 from DataCrunch-io/bugfix/remove-option-to-name-containers
bugfix: removed the option to name a container on creation
2 parents deaac64 + fe92b99 commit d1432f5

File tree

4 files changed

+71
-27
lines changed

4 files changed

+71
-27
lines changed

datacrunch/containers/containers.py

Lines changed: 61 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,31 @@ class VolumeMount:
9797
@dataclass_json
9898
@dataclass
9999
class Container:
100+
"""Container configuration for deployment creation and updates.
101+
This class omits the name field which is managed by the system.
102+
103+
:param image: Container image to use
104+
:param exposed_port: Port to expose from the container
105+
:param healthcheck: Optional health check configuration
106+
:param entrypoint_overrides: Optional entrypoint override settings
107+
:param env: Optional list of environment variables
108+
:param volume_mounts: Optional list of volume mounts
109+
"""
110+
image: str
111+
exposed_port: int
112+
healthcheck: Optional[HealthcheckSettings] = None
113+
entrypoint_overrides: Optional[EntrypointOverridesSettings] = None
114+
env: Optional[List[EnvVar]] = None
115+
volume_mounts: Optional[List[VolumeMount]] = None
116+
117+
118+
@dataclass_json
119+
@dataclass
120+
class ContainerInfo:
100121
"""Container configuration for deployments.
122+
This class is read-only and includes the system-managed name field.
101123
102-
:param name: Name of the container
124+
:param name: Name of the container (system-managed)
103125
:param image: Container image to use
104126
:param exposed_port: Port to expose from the container
105127
:param healthcheck: Optional health check configuration
@@ -224,7 +246,31 @@ class ScalingOptions:
224246
@dataclass_json(undefined=Undefined.EXCLUDE)
225247
@dataclass
226248
class Deployment:
249+
"""Configuration for creating or updating a container deployment.
250+
This class uses Container instead of ContainerInfo to prevent name setting.
251+
252+
:param name: Name of the deployment
253+
:param container_registry_settings: Settings for accessing container registry
254+
:param containers: List of container specifications in the deployment
255+
:param compute: Compute resource configuration
256+
:param is_spot: Whether is spot deployment
257+
:param endpoint_base_url: Optional base URL for the deployment endpoint
258+
:param scaling: Optional scaling configuration
259+
"""
260+
name: str
261+
container_registry_settings: ContainerRegistrySettings
262+
containers: List[Container]
263+
compute: ComputeResource
264+
is_spot: bool = False
265+
endpoint_base_url: Optional[str] = None
266+
scaling: Optional[ScalingOptions] = None
267+
268+
269+
@dataclass_json(undefined=Undefined.EXCLUDE)
270+
@dataclass
271+
class DeploymentInfo:
227272
"""Configuration for a container deployment.
273+
This class is read-only and includes system-managed fields.
228274
229275
:param name: Name of the deployment
230276
:param container_registry_settings: Settings for accessing container registry
@@ -237,7 +283,7 @@ class Deployment:
237283
"""
238284
name: str
239285
container_registry_settings: ContainerRegistrySettings
240-
containers: List[Container]
286+
containers: List[ContainerInfo]
241287
compute: ComputeResource
242288
is_spot: bool = False
243289
endpoint_base_url: Optional[str] = None
@@ -359,59 +405,59 @@ def __init__(self, http_client) -> None:
359405
"""
360406
self.client = http_client
361407

362-
def get_deployments(self) -> List[Deployment]:
408+
def get_deployments(self) -> List[DeploymentInfo]:
363409
"""Get all deployments
364410
365411
:return: list of deployments
366-
:rtype: List[Deployment]
412+
:rtype: List[DeploymentInfo]
367413
"""
368414
response = self.client.get(CONTAINER_DEPLOYMENTS_ENDPOINT)
369-
return [Deployment.from_dict(deployment, infer_missing=True) for deployment in response.json()]
415+
return [DeploymentInfo.from_dict(deployment, infer_missing=True) for deployment in response.json()]
370416

371-
def get_deployment_by_name(self, deployment_name: str) -> Deployment:
417+
def get_deployment_by_name(self, deployment_name: str) -> DeploymentInfo:
372418
"""Get a deployment by name
373419
374420
:param deployment_name: name of the deployment
375421
:type deployment_name: str
376422
:return: deployment
377-
:rtype: Deployment
423+
:rtype: DeploymentInfo
378424
"""
379425
response = self.client.get(
380426
f"{CONTAINER_DEPLOYMENTS_ENDPOINT}/{deployment_name}")
381-
return Deployment.from_dict(response.json(), infer_missing=True)
427+
return DeploymentInfo.from_dict(response.json(), infer_missing=True)
382428

383429
def create_deployment(
384430
self,
385431
deployment: Deployment
386-
) -> Deployment:
432+
) -> DeploymentInfo:
387433
"""Create a new deployment
388434
389435
:param deployment: deployment configuration
390436
:type deployment: Deployment
391437
:return: created deployment
392-
:rtype: Deployment
438+
:rtype: DeploymentInfo
393439
"""
394440
response = self.client.post(
395441
CONTAINER_DEPLOYMENTS_ENDPOINT,
396442
deployment.to_dict()
397443
)
398-
return Deployment.from_dict(response.json(), infer_missing=True)
444+
return DeploymentInfo.from_dict(response.json(), infer_missing=True)
399445

400-
def update_deployment(self, deployment_name: str, deployment: Deployment) -> Deployment:
446+
def update_deployment(self, deployment_name: str, deployment: DeploymentInfo) -> DeploymentInfo:
401447
"""Update an existing deployment
402448
403449
:param deployment_name: name of the deployment to update
404450
:type deployment_name: str
405451
:param deployment: updated deployment
406-
:type deployment: Deployment
452+
:type deployment: DeploymentInfo
407453
:return: updated deployment
408-
:rtype: Deployment
454+
:rtype: DeploymentInfo
409455
"""
410456
response = self.client.patch(
411457
f"{CONTAINER_DEPLOYMENTS_ENDPOINT}/{deployment_name}",
412458
deployment.to_dict()
413459
)
414-
return Deployment.from_dict(response.json(), infer_missing=True)
460+
return DeploymentInfo.from_dict(response.json(), infer_missing=True)
415461

416462
def delete_deployment(self, deployment_name: str) -> None:
417463
"""Delete a deployment

examples/containers/container_deployments_example.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727

2828
# Configuration constants
2929
DEPLOYMENT_NAME = "my-deployment"
30-
CONTAINER_NAME = "my-app"
3130
IMAGE_NAME = "your-image-name:version"
3231

3332
# Environment variables
@@ -93,7 +92,6 @@ def main() -> None:
9392

9493
# Create container configuration
9594
container = Container(
96-
name=CONTAINER_NAME,
9795
image=IMAGE_NAME,
9896
exposed_port=80,
9997
healthcheck=HealthcheckSettings(

examples/containers/sglang_deployment_example.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,6 @@ def main() -> None:
206206

207207
# Create container configuration
208208
container = Container(
209-
name=CONTAINER_NAME,
210209
image=IMAGE_URL,
211210
exposed_port=30000,
212211
healthcheck=HealthcheckSettings(

tests/unit_tests/containers/test_containers.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@
88
SECRETS_ENDPOINT,
99
SERVERLESS_COMPUTE_RESOURCES_ENDPOINT,
1010
Container,
11+
ContainerInfo,
1112
ContainerDeploymentStatus,
1213
ContainerRegistrySettings,
1314
ContainersService,
1415
Deployment,
16+
DeploymentInfo,
1517
EnvVar,
1618
EnvVarType,
1719
EntrypointOverridesSettings,
@@ -213,10 +215,10 @@ def test_get_deployments(self, containers_service, deployments_endpoint):
213215
# assert
214216
assert type(deployments) == list
215217
assert len(deployments) == 1
216-
assert type(deployment) == Deployment
218+
assert type(deployment) == DeploymentInfo
217219
assert deployment.name == DEPLOYMENT_NAME
218220
assert len(deployment.containers) == 1
219-
assert type(deployment.containers[0]) == Container
221+
assert type(deployment.containers[0]) == ContainerInfo
220222
assert type(deployment.compute) == ComputeResource
221223
assert deployment.compute.name == COMPUTE_RESOURCE_NAME
222224
assert responses.assert_call_count(deployments_endpoint, 1) is True
@@ -236,7 +238,7 @@ def test_get_deployment_by_name(self, containers_service, deployments_endpoint):
236238
deployment = containers_service.get_deployment_by_name(DEPLOYMENT_NAME)
237239

238240
# assert
239-
assert type(deployment) == Deployment
241+
assert type(deployment) == DeploymentInfo
240242
assert deployment.name == DEPLOYMENT_NAME
241243
assert len(deployment.containers) == 1
242244
assert deployment.containers[0].name == CONTAINER_NAME
@@ -273,9 +275,7 @@ def test_create_deployment(self, containers_service, deployments_endpoint):
273275
status=200
274276
)
275277

276-
# create deployment object
277278
container = Container(
278-
name=CONTAINER_NAME,
279279
image="nginx:latest",
280280
exposed_port=80,
281281
healthcheck=HealthcheckSettings(
@@ -292,6 +292,7 @@ def test_create_deployment(self, containers_service, deployments_endpoint):
292292
container_registry_settings = ContainerRegistrySettings(
293293
is_private=False)
294294

295+
# create deployment object
295296
deployment = Deployment(
296297
name=DEPLOYMENT_NAME,
297298
container_registry_settings=container_registry_settings,
@@ -304,7 +305,7 @@ def test_create_deployment(self, containers_service, deployments_endpoint):
304305
created_deployment = containers_service.create_deployment(deployment)
305306

306307
# assert
307-
assert type(created_deployment) == Deployment
308+
assert type(created_deployment) == DeploymentInfo
308309
assert created_deployment.name == DEPLOYMENT_NAME
309310
assert len(created_deployment.containers) == 1
310311
assert created_deployment.containers[0].name == CONTAINER_NAME
@@ -323,7 +324,7 @@ def test_update_deployment(self, containers_service, deployments_endpoint):
323324
)
324325

325326
# create deployment object
326-
container = Container(
327+
container = ContainerInfo(
327328
name=CONTAINER_NAME,
328329
image="nginx:latest",
329330
exposed_port=80
@@ -334,7 +335,7 @@ def test_update_deployment(self, containers_service, deployments_endpoint):
334335

335336
compute = ComputeResource(name=COMPUTE_RESOURCE_NAME, size=1)
336337

337-
deployment = Deployment(
338+
deployment = DeploymentInfo(
338339
name=DEPLOYMENT_NAME,
339340
container_registry_settings=container_registry_settings,
340341
containers=[container],
@@ -346,7 +347,7 @@ def test_update_deployment(self, containers_service, deployments_endpoint):
346347
DEPLOYMENT_NAME, deployment)
347348

348349
# assert
349-
assert type(updated_deployment) == Deployment
350+
assert type(updated_deployment) == DeploymentInfo
350351
assert updated_deployment.name == DEPLOYMENT_NAME
351352
assert len(updated_deployment.containers) == 1
352353
assert updated_deployment.containers[0].name == CONTAINER_NAME

0 commit comments

Comments
 (0)