mirror of
https://github.com/tahoe-lafs/tahoe-lafs.git
synced 2025-04-26 13:59:59 +00:00
webapi: make the /operations/ 't=status' qualifier optional, remove it from examples
This commit is contained in:
parent
03fb3a0160
commit
76b7b9d835
@ -200,8 +200,8 @@ are created by the client, and passed in as a an "ophandle=" query argument
|
|||||||
to the POST or PUT request which starts the operation. The following
|
to the POST or PUT request which starts the operation. The following
|
||||||
operations can then be used to retrieve status:
|
operations can then be used to retrieve status:
|
||||||
|
|
||||||
GET /operations/$HANDLE?t=status&output=HTML
|
GET /operations/$HANDLE?output=HTML (with or without t=status)
|
||||||
GET /operations/$HANDLE?t=status&output=JSON
|
GET /operations/$HANDLE?output=JSON (same)
|
||||||
|
|
||||||
These two retrieve the current status of the given operation. Each operation
|
These two retrieve the current status of the given operation. Each operation
|
||||||
presents a different sort of information, but in general the page retrieved
|
presents a different sort of information, but in general the page retrieved
|
||||||
@ -220,30 +220,30 @@ POST /operations/$HANDLE?t=cancel
|
|||||||
cancelled. If the operation handle has already expired (see below), this
|
cancelled. If the operation handle has already expired (see below), this
|
||||||
POST will return a 404, which indicates that the operation is no longer
|
POST will return a 404, which indicates that the operation is no longer
|
||||||
running (either it was completed or terminated). The response body will be
|
running (either it was completed or terminated). The response body will be
|
||||||
the same as a t=status on this operation handle, and the handle will be
|
the same as a GET /operations/$HANDLE on this operation handle, and the
|
||||||
expired immediately afterwards.
|
handle will be expired immediately afterwards.
|
||||||
|
|
||||||
The operation handle will eventually expire, to avoid consuming an unbounded
|
The operation handle will eventually expire, to avoid consuming an unbounded
|
||||||
amount of memory. The handle's time-to-live can be reset at any time, by
|
amount of memory. The handle's time-to-live can be reset at any time, by
|
||||||
passing a retain-for= argument (with a count of seconds) to either the
|
passing a retain-for= argument (with a count of seconds) to either the
|
||||||
initial POST that starts the operation, or the subsequent 'GET t=status'
|
initial POST that starts the operation, or the subsequent GET request which
|
||||||
request which asks about the operation. For example, if a 'GET
|
asks about the operation. For example, if a 'GET
|
||||||
/operations/$HANDLE?t=status&output=JSON&retain-for=600' query is performed,
|
/operations/$HANDLE?output=JSON&retain-for=600' query is performed, the
|
||||||
the handle will remain active for 600 seconds (10 minutes) after the GET was
|
handle will remain active for 600 seconds (10 minutes) after the GET was
|
||||||
received.
|
received.
|
||||||
|
|
||||||
In addition, if the GET t=status includes a release-after-complete=True
|
In addition, if the GET includes a release-after-complete=True argument, and
|
||||||
argument, and the operation has completed, the operation handle will be
|
the operation has completed, the operation handle will be released
|
||||||
released immediately.
|
immediately.
|
||||||
|
|
||||||
If a retain-for= argument is not used, the default handle lifetimes are:
|
If a retain-for= argument is not used, the default handle lifetimes are:
|
||||||
|
|
||||||
* handles will remain valid at least until their operation finishes
|
* handles will remain valid at least until their operation finishes
|
||||||
* uncollected handles for finished operations (i.e. handles for operations
|
* uncollected handles for finished operations (i.e. handles for operations
|
||||||
which have finished but for which the t=status page has not been accessed
|
which have finished but for which the GET page has not been accessed since
|
||||||
since completion) will remain valid for one hour, or for the total time
|
completion) will remain valid for one hour, or for the total time consumed
|
||||||
consumed by the operation, whichever is greater.
|
by the operation, whichever is greater.
|
||||||
* collected handles (i.e. the t=status page has been retrieved at least once
|
* collected handles (i.e. the GET page has been retrieved at least once
|
||||||
since the operation completed) will remain valid for ten minutes.
|
since the operation completed) will remain valid for ten minutes.
|
||||||
|
|
||||||
|
|
||||||
@ -819,11 +819,11 @@ POST $URL?t=start-deep-check (must add &ophandle=XYZ)
|
|||||||
deep-check operation will continue to run in the background, and the
|
deep-check operation will continue to run in the background, and the
|
||||||
/operations page should be used to find out when the operation is done.
|
/operations page should be used to find out when the operation is done.
|
||||||
|
|
||||||
The HTML /operations/$HANDLE?t=status page for incomplete operations will
|
The HTML /operations/$HANDLE page for incomplete operations will contain a
|
||||||
contain a meta-refresh tag, set to 60 seconds, so that a browser which uses
|
meta-refresh tag, set to 60 seconds, so that a browser which uses
|
||||||
deep-check will automatically poll until the operation has completed.
|
deep-check will automatically poll until the operation has completed.
|
||||||
|
|
||||||
The JSON page (/options/$HANDLE?t=status&output=JSON) will contain a
|
The JSON page (/options/$HANDLE?output=JSON) will contain a
|
||||||
machine-readable JSON dictionary with the following keys:
|
machine-readable JSON dictionary with the following keys:
|
||||||
|
|
||||||
finished: a boolean, True if the operation is complete, else False. Some
|
finished: a boolean, True if the operation is complete, else False. Some
|
||||||
@ -944,8 +944,8 @@ POST $DIRURL?t=start-manifest (must add &ophandle=XYZ)
|
|||||||
gives immediate access to every object in the virtual filesystem subtree.
|
gives immediate access to every object in the virtual filesystem subtree.
|
||||||
|
|
||||||
This operation uses the same ophandle= mechanism as deep-check. The
|
This operation uses the same ophandle= mechanism as deep-check. The
|
||||||
corresponding /operations/$HANDLE?t=status page has three different forms.
|
corresponding /operations/$HANDLE page has three different forms. The
|
||||||
The default is output=HTML.
|
default is output=HTML.
|
||||||
|
|
||||||
If output=text is added to the query args, the results will be a text/plain
|
If output=text is added to the query args, the results will be a text/plain
|
||||||
list. The first line is special: it is either "finished: yes" or "finished:
|
list. The first line is special: it is either "finished: yes" or "finished:
|
||||||
@ -970,7 +970,7 @@ POST $DIRURL?t=start-deep-size (must add &ophandle=XYZ)
|
|||||||
take expansion or encoding overhead into account. Later versions of the
|
take expansion or encoding overhead into account. Later versions of the
|
||||||
code may improve this estimate upwards.
|
code may improve this estimate upwards.
|
||||||
|
|
||||||
The t=status output consists of two lines of text:
|
The /operations/$HANDLE status output consists of two lines of text:
|
||||||
|
|
||||||
finished: yes
|
finished: yes
|
||||||
size: 1234
|
size: 1234
|
||||||
|
@ -854,6 +854,11 @@ class Web(WebMixin, testutil.StallMixin, unittest.TestCase):
|
|||||||
self.failUnless(self._sub_uri in manifest)
|
self.failUnless(self._sub_uri in manifest)
|
||||||
self.failUnless("<td>sub/baz.txt</td>" in manifest)
|
self.failUnless("<td>sub/baz.txt</td>" in manifest)
|
||||||
d.addCallback(_got_html)
|
d.addCallback(_got_html)
|
||||||
|
|
||||||
|
# both t=status and unadorned GET should be identical
|
||||||
|
d.addCallback(lambda res: self.GET("/operations/125"))
|
||||||
|
d.addCallback(_got_html)
|
||||||
|
|
||||||
d.addCallback(getman, "html")
|
d.addCallback(getman, "html")
|
||||||
d.addCallback(_got_html)
|
d.addCallback(_got_html)
|
||||||
d.addCallback(getman, "text")
|
d.addCallback(getman, "text")
|
||||||
@ -1599,7 +1604,7 @@ class Web(WebMixin, testutil.StallMixin, unittest.TestCase):
|
|||||||
def test_POST_DIRURL_deepcheck(self):
|
def test_POST_DIRURL_deepcheck(self):
|
||||||
def _check_redirect(statuscode, target):
|
def _check_redirect(statuscode, target):
|
||||||
self.failUnlessEqual(statuscode, str(http.FOUND))
|
self.failUnlessEqual(statuscode, str(http.FOUND))
|
||||||
self.failUnless(target.endswith("/operations/123?t=status"))
|
self.failUnless(target.endswith("/operations/123"))
|
||||||
d = self.shouldRedirect2("test_POST_DIRURL_deepcheck", _check_redirect,
|
d = self.shouldRedirect2("test_POST_DIRURL_deepcheck", _check_redirect,
|
||||||
self.POST, self.public_url,
|
self.POST, self.public_url,
|
||||||
t="start-deep-check", ophandle="123")
|
t="start-deep-check", ophandle="123")
|
||||||
|
@ -60,10 +60,10 @@ class OphandleTable(rend.Page, service.Service):
|
|||||||
def redirect_to(self, ctx):
|
def redirect_to(self, ctx):
|
||||||
ophandle = get_arg(ctx, "ophandle")
|
ophandle = get_arg(ctx, "ophandle")
|
||||||
assert ophandle
|
assert ophandle
|
||||||
target = get_root(ctx) + "/operations/" + ophandle + "?t=status"
|
target = get_root(ctx) + "/operations/" + ophandle
|
||||||
output = get_arg(ctx, "output")
|
output = get_arg(ctx, "output")
|
||||||
if output:
|
if output:
|
||||||
target = target + "&output=%s" % output
|
target = target + "?output=%s" % output
|
||||||
return url.URL.fromString(target)
|
return url.URL.fromString(target)
|
||||||
|
|
||||||
def childFactory(self, ctx, name):
|
def childFactory(self, ctx, name):
|
||||||
@ -73,8 +73,9 @@ class OphandleTable(rend.Page, service.Service):
|
|||||||
NOT_FOUND)
|
NOT_FOUND)
|
||||||
(monitor, renderer, when_added) = self.handles[ophandle]
|
(monitor, renderer, when_added) = self.handles[ophandle]
|
||||||
|
|
||||||
|
request = IRequest(ctx)
|
||||||
t = get_arg(ctx, "t", "status")
|
t = get_arg(ctx, "t", "status")
|
||||||
if t == "cancel":
|
if t == "cancel" and request.method == "POST":
|
||||||
monitor.cancel()
|
monitor.cancel()
|
||||||
# return the status anyways, but release the handle
|
# return the status anyways, but release the handle
|
||||||
self._release_ophandle(ophandle)
|
self._release_ophandle(ophandle)
|
||||||
@ -124,7 +125,7 @@ class ReloadMixin:
|
|||||||
# url.gethere would break a proxy, so the correct thing to do is
|
# url.gethere would break a proxy, so the correct thing to do is
|
||||||
# req.path[-1] + queryargs
|
# req.path[-1] + queryargs
|
||||||
ophandle = req.prepath[-1]
|
ophandle = req.prepath[-1]
|
||||||
reload_target = ophandle + "?t=status&output=html"
|
reload_target = ophandle + "?output=html"
|
||||||
cancel_target = ophandle + "?t=cancel"
|
cancel_target = ophandle + "?t=cancel"
|
||||||
cancel_button = T.form(action=cancel_target, method="POST",
|
cancel_button = T.form(action=cancel_target, method="POST",
|
||||||
enctype="multipart/form-data")[
|
enctype="multipart/form-data")[
|
||||||
|
Loading…
x
Reference in New Issue
Block a user