You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* Added LRO guidelines
* Restore all prior named guidelines with some edits where needed
* Address PR review feedback
Co-authored-by: Mike Kistler <[email protected]>
Co-authored-by: Weidong Xu <[email protected]>
Status Monitor->>Client: HTTP/1.1 200 OK<br/>{ "id": "22", "status": "Succeeded" }
252
332
```
253
333
254
-
1. The client sends the request to initiate the long-running operation.
255
-
The initial request could be a POST or DELETE method.
334
+
1. The client sends the request to initiate the long-running DELETE operation.
256
335
The request may contain an `Operation-Id` header that the service uses as the ID of the status monitor created for the operation.
257
336
258
337
2. The service validates the request and initiates the operation processing.
@@ -261,8 +340,8 @@ Otherwise the service responds with a `202-Accepted` HTTP status code.
261
340
The response body is the status monitor for the operation including the ID, either from the request header or generated by the service.
262
341
When returning a status monitor whose status is not in a terminal state, the response must also include a `retry-after` header indicating the minimum number of seconds the client should wait
263
342
before polling (GETing) the status monitor URL again for an update.
264
-
For backward compatibility, the response may also include an `Operation-Location` header containing the absolute URL
265
-
of the status monitor resource (without an api-version query parameter).
343
+
For backward compatibility, the response must also include an `Operation-Location` header containing the absolute URL
344
+
of the status monitor resource, including an api-version query parameter.
266
345
267
346
3. After waiting at least the amount of time specified by the previous response's `Retry-after` header,
268
347
the client issues a GET request to the status monitor using the ID in the body of the initial response.
@@ -275,14 +354,11 @@ If the operation is still being processed, the status field will contain a "non-
275
354
276
355
5. After the operation processing completes, a GET request to the status monitor returns the status monitor with a status field set to a terminal value -- `Succeeded`, `Failed`, or `Canceled` -- that indicates the result of the operation.
277
356
If the status is `Failed`, the status monitor resource contains an `error` field with a `code` and `message` that describes the failure.
278
-
If the status is `Succeeded` and the LRO is an Action operation, the operation results will be returned in the `result` field of the status monitor.
279
-
If the status is `Succeeded` and the LRO is an operation on a resource, the client can perform a GET on the resource
280
-
to observe the result of the operation if desired.
281
357
282
-
6. There may be some cases where a long-running operation can be completed before the response to the initial request.
358
+
6. There may be some cases where a long-running DELETE operation can be completed before the response to the initial request.
283
359
In these cases, the operation should still return a `202 Accepted` with the `status` property set to the appropriate terminal state.
284
360
285
-
7. The service is responsible for purging the status-monitor resource.
361
+
7. The service is responsible for purging the statusmonitor resource.
286
362
It should auto-purge the status monitor resource after completion (at least 24 hours).
287
363
The service may offer DELETE of the status monitor resource due to GDPR/privacy.
288
364
@@ -292,6 +368,9 @@ An action operation that is also long-running combines the [Action Operations](#
292
368
with the [Long Running Operations](#long-running-operations) pattern.
293
369
294
370
The operation is initiated with a POST operation and the operation path ends in `:<action>`.
371
+
A long-running POST should not be used for resource create: use PUT as described above.
372
+
PATCH must never be used for long-running operations: it should be reserved for simple resource updates.
373
+
If a long-running update is required it should be implemented with POST.
295
374
296
375
```text
297
376
POST /<service-or-resource-url>:<action>?api-version=2022-05-01
@@ -303,7 +382,7 @@ Operation-Id: 22
303
382
}
304
383
```
305
384
306
-
The response is a `202 Accepted`as described above.
385
+
A long-running action operation returns a `202 Accepted`response with the status monitor in the response body.
307
386
308
387
```text
309
388
HTTP/1.1 202 Accepted
@@ -333,82 +412,95 @@ HTTP/1.1 200 OK
333
412
}
334
413
```
335
414
336
-
### PUT with additional long-running processing
415
+
This diagram illustrates how a long-running action operation is initiated and then how the client
416
+
determines it has completed and obtains its results:
337
417
338
-
A special case of long-running operation that occurs often is a PUT operation to create or replace a resource
339
-
that involves some additional long-running processing.
340
-
One example is a resource requires physical resources (e.g. servers) to be "provisioned" to make the resource functional.
341
-
In this case, the request may contain an `Operation-Id` header that the service will use as
342
-
the ID of the status monitor created for the operation.
418
+
```mermaid
419
+
sequenceDiagram
420
+
participant Client
421
+
participant API Endpoint
422
+
participant Status Monitor
423
+
Client->>API Endpoint: POST
424
+
API Endpoint->>Client: HTTP/1.1 202 Accepted<br/>{ "id": "22", "status": "NotStarted" }
1. The client sends the request to initiate the long-running action operation.
432
+
The request may contain an `Operation-Id` header that the service uses as the ID of the status monitor created for the operation.
347
433
348
-
{
349
-
"prop1": 555,
350
-
"prop2": "something"
351
-
}
352
-
```
434
+
2. The service validates the request and initiates the operation processing.
435
+
If there are any problems with the request, the service responds with a `4xx` status code and error response body.
436
+
Otherwise the service responds with a `202-Accepted` HTTP status code.
437
+
The response body is the status monitor for the operation including the ID, either from the request header or generated by the service.
438
+
When returning a status monitor whose status is not in a terminal state, the response must also include a `retry-after` header indicating the minimum number of seconds the client should wait
439
+
before polling (GETing) the status monitor URL again for an update.
440
+
For backward compatibility, the response may also include an `Operation-Location` header containing the absolute URL
441
+
of the status monitor resource, including an api-version query parameter.
353
442
354
-
In this case the response to the initial request is a `201 Created` to indicate that the resource has been created
355
-
or `200 OK` when the resource was replaced.
356
-
The response body contains a representation of the created resource, which is the standard pattern for a create operation.
357
-
A status monitor is created to track the additional processing and the ID of the status monitor
358
-
is returned in the `Operation-Id` header of the response.
359
-
The response may also include an `Operation-Location` header for backward compatibility.
360
-
If the resource supports ETags, the response may contain an `etag` header and possibly an `etag` property in the resource.
443
+
3. After waiting at least the amount of time specified by the previous response's `Retry-after` header,
444
+
the client issues a GET request to the status monitor using the ID in the body of the initial response.
445
+
The GET operation for the status monitor is documented in the REST API definition and the ID
446
+
is the last URL path segment.
361
447
362
-
```text
363
-
HTTP/1.1 201 Created
364
-
Operation-Id: 22
365
-
Operation-Location: https://items/operations/22
366
-
etag: "123abc"
448
+
4. The status monitor responds with information about the operation including its current status,
449
+
which should be represented as one of a fixed set of string values in a field named `status`.
450
+
If the operation is still being processed, the status field will contain a "non-terminal" value, like `NotStarted` or `Running`.
367
451
368
-
{
369
-
"id": "FooBar",
370
-
"etag": "123abc",
371
-
"prop1": 555,
372
-
"prop2": "something"
373
-
}
374
-
```
452
+
5. After the operation processing completes, a GET request to the status monitor returns the status monitor with a status field set to a terminal value -- `Succeeded`, `Failed`, or `Canceled` -- that indicates the result of the operation.
453
+
If the status is `Failed`, the status monitor resource contains an `error` field with a `code` and `message` that describes the failure.
454
+
If the status is `Succeeded`, the operation results (if any) are returned in the `result` field of the status monitor.
375
455
376
-
The client will issue a GET to the status monitor to obtain the status of the operation performing the additional processing.
456
+
6. There may be some cases where a long-running action operation can be completed before the response to the initial request.
457
+
In these cases, the operation should still return a `202 Accepted` with the `status` property set to the appropriate terminal state.
377
458
378
-
```text
379
-
GET https://items/operations/22?api-version=2022-05-01
380
-
```
459
+
7. The service is responsible for purging the status monitor resource.
460
+
It should auto-purge the status monitor resource after completion (at least 24 hours).
461
+
The service may offer DELETE of the status monitor resource due to GDPR/privacy.
381
462
382
-
When the additional processing completes, the status monitor will indicate if it succeeded or failed.
463
+
### Long-running action operation not related to a resource
383
464
384
-
```text
385
-
HTTP/1.1 200 OK
465
+
When a long-running action operation is not related to a specific resource (a batch operation is one example),
466
+
another approach is needed.
386
467
387
-
{
388
-
"id": "22",
389
-
"status": "Succeeded"
390
-
}
391
-
```
468
+
This type of LRO should be initiated with a PUT method on a URL that represents the operation to be performed,
469
+
and includes a final path parameter for the user-specified operation ID.
470
+
The response of the PUT includes a response body containing a representation of the status monitor for the operation
471
+
and an `Operation-Location` response header that contains the absolute URL of the status monitor.
472
+
In this type of LRO, the status monitor should include any information from the request used to initiate the operation,
473
+
so that a failed operation could be reissued if necessary.
392
474
393
-
If the additional processing failed, the service may delete the original resource if it is not usable in this state,
394
-
but would have to clearly document this behavior.
475
+
Clients will use a GET on the status monitor URL to obtain the status and results of the operation.
476
+
Since the HTTP semantic for PUT is to create a resource, the same schema should be used for the PUT request body,
477
+
the PUT response body, and the response body of the GET for the status monitor for the operation.
478
+
For this type of LRO, the status monitor URL should be the same URL as the PUT operation.
395
479
396
-
### Long-running delete operation
480
+
The following examples illustrate this pattern.
397
481
398
-
A long-running delete operation follows the general pattern of a long-running operation --
399
-
it returns a `202 Accepted` with a status monitor which the client uses to determine the outcome of the delete.
482
+
```text
483
+
PUT /translate-operations/<operation-id>?api-version=2022-05-01
400
484
401
-
The resource being deleted should remain visible (returned from a GET) until the delete operation completes successfully.
485
+
<JSON body with parameters for the operation>
486
+
```
487
+
488
+
Note that the client specifies the operation id in the URL path.
402
489
403
-
When the delete operation completes successfully, a client must be able to create new resource with same name without conflicts.
490
+
A successful response to the PUT operation should have a `201 Created` status and response body
491
+
that contains a representation of the status monitor _and_ any information from the request used to initiate the operation.
492
+
493
+
The service is responsible for purging the status monitor after some period of time,
494
+
but no earlier than 24 hours after the completion of the operation.
495
+
The service may offer DELETE of the status monitor resource due to GDPR/privacy.
404
496
405
497
### Controlling a long-running operation
406
498
407
499
It might be necessary to support some control action on a long-running operation, such as cancel.
408
500
This is implemented as a POST on the status monitor endpoint with `:<action>` added.
409
501
410
502
```text
411
-
POST /<status-monitor-url>:cancel?api-version=2022-05-01
503
+
POST /<status-monitor-endpoint>:cancel?api-version=2022-05-01
412
504
```
413
505
414
506
A successful response to a control operation should be a `200 OK` with a representation of the status monitor.
0 commit comments