From 52c9a03f4cec5e8b627932c9b083871647d43155 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Mon, 15 Sep 2025 09:02:20 +0200 Subject: [PATCH 1/3] Updating example for per-mode limits. I am removing the in-document example; it seems a waste of paper, and with auxiliaryurl we now have a better alternative. --- Makefile | 12 +++--------- TAPRegExt.tex | 8 ++++++++ make-sample.sh | 4 +--- sample.xml | 12 ++++++++++-- 4 files changed, 22 insertions(+), 14 deletions(-) diff --git a/Makefile b/Makefile index e9d7eec..6584709 100644 --- a/Makefile +++ b/Makefile @@ -28,19 +28,13 @@ VECTORFIGURES = # Additional files to distribute (e.g., CSS, schema files, examples...) -AUX_FILES = $(SCHEMA_FILE) sample.xml +AUX_FILES = $(SCHEMA_FILE) sample.xml -include ivoatex/Makefile -ivoatex/Makefile: - @echo "*** ivoatex submodule not found. Initialising submodules." - @echo - git submodule update --init - - sample.xml: make-sample.sh - ./make-sample.sh > sample.xml - + ./make-sample.sh + install: # local to Markus' setup ~/gavo/standards/fixschema $(SCHEMA_FILE) > ~/gavo/trunk/gavo/resources/schemata/TAPRegExt.xsd diff --git a/TAPRegExt.tex b/TAPRegExt.tex index e3fef75..b477946 100644 --- a/TAPRegExt.tex +++ b/TAPRegExt.tex @@ -84,6 +84,14 @@ \section{Introduction} VOResource record, the capability elements would be direct children of the \xmlel{vr:Resource} element. +The specification comes with a non-normative example +document\footnote{\auxiliaryurl{sample.xml}} showing this +specification's major features. It also declares a separate capability +for the VOSI capabilities endpoint. The example is written as a +response from a TAP service's capabilities endpoint. When embedded in a +VOResource record, the capability elements would be direct children of +the \xmlel{vr:Resource} element. + \subsection{TAPRegExt within the VO Architecture} diff --git a/make-sample.sh b/make-sample.sh index df2225b..a76cfb0 100755 --- a/make-sample.sh +++ b/make-sample.sh @@ -8,9 +8,8 @@ curl -s http://localhost:8080/tap/capabilities \ | xmlstarlet ed \ -d "//capability[not(contains(@standardID, 'capabilities') or contains(@standardID, 'TAP'))]" \ - | xmlstarlet fo -o -s 2 + | xmlstarlet fo -o -s 2 > sample.xml -exit 0 STILTS=stilts SCHEMA_FILE=TAPRegExt-v1.1.xsd $STILTS xsdvalidate \ @@ -18,4 +17,3 @@ $STILTS xsdvalidate \ schemaloc="http://www.ivoa.net/xml/VOSICapabilities/v1.0=https://www.ivoa.net/xml/VOSICapabilities/v1.0" \ schemaloc="http://www.ivoa.net/xml/VODataService/v1.1=https://www.ivoa.net/xml/VODataService/v1.1" \ doc=sample.xml - diff --git a/sample.xml b/sample.xml index cb884ba..635dd1a 100644 --- a/sample.xml +++ b/sample.xml @@ -476,15 +476,23 @@ of the timestamp. 172800 - 7200 + 50 20000 20000000 - 80000000 + 100000000 + + + 7200 + + + 80000000 + + From 4873d53e560254523208ac5981dc0c2840912418 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Fri, 12 Sep 2025 16:03:18 +0200 Subject: [PATCH 2/3] Adding a limits element. Also, adding tests and updating the CI workflow. --- Makefile | 9 +- TAPRegExt-v1.1.xsd | 119 +++++++++- TAPRegExt.tex | 537 +++++++++++++++++++++++++++++++++++---------- role_diagram.pdf | Bin 33418 -> 33252 bytes role_diagram.svg | 78 +++---- 5 files changed, 576 insertions(+), 167 deletions(-) diff --git a/Makefile b/Makefile index 6584709..a46503b 100644 --- a/Makefile +++ b/Makefile @@ -32,13 +32,14 @@ AUX_FILES = $(SCHEMA_FILE) sample.xml -include ivoatex/Makefile +ivoatex/Makefile: + @echo "*** ivoatex submodule not found. Initialising submodules." + @echo + git submodule update --init + sample.xml: make-sample.sh ./make-sample.sh -install: - # local to Markus' setup - ~/gavo/standards/fixschema $(SCHEMA_FILE) > ~/gavo/trunk/gavo/resources/schemata/TAPRegExt.xsd - STILTS ?= stilts SCHEMA_FILE=TAPRegExt-v1.1.xsd diff --git a/TAPRegExt-v1.1.xsd b/TAPRegExt-v1.1.xsd index 82a5b4f..9a324e0 100644 --- a/TAPRegExt-v1.1.xsd +++ b/TAPRegExt-v1.1.xsd @@ -4,12 +4,12 @@ xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vr="http://www.ivoa.net/xml/VOResource/v1.0" xmlns:vm="http://www.ivoa.net/xml/VOMetadata/v0.1" xmlns:tr="http://www.ivoa.net/xml/TAPRegExt/v1.0" -version="1.1-pre1" +version="1.1-pre2" targetNamespace="http://www.ivoa.net/xml/TAPRegExt/v1.0" elementFormDefault="unqualified" attributeFormDefault="unqualified" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" -xsi:schemaLocation="http://www.w3.org/2001/XMLSchema http://vo.ari.uni-heidelberg.de/docs/schemata/XMLSchema.xsd"> +> TAPRegExt @@ -82,8 +82,9 @@ xsi:schemaLocation="http://www.w3.org/2001/XMLSchema http://vo.ari.uni-heidelber minOccurs="0" maxOccurs="1"> - Limits on the time between job creation and - destruction time. + Limits for how long a service will retain async jobs + for the service's default access + mode (typically anonymous-sync). @@ -92,7 +93,9 @@ xsi:schemaLocation="http://www.w3.org/2001/XMLSchema http://vo.ari.uni-heidelber minOccurs="0" maxOccurs="1"> - Limits on executionDuration. + Limits on the time after which a query will be cancelled + for the service's default access mode (typically + anonymous-sync). @@ -101,7 +104,9 @@ xsi:schemaLocation="http://www.w3.org/2001/XMLSchema http://vo.ari.uni-heidelber minOccurs="0" maxOccurs="1"> - Limits on the size of data returned. + Limits on the size of data returned + for the service's default access mode (typically + anonymous-sync). @@ -110,12 +115,21 @@ xsi:schemaLocation="http://www.w3.org/2001/XMLSchema http://vo.ari.uni-heidelber minOccurs="0" maxOccurs="1"> - Limits on the size of uploaded data. + Limits on the size of uploaded data + for the service's default access mode (typically + anonymous-sync). - + + + + Per-mode overrides of the limits defined gobally. + + + @@ -602,4 +616,93 @@ xsi:schemaLocation="http://www.w3.org/2001/XMLSchema http://vo.ari.uni-heidelber + + + + The limits corresponding to an access mode (auth/non-auth, sync/async). + + + + + + + + Limits for how long a service will retain async jobs + in this limit element's mode. + + + + + + + + Limits on the time after which a query will be cancelled + in this limit element's mode. + + + + + + + + Limits on the size of data returned + in this limit element's mode. + + + + + + + + Limits on the size of uploaded data + in this limit element's mode. + + + + + + + + + + + + These limits apply to unauthenticated clients running + synchronous queries. + + + + + + + These limits apply to unauthenticated clients running + asynchronous queries. + + + + + + + These limits apply to authenticated clients running + synchronous queries. + + + + + + + These limits apply to authenticated clients running + asynchronous queries. + + + + + + + + diff --git a/TAPRegExt.tex b/TAPRegExt.tex index b477946..1b37fdd 100644 --- a/TAPRegExt.tex +++ b/TAPRegExt.tex @@ -200,12 +200,14 @@ \subsection{Declaring Instantiated Data Models} % GENERATED: !schemadoc TAPRegExt-v1.1.xsd DataModelType \begin{generated} \begingroup - \renewcommand*\descriptionlabel[1]{% - \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:DataModelType} Type Schema Documentation} + \renewcommand*\descriptionlabel[1]{% + \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:DataModelType} Type Schema Documentation} -\noindent{\small{}An IVOA defined data model, identified by an IVORN +\noindent{\small + An IVOA defined data model, identified by an IVORN intended for machine consumption and a short label - intended for human comsumption.\par} + intended for human comsumption. + \par} \vspace{1ex}\noindent\textbf{\xmlel{tr:DataModelType} Type Schema Definition} @@ -225,7 +227,9 @@ \subsection{Declaring Instantiated Data Models} \item[ivo-id] \begin{description} \item[Type] a URI: \xmlel{xs:anyURI} -\item[Meaning] The IVOID of the data model. +\item[Meaning] + The IVOID of the data model. + \item[Occurrence] required \end{description} @@ -270,14 +274,18 @@ \subsection{Languages Supported} % GENERATED: !schemadoc TAPRegExt-v1.1.xsd Language \begin{generated} \begingroup - \renewcommand*\descriptionlabel[1]{% - \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:Language} Type Schema Documentation} + \renewcommand*\descriptionlabel[1]{% + \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:Language} Type Schema Documentation} -\noindent{\small{}A query language supported by the service.\par} +\noindent{\small + A query language supported by the service. + \par} -\noindent{\small{}Each language element can describe one or more versions +\noindent{\small + Each language element can describe one or more versions of a language. Either name alone or name-version can be - used as values for the server's LANG parameter.\par} + used as values for the server's LANG parameter. + \par} \vspace{1ex}\noindent\textbf{\xmlel{tr:Language} Type Schema Definition} @@ -301,34 +309,44 @@ \subsection{Languages Supported} \begingroup\small\begin{bigdescription}\item[Element \xmlel{name}] \begin{description} \item[Type] a prefixless XML name -\item[Meaning] The name of the language without a version suffix. +\item[Meaning] + The name of the language without a version suffix. + \item[Occurrence] required \end{description} \item[Element \xmlel{version}] \begin{description} \item[Type] a string with optional attributes -\item[Meaning] A version of the language supported by the server. +\item[Meaning] + A version of the language supported by the server. + \item[Occurrence] required; multiple occurrences allowed. \end{description} \item[Element \xmlel{description}] \begin{description} \item[Type] string: \xmlel{xs:token} -\item[Meaning] A short, human-readable description of the +\item[Meaning] + A short, human-readable description of the query language. + \item[Occurrence] optional \end{description} \item[Element \xmlel{languageFeatures}] \begin{description} \item[Type] composite: \xmlel{tr:LanguageFeatureList} -\item[Meaning] Optional features of the query language, grouped by +\item[Meaning] + Optional features of the query language, grouped by feature type. + \item[Occurrence] optional; multiple occurrences allowed. -\item[Comment] This includes listing user defined functions, geometry support, +\item[Comment] + This includes listing user defined functions, geometry support, or similar concepts. + \end{description} @@ -342,17 +360,21 @@ \subsection{Languages Supported} % GENERATED: !schemadoc TAPRegExt-v1.1.xsd Version \begin{generated} \begingroup - \renewcommand*\descriptionlabel[1]{% - \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:Version} Type Schema Documentation} + \renewcommand*\descriptionlabel[1]{% + \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:Version} Type Schema Documentation} -\noindent{\small{}One version of the language supported by the service.\par} +\noindent{\small + One version of the language supported by the service. + \par} -\noindent{\small{}If the service supports more than one version of the +\noindent{\small + If the service supports more than one version of the language, include multiple version elements. It is recommended that you use a version numbering scheme like MAJOR.MINOR in such a way that sorting by ascending character codes will leave the most - recent version at the bottom of the list.\par} + recent version at the bottom of the list. + \par} \vspace{1ex}\noindent\textbf{\xmlel{tr:Version} Type Schema Definition} @@ -372,13 +394,17 @@ \subsection{Languages Supported} \item[ivo-id] \begin{description} \item[Type] a URI: \xmlel{xs:anyURI} -\item[Meaning] An optional IVOID of the language. +\item[Meaning] + An optional IVOID of the language. + \item[Occurrence] optional -\item[Comment] To more formally define a language supported by a service, +\item[Comment] + To more formally define a language supported by a service, a resource record for the language can be created, either centrally on the Registry of Registries or by other registry operators. When such a record exists, the ivo-id attribute of language should point to it. + \end{description} @@ -471,13 +497,16 @@ \subsection{Languages Supported} % GENERATED: !schemadoc TAPRegExt-v1.1.xsd LanguageFeatureList \begin{generated} \begingroup - \renewcommand*\descriptionlabel[1]{% - \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:LanguageFeatureList} Type Schema Documentation} + \renewcommand*\descriptionlabel[1]{% + \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:LanguageFeatureList} Type Schema Documentation} -\noindent{\small{}An enumeration of non-standard or non-mandatory features of - a specific type implemented by the language.\par} +\noindent{\small + An enumeration of non-standard or non-mandatory features of + a specific type implemented by the language. + \par} -\noindent{\small{}A feature type is a language-dependent concept like +\noindent{\small + A feature type is a language-dependent concept like {"}user defined function{"}, {"}geometry support{"}, or possibly {"}units supported{"}. A featureList gives all features of a given type applicable for the service. Multiple featureLists @@ -488,7 +517,8 @@ \subsection{Languages Supported} the value of which will typically be an IVOID. To see values defined in TAPRegExt, retrieve the ivo://ivoa.net/std/TAPRegExt - resource record and look for keys starting with {"}features-{"}.\par} + resource record and look for keys starting with {"}features-{"}. + \par} \vspace{1ex}\noindent\textbf{\xmlel{tr:LanguageFeatureList} Type Schema Definition} @@ -508,11 +538,15 @@ \subsection{Languages Supported} \item[type] \begin{description} \item[Type] a URI: \xmlel{xs:anyURI} -\item[Meaning] The type of the features given here. +\item[Meaning] + The type of the features given here. + \item[Occurrence] required -\item[Comment] This is in general an IVOID. TAPRegExt itself gives +\item[Comment] + This is in general an IVOID. TAPRegExt itself gives IVOIDs for defining user defined functions and geometry support. + \end{description} @@ -525,8 +559,10 @@ \subsection{Languages Supported} \begingroup\small\begin{bigdescription}\item[Element \xmlel{feature}] \begin{description} \item[Type] composite: \xmlel{tr:LanguageFeature} -\item[Meaning] A language feature of the type given by the +\item[Meaning] + A language feature of the type given by the type attribute. + \item[Occurrence] optional; multiple occurrences allowed. \end{description} @@ -542,11 +578,13 @@ \subsection{Languages Supported} % GENERATED: !schemadoc TAPRegExt-v1.1.xsd LanguageFeature \begin{generated} \begingroup - \renewcommand*\descriptionlabel[1]{% - \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:LanguageFeature} Type Schema Documentation} + \renewcommand*\descriptionlabel[1]{% + \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:LanguageFeature} Type Schema Documentation} -\noindent{\small{}A non-standard or non-mandatory feature implemented - by the language..\par} +\noindent{\small + A non-standard or non-mandatory feature implemented + by the language.. + \par} \vspace{1ex}\noindent\textbf{\xmlel{tr:LanguageFeature} Type Schema Definition} @@ -564,16 +602,22 @@ \subsection{Languages Supported} \begingroup\small\begin{bigdescription}\item[Element \xmlel{form}] \begin{description} \item[Type] string: \xmlel{xs:token} -\item[Meaning] Formal notation for the language feature. +\item[Meaning] + Formal notation for the language feature. + \item[Occurrence] required -\item[Comment] The syntax for the content of this element is defined by the +\item[Comment] + The syntax for the content of this element is defined by the type attribute of its parent language list. + \end{description} \item[Element \xmlel{description}] \begin{description} \item[Type] string: \xmlel{xs:string} -\item[Meaning] Human-readable freeform documentation for the language feature. +\item[Meaning] + Human-readable freeform documentation for the language feature. + \item[Occurrence] optional \end{description} @@ -611,12 +655,15 @@ \subsection{Output Formats} % GENERATED: !schemadoc TAPRegExt-v1.1.xsd OutputFormat \begin{generated} \begingroup - \renewcommand*\descriptionlabel[1]{% - \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:OutputFormat} Type Schema Documentation} + \renewcommand*\descriptionlabel[1]{% + \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:OutputFormat} Type Schema Documentation} -\noindent{\small{}An output format supported by the service.\par} +\noindent{\small + An output format supported by the service. + \par} -\noindent{\small{}All TAP services must support VOTable output, with media types as +\noindent{\small + All TAP services must support VOTable output, with media types as requested by the FORMAT parameter if applicable (cf.~section 2.7.1 of the TAP standard). @@ -625,7 +672,8 @@ \subsection{Output Formats} use a media type (or make one up using the x- syntax), although the concrete media syntax is not enforced by the schema. - For more detailed specification, an IVOID may be used.\par} + For more detailed specification, an IVOID may be used. + \par} \vspace{1ex}\noindent\textbf{\xmlel{tr:OutputFormat} Type Schema Definition} @@ -636,7 +684,6 @@ \subsection{Output Formats} - \end{lstlisting} @@ -647,15 +694,19 @@ \subsection{Output Formats} \item[ivo-id] \begin{description} \item[Type] a URI: \xmlel{xs:anyURI} -\item[Meaning] An optional IVOID of the output format. +\item[Meaning] + An optional IVOID of the output format. + \item[Occurrence] optional -\item[Comment] When the media type does not uniquely define the +\item[Comment] + When the media type does not uniquely define the format (or a generic media type like application/octet-stream or text/plain is given), the IVOID can point to a key or StandardsRegExt document defining the format more precisely. To see values defined in TAPRegExt, retrieve the ivo://ivoa.net/std/TAPRegExt resource record and look for keys starting with {"}output-{"}. + \end{description} @@ -668,18 +719,24 @@ \subsection{Output Formats} \begingroup\small\begin{bigdescription}\item[Element \xmlel{mime}] \begin{description} \item[Type] string: \xmlel{xs:token} -\item[Meaning] The media type of this format. +\item[Meaning] + The media type of this format. + \item[Occurrence] required -\item[Comment] The format of this string is specified by RFC 2046. +\item[Comment] + The format of this string is specified by RFC 2046. The service has to accept this string as a value of the FORMAT parameter. + \end{description} \item[Element \xmlel{alias}] \begin{description} \item[Type] string: \xmlel{xs:token} -\item[Meaning] Other values of FORMAT ({"}shorthands{"}) that make the service return +\item[Meaning] + Other values of FORMAT ({"}shorthands{"}) that make the service return documents with the media type. + \item[Occurrence] optional; multiple occurrences allowed. \end{description} @@ -744,12 +801,15 @@ \subsection{Upload Methods} % GENERATED: !schemadoc TAPRegExt-v1.1.xsd UploadMethod \begin{generated} \begingroup - \renewcommand*\descriptionlabel[1]{% - \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:UploadMethod} Type Schema Documentation} + \renewcommand*\descriptionlabel[1]{% + \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:UploadMethod} Type Schema Documentation} -\noindent{\small{}An upload method as defined by IVOA.\par} +\noindent{\small + An upload method as defined by IVOA. + \par} -\noindent{\small{}Upload methods are always identified by an IVOID. +\noindent{\small + Upload methods are always identified by an IVOID. Descriptions can be obtained by dereferencing this IVOID. To see values defined in TAPRegExt, retrieve the ivo://ivoa.net/std/TAPRegExt @@ -757,7 +817,8 @@ \subsection{Upload Methods} You can register custom upload methods, but you must use the standard IVOIDs for the upload methods defined in the TAP - specification.\par} + specification. + \par} \vspace{1ex}\noindent\textbf{\xmlel{tr:UploadMethod} Type Schema Definition} @@ -777,7 +838,9 @@ \subsection{Upload Methods} \item[ivo-id] \begin{description} \item[Type] a URI: \xmlel{xs:anyURI} -\item[Meaning] The IVOID of the upload method. +\item[Meaning] + The IVOID of the upload method. + \item[Occurrence] optional \end{description} @@ -807,13 +870,6 @@ \subsection{Resource Limits} conservative guidelines. Thus, the operators of a service implementing a complex, possibly dynamic limits policy should give lower estimates here. -If a service supports authentication and has different -limits depending on what user is authenticated, it should make an effort -to guess the limits applying to a given client (e.g., when -authentication tokens are present in the request). Limits reported to -the Registry should reflect limits for unauthenticated use unless the -service does not admit unauthenticated requests. - The resource limits applying to newly created jobs are given in \xmlel{default} elements, the limits beyond which users cannot raise the limits are given in \xmlel{hard} elements. @@ -821,6 +877,11 @@ \subsection{Resource Limits} Note that the absence of a specification of limits does not imply that no limits are enforced. +Limits can be specified as direct children of \xmlel{capability}, or in +\xmlel{limits} groups as per Sect.~\ref{sect:permode}. The limits in +direct children should describe what is enforced for clients doing sync +queries without authentication unless the service does not support that +mode of operation. \subsubsection{Limits on Time} This document defines two time-like resource limits: @@ -842,10 +903,12 @@ \subsubsection{Limits on Time} % GENERATED: !schemadoc TAPRegExt-v1.1.xsd TimeLimits \begin{generated} \begingroup - \renewcommand*\descriptionlabel[1]{% - \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:TimeLimits} Type Schema Documentation} + \renewcommand*\descriptionlabel[1]{% + \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:TimeLimits} Type Schema Documentation} -\noindent{\small{}Time-valued limits, all values given in seconds.\par} +\noindent{\small + Time-valued limits, all values given in seconds. + \par} \vspace{1ex}\noindent\textbf{\xmlel{tr:TimeLimits} Type Schema Definition} @@ -864,14 +927,18 @@ \subsubsection{Limits on Time} \begingroup\small\begin{bigdescription}\item[Element \xmlel{default}] \begin{description} \item[Type] integer -\item[Meaning] The value of this limit for newly-created jobs, given in seconds. +\item[Meaning] + The value of this limit for newly-created jobs, given in seconds. + \item[Occurrence] optional \end{description} \item[Element \xmlel{hard}] \begin{description} \item[Type] integer -\item[Meaning] The value this limit cannot be raised above, given in seconds. +\item[Meaning] + The value this limit cannot be raised above, given in seconds. + \item[Occurrence] optional \end{description} @@ -915,10 +982,12 @@ \subsubsection{Limits on Data} % GENERATED: !schemadoc TAPRegExt-v1.1.xsd DataLimits \begin{generated} \begingroup - \renewcommand*\descriptionlabel[1]{% - \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:DataLimits} Type Schema Documentation} + \renewcommand*\descriptionlabel[1]{% + \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:DataLimits} Type Schema Documentation} -\noindent{\small{}Limits on data sizes, given in rows or bytes.\par} +\noindent{\small + Limits on data sizes, given in rows or bytes. + \par} \vspace{1ex}\noindent\textbf{\xmlel{tr:DataLimits} Type Schema Definition} @@ -938,14 +1007,18 @@ \subsubsection{Limits on Data} \begingroup\small\begin{bigdescription}\item[Element \xmlel{default}] \begin{description} \item[Type] an integer with optional attributes -\item[Meaning] The value of this limit for newly-created jobs. +\item[Meaning] + The value of this limit for newly-created jobs. + \item[Occurrence] optional \end{description} \item[Element \xmlel{hard}] \begin{description} \item[Type] an integer with optional attributes -\item[Meaning] The value this limit cannot be raised above. +\item[Meaning] + The value this limit cannot be raised above. + \item[Occurrence] optional \end{description} @@ -961,10 +1034,12 @@ \subsubsection{Limits on Data} % GENERATED: !schemadoc TAPRegExt-v1.1.xsd DataLimit \begin{generated} \begingroup - \renewcommand*\descriptionlabel[1]{% - \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:DataLimit} Type Schema Documentation} + \renewcommand*\descriptionlabel[1]{% + \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:DataLimit} Type Schema Documentation} -\noindent{\small{}A limit on some data size, either in rows or in bytes.\par} +\noindent{\small + A limit on some data size, either in rows or in bytes. + \par} \vspace{1ex}\noindent\textbf{\xmlel{tr:DataLimit} Type Schema Definition} @@ -991,7 +1066,9 @@ \subsubsection{Limits on Data} \item[unit] \begin{description} \item[Type] string with controlled vocabulary -\item[Meaning] The unit of the limit specified. +\item[Meaning] + The unit of the limit specified. + \item[Occurrence] required \item[Allowed Values]\hfil @@ -1008,6 +1085,163 @@ \subsubsection{Limits on Data} % /GENERATED +\subsubsection{Per-Mode Limits} +\label{sect:permode} + +TAP services may have separate policies for authenticated and anonymous +usage, and they may apply different limits to sync versus async queries. +To inform clients about these, the limits defined above can be +overridden in \xmlel{limits} elements qualifed with a \xmlel{mode} +attribute, which is restricted by the schema to be one of: + +\begin{itemize} +\item \emph{anonymous-sync} -- the limits given apply to clients that do +synchronous queries without authentication. Since this is what the +global values describe in TAPRegExt version 1.1, it should not be +necessary to override anything in a limits block with this mode. + +\item \emph{anonymous-async} -- the limits given apply to clients that +do asynchronous queries without authentication. + +\item \emph{auth-sync} -- the limits given apply to clients that do +synchronous queries with suitable authentication. + +\item \emph{auth-async} -- the limits given apply to clients that do +asynchronous queries with suitable authentication. +\end{itemize} + +No \xmlel{limits} groups need to be given when services have no reason +to override the ``global'' limits defined at the root level of the +capability. Note that the per-mode limits will be ignored by clients +supporting only TAPRegExt 1.0, and they are also invisible in RegTAP, at +least to its version 1.2. + +The \xmlel{limits} elements are of type \xmlel{tr:PerModeLimits}: + +% GENERATED: !schemadoc TAPRegExt-v1.1.xsd PerModeLimits +\begin{generated} +\begingroup + \renewcommand*\descriptionlabel[1]{% + \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:PerModeLimits} Type Schema Documentation} + +\noindent{\small + The limits corresponding to an access mode (auth/non-auth, sync/async). + \par} + +\vspace{1ex}\noindent\textbf{\xmlel{tr:PerModeLimits} Type Schema Definition} + +\begin{lstlisting}[language=XML,basicstyle=\footnotesize] + + + + + + + + + + + + + + + + + + +\end{lstlisting} + +\vspace{0.5ex}\noindent\textbf{\xmlel{tr:PerModeLimits} Attributes} + +\begingroup\small\begin{bigdescription} +\item[mode] +\begin{description} +\item[Type] string +\item[Meaning] +\item[Occurrence] optional + +\item[Allowed Values]\hfil +\begin{longtermsdescription}\item[anonymous-sync] + These limits apply to unauthenticated clients running + synchronous queries. + +\item[anonymous-async] + These limits apply to unauthenticated clients running + asynchronous queries. + +\item[auth-sync] + These limits apply to authenticated clients running + synchronous queries. + +\item[auth-async] + These limits apply to authenticated clients running + asynchronous queries. + +\end{longtermsdescription} +\end{description} + + +\end{bigdescription}\endgroup + + + +\vspace{0.5ex}\noindent\textbf{\xmlel{tr:PerModeLimits} Metadata Elements} + +\begingroup\small\begin{bigdescription}\item[Element \xmlel{retentionPeriod}] +\begin{description} +\item[Type] composite: \xmlel{tr:TimeLimits} +\item[Meaning] + Limits for how long a service will retain async jobs + in this limit element's mode. + +\item[Occurrence] optional + +\end{description} +\item[Element \xmlel{executionDuration}] +\begin{description} +\item[Type] composite: \xmlel{tr:TimeLimits} +\item[Meaning] + Limits on the time after which a query will be cancelled + in this limit element's mode. + +\item[Occurrence] optional + +\end{description} +\item[Element \xmlel{outputLimit}] +\begin{description} +\item[Type] composite: \xmlel{tr:DataLimits} +\item[Meaning] + Limits on the size of data returned + in this limit element's mode. + +\item[Occurrence] optional + +\end{description} +\item[Element \xmlel{uploadLimit}] +\begin{description} +\item[Type] composite: \xmlel{tr:DataLimits} +\item[Meaning] + Limits on the size of uploaded data + in this limit element's mode. + +\item[Occurrence] optional + +\end{description} + + +\end{bigdescription}\endgroup + +\endgroup +\end{generated} + +% /GENERATED + + \subsection{Interface Declaration} \label{intfdecl} @@ -1044,16 +1278,20 @@ \subsection{Interface Declaration} % GENERATED: !schemadoc TAPRegExt-v1.1.xsd DALIInterface \begin{generated} \begingroup - \renewcommand*\descriptionlabel[1]{% - \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:DALIInterface} Type Schema Documentation} + \renewcommand*\descriptionlabel[1]{% + \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:DALIInterface} Type Schema Documentation} -\noindent{\small{}An interface for a complex, multi-endpoint interfaces as - regulated by DALI.\par} +\noindent{\small + An interface for a complex, multi-endpoint interfaces as + regulated by DALI. + \par} -\noindent{\small{}In addition to the standard vr:Interface elements, DALIInterfaces +\noindent{\small + In addition to the standard vr:Interface elements, DALIInterfaces have endpoints, listed by name; that name doubles as a path segment to append to the interface's access URL, yielding the URI at - which the endpoint is operated.\par} + which the endpoint is operated. + \par} \vspace{1ex}\noindent\textbf{\xmlel{tr:DALIInterface} Type Schema Definition} @@ -1075,7 +1313,9 @@ \subsection{Interface Declaration} \begingroup\small\begin{bigdescription}\item[Element \xmlel{endpoint}] \begin{description} \item[Type] composite: \xmlel{tr:Endpoint} -\item[Meaning] An endpoint accessible through this interface. +\item[Meaning] + An endpoint accessible through this interface. + \item[Occurrence] optional; multiple occurrences allowed. \end{description} @@ -1099,15 +1339,19 @@ \subsection{Interface Declaration} % GENERATED: !schemadoc TAPRegExt-v1.1.xsd Endpoint \begin{generated} \begingroup - \renewcommand*\descriptionlabel[1]{% - \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:Endpoint} Type Schema Documentation} + \renewcommand*\descriptionlabel[1]{% + \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:Endpoint} Type Schema Documentation} -\noindent{\small{}An endpoint of a complex interface.\par} +\noindent{\small + An endpoint of a complex interface. + \par} -\noindent{\small{}An endpoint is characterised and addressed by its name; +\noindent{\small + An endpoint is characterised and addressed by its name; they can further be defined through RDF triples. This is a generic extension mechanism for endpoint-specific metadata, - primarily intended for custom, vendor-specific extensions.\par} + primarily intended for custom, vendor-specific extensions. + \par} \vspace{1ex}\noindent\textbf{\xmlel{tr:Endpoint} Type Schema Definition} @@ -1126,18 +1370,24 @@ \subsection{Interface Declaration} \begingroup\small\begin{bigdescription}\item[Element \xmlel{name}] \begin{description} \item[Type] string: \xmlel{xs:token} -\item[Meaning] The endpoint name, which is also the last component of the +\item[Meaning] + The endpoint name, which is also the last component of the path of its URI. + \item[Occurrence] required -\item[Comment] Names without dashes are reserved for IVOA use and are expected to +\item[Comment] + Names without dashes are reserved for IVOA use and are expected to work the same way on all services. Well-known examples for such endpoint names include sync, async, and tables. + \end{description} \item[Element \xmlel{meta}] \begin{description} \item[Type] a string with optional attributes -\item[Meaning] Auxiliary information on this endpoint. +\item[Meaning] + Auxiliary information on this endpoint. + \item[Occurrence] optional; multiple occurrences allowed. \end{description} @@ -1168,11 +1418,13 @@ \subsection{Interface Declaration} % GENERATED: !schemadoc TAPRegExt-v1.1.xsd MetaTriple \begin{generated} \begingroup - \renewcommand*\descriptionlabel[1]{% - \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:MetaTriple} Type Schema Documentation} + \renewcommand*\descriptionlabel[1]{% + \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:MetaTriple} Type Schema Documentation} -\noindent{\small{}A container for an RDFa triple giving information related to - an endpoint.\par} +\noindent{\small + A container for an RDFa triple giving information related to + an endpoint. + \par} \vspace{1ex}\noindent\textbf{\xmlel{tr:MetaTriple} Type Schema Definition} @@ -1194,27 +1446,39 @@ \subsection{Interface Declaration} \item[about] \begin{description} \item[Type] a URI: \xmlel{xs:anyURI} -\item[Meaning] The subject of the statement. +\item[Meaning] + The subject of the statement. + \item[Occurrence] optional -\item[Comment] If missing, the endpoint itself is assumed as the subject. +\item[Comment] + If missing, the endpoint itself is assumed as the subject. + \end{description} \item[property] \begin{description} \item[Type] a URI: \xmlel{xs:anyURI} -\item[Meaning] The property of the statement. +\item[Meaning] + The property of the statement. + \item[Occurrence] required -\item[Comment] This is a reference to an RDF resource. IVOA standards may define +\item[Comment] + This is a reference to an RDF resource. IVOA standards may define semantics for scheme-less URI; non-IVOA properties must use full URIs with at least scheme and authority; in this version, no vocab attributes are supported. + \end{description} \item[resource] \begin{description} \item[Type] a URI: \xmlel{xs:anyURI} -\item[Meaning] The object of the statement. +\item[Meaning] + The object of the statement. + \item[Occurrence] optional -\item[Comment] If missing, the text content of the element is used as the +\item[Comment] + If missing, the text content of the element is used as the object. + \end{description} @@ -1318,13 +1582,17 @@ \subsection{The Capability Record} % GENERATED: !schemadoc TAPRegExt-v1.1.xsd TableAccess \begin{generated} \begingroup - \renewcommand*\descriptionlabel[1]{% - \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:TableAccess} Type Schema Documentation} + \renewcommand*\descriptionlabel[1]{% + \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:TableAccess} Type Schema Documentation} -\noindent{\small{}The capabilities of a TAP server.\par} +\noindent{\small + The capabilities of a TAP server. + \par} -\noindent{\small{}The capabilities attempt to define most issues that the - TAP standard leaves to the implementors ({"}may{"}, {"}should{"}).\par} +\noindent{\small + The capabilities attempt to define most issues that the + TAP standard leaves to the implementors ({"}may{"}, {"}should{"}). + \par} \vspace{1ex}\noindent\textbf{\xmlel{tr:TableAccess} Type Schema Definition} @@ -1350,6 +1618,7 @@ \subsection{The Capability Record} maxOccurs="1" /> + @@ -1361,61 +1630,95 @@ \subsection{The Capability Record} \begingroup\small\begin{bigdescription}\item[Element \xmlel{dataModel}] \begin{description} \item[Type] a string with optional attributes -\item[Meaning] Identifier of IVOA-approved data model supported by the +\item[Meaning] + Identifier of IVOA-approved data model supported by the service. + \item[Occurrence] optional; multiple occurrences allowed. \end{description} \item[Element \xmlel{language}] \begin{description} \item[Type] composite: \xmlel{tr:Language} -\item[Meaning] Language supported by the service. +\item[Meaning] + Language supported by the service. + \item[Occurrence] required; multiple occurrences allowed. \end{description} \item[Element \xmlel{outputFormat}] \begin{description} \item[Type] composite: \xmlel{tr:OutputFormat} -\item[Meaning] Output format supported by the service. +\item[Meaning] + Output format supported by the service. + \item[Occurrence] required; multiple occurrences allowed. \end{description} \item[Element \xmlel{uploadMethod}] \begin{description} \item[Type] composite: \xmlel{tr:UploadMethod} -\item[Meaning] Upload method supported by the service. +\item[Meaning] + Upload method supported by the service. + \item[Occurrence] optional; multiple occurrences allowed. -\item[Comment] The absence of upload methods indicates +\item[Comment] + The absence of upload methods indicates that the service does not support uploads at all. + \end{description} \item[Element \xmlel{retentionPeriod}] \begin{description} \item[Type] composite: \xmlel{tr:TimeLimits} -\item[Meaning] Limits on the time between job creation and - destruction time. +\item[Meaning] + Limits for how long a service will retain async jobs + for the service's default access + mode (typically anonymous-sync). + \item[Occurrence] optional \end{description} \item[Element \xmlel{executionDuration}] \begin{description} \item[Type] composite: \xmlel{tr:TimeLimits} -\item[Meaning] Limits on executionDuration. +\item[Meaning] + Limits on the time after which a query will be cancelled + for the service's default access mode (typically + anonymous-sync). + \item[Occurrence] optional \end{description} \item[Element \xmlel{outputLimit}] \begin{description} \item[Type] composite: \xmlel{tr:DataLimits} -\item[Meaning] Limits on the size of data returned. +\item[Meaning] + Limits on the size of data returned + for the service's default access mode (typically + anonymous-sync). + \item[Occurrence] optional \end{description} \item[Element \xmlel{uploadLimit}] \begin{description} \item[Type] composite: \xmlel{tr:DataLimits} -\item[Meaning] Limits on the size of uploaded data. +\item[Meaning] + Limits on the size of uploaded data + for the service's default access mode (typically + anonymous-sync). + +\item[Occurrence] optional + +\end{description} +\item[Element \xmlel{limits}] +\begin{description} +\item[Type] composite: \xmlel{tr:PerModeLimits} +\item[Meaning] + Per-mode overrides of the limits defined gobally. + \item[Occurrence] optional \end{description} @@ -1456,6 +1759,8 @@ \subsection{Changes from REC-1.0} \item Adding tr:DALIInterface to the schema. \item Dropping the appendix with an example document. Using a standalone, validated file and auxiliaryurl instead. +\item Adding a \xmlel{limits} element to declare different limits by +access mode. \end{itemize} \subsection{Changes from WD-20110127} diff --git a/role_diagram.pdf b/role_diagram.pdf index 37f9449708e158ce4aea8fc177f3f6e2332cceea..ed27c3e269e80b176ede02c679acc91bfa84a2ff 100644 GIT binary patch delta 22536 zcmV(^K-IsBg#zS*0+3FBO;g)Q5WVYH^wAtVnV#=CLP%1ipa|Ho2Py}ZEgUDz zmv=DP*;7Ap)f-a76=xGR z^yTFf4w4NO_Gnt5>MO4Ry%a$ig%L0aZ=!MmrmN!J?O2XE^7OVCUA0xy9!$R%NHL{! zmJ?3r#pr##x_{_@`pt0^(kP7q#@eRsFHQaTa^7#}eB+e+F_kjpC4Hc;DeLI6S}fbH z`JEjYADi2NLRslGy*nu|M#f9_H>2aSE8#%<(cx@XwJlJ}uAbF*?ZMaS=iJ9C6Yfb*YiFF9m+zow#tYYqbD0BSrdr{Hvd$0U2o2OZr70_sRxfT z8t}-09(AOD2I{C?{mTK?{ksHNUR5I(8F+?llAzhseiQtN6LFm=NPjLl0kB& zEfs{4AqE4Rt*hRPj1f_*@WhSOv1rOwmMe+Su=Ke?ZeTd+sa((Dtm?`+zr3&S?y6b0 ztk=EBl_Da^Neb78opg0mE>Z!MrzSvco_9#OaaT%zMD2p1b~9-zCI4zwuDj(dABpCw z@-b3THVGJ2UwLb-b5E%_tLN3-(10;GDK)rZ^ZFbv9;)0=j!*NX>&o;y@H zBO^68ck+<>W8JLEt{ti`{LnC) zaaLJ>;LW77w4%;*c>tiY#E|wr_Da*6CcQo%TJ3GX{{+gQ(DNX6dS{5F<2=)lCRgxV zA#P^DnK%~vqV$|rr7;QCirvYi%Y@ZT&QZQZ=A@&BD4ThE`C(6-F<)Rj{w@9H*cBzx zK$5{m9f0~-;C7fN^NO12cG=%Id%#qh>#g{IwxijZes=5zRB1;o7^o0HQ{tt{A0M8c z?1>Q5?T$(U4V>NaVMO7h3+$mHwcu8KhsPJEd*ZV+-Eul+1$S>8p2>zs17AYh^>{Oy z9ymEV{PK9k|KF~$q$Sd$d1IN4kHYcQf}pK=iN>qHCi}LvawPaPBGnt3+GwKAQJo_( z{q}riL{0`3UKIZT(Q%-^3T19&b98cLVQmU!Ze(v_Y6>+VFd%PYY6>7AATcmAHnVgD z+5vxScvRK3d!5I;axyb#UMFFMIg=ri#3UwW5&{^=AtXZ(HSanDLM9S0D40M3_(FoU z3Q+_rwzO8jmTQ%Ⓢ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 JTwNaLzW}|ZL`VPt delta 22569 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 K+2z#a@&5;#5gf1p diff --git a/role_diagram.svg b/role_diagram.svg index 276d13c..ea1815e 100644 --- a/role_diagram.svg +++ b/role_diagram.svg @@ -1,43 +1,43 @@ -IVOA Architecture DiagramThis image shows the architecture of the Virtual Observatory - (cf. http://ivoa.net), together with the relevant standards.UsersComputersProvidersRegistryData Access ProtocolsUser LayerUsingResource LayerSharingVOCoreFindingGettingDesktop AppsIn-BrowserAppsUserProgramsData and Metadata CollectionStorageComputationSemanticsDataModelsVO QueryLanguagesFormats +IVOA Architecture DiagramThis image shows the architecture of the Virtual Observatory + (cf. http://ivoa.net), together with the relevant standards.UsersComputersProvidersRegistryData Access ProtocolsUser LayerUsingResource LayerSharingVOCoreFindingGettingDesktop AppsIn-BrowserAppsUserProgramsData and Metadata CollectionStorageComputationSemanticsDataModelsVO QueryLanguagesFormats VOResource Resource M.D. From 845d03e69bb9606dcb0943b9c3ea65d7ca6f8098 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Wed, 24 Sep 2025 11:32:34 +0200 Subject: [PATCH 3/3] Purging the notion of a 'default access mode' --- TAPRegExt-v1.1.xsd | 16 ++++------------ TAPRegExt.tex | 21 ++++++--------------- 2 files changed, 10 insertions(+), 27 deletions(-) diff --git a/TAPRegExt-v1.1.xsd b/TAPRegExt-v1.1.xsd index 9a324e0..8149959 100644 --- a/TAPRegExt-v1.1.xsd +++ b/TAPRegExt-v1.1.xsd @@ -82,9 +82,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" minOccurs="0" maxOccurs="1"> - Limits for how long a service will retain async jobs - for the service's default access - mode (typically anonymous-sync). + Default limits for how long a service will retain async jobs. @@ -93,9 +91,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" minOccurs="0" maxOccurs="1"> - Limits on the time after which a query will be cancelled - for the service's default access mode (typically - anonymous-sync). + Default limits on the time after which a query will be cancelled. @@ -104,9 +100,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" minOccurs="0" maxOccurs="1"> - Limits on the size of data returned - for the service's default access mode (typically - anonymous-sync). + Deafult limits on the size of data returned. @@ -115,9 +109,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" minOccurs="0" maxOccurs="1"> - Limits on the size of uploaded data - for the service's default access mode (typically - anonymous-sync). + Default limits on the size of uploaded data. diff --git a/TAPRegExt.tex b/TAPRegExt.tex index 1b37fdd..bbd7362 100644 --- a/TAPRegExt.tex +++ b/TAPRegExt.tex @@ -879,9 +879,8 @@ \subsection{Resource Limits} Limits can be specified as direct children of \xmlel{capability}, or in \xmlel{limits} groups as per Sect.~\ref{sect:permode}. The limits in -direct children should describe what is enforced for clients doing sync -queries without authentication unless the service does not support that -mode of operation. +direct children give defaults, overrideable in the limits groups for +specific modes. \subsubsection{Limits on Time} This document defines two time-like resource limits: @@ -1673,9 +1672,7 @@ \subsection{The Capability Record} \begin{description} \item[Type] composite: \xmlel{tr:TimeLimits} \item[Meaning] - Limits for how long a service will retain async jobs - for the service's default access - mode (typically anonymous-sync). + Default limits for how long a service will retain async jobs. \item[Occurrence] optional @@ -1684,9 +1681,7 @@ \subsection{The Capability Record} \begin{description} \item[Type] composite: \xmlel{tr:TimeLimits} \item[Meaning] - Limits on the time after which a query will be cancelled - for the service's default access mode (typically - anonymous-sync). + Default limits on the time after which a query will be cancelled. \item[Occurrence] optional @@ -1695,9 +1690,7 @@ \subsection{The Capability Record} \begin{description} \item[Type] composite: \xmlel{tr:DataLimits} \item[Meaning] - Limits on the size of data returned - for the service's default access mode (typically - anonymous-sync). + Deafult limits on the size of data returned. \item[Occurrence] optional @@ -1706,9 +1699,7 @@ \subsection{The Capability Record} \begin{description} \item[Type] composite: \xmlel{tr:DataLimits} \item[Meaning] - Limits on the size of uploaded data - for the service's default access mode (typically - anonymous-sync). + Default limits on the size of uploaded data. \item[Occurrence] optional