modal 0.71.7__py3-none-any.whl → 0.71.12__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.
modal/io_streams.py CHANGED
@@ -14,8 +14,7 @@ from typing import (
14
14
  from grpclib import Status
15
15
  from grpclib.exceptions import GRPCError, StreamTerminatedError
16
16
 
17
- from modal.exception import InvalidError
18
- from modal.io_streams_helper import consume_stream_with_retries
17
+ from modal.exception import ClientClosed, InvalidError
19
18
  from modal_proto import api_pb2
20
19
 
21
20
  from ._utils.async_utils import synchronize_api
@@ -177,21 +176,34 @@ class _StreamReader(Generic[T]):
177
176
  if self._stream_type == StreamType.DEVNULL:
178
177
  return
179
178
 
180
- def item_handler(item: Optional[bytes]):
181
- if self._stream_type == StreamType.STDOUT and item is not None:
182
- print(item.decode("utf-8"), end="")
183
- elif self._stream_type == StreamType.PIPE:
184
- self._container_process_buffer.append(item)
179
+ completed = False
180
+ retries_remaining = 10
181
+ while not completed:
182
+ try:
183
+ iterator = _container_process_logs_iterator(self._object_id, self._file_descriptor, self._client)
185
184
 
186
- def completion_check(item: Optional[bytes]):
187
- return item is None
185
+ async for message in iterator:
186
+ if self._stream_type == StreamType.STDOUT and message:
187
+ print(message.decode("utf-8"), end="")
188
+ elif self._stream_type == StreamType.PIPE:
189
+ self._container_process_buffer.append(message)
190
+ if message is None:
191
+ completed = True
192
+ break
188
193
 
189
- iterator = _container_process_logs_iterator(self._object_id, self._file_descriptor, self._client)
190
- await consume_stream_with_retries(
191
- iterator,
192
- item_handler,
193
- completion_check,
194
- )
194
+ except (GRPCError, StreamTerminatedError, ClientClosed) as exc:
195
+ if retries_remaining > 0:
196
+ retries_remaining -= 1
197
+ if isinstance(exc, GRPCError):
198
+ if exc.status in RETRYABLE_GRPC_STATUS_CODES:
199
+ await asyncio.sleep(1.0)
200
+ continue
201
+ elif isinstance(exc, StreamTerminatedError):
202
+ continue
203
+ elif isinstance(exc, ClientClosed):
204
+ # If the client was closed, the user has triggered a cleanup.
205
+ break
206
+ raise exc
195
207
 
196
208
  async def _stream_container_process(self) -> AsyncGenerator[tuple[Optional[bytes], str], None]:
197
209
  """Streams the container process buffer to the reader."""
modal/volume.py CHANGED
@@ -506,6 +506,18 @@ class _Volume(_Object, type_prefix="vo"):
506
506
  req = api_pb2.VolumeDeleteRequest(volume_id=obj.object_id)
507
507
  await retry_transient_errors(obj._client.stub.VolumeDelete, req)
508
508
 
509
+ @staticmethod
510
+ async def rename(
511
+ old_name: str,
512
+ new_name: str,
513
+ *,
514
+ client: Optional[_Client] = None,
515
+ environment_name: Optional[str] = None,
516
+ ):
517
+ obj = await _Volume.lookup(old_name, client=client, environment_name=environment_name)
518
+ req = api_pb2.VolumeRenameRequest(volume_id=obj.object_id, name=new_name)
519
+ await retry_transient_errors(obj._client.stub.VolumeRename, req)
520
+
509
521
 
510
522
  class _VolumeUploadContextManager:
511
523
  """Context manager for batch-uploading files to a Volume."""
modal/volume.pyi CHANGED
@@ -85,6 +85,14 @@ class _Volume(modal.object._Object):
85
85
  async def delete(
86
86
  name: str, client: typing.Optional[modal.client._Client] = None, environment_name: typing.Optional[str] = None
87
87
  ): ...
88
+ @staticmethod
89
+ async def rename(
90
+ old_name: str,
91
+ new_name: str,
92
+ *,
93
+ client: typing.Optional[modal.client._Client] = None,
94
+ environment_name: typing.Optional[str] = None,
95
+ ): ...
88
96
 
89
97
  class _VolumeUploadContextManager:
90
98
  _volume_id: str
@@ -272,6 +280,26 @@ class Volume(modal.object.Object):
272
280
 
273
281
  delete: __delete_spec
274
282
 
283
+ class __rename_spec(typing_extensions.Protocol):
284
+ def __call__(
285
+ self,
286
+ old_name: str,
287
+ new_name: str,
288
+ *,
289
+ client: typing.Optional[modal.client.Client] = None,
290
+ environment_name: typing.Optional[str] = None,
291
+ ): ...
292
+ async def aio(
293
+ self,
294
+ old_name: str,
295
+ new_name: str,
296
+ *,
297
+ client: typing.Optional[modal.client.Client] = None,
298
+ environment_name: typing.Optional[str] = None,
299
+ ): ...
300
+
301
+ rename: __rename_spec
302
+
275
303
  class VolumeUploadContextManager:
276
304
  _volume_id: str
277
305
  _client: modal.client.Client
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: modal
3
- Version: 0.71.7
3
+ Version: 0.71.12
4
4
  Summary: Python client library for Modal
5
5
  Author: Modal Labs
6
6
  Author-email: support@modal.com
@@ -2,7 +2,7 @@ modal/__init__.py,sha256=3NJLLHb0TRc2tc68kf8NHzORx38GbtbZvPEWDWrQ6N4,2234
2
2
  modal/__main__.py,sha256=scYhGFqh8OJcVDo-VOxIT6CCwxOgzgflYWMnIZiMRqE,2871
3
3
  modal/_clustered_functions.py,sha256=kTf-9YBXY88NutC1akI-gCbvf01RhMPCw-zoOI_YIUE,2700
4
4
  modal/_clustered_functions.pyi,sha256=vllkegc99A0jrUOWa8mdlSbdp6uz36TsHhGxysAOpaQ,771
5
- modal/_container_entrypoint.py,sha256=-zUa567FgOKmF0TtFWQ6DgehUD2CMfABDBQ8oLSpjyc,29171
5
+ modal/_container_entrypoint.py,sha256=U1ZU-Sa0LC646YPh0AWSGVBHmzfTxYUiGu2viKzW-Zs,29643
6
6
  modal/_ipython.py,sha256=TW1fkVOmZL3YYqdS2YlM1hqpf654Yf8ZyybHdBnlhSw,301
7
7
  modal/_location.py,sha256=S3lSxIU3h9HkWpkJ3Pwo0pqjIOSB1fjeSgUsY3x7eec,1202
8
8
  modal/_output.py,sha256=0fWX_KQwhER--U81ys16CL-pA5A-LN20C0EZjElKGJQ,25410
@@ -19,7 +19,7 @@ modal/app.py,sha256=vEE0cK5QPF6_cdW5AJvcuWxz5KmeprHwBEtlDkVRHgE,45582
19
19
  modal/app.pyi,sha256=Gx7gxjfQ70sxhbwfpx1VjvzEON-ZEMTJ_Vy8qt0oQvo,25302
20
20
  modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
21
21
  modal/client.py,sha256=JAnd4-GCN093BwkvOFAK5a6iy5ycxofjpUncMxlrIMw,15253
22
- modal/client.pyi,sha256=BemCZNYj-Ol_UF2iZJVU15N3VIKhxO2CPtgxitRJWw4,7278
22
+ modal/client.pyi,sha256=fidFDEnApJ5cdIG6f0JFX3SIzsgBEH7Ubu26iPbYew4,7280
23
23
  modal/cloud_bucket_mount.py,sha256=G7T7jWLD0QkmrfKR75mSTwdUZ2xNfj7pkVqb4ipmxmI,5735
24
24
  modal/cloud_bucket_mount.pyi,sha256=CEi7vrH3kDUF4LAy4qP6tfImy2UJuFRcRbsgRNM1wo8,1403
25
25
  modal/cls.py,sha256=3hjb0JcoPjxKZNeK22f5rR43bZRBjoRI7_EMZXY7YrE,31172
@@ -33,17 +33,16 @@ modal/environments.py,sha256=wbv9ttFCbzATGfwcmvYiG608PfHovx0AQmawsg-jmic,6660
33
33
  modal/environments.pyi,sha256=rF7oaaELoSNuoD6qImGnIbuGPtgWwR5SlcExyYJ61hQ,3515
34
34
  modal/exception.py,sha256=4JyO-SACaLNDe2QC48EjsK8GMkZ8AgEurZ8j1YdRu8E,5263
35
35
  modal/experimental.py,sha256=npfKbyMpI41uZZs9HW_QiB3E4ykWfDXZbACXXbw6qeA,2385
36
- modal/file_io.py,sha256=ZR8VBCDsDt5uB9TNN9XbEh7sniJzM_5YL47m8WP0m5c,19617
37
- modal/file_io.pyi,sha256=79Fg75BjmMEeCX0Lx-Z8C4XSNPCotwNdK6ZLIDFm2f4,9770
36
+ modal/file_io.py,sha256=lcMs_E9Xfm0YX1t9U2wNIBPnqHRxmImqjLW1GHqVmyg,20945
37
+ modal/file_io.pyi,sha256=NrIoB0YjIqZ8MDMe826xAnybT0ww_kxQM3iPLo82REU,8898
38
38
  modal/file_pattern_matcher.py,sha256=LaI7Paxg0xR9D-D7Tgc60xR0w1KZee22LjGbFie1Vms,5571
39
39
  modal/functions.py,sha256=3uJPbrEAWhpFfLfUnoRjGmvEUC-_wVh-8yNJBx8eVeM,68249
40
40
  modal/functions.pyi,sha256=3ESJ61f8oEDycDmrpnuNB2vjFKuLBG_aqyliXPTdY7M,25407
41
41
  modal/gpu.py,sha256=MTxj6ql8EpgfBg8YmZ5a1cLznyuZFssX1qXbEX4LKVM,7503
42
42
  modal/image.py,sha256=oKqqLhc3Ap2XMG5MKVlERKkMTwJPkNMNcSzxoZh4zuw,85259
43
43
  modal/image.pyi,sha256=Pa1_LVr3FyNsnu_MhBO08fBgCeLazTEe25phYdu0bzE,25365
44
- modal/io_streams.py,sha256=Xxc5grJiO94nBA48FFWH3S3g6SPR0xFVgZ_DZ1oFmvI,14428
44
+ modal/io_streams.py,sha256=QkQiizKRzd5bnbKQsap31LJgBYlAnj4-XkV_50xPYX0,15079
45
45
  modal/io_streams.pyi,sha256=bCCVSxkMcosYd8O3PQDDwJw7TQ8JEcnYonLJ5t27TQs,4804
46
- modal/io_streams_helper.py,sha256=B5Ui56ph7LkRpZX0tAF80Q-gOMsvPPLx5bpIPX0kgDc,1772
47
46
  modal/mount.py,sha256=wOr-2vmKImsE3lHBII8hL2gYy5ng46R58QwId4JultQ,29313
48
47
  modal/mount.pyi,sha256=FiNV1wIKFvd0ZMZ0tm1mz6ZSA5Hjsge-kFSA5tPWfcI,10503
49
48
  modal/network_file_system.py,sha256=INj1TfN_Fsmabmlte7anvey1epodjbMmjBW_TIJSST4,14406
@@ -75,10 +74,10 @@ modal/serving.pyi,sha256=ncV-9jY_vZYFnGs5ZnMb3ffrX8LmcLdIMHBC56xRbtE,1711
75
74
  modal/stream_type.py,sha256=A6320qoAAWhEfwOCZfGtymQTu5AfLfJXXgARqooTPvY,417
76
75
  modal/token_flow.py,sha256=LcgSce_MSQ2p7j55DPwpVRpiAtCDe8GRSEwzO7muNR8,6774
77
76
  modal/token_flow.pyi,sha256=gOYtYujrWt_JFZeiI8EmfahXPx5GCR5Na-VaPQcWgEY,1937
78
- modal/volume.py,sha256=T-pLxCYqmqRO6OolpAXlPxomMu0RWjti2e4kUpaj2cQ,29229
79
- modal/volume.pyi,sha256=eekb2dnAAwFK_NO9ciAOOTthl8NP1iAmMFrCGgjDA2k,11100
77
+ modal/volume.py,sha256=NoqdOTrjSUEBkUj-Of_oi7I_yCuNmaLqr3TIsTWOddM,29674
78
+ modal/volume.pyi,sha256=GfyVeLyM7DMiBlg0I5N6OtJl0Bzv0-rNQXkWVO0j5c0,11903
80
79
  modal/_runtime/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
81
- modal/_runtime/asgi.py,sha256=Mjs859pSgOmtZL-YmEsSKN557v1A2Ax_5-ERgPfj55E,21920
80
+ modal/_runtime/asgi.py,sha256=c4hmaMW1pLo-cm7ouriJjieuFm4ZF6D2LMy0638sfOs,22139
82
81
  modal/_runtime/container_io_manager.py,sha256=HgDLjE78yy1P7WZTmsEVDf89YnFFWG63Ddes8uYLVDY,43764
83
82
  modal/_runtime/execution_context.py,sha256=E6ofm6j1POXGPxS841X3V7JU6NheVb8OkQc7JpLq4Kg,2712
84
83
  modal/_runtime/telemetry.py,sha256=T1RoAGyjBDr1swiM6pPsGRSITm7LI5FDK18oNXxY08U,5163
@@ -124,7 +123,7 @@ modal/cli/run.py,sha256=QMs3BVSkq8jve76BqgstGt4C6jilbDD9gpCCRPuHUy0,17879
124
123
  modal/cli/secret.py,sha256=uQpwYrMY98iMCWeZOQTcktOYhPTZ8IHnyealDc2CZqo,4206
125
124
  modal/cli/token.py,sha256=mxSgOWakXG6N71hQb1ko61XAR9ZGkTMZD-Txn7gmTac,1924
126
125
  modal/cli/utils.py,sha256=hZmjyzcPjDnQSkLvycZD2LhGdcsfdZshs_rOU78EpvI,3717
127
- modal/cli/volume.py,sha256=Oxc8WGP8wm2a_S87bp-P4OnPwoT1wIYQhbgkCvvFIdI,9998
126
+ modal/cli/volume.py,sha256=Jrm-1R9u92JbbUM62bkB9RzAM_jO8wi7T2-i6Cb2XG0,10568
128
127
  modal/cli/programs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
129
128
  modal/cli/programs/run_jupyter.py,sha256=RRr07CqZrStMbLdBM3PpzU6KM8t9FtLbdIPthg2-Mpw,2755
130
129
  modal/cli/programs/vscode.py,sha256=m80wuQyTALTc7y-kAVqmMjtrcb6muCtpuhxsJm4Va2Y,3453
@@ -149,13 +148,13 @@ modal_global_objects/mounts/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0
149
148
  modal_global_objects/mounts/modal_client_package.py,sha256=W0E_yShsRojPzWm6LtIQqNVolapdnrZkm2hVEQuZK_4,767
150
149
  modal_global_objects/mounts/python_standalone.py,sha256=SL_riIxpd8mP4i4CLDCWiFFNj0Ltknm9c_UIGfX5d60,1836
151
150
  modal_proto/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
152
- modal_proto/api.proto,sha256=ERfCFygQvpd09LyVtpZ-eInPfJ4p6UIDh_z3za_rbsw,80174
153
- modal_proto/api_grpc.py,sha256=MLsxlZXikcv36aSs0iVZywIOANMWstVZMWJGQTDjdM0,102823
154
- modal_proto/api_pb2.py,sha256=dJJ88RIIPlwyTBQk9rKfSfbAxeZXDZn7FpszS6mF0Qs,294984
155
- modal_proto/api_pb2.pyi,sha256=I1cHME11tDMerj_8DzHF2SEwN1QorEfdjziW3_v-omA,393699
156
- modal_proto/api_pb2_grpc.py,sha256=4d5SwJPLldCqqHz_BGqmJLlX-BMG592WFKUQ6IBg5rg,222415
157
- modal_proto/api_pb2_grpc.pyi,sha256=C4c3jndI6TKEgVnx3vAmT86In4T9JKmB1CImiye_aQk,51822
158
- modal_proto/modal_api_grpc.py,sha256=eeH1vHXgwO768tM7DXqvj-P37u15SI00gZtm8_EK15I,13732
151
+ modal_proto/api.proto,sha256=1hO6_dn7DwgFra9TQSAXBt1NV4ETiiURPHe09bodinc,80368
152
+ modal_proto/api_grpc.py,sha256=VakjV_Ge3fgZDRJN6EeG2yY_LMkZvn6yVXr5SnFKIDA,103542
153
+ modal_proto/api_pb2.py,sha256=77arFb-gAsuI-7Rbr65FxAB13i-mPoJEHYvs7z5Uo1s,295839
154
+ modal_proto/api_pb2.pyi,sha256=iGrfDlLXPg8oC9QdWOFlCrNoJqB0FompkpVa-EskYOg,394251
155
+ modal_proto/api_pb2_grpc.py,sha256=OAvrG7OCPKmF-6eawqc4X5iLN0WFBQ_AvufuWnHm3Es,224030
156
+ modal_proto/api_pb2_grpc.pyi,sha256=-bE8AO-IJsg0WMwSzEEe_jnmeirta3tqj5IwTVIrF6c,52169
157
+ modal_proto/modal_api_grpc.py,sha256=kOABHGzB81bAhxqKwj79DKqdK2HlcC4U0MkFETkQwfQ,13826
159
158
  modal_proto/modal_options_grpc.py,sha256=qJ1cuwA54oRqrdTyPTbvfhFZYd9HhJKK5UCwt523r3Y,120
160
159
  modal_proto/options.proto,sha256=a-siq4swVbZPfaFRXAipRZzGP2bq8OsdUvjlyzAeodQ,488
161
160
  modal_proto/options_grpc.py,sha256=M18X3d-8F_cNYSVM3I25dUTO5rZ0rd-vCCfynfh13Nc,125
@@ -166,10 +165,10 @@ modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0y
166
165
  modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
167
166
  modal_version/__init__.py,sha256=BEBWj9tcbFUwzEjUrqly601rauw5cYsHdcmJHs3iu0s,470
168
167
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
169
- modal_version/_version_generated.py,sha256=vCubBvI9-d34zmRrXH9kK-02zZQnqA3cVMw5ONOUPds,148
170
- modal-0.71.7.dist-info/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
171
- modal-0.71.7.dist-info/METADATA,sha256=a3pklm2HmEel6rdqBnRdP8yR4-pVDyljfp9i_JULRvU,2328
172
- modal-0.71.7.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
173
- modal-0.71.7.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
174
- modal-0.71.7.dist-info/top_level.txt,sha256=1nvYbOSIKcmU50fNrpnQnrrOpj269ei3LzgB6j9xGqg,64
175
- modal-0.71.7.dist-info/RECORD,,
168
+ modal_version/_version_generated.py,sha256=tsI6q2yoqEFbt-h7LyODo6hXvuxvd0qyoes8iA52jUA,149
169
+ modal-0.71.12.dist-info/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
170
+ modal-0.71.12.dist-info/METADATA,sha256=7OCMKt2uJg0IqSqDJ8V-vcMrWoLr5dWLVp5SQ0NOXvk,2329
171
+ modal-0.71.12.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
172
+ modal-0.71.12.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
173
+ modal-0.71.12.dist-info/top_level.txt,sha256=1nvYbOSIKcmU50fNrpnQnrrOpj269ei3LzgB6j9xGqg,64
174
+ modal-0.71.12.dist-info/RECORD,,
modal_proto/api.proto CHANGED
@@ -2680,6 +2680,11 @@ message VolumeRemoveFileRequest {
2680
2680
  bool recursive = 3;
2681
2681
  }
2682
2682
 
2683
+ message VolumeRenameRequest {
2684
+ string volume_id = 1 [ (modal.options.audit_target_attr) = true ];
2685
+ string name = 2;
2686
+ }
2687
+
2683
2688
  message Warning {
2684
2689
  enum WarningType {
2685
2690
  WARNING_TYPE_UNSPECIFIED = 0;
@@ -2887,6 +2892,7 @@ service ModalClient {
2887
2892
  rpc VolumePutFiles(VolumePutFilesRequest) returns (google.protobuf.Empty);
2888
2893
  rpc VolumeReload(VolumeReloadRequest) returns (google.protobuf.Empty);
2889
2894
  rpc VolumeRemoveFile(VolumeRemoveFileRequest) returns (google.protobuf.Empty);
2895
+ rpc VolumeRename(VolumeRenameRequest) returns (google.protobuf.Empty);
2890
2896
 
2891
2897
  // Workspaces
2892
2898
  rpc WorkspaceNameLookup(google.protobuf.Empty) returns (WorkspaceNameLookupResponse);
modal_proto/api_grpc.py CHANGED
@@ -549,6 +549,10 @@ class ModalClientBase(abc.ABC):
549
549
  async def VolumeRemoveFile(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.VolumeRemoveFileRequest, google.protobuf.empty_pb2.Empty]') -> None:
550
550
  pass
551
551
 
552
+ @abc.abstractmethod
553
+ async def VolumeRename(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.VolumeRenameRequest, google.protobuf.empty_pb2.Empty]') -> None:
554
+ pass
555
+
552
556
  @abc.abstractmethod
553
557
  async def WorkspaceNameLookup(self, stream: 'grpclib.server.Stream[google.protobuf.empty_pb2.Empty, modal_proto.api_pb2.WorkspaceNameLookupResponse]') -> None:
554
558
  pass
@@ -1353,6 +1357,12 @@ class ModalClientBase(abc.ABC):
1353
1357
  modal_proto.api_pb2.VolumeRemoveFileRequest,
1354
1358
  google.protobuf.empty_pb2.Empty,
1355
1359
  ),
1360
+ '/modal.client.ModalClient/VolumeRename': grpclib.const.Handler(
1361
+ self.VolumeRename,
1362
+ grpclib.const.Cardinality.UNARY_UNARY,
1363
+ modal_proto.api_pb2.VolumeRenameRequest,
1364
+ google.protobuf.empty_pb2.Empty,
1365
+ ),
1356
1366
  '/modal.client.ModalClient/WorkspaceNameLookup': grpclib.const.Handler(
1357
1367
  self.WorkspaceNameLookup,
1358
1368
  grpclib.const.Cardinality.UNARY_UNARY,
@@ -2163,6 +2173,12 @@ class ModalClientStub:
2163
2173
  modal_proto.api_pb2.VolumeRemoveFileRequest,
2164
2174
  google.protobuf.empty_pb2.Empty,
2165
2175
  )
2176
+ self.VolumeRename = grpclib.client.UnaryUnaryMethod(
2177
+ channel,
2178
+ '/modal.client.ModalClient/VolumeRename',
2179
+ modal_proto.api_pb2.VolumeRenameRequest,
2180
+ google.protobuf.empty_pb2.Empty,
2181
+ )
2166
2182
  self.WorkspaceNameLookup = grpclib.client.UnaryUnaryMethod(
2167
2183
  channel,
2168
2184
  '/modal.client.ModalClient/WorkspaceNameLookup',