International

    Virtual

    Observatory

Alliance

Universal Worker Service
Version 1.0

IVOA Working Draft 2009-08-27

Working Group:
http://www.ivoa.net/twiki/bin/view/IVOA/IvoaGridAndWebServices
This version:
http://www.ivoa.net/Documents/UWS/20090827/WD-UWS-1.0-20090827.html
Latest version:
http://www.ivoa.net/Documents/UWS/
Previous version(s):
Internal Working Draft v0.1, 2005-01-24
Internal Working Draft v0.2, 2006-05-11
Internal Working Draft v0.3, 2007-04-26
Internal Working Draft v0.4, 2008-05-10
Internal Working Draft v0.5, 2008-10-08
Internal Working Draft v0.9, 2009-10-08
 
 
 
 
Author(s):
P. Harrison, G. Rixon

Abstract

The Universal Worker Service (UWS) pattern defines how to manage asynchronous execution of jobs on a service. Any application of the pattern defines a family of related services with a common service contract. Possible uses of the pattern are also described.

Status of This Document

This is a working draft of the GWS-WG. The first release of this document was on 2005-01-24 within the working group; This version is the first public WD.

This is an IVOA Working Draft for review by IVOA members and other interested parties. It is a draft document and may be updated, replaced, or made obsolete by other documents at any time. It is inappropriate to use IVOA Working Drafts as reference materials or to cite them as other than “work in progress”.

A list of current IVOA Recommendations and other technical documents can be found at http://www.ivoa.net/Documents/.

Acknowledgements

The need for the UWS pattern was inspired by AstroGrid’s Common Execution Architecture and particularly by discussions with Noel Winstanley. The ideas about statefulness are distilled from debates in the Global Grid Forum in respect of the Open Grid Services Infrastructure that was the fore-runner of Web Services Resource Framework. The REST binding came initially from suggestions by Norman Gray.

Contents

1. Introduction

The Universal Worker Service (UWS) pattern defines how to build asynchronous, stateful, job-oriented services (the italicized terms are defined in sub-sections of this introduction). It does so in a way that allows for wide-scale reuse of software and support from software toolkits.

Section 2. of this document describes the pattern and lists the aspects that are common to all its applications. Any such application would involve a service contract that embodies the pattern and fixes the issues left undefined in the pattern itself (see section 1.4). The contract might include the XML schemata which form a "job description language" or JDL for the application, or simply a description of the input parameters for the service which are conveyed via typical HTML form encodings. It is intended that each such contract cover a family of related applications, such that the implementations may be widely reused.

Section 3 outlines several possible applications of the pattern. These use-cases may be expanded into full IVOA standards that are siblings of the current document.

Section 4 describes the preferred method of creating a synchronous facade to a UWS system.

1.2. Some IVO activities that outgrow synchronous, stateless services

These cases are examples. They are not a complete list!

  1. An ADQL [std:adql] service gives access to a large object-catalogue. Most queries run in less than a minute, but some legitimate queries involve a full-table traverse and take hours or days. The service needs to run these special cases in a low-priority queue.

  2. An object-finding service runs the SExtractor [sextractor] application on a list of images. Normally, the list is short and the request is quickly satisfied. Occasionally, a list of 10,000 images is sent in the expectation that the work will be finished over the weekend.

  3. A cone-search [std:scs] request on a rich catalogue raises 10,000,000 rows of results, but the client is connected via a slow link and cannot read all the results in a reasonable time. The client needs the service to send the results into storage over a faster link. This could mean sending them to VOSpace, or simply holding them temporarily until the user can retrieve them on a fast link.

  4. An ADQL service allows users to save query results into new tables such that they can be the target of later queries. However, space is limited and the results tables can only be kept for a short time. The client and service negotiate the lifetime of the results tables.

  5. A service performs image stacking on a list of fields. Each field can be processed by a synchronous service but the list is long and the user wants to retrieve the results of the early fields before the last fields are processed.

2. Universal Worker Service Pattern

2.1. Objects within a UWS

A UWS consists logically in a set of objects that may be read and written to in order to control jobs. In a REST binding, these objects are represented as distinct web-resources each with its own URI.

The following sub-sections explain the semantics of the objects. The UML diagram below shows the relationships more succinctly.

UWS Objects Class Diagram

2.2. The REST Binding

In order to create a usable service the objects discussed in the section above must be exposed in a particular interface which can be addressed over a particular transport mechanism - this combination is known as a "binding". In this first version of the UWS pattern only a REST (Representational State Transfer) style binding [fielding00] is presented, however, future versions of this document will add other bindings such as SOAP. [std:soap]

2.2.1. Resources and URIs

In a REST (Representational State Transfer) binding of UWS, each of the objects defined above is available as a web resource with its own URI. These URIs must form a hierarchy as shown in the table below:

URI Description Representation
/{jobs} the Job List the <jobs> element in the UWS schema
/{jobs}/(job-id) a Job

the <job> element in the UWS schema

/{jobs}/(job-id)/phase the Phase of job (job-id) one of the fixed strings
/{jobs}/(job-id)/executionduration the maximum execution duration of (job-id) Integer number of seconds
/{jobs}/(job-id)/destruction the destruction instant for (job-id) [std:iso8601]
/{jobs}/(job-id)/error any error message associated with (job-id) any representation appropriate to the implementing service
/{jobs}/(job-id)/quote the Quote for (job-id) Integer number of seconds
/{jobs}/(job-id)/results any parameters for the job (job-id) the <results> element in the UWS schema
/{jobs}/(job-id)/parameters any parameters for the job (job-id) the <parameters> element in the UWS schema
/{jobs}/(job-id)/owner the owner of the job (job-id) and appropriate identifier as discussed in 3.

The service implementer is free to choose the names given in parentheses above, i.e. the root of the URI tree, and the form that the job identifier takes (though note that it should be a legal URI path element) - the other names are part of the UWS standard.

The URI for the Job List, in its absolute form is the root URI for the whole UWS. This URI should be given as the access URL in the UWS registration.

2.2.2. Representations of resources

For each of the resources HTTP GET fetches a representation. In general where an object is a container for other objects then an XML representation of the object is returned, otherwise for simple atomic types a textual representation is returned. The XML schema for the various objects described above is detailed in Appendix B. of this specification. This schema is the definitive description of the exact form of the XML returned by a UWS and should not vary between implementations.

HTTP allows multiple representations of a resource distinguished by their MIME types and selected by the HTTP "Accept" headers of a GET request. UWS exploits this to support both web browsers and rich clients in the same tree of resources. Although the default behaviour is to return XML, a UWS should return HTML or XHTML to clients that accept these types. These clients are assumed to be web browsers and the UWS is generating its own user interface. The HTML interface generated should allow full control of the UWS via the use of HTML forms and appropriate links.

Clients which are assumed to be part of remote applications that drive UWS without showing the details to their users should accept only "application/xml". A UWS must therefore return XML representations of the resources in preference to the HTML representation. A technique that may be used to always return XML that modern browsers can transform on the client-side to HTML is via the <?xml-stylesheet ?> processing instruction, which can be used to point to a suitable XSL resource to perform the transformation.

More detail for some of the UWS objects is provided below;

2.2.2.2. Job

The representation of a Job is as specified by the <job> element in the UWS schema as detailed in an example or such a job instance is shown below

<uws:job xsi:schemaLocation="http://www.ivoa.net/xml/UWS/v1.0rc3 UWS.xsd " xlmns:xml="http://www.w3.org/XML/1998/namespace" xlmns:uws="http://www.ivoa.net/xml/UWS/v1.0rc3" xlmns:xlink="http://www.w3.org/1999/xlink" xlmns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<uws:jobId>cea-agdevel.jb.man.ac.uk-130.88.24.18-1242749568029-508182314</uws:jobId>
<uws:ownerId xsi:nil="true"/>
<uws:phase>COMPLETED</uws:phase>
<uws:startTime>2009-05-19T17:12:48.038+01:00</uws:startTime>
<uws:endTime>2009-05-19T17:12:48.041+01:00</uws:endTime>
<uws:executionDuration>86400</uws:executionDuration>
<uws:destruction>2009-05-29T17:12:48.035+01:00</uws:destruction>
<uws:parameters>
<uws:parameter id="scaleFactor">1.8</uws:parameter>
<uws:parameter id="image" byReference="true"> http://myserver.org/uws/jobs/jobid123/param/image</uws:parameter>
</uws:parameters>
<uws:results>
<uws:result id="correctedImage" xlink:href="http://myserver.org/uws/jobs/jobid123/result/image"/>
</uws:results>
<uws:errorSummary type="transient">
<uws:message>we have problem</uws:message>
<uws:detail xlink:href="http://myserver.org/uws/jobs/jobid123/error"/>
</uws:errorSummary>
<uws:jobInfo>
<any>
<xml>
<thatyouwant/>
</xml>
</any>
</uws:jobInfo>
</uws:job>

The <job> element has placeholders of all of the standard UWS objects, and in addition there is a <uws:jobinfo> element which can be used by implementations to include any extra information within the job description.

2.2.3. State changing requests

Certain of the UWS' resources accept HTTP POST and DELETE messages to change the state of the service – This is the fundamental way that a client controls the execution of a job. In most of the cases where a job sub-object is set the response will have a http 303 “See other” status and a Location header that points back to the main job summary obtained at the /{jobs}/(job-id) URI. The job summary contains the values of (or links to) all the UWS objects within the returned XML (or XHTML). This mode of operation was chosen (as opposed to returning only the sub-object being altered) as it makes for a more natural user interface – especially in the case of the XHMTL interface. A client that wants to obtain only the value of a particular sub-object can at any time request that sub-object with a HTTP GET.

3. Security Considerations

A UWS should follow IVOA standards for security [std:ssoauth] if it is desired that a non-public UWS be created. It is possible to imagine many different authorization policies that might be employed in an authenticated UWS, where particular groups of users have different permissions to create and view different types of jobs. A full discussion of such authorization policies is beyond the scope of this document, but a UWS should behave as described in section 2.2. for any individual authenticated user, although it is clear that a user without sufficient privileges might only obtain a restricted list of jobs within the joblist at /{jobs}. Any attempt to retrieve a job for which the user does not have sufficient privilege should result in a 403 Forbidden HTTP status being returned.

When an authentication mechanism is used in the UWS then the implementation should set the owner object to the identity obtained by the authentication.

4. Applications of UWS (informative)

The UWS pattern leaves undefined two essential parts of the service contract: the content that must be posted to create a job; and the pattern of results made available by a completed job. An application of UWS completes a service contract by defining these matters.

There follow some use cases applying the UWS pattern. The descriptions are neither formal nor complete. The intention is to show a range of ways that the pattern can be applied without burdening the reader with the level of detail needed for a standard implementation.

Any of these cases could be worked up into a full IVOA standard by formalizing the description, adding detail and generally making the specification more exact and complete.

4.1. Image service with data staging

Consider a service that computes images from archive data. The computation takes significant time, so the service is asynchronous. The service keeps the computed images in its own storage until the user downloads them; this is essentially the model of SIAP [std:siap] .

The asynchronous image-service is a logical extension of a synchronous SIA service. Therefore it uses the REST binding of UWS.

The parameters for posting a new job are as for SIAP 1.0:

  • POS, the position on the sky to be searched;

  • SIZE, the size of the search box;

  • FORMAT: the type of images to be computed.

Particular implementations are free to add extra parameters.

These parameters are posted in a document of type application/x-www-form-urlencoded: i.e. they can be sent from an HTML form.

The images generated by the job are accessible as unnamed results. Each image has its own URI and can be downloaded over HTTP at any time until the destruction time of the job. The URIs for the images may be discovered from the Results List in the normal UWS way.

SIAP 1.0 produces, for each query, a table of metadata describing the images. The asynchronous image-service produces a table to the same schema as a named result, called “table”.

Image results are added to the results list, and to the “table” result, as they are generated. Hence, a client that polls the service can discover, download and use some of the images before the job is finished. If the client is satisfied with these early images, the client can cancel the rest of the job by destroying the job. However, destroying the job deletes the cached images so the client has to download them first.

4.3. Parameterized applications

There is a class of applications on which a job may be defined by a list of simple parameters. “Simple” here means unstructured: a scalar value such as a number, a string of text or a boolean value. If the parameters are allowed to name files, so that structured data are passed indirectly, then the class of applications is very large indeed: almost any non-interactive application can be driven in this way.

Turning each application of choice into a service (with or without UWS semantics) would be onerous. However, if the application’s interface is entirely characterized, through the JDL, in terms of typed input and output parameters, then one service contract will work for all the applications and a single implementation of the contract can be reused for all cases.

AstroGrid’s Common Execution Architecture (CEA) [harrison05] works in this way. It has just one service contract for all applications (including ADQL services; the ADQL query is passed in the list of parameters). It has four implementations, one for each of the possible interfaces between the service and a kind of job (jobs can be implemented with Java classes, command-line applications, HTTP-get services or JDBC databases). CEA also specifies stateful, asynchronous services and makes use of VOSpace.

Consider a CEA reworked to use the UWS pattern for consistency with other (future) IVOA standards. Call it CEA v2 to distinguish it from CEA v1 as currently maintained by AstroGrid. For this example, consider the particular kind of CEA service that runs applications supplied as executable binaries.

A binary application-server has a library of applications co-located with its service and defined in the service configuration set by the service provider. It does not accept code from the client for local execution.

The JDL in CEA v2 is similar to that in CEA v1 It is a formal, XML vocabulary for expressing choice of application and parameter lists [std:voc ea] . Parameters may be inputs or outputs of the job.

To start a job, a document in this JDL is posted to the UWS. The document is sent in its native MIME-type, application/xml, so this is not an interface that can be driven directly from an HTML form, although it can be driven from the emerging XForms technology [std:xform] .

The results of the job depend on the choice of application. They are all named results and the names and types are defined in the definition of the application. That application-definition is registered, so the client knows before running the job what results to expect.

CEA input-parameters may be indirect: i.e. they may refer to data in on-line storage. In this case, the JDL document contains the URIs for those data objects Alternatively, the parameters may be direct, in which case the JDL contains the actual value of the parameters.

Similarly, CEA results may be made indirect. In this case, the results are named as parameters in the JDL where the values are the URIs to which the results are delivered. The application server can then stream the results to the specified destination as they become available and need not cache them locally. If a job result is indirect, then the server can choose whether or not to keep a local copy. If it chooses not to cache locally, then the result URI in the UWS is set to the external location named in the URI.

5. Implementing a Synchronous Service on top of UWS (informative)

Whilst the provision of synchronous services is not one of the design aims of the UWS pattern, there is clearly a desire in second generation IVOA services still to allow a simple synchronous calling pattern to be available to simple clients. What follows is a recommended recipe for putting a synchronous facade on UWS;

It is assumed that the core of the service does provide a true UWS compliant set of endpoints rooted at /async (equivalent to the /{jobs} endpoint in the nomenclature used above). The desired synchronous service is to be rooted at /sync.

  1. The job is started by either a GET (for compatibility with existing IVOA standards) or a POST (preferably) of form encoded parameters to the /sync endpoint.

  2. Internally the service creates a job in the standard UWS system with the given parameters and sets the PHASE to RUN, noting the returned job identifier which we will call {job-id}. The /sync endpoint then responds with a STATUS 303 (redirection) response to the URL /sync/{job-id}.

  3. The /sync/{job-id} endpoint then blocks until it detects that the underlying job has finished at which point it responds with a STATUS 303 (redirection) to the /{jobs}/{job-id}/results/mainresult URL, where “mainresult” is the name of the primary result of the job.

In this way the service appears to be a synchronous to the original client – assuming it obeys standard HTTP redirection semantics, so a simple client like a web browser could obtain the result with a single “click”. At the same time a more sophisticated, UWS aware, client could control the same job from the standard /{jobs} endpoint – indeed if the synchronous call timed out for some reason, then it would be possible for the original client to retrieve the results by looking at the /{jobs}/{job-id} URL tree, because it could make the association of the job-Id from the URL it receives in step 2 above.

The purely synchronous client is restricted compared with the full UWS pattern in that there can only be one result directly returned to the client, as noted in stage 3 above. This is usually not a problem for compatibility with existing version 1.0 DAL services as they typically return a single VOTable containing references to the desired data.

Appendices

Appendix B. UWS Schema

Note that this schema can be found on-line at http://www.ivoa.net/xml/UWS/v1.0 (i.e. the target namespace can also be used as a URL for the schema.) This location should represent the definitive source, the schema is reproduced below only for completeness of this document.

<!-- $Id: UWS.xsd,v 1.1 2009/06/15 15:30:32 pah Exp $ -->
<!-- proposal for basic UWS schema - Paul Harrison May 2008 -->
<xs:schema targetNamespace="http://www.ivoa.net/xml/UWS/v1.0rc3" elementFormDefault="qualified" attributeFormDefault="unqualified" xlmns:xml="http://www.w3.org/XML/1998/namespace" xlmns:xs="http://www.w3.org/2001/XMLSchema" xlmns:uws="http://www.ivoa.net/xml/UWS/v1.0rc3" xlmns:xlink="http://www.w3.org/1999/xlink">
<xs:import namespace="http://www.w3.org/1999/xlink" schemaLocation="http://software.astrogrid.org/schema/stc/STC/v1.30/XLINK.xsd"/>
<!-- <xs:import namespace="http://www.w3.org/1999/xlink" schemaLocation="http://www.ivoa.net/xml/Xlink/xlink.xsd"/> -->
<xs:complexType name="ShortJobDescription">
<xs:sequence>
<xs:element name="phase" type="uws:ExecutionPhase">
<xs:annotation>
<xs:documentation> the execution phase - returned at /(jobs)/(jobid)/phase</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
<xs:attribute name="id" type="uws:JobIdentifier" use="required"/>
<xs:attributeGroup ref="uws:reference"/>
</xs:complexType>
<xs:attributeGroup name="reference">
<xs:annotation>
<xs:documentation>standard xlink references </xs:documentation>
</xs:annotation>
<xs:attribute ref="xlink:type" use="optional" default="simple"/>
<xs:attribute ref="xlink:href" use="optional"/>
</xs:attributeGroup>
<xs:simpleType name="ExecutionPhase">
<!-- need to think a little here about the implication of allowing a "re-entrant" application that is capable of running mini-jobs...probably this is indicated with a different state varible entirely -->
<xs:annotation>
<xs:documentation> Enumeration of possible phases of job execution</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:enumeration value="PENDING">
<xs:annotation>
<xs:documentation> The first phase a job is entered into - this is where a job is being set up but no request to run has occurred.</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="QUEUED">
<xs:annotation>
<xs:documentation> An job has been accepted for execution but is waiting in a queue</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="EXECUTING">
<xs:annotation>
<xs:documentation>An job is running</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="COMPLETED">
<xs:annotation>
<xs:documentation> An job has completed successfully </xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="ERROR">
<xs:annotation>
<xs:documentation> Some form of error has occurred </xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="UNKNOWN">
<xs:annotation>
<xs:documentation> The job is in an unknown state </xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="HELD">
<xs:annotation>
<xs:documentation> The job is HELD pending execution and will not automatically be executed (cf pending) </xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="SUSPENDED">
<xs:annotation>
<xs:documentation> The job has been suspended by the system during execution</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="ABORTED">
<xs:annotation>
<xs:documentation> The job has been aborted, either by user request or by the server because of lack or overuse of resources.</xs:documentation>
</xs:annotation>
</xs:enumeration>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="JobSummary">
<xs:annotation>
<xs:documentation>The complete representation of the state of a job</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="jobId" type="uws:JobIdentifier"/>
<xs:element name="runId" type="xs:string" maxOccurs="1" minOccurs="0">
<xs:annotation>
<xs:documentation> this is a client supplied identifier - the UWS system does nothing other than to return it as part of the description of the job</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="ownerId" type="xs:string" nillable="true">
<xs:annotation>
<xs:documentation>the owner (creator) of the job - this should be expressed as a string that can be parsed in accordance with IVOA security standards. If there was no authenticated job creator then this should be set to NULL.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="phase" type="uws:ExecutionPhase">
<xs:annotation>
<xs:documentation> the execution phase - returned at /(jobs)/(jobid)/phase</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="quote" type="xs:dateTime" nillable="true" maxOccurs="1" minOccurs="0">
<xs:annotation>
<xs:documentation> A Quote predicts when the job is likely to complete - returned at /(jobs)/(jobid)/quote "don't know" is encoded by setting to the XML null value xsi:nil="true"</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="startTime" type="xs:dateTime" nillable="true">
<xs:annotation>
<xs:documentation>The instant at which the job started execution.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="endTime" type="xs:dateTime" nillable="true">
<xs:annotation>
<xs:documentation>The instant at which the job finished execution</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="executionDuration" type="xs:int" nillable="false">
<!-- TODO look if xs:duration here has any benefits -->
<xs:annotation>
<xs:documentation> The duration (in seconds) for which the job should be allowed to run - a value of 0 is intended to mean unlimited - returned at /(jobs)/(jobid)/executionduration</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="destruction" type="xs:dateTime" nillable="true">
<xs:annotation>
<xs:documentation> The time at which the whole job + records + results will be destroyed. returned at /(jobs)/(jobid)/destruction</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element ref="uws:parameters" maxOccurs="1" minOccurs="0">
<xs:annotation>
<xs:documentation>The parameters to the job (where appropriate) can also be retrieved at /(jobs)/(jobid)/parameters</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element ref="uws:results">
<xs:annotation>
<xs:documentation>The results for the job - can also be retrieved at /(jobs)/(jobid)/results</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="errorSummary" type="uws:ErrorSummary" maxOccurs="1" minOccurs="0"> </xs:element>
<xs:element name="jobInfo" maxOccurs="1" minOccurs="0">
<xs:annotation>
<xs:documentation> This is arbitrary information that can be added to the job description by the UWS implementation.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="JobIdentifier">
<xs:annotation>
<xs:documentation> The identifier for the job </xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:element name="job" type="uws:JobSummary">
<xs:annotation>
<xs:documentation> This is the information that is returned when a GET is made for a single job resource - i.e. /(jobs)/(jobid)</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="jobs">
<xs:annotation>
<xs:documentation> The list of job references returned at /(jobs)</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:annotation>
<xs:documentation> ISSUE - do we want to have any sort of paging or selection mechanism in case the job list gets very large? Or is that an unnecessary complication... </xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="jobref" type="uws:ShortJobDescription" maxOccurs="unbounded" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="ResultReference">
<xs:annotation>
<xs:documentation> A reference to a UWS result </xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="phase" maxOccurs="1" minOccurs="0" type="uws:ExecutionPhase"/>
<!-- pah - TODO why is this here - there was a use case to do with picking up results of partially finished jobs ? -->
</xs:sequence>
<xs:attribute name="id" type="xs:string" use="required"/>
<xs:attributeGroup ref="uws:reference"/>
</xs:complexType>
<xs:element name="results">
<xs:annotation>
<xs:documentation> The element returned for /(jobs)/(jobid)/results</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="result" type="uws:ResultReference" maxOccurs="unbounded" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="ErrorSummary">
<xs:annotation>
<xs:documentation> A short summary of an error - a fuller representation of the error may be retrieved from /(jobs)/(jobid)/error </xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="message" type="xs:string"/>
<!-- is this detail redundant if we say that the "detailed message" is always available from /(jobs)/(jobid)/error-->
<xs:element name="detail" maxOccurs="1" minOccurs="0">
<xs:complexType>
<xs:attributeGroup ref="uws:reference"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="type" type="uws:ErrorType">
<xs:annotation>
<xs:documentation>characterization of the type of the error</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
<xs:simpleType name="ErrorType">
<xs:restriction base="xs:string">
<xs:enumeration value="transient"/>
<xs:enumeration value="fatal"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="Parameter" mixed="true">
<xs:annotation>
<xs:documentation> the list of input parameters to the job - if the job description language does not naturally have parameters, then this list should contain one element which is the content of the original POST that created the job. </xs:documentation>
</xs:annotation>
<xs:attribute name="byReference" type="xs:boolean" default="false">
<xs:annotation>
<xs:documentation> if this attribute is true then the content of the parameter represents a URL to retrieve the actual parameter value.</xs:documentation>
<xs:documentation> It is up to the implementation to decide if a parameter value cannot be returned directly as the content - the basic rule is that the representation of the parameter must allow the whole job element to be valid XML. If this cannot be achieved then the parameter value must be returned by reference.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="id" type="xs:string" use="required">
<xs:annotation>
<xs:documentation> the identifier for the parameter </xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="isPost" type="xs:boolean"/>
</xs:complexType>
<xs:element name="parameters">
<xs:complexType>
<xs:sequence>
<xs:element name="parameter" type="uws:Parameter" maxOccurs="unbounded" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
<!-- -->

References

[std:xform] John M. Boyer, editor.
Xforms 1.1, 2007.
[std:soap] Don Box, David Ehnebuske, Gopal Kakivaya, Andrew Layman, Noah Mendelsohn, Henrik Frystyk Nielsen, Satish Thatte, and Dave Winer.
Simple object access protocol (soap) 1.1, 2000.
[fielding00] Roy Thomas Fielding.
Architectural Styles and the Design of Network-based Software Architectures. PhD thesis, University of California, Irvine, 2000.
[std:iso8601] ISO 8601:2004 Data elements and interchange formats - Information interchange - Representation of dates and times
International Organization for Standardization, 2004.
[std:ssoauth] {Grid and Web Services Working Group}, Guy Rixon and Matthew Graham, editors.
Ivoa single-sign-on profile: Authentication mechanisms version 1.01, 2008.
[harrison05] P. Harrison.
A proposal for a common execution architecture. {IVOA Note}, May 2005.
[std:vocea] Paul Harrison.
VOCEA - an xml schema for registering cea.
[sextractor] http://astromatic.iap.fr/software/sextractor/.
Sextractor. [Online].
[std:adql] Iņaki Ortiz, Jeff Lusted, Pat Dowler, Alexander Szalay, Yuji Shirasaki, Maria A. Nieto-Santisteba, Masatoshi Ohishi, William OÕMullane, Pedro Osuna, the VOQL-TEG, and the VOQL Working Group, Pedro Osuna and Iņaki Ortiz, editors.
Ivoa astronomical data query language. {IVOA Recommendation}, 2008.
[std:siap] Doug Tody and Ray Plant, Paul Harrison, editor.
Simple image access specification. {IVOA Recommendation}, 2009.
[std:scs] Roy Williams, Robert Hanisch, Alex Szalay, and Raymond Plante, Raymond Plante, editor.
Simple cone search. {IVOA Recommendation}, 2008.

$Revision: 847 $ $Date: 2008-10-29 14:33:57 +0000 (Wed, 29. Oct 2008) $