Skip to content

Commit 040e8c8

Browse files
committed
feat: unify the NetworkVol classes
Signed-off-by: pandyamarut <pandyamarut@gmail.com>
1 parent 6779b75 commit 040e8c8

4 files changed

Lines changed: 40 additions & 45 deletions

File tree

src/tetra_rp/__init__.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@
1919
ResourceManager,
2020
ServerlessEndpoint,
2121
runpod,
22-
NetworkVolumeConfig,
23-
NetworkVolumeResource,
22+
NetworkVolume,
2423
)
2524

2625

@@ -35,6 +34,5 @@
3534
"ResourceManager",
3635
"ServerlessEndpoint",
3736
"runpod",
38-
"NetworkVolumeConfig",
39-
"NetworkVolumeResource",
37+
"NetworkVolume",
4038
]

src/tetra_rp/client.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import logging
22
from functools import wraps
33
from typing import List, Dict, Optional
4-
from .core.resources import ServerlessResource, ResourceManager, NetworkVolumeConfig, NetworkVolumeResource
4+
from .core.resources import ServerlessResource, ResourceManager, NetworkVolume
55
from .stubs import stub_resource
66

77

@@ -12,7 +12,7 @@ def remote(
1212
resource_config: ServerlessResource,
1313
dependencies: List[str] = None,
1414
system_dependencies: List[str] = None,
15-
mount_volume: Optional[NetworkVolumeConfig] = None,
15+
mount_volume: Optional[NetworkVolume] = None,
1616
**extra,
1717
):
1818
"""
@@ -52,11 +52,10 @@ async def wrapper(*args, **kwargs):
5252
# Create netowrk volume if mount_volume is provided
5353
if mount_volume:
5454
try:
55-
nv = NetworkVolumeResource(config=mount_volume)
56-
network_volume = await nv.deploy()
57-
resource_config.networkVolumeId = network_volume.volume_id
55+
network_volume = await mount_volume.deploy()
56+
resource_config.networkVolumeId = network_volume
5857
log.info(
59-
f"Updated resource config with network volume: {network_volume.volume_id}"
58+
f"Updated resource config with network volume: {network_volume}"
6059
)
6160
except Exception as e:
6261
log.error(f"Failed to create or mount network volume: {e}")

src/tetra_rp/core/resources/__init__.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@
1010
ServerlessEndpoint,
1111
JobOutput,
1212
CudaVersion,
13-
NetworkVolumeConfig,
14-
NetworkVolumeResource,
13+
NetworkVolume,
1514
)
1615
from .template import PodTemplate
1716

@@ -32,6 +31,5 @@
3231
"ServerlessResource",
3332
"ServerlessEndpoint",
3433
"PodTemplate",
35-
"NetworkVolumeConfig",
36-
"NetworkVolumeResource",
34+
"NetworkVolume",
3735
]

src/tetra_rp/core/resources/serverless.py

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
from .cpu import CpuInstanceType
2424
from .environment import EnvironmentVars
2525

26+
2627
# Environment variables are loaded from the .env file
2728
def get_env_vars() -> Dict[str, str]:
2829
"""
@@ -232,7 +233,7 @@ async def is_ready_for_requests(self, give_up_threshold=10) -> bool:
232233
233234
Raises:
234235
ValueError: If the serverless resource is not deployed.
235-
RuntimeError: If the health status is THROTTLED, UNHEALTHY, or UNKNOWN
236+
RuntimeError: If the health status is THROTTLED, UNHEALTHY, or UNKNOWN
236237
after exceeding the give_up_threshold.
237238
"""
238239
if not self.is_deployed():
@@ -379,7 +380,9 @@ class ServerlessEndpoint(ServerlessResource):
379380
@model_validator(mode="after")
380381
def set_serverless_template(self):
381382
if not any([self.imageName, self.template, self.templateId]):
382-
raise ValueError("Either imageName, template, or templateId must be provided")
383+
raise ValueError(
384+
"Either imageName, template, or templateId must be provided"
385+
)
383386

384387
if not self.templateId and not self.template:
385388
self.template = PodTemplate(
@@ -404,6 +407,7 @@ class CpuServerlessEndpoint(ServerlessEndpoint):
404407
Represents a CPU-only serverless endpoint distinct from a live serverless.
405408
Inherits from ServerlessEndpoint.
406409
"""
410+
407411
instanceIds: Optional[List[CpuInstanceType]] = [CpuInstanceType.CPU3G_2_8]
408412

409413

@@ -471,33 +475,32 @@ class ServerlessHealth(BaseModel):
471475
def is_ready(self) -> bool:
472476
return self.workers.status == Status.READY
473477

474-
class NetworkVolumeConfig(BaseModel):
475-
"""
476-
NetworkvolumeConfig Represents a network volume configuration for serverless resources.
477-
"""
478-
size: int # Size in GB
479-
datacenter_id: str
480-
name: str
481-
482478

483-
class NetworkVolumeResource(DeployableResource):
479+
class NetworkVolume(DeployableResource):
484480
"""
485481
NetworkVolume resource for creating and managing Runpod netowrk volumes.
486-
482+
487483
This class handles the creation, deployment, and management of network volumes
488484
that can be attached to serverless resources.
489485
490486
"""
491-
config: NetworkVolumeConfig
492-
volume_id: Optional[str] = Field(default=None)
493-
494-
487+
488+
dataCenterId: Optional[str] = None
489+
id: Optional[str] = Field(default=None)
490+
name: Optional[str] = None
491+
size: Optional[int] = None # Size in GB
492+
493+
@property
494+
def is_created(self) -> bool:
495+
" Returns True if the network volume already exists. " ""
496+
return self.id is not None
497+
495498
@property
496499
def url(self) -> str:
497500
"""
498501
Returns the URL for the network volume resource.
499502
"""
500-
if not self.volume_id:
503+
if not self.id:
501504
raise ValueError("Network volume ID is not set")
502505
return f"{CONSOLE_BASE_URL}/user/storage"
503506

@@ -506,23 +509,21 @@ async def create_network_volume(self) -> str:
506509
Creates a network volume using the provided configuration.
507510
Returns the volume ID.
508511
"""
509-
print(self.config)
510512
async with RunpodRestClient() as client:
511513
# Create the network volume
512-
volume = await client.create_network_volume(
513-
datacenter_id=self.config.datacenter_id,
514-
name=self.config.name,
515-
size=self.config.size
514+
result = await client.create_network_volume(
515+
datacenter_id=self.dataCenterId, name=self.name, size=self.size
516516
)
517-
log.info(f"Created network volume: {volume['id']}")
518-
return volume["id"]
519-
517+
log.info(f"Created network volume: {result['id']}")
518+
if volume := self.__class__(**result):
519+
return volume.id
520+
520521
def is_deployed(self) -> bool:
521522
"""
522523
Checks if the network volume resource is deployed and available.
523524
"""
524-
return self.volume_id is not None
525-
525+
return self.id is not None
526+
526527
async def deploy(self) -> "DeployableResource":
527528
"""
528529
Deploys the network volume resource using the provided configuration.
@@ -532,17 +533,16 @@ async def deploy(self) -> "DeployableResource":
532533
# If the resource is already deployed, return it
533534
if self.is_deployed():
534535
log.debug(f"{self} exists")
535-
return self
536+
return self.id
536537

537538
# Create the network volume
538-
self.volume_id = await self.create_network_volume()
539+
self.id = await self.create_network_volume()
539540

540541
if self.is_deployed():
541-
return self
542+
return self.id
542543

543544
raise ValueError("Deployment failed, no volume was created.")
544545

545546
except Exception as e:
546547
log.error(f"{self} failed to deploy: {e}")
547548
raise
548-

0 commit comments

Comments
 (0)