@@ -178,47 +178,82 @@ class _DeleteExperimentIntent(_Intent):
178
178
179
179
_MESSAGE_TEMPLATE = textwrap .dedent (
180
180
"""\
181
- This will delete the experiment on https://tensorboard.dev with the
182
- following experiment ID:
181
+ This will delete the {num} experiment(s) on
182
+ https://tensorboard.dev with the following experiment ID(s) :
183
183
184
- {experiment_id }
184
+ {experiment_id_list }
185
185
186
186
You have chosen to delete an experiment. All experiments uploaded
187
187
to TensorBoard.dev are publicly visible. Do not upload sensitive
188
188
data.
189
189
"""
190
190
)
191
191
192
- def __init__ (self , experiment_id ):
193
- self .experiment_id = experiment_id
192
+ def __init__ (self , experiment_id_list ):
193
+ self .experiment_id_list = experiment_id_list
194
194
195
195
def get_ack_message_body (self ):
196
- return self ._MESSAGE_TEMPLATE .format (experiment_id = self .experiment_id )
196
+ return self ._MESSAGE_TEMPLATE .format (
197
+ num = len (self .experiment_id_list ),
198
+ experiment_id_list = self .experiment_id_list ,
199
+ )
197
200
198
201
def execute (self , server_info , channel ):
199
202
api_client = write_service_pb2_grpc .TensorBoardWriterServiceStub (
200
203
channel
201
204
)
202
- experiment_id = self .experiment_id
203
- if not experiment_id :
205
+ if not self .experiment_id_list :
204
206
raise base_plugin .FlagsError (
205
- "Must specify a non-empty experiment ID to delete."
206
- )
207
- try :
208
- uploader_lib .delete_experiment (api_client , experiment_id )
209
- except uploader_lib .ExperimentNotFoundError :
210
- _die (
211
- "No such experiment %s. Either it never existed or it has "
212
- "already been deleted." % experiment_id
213
- )
214
- except uploader_lib .PermissionDeniedError :
215
- _die (
216
- "Cannot delete experiment %s because it is owned by a "
217
- "different user." % experiment_id
207
+ "Must specify at least one experiment ID to delete."
218
208
)
219
- except grpc .RpcError as e :
220
- _die ("Internal error deleting experiment: %s" % e )
221
- print ("Deleted experiment %s." % experiment_id )
209
+ # Map from eid to (msg, action) pair.
210
+ results = {}
211
+ NO_ACTION = "NO_ACTION"
212
+ DIE_ACTION = "DIE_ACTION"
213
+ for experiment_id in set (self .experiment_id_list ):
214
+ if not experiment_id :
215
+ results [experiment_id ] = (
216
+ "Skipping empty experiment_id." ,
217
+ NO_ACTION ,
218
+ )
219
+ continue
220
+ try :
221
+ uploader_lib .delete_experiment (api_client , experiment_id )
222
+ results [experiment_id ] = (
223
+ "Deleted experiment %s." % experiment_id ,
224
+ NO_ACTION ,
225
+ )
226
+ except uploader_lib .ExperimentNotFoundError :
227
+ results [experiment_id ] = (
228
+ "No such experiment %s. Either it never existed or it has "
229
+ "already been deleted." % experiment_id ,
230
+ DIE_ACTION ,
231
+ )
232
+ except uploader_lib .PermissionDeniedError :
233
+ results [experiment_id ] = (
234
+ "Cannot delete experiment %s because it is owned by a "
235
+ "different user." % experiment_id ,
236
+ DIE_ACTION ,
237
+ )
238
+ except grpc .RpcError as e :
239
+ results [experiment_id ] = (
240
+ (
241
+ "Internal error deleting experiment %s: %s."
242
+ % (experiment_id , e )
243
+ ),
244
+ DIE_ACTION ,
245
+ )
246
+ # business logic on the receipt
247
+ any_die_action = False
248
+ err_msg = ""
249
+ for (msg , action ) in results .values ():
250
+ if action == NO_ACTION :
251
+ print (msg )
252
+ if action == DIE_ACTION :
253
+ err_msg += msg + "\n "
254
+ any_die_action = True
255
+ if any_die_action :
256
+ _die (err_msg )
222
257
223
258
224
259
class _UpdateMetadataIntent (_Intent ):
@@ -576,7 +611,7 @@ def _get_intent(flags, experiment_url_callback=None):
576
611
return _DeleteExperimentIntent (flags .experiment_id )
577
612
else :
578
613
raise base_plugin .FlagsError (
579
- "Must specify experiment to delete via `--experiment_id`."
614
+ "Must specify experiment(s) to delete via `--experiment_id`."
580
615
)
581
616
elif cmd == flags_parser .SUBCOMMAND_KEY_LIST :
582
617
return _ListIntent (json = flags .json )
0 commit comments