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.

Files changed (81) hide show
  1. sky/__init__.py +4 -2
  2. sky/adaptors/primeintellect.py +1 -0
  3. sky/adaptors/seeweb.py +68 -4
  4. sky/authentication.py +25 -0
  5. sky/backends/__init__.py +3 -2
  6. sky/backends/backend_utils.py +16 -12
  7. sky/backends/cloud_vm_ray_backend.py +57 -0
  8. sky/catalog/primeintellect_catalog.py +95 -0
  9. sky/clouds/__init__.py +2 -0
  10. sky/clouds/primeintellect.py +314 -0
  11. sky/core.py +77 -48
  12. sky/dashboard/out/404.html +1 -1
  13. sky/dashboard/out/_next/static/{y8s7LlyyfhMzpzCkxuD2r → VvaUqYDvHOcHZRnvMBmax}/_buildManifest.js +1 -1
  14. sky/dashboard/out/_next/static/chunks/1121-4ff1ec0dbc5792ab.js +1 -0
  15. sky/dashboard/out/_next/static/chunks/3015-88c7c8d69b0b6dba.js +1 -0
  16. sky/dashboard/out/_next/static/chunks/{6856-e0754534b3015377.js → 6856-9a2538f38c004652.js} +1 -1
  17. sky/dashboard/out/_next/static/chunks/8969-a39efbadcd9fde80.js +1 -0
  18. sky/dashboard/out/_next/static/chunks/9037-472ee1222cb1e158.js +6 -0
  19. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-1e9248ddbddcd122.js +16 -0
  20. sky/dashboard/out/_next/static/chunks/pages/clusters/{[cluster]-0b4b35dc1dfe046c.js → [cluster]-9525660179df3605.js} +1 -1
  21. sky/dashboard/out/_next/static/chunks/{webpack-05f82d90d6fd7f82.js → webpack-b2a3938c22b6647b.js} +1 -1
  22. sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
  23. sky/dashboard/out/clusters/[cluster].html +1 -1
  24. sky/dashboard/out/clusters.html +1 -1
  25. sky/dashboard/out/config.html +1 -1
  26. sky/dashboard/out/index.html +1 -1
  27. sky/dashboard/out/infra/[context].html +1 -1
  28. sky/dashboard/out/infra.html +1 -1
  29. sky/dashboard/out/jobs/[job].html +1 -1
  30. sky/dashboard/out/jobs/pools/[pool].html +1 -1
  31. sky/dashboard/out/jobs.html +1 -1
  32. sky/dashboard/out/users.html +1 -1
  33. sky/dashboard/out/volumes.html +1 -1
  34. sky/dashboard/out/workspace/new.html +1 -1
  35. sky/dashboard/out/workspaces/[name].html +1 -1
  36. sky/dashboard/out/workspaces.html +1 -1
  37. sky/global_user_state.py +99 -62
  38. sky/jobs/server/server.py +14 -1
  39. sky/jobs/state.py +26 -1
  40. sky/metrics/utils.py +174 -8
  41. sky/provision/__init__.py +1 -0
  42. sky/provision/docker_utils.py +6 -2
  43. sky/provision/primeintellect/__init__.py +10 -0
  44. sky/provision/primeintellect/config.py +11 -0
  45. sky/provision/primeintellect/instance.py +454 -0
  46. sky/provision/primeintellect/utils.py +398 -0
  47. sky/resources.py +9 -1
  48. sky/schemas/generated/jobsv1_pb2.py +40 -40
  49. sky/schemas/generated/servev1_pb2.py +58 -0
  50. sky/schemas/generated/servev1_pb2.pyi +115 -0
  51. sky/schemas/generated/servev1_pb2_grpc.py +322 -0
  52. sky/serve/serve_rpc_utils.py +179 -0
  53. sky/serve/serve_utils.py +29 -12
  54. sky/serve/server/core.py +37 -19
  55. sky/serve/server/impl.py +221 -129
  56. sky/server/metrics.py +52 -158
  57. sky/server/requests/executor.py +12 -8
  58. sky/server/requests/payloads.py +6 -0
  59. sky/server/requests/requests.py +1 -1
  60. sky/server/requests/serializers/encoders.py +3 -2
  61. sky/server/server.py +5 -41
  62. sky/setup_files/dependencies.py +1 -0
  63. sky/skylet/constants.py +10 -5
  64. sky/skylet/job_lib.py +14 -15
  65. sky/skylet/services.py +98 -0
  66. sky/skylet/skylet.py +3 -1
  67. sky/templates/kubernetes-ray.yml.j2 +22 -12
  68. sky/templates/primeintellect-ray.yml.j2 +71 -0
  69. sky/utils/locks.py +41 -10
  70. {skypilot_nightly-1.0.0.dev20250916.dist-info → skypilot_nightly-1.0.0.dev20250919.dist-info}/METADATA +36 -35
  71. {skypilot_nightly-1.0.0.dev20250916.dist-info → skypilot_nightly-1.0.0.dev20250919.dist-info}/RECORD +76 -64
  72. sky/dashboard/out/_next/static/chunks/1121-408ed10b2f9fce17.js +0 -1
  73. sky/dashboard/out/_next/static/chunks/3015-2ea98b57e318bd6e.js +0 -1
  74. sky/dashboard/out/_next/static/chunks/8969-0487dfbf149d9e53.js +0 -1
  75. sky/dashboard/out/_next/static/chunks/9037-f9800e64eb05dd1c.js +0 -6
  76. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-1cbba24bd1bd35f8.js +0 -16
  77. /sky/dashboard/out/_next/static/{y8s7LlyyfhMzpzCkxuD2r → VvaUqYDvHOcHZRnvMBmax}/_ssgManifest.js +0 -0
  78. {skypilot_nightly-1.0.0.dev20250916.dist-info → skypilot_nightly-1.0.0.dev20250919.dist-info}/WHEEL +0 -0
  79. {skypilot_nightly-1.0.0.dev20250916.dist-info → skypilot_nightly-1.0.0.dev20250919.dist-info}/entry_points.txt +0 -0
  80. {skypilot_nightly-1.0.0.dev20250916.dist-info → skypilot_nightly-1.0.0.dev20250919.dist-info}/licenses/LICENSE +0 -0
  81. {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))