skypilot-nightly 1.0.0.dev20250916__py3-none-any.whl → 1.0.0.dev20250919__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 skypilot-nightly might be problematic. Click here for more details.
- sky/__init__.py +4 -2
- sky/adaptors/primeintellect.py +1 -0
- sky/adaptors/seeweb.py +68 -4
- sky/authentication.py +25 -0
- sky/backends/__init__.py +3 -2
- sky/backends/backend_utils.py +16 -12
- sky/backends/cloud_vm_ray_backend.py +57 -0
- sky/catalog/primeintellect_catalog.py +95 -0
- sky/clouds/__init__.py +2 -0
- sky/clouds/primeintellect.py +314 -0
- sky/core.py +77 -48
- sky/dashboard/out/404.html +1 -1
- sky/dashboard/out/_next/static/{y8s7LlyyfhMzpzCkxuD2r → VvaUqYDvHOcHZRnvMBmax}/_buildManifest.js +1 -1
- sky/dashboard/out/_next/static/chunks/1121-4ff1ec0dbc5792ab.js +1 -0
- sky/dashboard/out/_next/static/chunks/3015-88c7c8d69b0b6dba.js +1 -0
- sky/dashboard/out/_next/static/chunks/{6856-e0754534b3015377.js → 6856-9a2538f38c004652.js} +1 -1
- sky/dashboard/out/_next/static/chunks/8969-a39efbadcd9fde80.js +1 -0
- sky/dashboard/out/_next/static/chunks/9037-472ee1222cb1e158.js +6 -0
- sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-1e9248ddbddcd122.js +16 -0
- sky/dashboard/out/_next/static/chunks/pages/clusters/{[cluster]-0b4b35dc1dfe046c.js → [cluster]-9525660179df3605.js} +1 -1
- sky/dashboard/out/_next/static/chunks/{webpack-05f82d90d6fd7f82.js → webpack-b2a3938c22b6647b.js} +1 -1
- sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
- sky/dashboard/out/clusters/[cluster].html +1 -1
- sky/dashboard/out/clusters.html +1 -1
- sky/dashboard/out/config.html +1 -1
- sky/dashboard/out/index.html +1 -1
- sky/dashboard/out/infra/[context].html +1 -1
- sky/dashboard/out/infra.html +1 -1
- sky/dashboard/out/jobs/[job].html +1 -1
- sky/dashboard/out/jobs/pools/[pool].html +1 -1
- sky/dashboard/out/jobs.html +1 -1
- sky/dashboard/out/users.html +1 -1
- sky/dashboard/out/volumes.html +1 -1
- sky/dashboard/out/workspace/new.html +1 -1
- sky/dashboard/out/workspaces/[name].html +1 -1
- sky/dashboard/out/workspaces.html +1 -1
- sky/global_user_state.py +99 -62
- sky/jobs/server/server.py +14 -1
- sky/jobs/state.py +26 -1
- sky/metrics/utils.py +174 -8
- sky/provision/__init__.py +1 -0
- sky/provision/docker_utils.py +6 -2
- sky/provision/primeintellect/__init__.py +10 -0
- sky/provision/primeintellect/config.py +11 -0
- sky/provision/primeintellect/instance.py +454 -0
- sky/provision/primeintellect/utils.py +398 -0
- sky/resources.py +9 -1
- sky/schemas/generated/jobsv1_pb2.py +40 -40
- sky/schemas/generated/servev1_pb2.py +58 -0
- sky/schemas/generated/servev1_pb2.pyi +115 -0
- sky/schemas/generated/servev1_pb2_grpc.py +322 -0
- sky/serve/serve_rpc_utils.py +179 -0
- sky/serve/serve_utils.py +29 -12
- sky/serve/server/core.py +37 -19
- sky/serve/server/impl.py +221 -129
- sky/server/metrics.py +52 -158
- sky/server/requests/executor.py +12 -8
- sky/server/requests/payloads.py +6 -0
- sky/server/requests/requests.py +1 -1
- sky/server/requests/serializers/encoders.py +3 -2
- sky/server/server.py +5 -41
- sky/setup_files/dependencies.py +1 -0
- sky/skylet/constants.py +10 -5
- sky/skylet/job_lib.py +14 -15
- sky/skylet/services.py +98 -0
- sky/skylet/skylet.py +3 -1
- sky/templates/kubernetes-ray.yml.j2 +22 -12
- sky/templates/primeintellect-ray.yml.j2 +71 -0
- sky/utils/locks.py +41 -10
- {skypilot_nightly-1.0.0.dev20250916.dist-info → skypilot_nightly-1.0.0.dev20250919.dist-info}/METADATA +36 -35
- {skypilot_nightly-1.0.0.dev20250916.dist-info → skypilot_nightly-1.0.0.dev20250919.dist-info}/RECORD +76 -64
- sky/dashboard/out/_next/static/chunks/1121-408ed10b2f9fce17.js +0 -1
- sky/dashboard/out/_next/static/chunks/3015-2ea98b57e318bd6e.js +0 -1
- sky/dashboard/out/_next/static/chunks/8969-0487dfbf149d9e53.js +0 -1
- sky/dashboard/out/_next/static/chunks/9037-f9800e64eb05dd1c.js +0 -6
- sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-1cbba24bd1bd35f8.js +0 -16
- /sky/dashboard/out/_next/static/{y8s7LlyyfhMzpzCkxuD2r → VvaUqYDvHOcHZRnvMBmax}/_ssgManifest.js +0 -0
- {skypilot_nightly-1.0.0.dev20250916.dist-info → skypilot_nightly-1.0.0.dev20250919.dist-info}/WHEEL +0 -0
- {skypilot_nightly-1.0.0.dev20250916.dist-info → skypilot_nightly-1.0.0.dev20250919.dist-info}/entry_points.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250916.dist-info → skypilot_nightly-1.0.0.dev20250919.dist-info}/licenses/LICENSE +0 -0
- {skypilot_nightly-1.0.0.dev20250916.dist-info → skypilot_nightly-1.0.0.dev20250919.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
from google.protobuf.internal import containers as _containers
|
|
2
|
+
from google.protobuf import descriptor as _descriptor
|
|
3
|
+
from google.protobuf import message as _message
|
|
4
|
+
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union
|
|
5
|
+
|
|
6
|
+
DESCRIPTOR: _descriptor.FileDescriptor
|
|
7
|
+
|
|
8
|
+
class ServiceNames(_message.Message):
|
|
9
|
+
__slots__ = ("names",)
|
|
10
|
+
NAMES_FIELD_NUMBER: _ClassVar[int]
|
|
11
|
+
names: _containers.RepeatedScalarFieldContainer[str]
|
|
12
|
+
def __init__(self, names: _Optional[_Iterable[str]] = ...) -> None: ...
|
|
13
|
+
|
|
14
|
+
class ServiceStatus(_message.Message):
|
|
15
|
+
__slots__ = ("status",)
|
|
16
|
+
class StatusEntry(_message.Message):
|
|
17
|
+
__slots__ = ("key", "value")
|
|
18
|
+
KEY_FIELD_NUMBER: _ClassVar[int]
|
|
19
|
+
VALUE_FIELD_NUMBER: _ClassVar[int]
|
|
20
|
+
key: str
|
|
21
|
+
value: str
|
|
22
|
+
def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ...
|
|
23
|
+
STATUS_FIELD_NUMBER: _ClassVar[int]
|
|
24
|
+
status: _containers.ScalarMap[str, str]
|
|
25
|
+
def __init__(self, status: _Optional[_Mapping[str, str]] = ...) -> None: ...
|
|
26
|
+
|
|
27
|
+
class GetServiceStatusRequest(_message.Message):
|
|
28
|
+
__slots__ = ("service_names", "pool")
|
|
29
|
+
SERVICE_NAMES_FIELD_NUMBER: _ClassVar[int]
|
|
30
|
+
POOL_FIELD_NUMBER: _ClassVar[int]
|
|
31
|
+
service_names: ServiceNames
|
|
32
|
+
pool: bool
|
|
33
|
+
def __init__(self, service_names: _Optional[_Union[ServiceNames, _Mapping]] = ..., pool: bool = ...) -> None: ...
|
|
34
|
+
|
|
35
|
+
class GetServiceStatusResponse(_message.Message):
|
|
36
|
+
__slots__ = ("statuses",)
|
|
37
|
+
STATUSES_FIELD_NUMBER: _ClassVar[int]
|
|
38
|
+
statuses: _containers.RepeatedCompositeFieldContainer[ServiceStatus]
|
|
39
|
+
def __init__(self, statuses: _Optional[_Iterable[_Union[ServiceStatus, _Mapping]]] = ...) -> None: ...
|
|
40
|
+
|
|
41
|
+
class AddVersionRequest(_message.Message):
|
|
42
|
+
__slots__ = ("service_name",)
|
|
43
|
+
SERVICE_NAME_FIELD_NUMBER: _ClassVar[int]
|
|
44
|
+
service_name: str
|
|
45
|
+
def __init__(self, service_name: _Optional[str] = ...) -> None: ...
|
|
46
|
+
|
|
47
|
+
class AddVersionResponse(_message.Message):
|
|
48
|
+
__slots__ = ("version",)
|
|
49
|
+
VERSION_FIELD_NUMBER: _ClassVar[int]
|
|
50
|
+
version: int
|
|
51
|
+
def __init__(self, version: _Optional[int] = ...) -> None: ...
|
|
52
|
+
|
|
53
|
+
class TerminateServicesRequest(_message.Message):
|
|
54
|
+
__slots__ = ("service_names", "purge", "pool")
|
|
55
|
+
SERVICE_NAMES_FIELD_NUMBER: _ClassVar[int]
|
|
56
|
+
PURGE_FIELD_NUMBER: _ClassVar[int]
|
|
57
|
+
POOL_FIELD_NUMBER: _ClassVar[int]
|
|
58
|
+
service_names: ServiceNames
|
|
59
|
+
purge: bool
|
|
60
|
+
pool: bool
|
|
61
|
+
def __init__(self, service_names: _Optional[_Union[ServiceNames, _Mapping]] = ..., purge: bool = ..., pool: bool = ...) -> None: ...
|
|
62
|
+
|
|
63
|
+
class TerminateServicesResponse(_message.Message):
|
|
64
|
+
__slots__ = ("message",)
|
|
65
|
+
MESSAGE_FIELD_NUMBER: _ClassVar[int]
|
|
66
|
+
message: str
|
|
67
|
+
def __init__(self, message: _Optional[str] = ...) -> None: ...
|
|
68
|
+
|
|
69
|
+
class TerminateReplicaRequest(_message.Message):
|
|
70
|
+
__slots__ = ("service_name", "replica_id", "purge")
|
|
71
|
+
SERVICE_NAME_FIELD_NUMBER: _ClassVar[int]
|
|
72
|
+
REPLICA_ID_FIELD_NUMBER: _ClassVar[int]
|
|
73
|
+
PURGE_FIELD_NUMBER: _ClassVar[int]
|
|
74
|
+
service_name: str
|
|
75
|
+
replica_id: int
|
|
76
|
+
purge: bool
|
|
77
|
+
def __init__(self, service_name: _Optional[str] = ..., replica_id: _Optional[int] = ..., purge: bool = ...) -> None: ...
|
|
78
|
+
|
|
79
|
+
class TerminateReplicaResponse(_message.Message):
|
|
80
|
+
__slots__ = ("message",)
|
|
81
|
+
MESSAGE_FIELD_NUMBER: _ClassVar[int]
|
|
82
|
+
message: str
|
|
83
|
+
def __init__(self, message: _Optional[str] = ...) -> None: ...
|
|
84
|
+
|
|
85
|
+
class WaitServiceRegistrationRequest(_message.Message):
|
|
86
|
+
__slots__ = ("service_name", "job_id", "pool")
|
|
87
|
+
SERVICE_NAME_FIELD_NUMBER: _ClassVar[int]
|
|
88
|
+
JOB_ID_FIELD_NUMBER: _ClassVar[int]
|
|
89
|
+
POOL_FIELD_NUMBER: _ClassVar[int]
|
|
90
|
+
service_name: str
|
|
91
|
+
job_id: int
|
|
92
|
+
pool: bool
|
|
93
|
+
def __init__(self, service_name: _Optional[str] = ..., job_id: _Optional[int] = ..., pool: bool = ...) -> None: ...
|
|
94
|
+
|
|
95
|
+
class WaitServiceRegistrationResponse(_message.Message):
|
|
96
|
+
__slots__ = ("lb_port",)
|
|
97
|
+
LB_PORT_FIELD_NUMBER: _ClassVar[int]
|
|
98
|
+
lb_port: int
|
|
99
|
+
def __init__(self, lb_port: _Optional[int] = ...) -> None: ...
|
|
100
|
+
|
|
101
|
+
class UpdateServiceRequest(_message.Message):
|
|
102
|
+
__slots__ = ("service_name", "version", "mode", "pool")
|
|
103
|
+
SERVICE_NAME_FIELD_NUMBER: _ClassVar[int]
|
|
104
|
+
VERSION_FIELD_NUMBER: _ClassVar[int]
|
|
105
|
+
MODE_FIELD_NUMBER: _ClassVar[int]
|
|
106
|
+
POOL_FIELD_NUMBER: _ClassVar[int]
|
|
107
|
+
service_name: str
|
|
108
|
+
version: int
|
|
109
|
+
mode: str
|
|
110
|
+
pool: bool
|
|
111
|
+
def __init__(self, service_name: _Optional[str] = ..., version: _Optional[int] = ..., mode: _Optional[str] = ..., pool: bool = ...) -> None: ...
|
|
112
|
+
|
|
113
|
+
class UpdateServiceResponse(_message.Message):
|
|
114
|
+
__slots__ = ()
|
|
115
|
+
def __init__(self) -> None: ...
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
|
|
2
|
+
"""Client and server classes corresponding to protobuf-defined services."""
|
|
3
|
+
import grpc
|
|
4
|
+
import warnings
|
|
5
|
+
|
|
6
|
+
from sky.schemas.generated import servev1_pb2 as sky_dot_schemas_dot_generated_dot_servev1__pb2
|
|
7
|
+
|
|
8
|
+
GRPC_GENERATED_VERSION = '1.63.0'
|
|
9
|
+
GRPC_VERSION = grpc.__version__
|
|
10
|
+
EXPECTED_ERROR_RELEASE = '1.65.0'
|
|
11
|
+
SCHEDULED_RELEASE_DATE = 'June 25, 2024'
|
|
12
|
+
_version_not_supported = False
|
|
13
|
+
|
|
14
|
+
try:
|
|
15
|
+
from grpc._utilities import first_version_is_lower
|
|
16
|
+
_version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION)
|
|
17
|
+
except ImportError:
|
|
18
|
+
_version_not_supported = True
|
|
19
|
+
|
|
20
|
+
if _version_not_supported:
|
|
21
|
+
warnings.warn(
|
|
22
|
+
f'The grpc package installed is at version {GRPC_VERSION},'
|
|
23
|
+
+ f' but the generated code in sky/schemas/generated/servev1_pb2_grpc.py depends on'
|
|
24
|
+
+ f' grpcio>={GRPC_GENERATED_VERSION}.'
|
|
25
|
+
+ f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}'
|
|
26
|
+
+ f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.'
|
|
27
|
+
+ f' This warning will become an error in {EXPECTED_ERROR_RELEASE},'
|
|
28
|
+
+ f' scheduled for release on {SCHEDULED_RELEASE_DATE}.',
|
|
29
|
+
RuntimeWarning
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class ServeServiceStub(object):
|
|
34
|
+
"""Missing associated documentation comment in .proto file."""
|
|
35
|
+
|
|
36
|
+
def __init__(self, channel):
|
|
37
|
+
"""Constructor.
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
channel: A grpc.Channel.
|
|
41
|
+
"""
|
|
42
|
+
self.GetServiceStatus = channel.unary_unary(
|
|
43
|
+
'/serve.v1.ServeService/GetServiceStatus',
|
|
44
|
+
request_serializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.GetServiceStatusRequest.SerializeToString,
|
|
45
|
+
response_deserializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.GetServiceStatusResponse.FromString,
|
|
46
|
+
_registered_method=True)
|
|
47
|
+
self.AddVersion = channel.unary_unary(
|
|
48
|
+
'/serve.v1.ServeService/AddVersion',
|
|
49
|
+
request_serializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.AddVersionRequest.SerializeToString,
|
|
50
|
+
response_deserializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.AddVersionResponse.FromString,
|
|
51
|
+
_registered_method=True)
|
|
52
|
+
self.TerminateServices = channel.unary_unary(
|
|
53
|
+
'/serve.v1.ServeService/TerminateServices',
|
|
54
|
+
request_serializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.TerminateServicesRequest.SerializeToString,
|
|
55
|
+
response_deserializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.TerminateServicesResponse.FromString,
|
|
56
|
+
_registered_method=True)
|
|
57
|
+
self.TerminateReplica = channel.unary_unary(
|
|
58
|
+
'/serve.v1.ServeService/TerminateReplica',
|
|
59
|
+
request_serializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.TerminateReplicaRequest.SerializeToString,
|
|
60
|
+
response_deserializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.TerminateReplicaResponse.FromString,
|
|
61
|
+
_registered_method=True)
|
|
62
|
+
self.WaitServiceRegistration = channel.unary_unary(
|
|
63
|
+
'/serve.v1.ServeService/WaitServiceRegistration',
|
|
64
|
+
request_serializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.WaitServiceRegistrationRequest.SerializeToString,
|
|
65
|
+
response_deserializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.WaitServiceRegistrationResponse.FromString,
|
|
66
|
+
_registered_method=True)
|
|
67
|
+
self.UpdateService = channel.unary_unary(
|
|
68
|
+
'/serve.v1.ServeService/UpdateService',
|
|
69
|
+
request_serializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.UpdateServiceRequest.SerializeToString,
|
|
70
|
+
response_deserializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.UpdateServiceResponse.FromString,
|
|
71
|
+
_registered_method=True)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class ServeServiceServicer(object):
|
|
75
|
+
"""Missing associated documentation comment in .proto file."""
|
|
76
|
+
|
|
77
|
+
def GetServiceStatus(self, request, context):
|
|
78
|
+
"""Get status of service.
|
|
79
|
+
"""
|
|
80
|
+
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
|
81
|
+
context.set_details('Method not implemented!')
|
|
82
|
+
raise NotImplementedError('Method not implemented!')
|
|
83
|
+
|
|
84
|
+
def AddVersion(self, request, context):
|
|
85
|
+
"""Add version to service.
|
|
86
|
+
"""
|
|
87
|
+
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
|
88
|
+
context.set_details('Method not implemented!')
|
|
89
|
+
raise NotImplementedError('Method not implemented!')
|
|
90
|
+
|
|
91
|
+
def TerminateServices(self, request, context):
|
|
92
|
+
"""Terminate services.
|
|
93
|
+
"""
|
|
94
|
+
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
|
95
|
+
context.set_details('Method not implemented!')
|
|
96
|
+
raise NotImplementedError('Method not implemented!')
|
|
97
|
+
|
|
98
|
+
def TerminateReplica(self, request, context):
|
|
99
|
+
"""Terminate replica.
|
|
100
|
+
"""
|
|
101
|
+
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
|
102
|
+
context.set_details('Method not implemented!')
|
|
103
|
+
raise NotImplementedError('Method not implemented!')
|
|
104
|
+
|
|
105
|
+
def WaitServiceRegistration(self, request, context):
|
|
106
|
+
"""Wait for service registration.
|
|
107
|
+
"""
|
|
108
|
+
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
|
109
|
+
context.set_details('Method not implemented!')
|
|
110
|
+
raise NotImplementedError('Method not implemented!')
|
|
111
|
+
|
|
112
|
+
def UpdateService(self, request, context):
|
|
113
|
+
"""Update service.
|
|
114
|
+
"""
|
|
115
|
+
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
|
116
|
+
context.set_details('Method not implemented!')
|
|
117
|
+
raise NotImplementedError('Method not implemented!')
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def add_ServeServiceServicer_to_server(servicer, server):
|
|
121
|
+
rpc_method_handlers = {
|
|
122
|
+
'GetServiceStatus': grpc.unary_unary_rpc_method_handler(
|
|
123
|
+
servicer.GetServiceStatus,
|
|
124
|
+
request_deserializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.GetServiceStatusRequest.FromString,
|
|
125
|
+
response_serializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.GetServiceStatusResponse.SerializeToString,
|
|
126
|
+
),
|
|
127
|
+
'AddVersion': grpc.unary_unary_rpc_method_handler(
|
|
128
|
+
servicer.AddVersion,
|
|
129
|
+
request_deserializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.AddVersionRequest.FromString,
|
|
130
|
+
response_serializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.AddVersionResponse.SerializeToString,
|
|
131
|
+
),
|
|
132
|
+
'TerminateServices': grpc.unary_unary_rpc_method_handler(
|
|
133
|
+
servicer.TerminateServices,
|
|
134
|
+
request_deserializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.TerminateServicesRequest.FromString,
|
|
135
|
+
response_serializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.TerminateServicesResponse.SerializeToString,
|
|
136
|
+
),
|
|
137
|
+
'TerminateReplica': grpc.unary_unary_rpc_method_handler(
|
|
138
|
+
servicer.TerminateReplica,
|
|
139
|
+
request_deserializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.TerminateReplicaRequest.FromString,
|
|
140
|
+
response_serializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.TerminateReplicaResponse.SerializeToString,
|
|
141
|
+
),
|
|
142
|
+
'WaitServiceRegistration': grpc.unary_unary_rpc_method_handler(
|
|
143
|
+
servicer.WaitServiceRegistration,
|
|
144
|
+
request_deserializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.WaitServiceRegistrationRequest.FromString,
|
|
145
|
+
response_serializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.WaitServiceRegistrationResponse.SerializeToString,
|
|
146
|
+
),
|
|
147
|
+
'UpdateService': grpc.unary_unary_rpc_method_handler(
|
|
148
|
+
servicer.UpdateService,
|
|
149
|
+
request_deserializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.UpdateServiceRequest.FromString,
|
|
150
|
+
response_serializer=sky_dot_schemas_dot_generated_dot_servev1__pb2.UpdateServiceResponse.SerializeToString,
|
|
151
|
+
),
|
|
152
|
+
}
|
|
153
|
+
generic_handler = grpc.method_handlers_generic_handler(
|
|
154
|
+
'serve.v1.ServeService', rpc_method_handlers)
|
|
155
|
+
server.add_generic_rpc_handlers((generic_handler,))
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
# This class is part of an EXPERIMENTAL API.
|
|
159
|
+
class ServeService(object):
|
|
160
|
+
"""Missing associated documentation comment in .proto file."""
|
|
161
|
+
|
|
162
|
+
@staticmethod
|
|
163
|
+
def GetServiceStatus(request,
|
|
164
|
+
target,
|
|
165
|
+
options=(),
|
|
166
|
+
channel_credentials=None,
|
|
167
|
+
call_credentials=None,
|
|
168
|
+
insecure=False,
|
|
169
|
+
compression=None,
|
|
170
|
+
wait_for_ready=None,
|
|
171
|
+
timeout=None,
|
|
172
|
+
metadata=None):
|
|
173
|
+
return grpc.experimental.unary_unary(
|
|
174
|
+
request,
|
|
175
|
+
target,
|
|
176
|
+
'/serve.v1.ServeService/GetServiceStatus',
|
|
177
|
+
sky_dot_schemas_dot_generated_dot_servev1__pb2.GetServiceStatusRequest.SerializeToString,
|
|
178
|
+
sky_dot_schemas_dot_generated_dot_servev1__pb2.GetServiceStatusResponse.FromString,
|
|
179
|
+
options,
|
|
180
|
+
channel_credentials,
|
|
181
|
+
insecure,
|
|
182
|
+
call_credentials,
|
|
183
|
+
compression,
|
|
184
|
+
wait_for_ready,
|
|
185
|
+
timeout,
|
|
186
|
+
metadata,
|
|
187
|
+
_registered_method=True)
|
|
188
|
+
|
|
189
|
+
@staticmethod
|
|
190
|
+
def AddVersion(request,
|
|
191
|
+
target,
|
|
192
|
+
options=(),
|
|
193
|
+
channel_credentials=None,
|
|
194
|
+
call_credentials=None,
|
|
195
|
+
insecure=False,
|
|
196
|
+
compression=None,
|
|
197
|
+
wait_for_ready=None,
|
|
198
|
+
timeout=None,
|
|
199
|
+
metadata=None):
|
|
200
|
+
return grpc.experimental.unary_unary(
|
|
201
|
+
request,
|
|
202
|
+
target,
|
|
203
|
+
'/serve.v1.ServeService/AddVersion',
|
|
204
|
+
sky_dot_schemas_dot_generated_dot_servev1__pb2.AddVersionRequest.SerializeToString,
|
|
205
|
+
sky_dot_schemas_dot_generated_dot_servev1__pb2.AddVersionResponse.FromString,
|
|
206
|
+
options,
|
|
207
|
+
channel_credentials,
|
|
208
|
+
insecure,
|
|
209
|
+
call_credentials,
|
|
210
|
+
compression,
|
|
211
|
+
wait_for_ready,
|
|
212
|
+
timeout,
|
|
213
|
+
metadata,
|
|
214
|
+
_registered_method=True)
|
|
215
|
+
|
|
216
|
+
@staticmethod
|
|
217
|
+
def TerminateServices(request,
|
|
218
|
+
target,
|
|
219
|
+
options=(),
|
|
220
|
+
channel_credentials=None,
|
|
221
|
+
call_credentials=None,
|
|
222
|
+
insecure=False,
|
|
223
|
+
compression=None,
|
|
224
|
+
wait_for_ready=None,
|
|
225
|
+
timeout=None,
|
|
226
|
+
metadata=None):
|
|
227
|
+
return grpc.experimental.unary_unary(
|
|
228
|
+
request,
|
|
229
|
+
target,
|
|
230
|
+
'/serve.v1.ServeService/TerminateServices',
|
|
231
|
+
sky_dot_schemas_dot_generated_dot_servev1__pb2.TerminateServicesRequest.SerializeToString,
|
|
232
|
+
sky_dot_schemas_dot_generated_dot_servev1__pb2.TerminateServicesResponse.FromString,
|
|
233
|
+
options,
|
|
234
|
+
channel_credentials,
|
|
235
|
+
insecure,
|
|
236
|
+
call_credentials,
|
|
237
|
+
compression,
|
|
238
|
+
wait_for_ready,
|
|
239
|
+
timeout,
|
|
240
|
+
metadata,
|
|
241
|
+
_registered_method=True)
|
|
242
|
+
|
|
243
|
+
@staticmethod
|
|
244
|
+
def TerminateReplica(request,
|
|
245
|
+
target,
|
|
246
|
+
options=(),
|
|
247
|
+
channel_credentials=None,
|
|
248
|
+
call_credentials=None,
|
|
249
|
+
insecure=False,
|
|
250
|
+
compression=None,
|
|
251
|
+
wait_for_ready=None,
|
|
252
|
+
timeout=None,
|
|
253
|
+
metadata=None):
|
|
254
|
+
return grpc.experimental.unary_unary(
|
|
255
|
+
request,
|
|
256
|
+
target,
|
|
257
|
+
'/serve.v1.ServeService/TerminateReplica',
|
|
258
|
+
sky_dot_schemas_dot_generated_dot_servev1__pb2.TerminateReplicaRequest.SerializeToString,
|
|
259
|
+
sky_dot_schemas_dot_generated_dot_servev1__pb2.TerminateReplicaResponse.FromString,
|
|
260
|
+
options,
|
|
261
|
+
channel_credentials,
|
|
262
|
+
insecure,
|
|
263
|
+
call_credentials,
|
|
264
|
+
compression,
|
|
265
|
+
wait_for_ready,
|
|
266
|
+
timeout,
|
|
267
|
+
metadata,
|
|
268
|
+
_registered_method=True)
|
|
269
|
+
|
|
270
|
+
@staticmethod
|
|
271
|
+
def WaitServiceRegistration(request,
|
|
272
|
+
target,
|
|
273
|
+
options=(),
|
|
274
|
+
channel_credentials=None,
|
|
275
|
+
call_credentials=None,
|
|
276
|
+
insecure=False,
|
|
277
|
+
compression=None,
|
|
278
|
+
wait_for_ready=None,
|
|
279
|
+
timeout=None,
|
|
280
|
+
metadata=None):
|
|
281
|
+
return grpc.experimental.unary_unary(
|
|
282
|
+
request,
|
|
283
|
+
target,
|
|
284
|
+
'/serve.v1.ServeService/WaitServiceRegistration',
|
|
285
|
+
sky_dot_schemas_dot_generated_dot_servev1__pb2.WaitServiceRegistrationRequest.SerializeToString,
|
|
286
|
+
sky_dot_schemas_dot_generated_dot_servev1__pb2.WaitServiceRegistrationResponse.FromString,
|
|
287
|
+
options,
|
|
288
|
+
channel_credentials,
|
|
289
|
+
insecure,
|
|
290
|
+
call_credentials,
|
|
291
|
+
compression,
|
|
292
|
+
wait_for_ready,
|
|
293
|
+
timeout,
|
|
294
|
+
metadata,
|
|
295
|
+
_registered_method=True)
|
|
296
|
+
|
|
297
|
+
@staticmethod
|
|
298
|
+
def UpdateService(request,
|
|
299
|
+
target,
|
|
300
|
+
options=(),
|
|
301
|
+
channel_credentials=None,
|
|
302
|
+
call_credentials=None,
|
|
303
|
+
insecure=False,
|
|
304
|
+
compression=None,
|
|
305
|
+
wait_for_ready=None,
|
|
306
|
+
timeout=None,
|
|
307
|
+
metadata=None):
|
|
308
|
+
return grpc.experimental.unary_unary(
|
|
309
|
+
request,
|
|
310
|
+
target,
|
|
311
|
+
'/serve.v1.ServeService/UpdateService',
|
|
312
|
+
sky_dot_schemas_dot_generated_dot_servev1__pb2.UpdateServiceRequest.SerializeToString,
|
|
313
|
+
sky_dot_schemas_dot_generated_dot_servev1__pb2.UpdateServiceResponse.FromString,
|
|
314
|
+
options,
|
|
315
|
+
channel_credentials,
|
|
316
|
+
insecure,
|
|
317
|
+
call_credentials,
|
|
318
|
+
compression,
|
|
319
|
+
wait_for_ready,
|
|
320
|
+
timeout,
|
|
321
|
+
metadata,
|
|
322
|
+
_registered_method=True)
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"""Rpc Utilities for SkyServe"""
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
from typing import Any, Dict, List, Optional, Tuple
|
|
5
|
+
|
|
6
|
+
from sky import backends
|
|
7
|
+
from sky.adaptors import common as adaptors_common
|
|
8
|
+
from sky.backends import backend_utils
|
|
9
|
+
from sky.serve import serve_utils
|
|
10
|
+
|
|
11
|
+
if typing.TYPE_CHECKING:
|
|
12
|
+
from sky.schemas.generated import servev1_pb2
|
|
13
|
+
else:
|
|
14
|
+
servev1_pb2 = adaptors_common.LazyImport(
|
|
15
|
+
'sky.schemas.generated.servev1_pb2')
|
|
16
|
+
|
|
17
|
+
# ======================= gRPC Converters for Sky Serve =======================
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class GetServiceStatusRequestConverter:
|
|
21
|
+
"""Converter for GetServiceStatusRequest"""
|
|
22
|
+
|
|
23
|
+
@classmethod
|
|
24
|
+
def to_proto(cls, service_names: Optional[List[str]],
|
|
25
|
+
pool: bool) -> 'servev1_pb2.GetServiceStatusRequest':
|
|
26
|
+
request = servev1_pb2.GetServiceStatusRequest()
|
|
27
|
+
request.pool = pool
|
|
28
|
+
if service_names is not None:
|
|
29
|
+
request.service_names.names.extend(service_names)
|
|
30
|
+
return request
|
|
31
|
+
|
|
32
|
+
@classmethod
|
|
33
|
+
def from_proto(
|
|
34
|
+
cls, proto: 'servev1_pb2.GetServiceStatusRequest'
|
|
35
|
+
) -> Tuple[Optional[List[str]], bool]:
|
|
36
|
+
pool = proto.pool
|
|
37
|
+
if proto.HasField('service_names'):
|
|
38
|
+
service_names = list(proto.service_names.names)
|
|
39
|
+
else:
|
|
40
|
+
service_names = None
|
|
41
|
+
return service_names, pool
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class GetServiceStatusResponseConverter:
|
|
45
|
+
"""Converter for GetServiceStatusResponse"""
|
|
46
|
+
|
|
47
|
+
@classmethod
|
|
48
|
+
def to_proto(
|
|
49
|
+
cls,
|
|
50
|
+
statuses: List[Dict[str,
|
|
51
|
+
str]]) -> 'servev1_pb2.GetServiceStatusResponse':
|
|
52
|
+
response = servev1_pb2.GetServiceStatusResponse()
|
|
53
|
+
for status in statuses:
|
|
54
|
+
added = response.statuses.add()
|
|
55
|
+
added.status.update(status)
|
|
56
|
+
return response
|
|
57
|
+
|
|
58
|
+
@classmethod
|
|
59
|
+
def from_proto(
|
|
60
|
+
cls, proto: 'servev1_pb2.GetServiceStatusResponse'
|
|
61
|
+
) -> List[Dict[str, str]]:
|
|
62
|
+
pickled = [dict(status.status) for status in proto.statuses]
|
|
63
|
+
return pickled
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class TerminateServicesRequestConverter:
|
|
67
|
+
"""Converter for TerminateServicesRequest"""
|
|
68
|
+
|
|
69
|
+
@classmethod
|
|
70
|
+
def to_proto(cls, service_names: Optional[List[str]], purge: bool,
|
|
71
|
+
pool: bool) -> 'servev1_pb2.TerminateServicesRequest':
|
|
72
|
+
request = servev1_pb2.TerminateServicesRequest()
|
|
73
|
+
request.purge = purge
|
|
74
|
+
request.pool = pool
|
|
75
|
+
if service_names is not None:
|
|
76
|
+
request.service_names.names.extend(service_names)
|
|
77
|
+
return request
|
|
78
|
+
|
|
79
|
+
@classmethod
|
|
80
|
+
def from_proto(
|
|
81
|
+
cls, proto: 'servev1_pb2.TerminateServicesRequest'
|
|
82
|
+
) -> Tuple[Optional[List[str]], bool, bool]:
|
|
83
|
+
purge = proto.purge
|
|
84
|
+
pool = proto.pool
|
|
85
|
+
if proto.HasField('service_names'):
|
|
86
|
+
service_names = list(proto.service_names.names)
|
|
87
|
+
else:
|
|
88
|
+
service_names = None
|
|
89
|
+
return service_names, purge, pool
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
# ========================= gRPC Runner for Sky Serve =========================
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
class RpcRunner:
|
|
96
|
+
"""gRPC Runner for Sky Serve
|
|
97
|
+
|
|
98
|
+
The RPC runner does not catch errors, and assumes that backend handle has
|
|
99
|
+
grpc enabled.
|
|
100
|
+
|
|
101
|
+
Common exceptions raised:
|
|
102
|
+
exceptions.FetchClusterInfoError
|
|
103
|
+
exceptions.SkyletInternalError
|
|
104
|
+
grpc.RpcError
|
|
105
|
+
grpc.FutureTimeoutError
|
|
106
|
+
AssertionError
|
|
107
|
+
"""
|
|
108
|
+
|
|
109
|
+
@classmethod
|
|
110
|
+
def get_service_status(cls, handle: backends.CloudVmRayResourceHandle,
|
|
111
|
+
service_names: Optional[List[str]],
|
|
112
|
+
pool: bool) -> List[Dict[str, Any]]:
|
|
113
|
+
assert handle.is_grpc_enabled_with_flag
|
|
114
|
+
request = GetServiceStatusRequestConverter.to_proto(service_names, pool)
|
|
115
|
+
response = backend_utils.invoke_skylet_with_retries(
|
|
116
|
+
lambda: backends.SkyletClient(handle.get_grpc_channel()
|
|
117
|
+
).get_service_status(request))
|
|
118
|
+
pickled = GetServiceStatusResponseConverter.from_proto(response)
|
|
119
|
+
return serve_utils.unpickle_service_status(pickled)
|
|
120
|
+
|
|
121
|
+
@classmethod
|
|
122
|
+
def add_version(cls, handle: backends.CloudVmRayResourceHandle,
|
|
123
|
+
service_name: str) -> int:
|
|
124
|
+
assert handle.is_grpc_enabled_with_flag
|
|
125
|
+
request = servev1_pb2.AddVersionRequest(service_name=service_name)
|
|
126
|
+
response = backend_utils.invoke_skylet_with_retries(
|
|
127
|
+
lambda: backends.SkyletClient(handle.get_grpc_channel()
|
|
128
|
+
).add_serve_version(request))
|
|
129
|
+
return response.version
|
|
130
|
+
|
|
131
|
+
@classmethod
|
|
132
|
+
def terminate_services(cls, handle: backends.CloudVmRayResourceHandle,
|
|
133
|
+
service_names: Optional[List[str]], purge: bool,
|
|
134
|
+
pool: bool) -> str:
|
|
135
|
+
assert handle.is_grpc_enabled_with_flag
|
|
136
|
+
request = TerminateServicesRequestConverter.to_proto(
|
|
137
|
+
service_names, purge, pool)
|
|
138
|
+
response = backend_utils.invoke_skylet_with_retries(
|
|
139
|
+
lambda: backends.SkyletClient(handle.get_grpc_channel()
|
|
140
|
+
).terminate_services(request))
|
|
141
|
+
return response.message
|
|
142
|
+
|
|
143
|
+
@classmethod
|
|
144
|
+
def terminate_replica(cls, handle: backends.CloudVmRayResourceHandle,
|
|
145
|
+
service_name: str, replica_id: int,
|
|
146
|
+
purge: bool) -> str:
|
|
147
|
+
assert handle.is_grpc_enabled_with_flag
|
|
148
|
+
request = servev1_pb2.TerminateReplicaRequest(service_name=service_name,
|
|
149
|
+
replica_id=replica_id,
|
|
150
|
+
purge=purge)
|
|
151
|
+
response = backend_utils.invoke_skylet_with_retries(
|
|
152
|
+
lambda: backends.SkyletClient(handle.get_grpc_channel()
|
|
153
|
+
).terminate_replica(request))
|
|
154
|
+
return response.message
|
|
155
|
+
|
|
156
|
+
@classmethod
|
|
157
|
+
def wait_service_registration(cls,
|
|
158
|
+
handle: backends.CloudVmRayResourceHandle,
|
|
159
|
+
service_name: str, job_id: int,
|
|
160
|
+
pool: bool) -> int:
|
|
161
|
+
assert handle.is_grpc_enabled_with_flag
|
|
162
|
+
request = servev1_pb2.WaitServiceRegistrationRequest(
|
|
163
|
+
service_name=service_name, job_id=job_id, pool=pool)
|
|
164
|
+
response = backend_utils.invoke_skylet_with_retries(
|
|
165
|
+
lambda: backends.SkyletClient(handle.get_grpc_channel()
|
|
166
|
+
).wait_service_registration(request))
|
|
167
|
+
return response.lb_port
|
|
168
|
+
|
|
169
|
+
@classmethod
|
|
170
|
+
def update_service(cls, handle: backends.CloudVmRayResourceHandle,
|
|
171
|
+
service_name: str, version: int,
|
|
172
|
+
mode: serve_utils.UpdateMode, pool: bool) -> None:
|
|
173
|
+
assert handle.is_grpc_enabled_with_flag
|
|
174
|
+
request = servev1_pb2.UpdateServiceRequest(service_name=service_name,
|
|
175
|
+
version=version,
|
|
176
|
+
mode=mode.value,
|
|
177
|
+
pool=pool)
|
|
178
|
+
backend_utils.invoke_skylet_with_retries(lambda: backends.SkyletClient(
|
|
179
|
+
handle.get_grpc_channel()).update_service(request))
|