Skip to content

Commit 257ef8d

Browse files
authored
Async AASX File Server Profile (#531)
* add proposal for an async aasx profile * correct result of the get .../results/... endpoint * add missing appearances of the async aasx file server operations
1 parent 15940ef commit 257ef8d

File tree

6 files changed

+376
-1
lines changed

6 files changed

+376
-1
lines changed
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
openapi: 3.0.3
2+
info:
3+
title: DotAAS Part 2 | HTTP/REST | AASX File Server Service Specification
4+
description: >-
5+
The async profile of the File Server Service Specification as part of the [Specification of the Asset Administration Shell: Part 2](http://industrialdigitaltwin.org/en/content-hub).
6+
7+
Publisher: Industrial Digital Twin Association (IDTA) 2026
8+
contact:
9+
name: Industrial Digital Twin Association (IDTA)
10+
email: info@idtwin.org
11+
license:
12+
name: CC BY 4.0
13+
url: https://creativecommons.org/licenses/by/4.0/
14+
version: V3.2.0_SSP-002
15+
x-profile-identifier: https://admin-shell.io/aas/API/3/2/AasxFileServerServiceSpecification/SSP-002
16+
termsOfService: https://github.com/admin-shell-io/aas-specs
17+
servers:
18+
- url: 'https://admin-shell.io/api/v3'
19+
- url: 'https://example.com'
20+
paths:
21+
/packages-async:
22+
23+
post:
24+
tags:
25+
- AASX Async File Server API
26+
summary: Initiates an asynchronous upload of an AASX package at the server.
27+
operationId: PostAsyncAASXPackage
28+
x-semanticIds:
29+
- https://admin-shell.io/aas/API/PostAsyncAASXPackage/3/2
30+
requestBody:
31+
description: AASX package
32+
content:
33+
multipart/form-data:
34+
schema:
35+
type: object
36+
properties:
37+
aasIds:
38+
type: array
39+
items:
40+
type: string
41+
file:
42+
type: string
43+
format: binary
44+
fileName:
45+
type: string
46+
encoding:
47+
file:
48+
contentType: application/asset-administration-shell-package
49+
required: true
50+
responses:
51+
'202':
52+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/accepted'
53+
'400':
54+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/bad-request'
55+
'401':
56+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/unauthorized'
57+
'403':
58+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/forbidden'
59+
'409':
60+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/conflict'
61+
'500':
62+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/internal-server-error'
63+
default:
64+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/default'
65+
66+
/packages-async/status/{handleId}:
67+
parameters:
68+
- $ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/parameters/HandleId'
69+
get:
70+
tags:
71+
- AASX Async File Server Status API
72+
summary: Returns the status of an asynchronously invoked AASX operation.
73+
operationId: GetAasxAsyncStatus
74+
x-semanticIds:
75+
- https://admin-shell.io/aas/API/GetAasxAsyncStatus/3/2
76+
responses:
77+
'200':
78+
description: Operation result object containing information that the 'executionState' is still 'Running'
79+
content:
80+
application/json:
81+
schema:
82+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/schemas/BaseOperationResult'
83+
'302':
84+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/found'
85+
'400':
86+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/bad-request'
87+
'401':
88+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/unauthorized'
89+
'403':
90+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/forbidden'
91+
'404':
92+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/not-found'
93+
'500':
94+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/internal-server-error'
95+
default:
96+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/default'
97+
/packages-async/results/{handleId}:
98+
parameters:
99+
- $ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/parameters/HandleId'
100+
get:
101+
tags:
102+
- AASX Async File Server Result API
103+
summary: Returns the result of an asynchronously invoked AASX operation.
104+
operationId: GetAasxAsyncResult
105+
x-semanticIds:
106+
- https://admin-shell.io/aas/API/GetAasxAsyncResult/3/2
107+
responses:
108+
'200':
109+
description: Operation result object
110+
content:
111+
application/json:
112+
schema:
113+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/schemas/BaseOperationResult'
114+
'400':
115+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/bad-request'
116+
'401':
117+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/unauthorized'
118+
'403':
119+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/forbidden'
120+
'404':
121+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/not-found'
122+
'500':
123+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/internal-server-error'
124+
default:
125+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/default'
126+
127+
128+
/description:
129+
get:
130+
tags:
131+
- Description API
132+
summary: Returns the self-describing information of a network resource (ServiceDescription)
133+
operationId: GetDescription
134+
x-semanticIds:
135+
- https://admin-shell.io/aas/API/Descriptor/GetDescription/3/2
136+
responses:
137+
'200':
138+
description: Requested Description
139+
content:
140+
application/json:
141+
example: "https://admin-shell.io/aas/API/3/2/AasxFileServerServiceSpecification/SSP-002"
142+
schema:
143+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/schemas/ServiceDescription'
144+
'400':
145+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/bad-request'
146+
'403':
147+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/forbidden'
148+
'404':
149+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/not-found'
150+
'500':
151+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/internal-server-error'
152+
default:
153+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/default'

Entire-API-Collection/V3.2.yaml

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7536,6 +7536,110 @@ paths:
75367536
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/internal-server-error'
75377537
default:
75387538
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/default'
7539+
/packages-async:
7540+
post:
7541+
tags:
7542+
- AASX Async File Server API
7543+
summary: Initiates an asynchronous upload of an AASX package at the server.
7544+
operationId: PostAsyncAASXPackage
7545+
x-semanticIds:
7546+
- https://admin-shell.io/aas/API/PostAsyncAASXPackage/3/2
7547+
requestBody:
7548+
description: AASX package
7549+
content:
7550+
multipart/form-data:
7551+
schema:
7552+
type: object
7553+
properties:
7554+
aasIds:
7555+
type: array
7556+
items:
7557+
type: string
7558+
file:
7559+
type: string
7560+
format: binary
7561+
fileName:
7562+
type: string
7563+
encoding:
7564+
file:
7565+
contentType: application/asset-administration-shell-package
7566+
required: true
7567+
responses:
7568+
'202':
7569+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/accepted'
7570+
'400':
7571+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/bad-request'
7572+
'401':
7573+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/unauthorized'
7574+
'403':
7575+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/forbidden'
7576+
'409':
7577+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/conflict'
7578+
'500':
7579+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/internal-server-error'
7580+
default:
7581+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/default'
7582+
/packages-async/status/{handleId}:
7583+
parameters:
7584+
- $ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/parameters/HandleId'
7585+
get:
7586+
tags:
7587+
- AASX Async File Server Status API
7588+
summary: Returns the status of an asynchronously invoked AASX operation.
7589+
operationId: GetAasxAsyncStatus
7590+
x-semanticIds:
7591+
- https://admin-shell.io/aas/API/GetAasxAsyncStatus/3/2
7592+
responses:
7593+
'200':
7594+
description: Operation result object containing information that the 'executionState' is still 'Running'
7595+
content:
7596+
application/json:
7597+
schema:
7598+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/schemas/BaseOperationResult'
7599+
'302':
7600+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/found'
7601+
'400':
7602+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/bad-request'
7603+
'401':
7604+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/unauthorized'
7605+
'403':
7606+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/forbidden'
7607+
'404':
7608+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/not-found'
7609+
'500':
7610+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/internal-server-error'
7611+
default:
7612+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/default'
7613+
/packages-async/results/{handleId}:
7614+
parameters:
7615+
- $ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/parameters/HandleId'
7616+
get:
7617+
tags:
7618+
- AASX Async File Server Result API
7619+
summary: Returns the result of an asynchronously invoked AASX operation.
7620+
operationId: GetAasxAsyncResult
7621+
x-semanticIds:
7622+
- https://admin-shell.io/aas/API/GetAasxAsyncResult/3/2
7623+
responses:
7624+
'200':
7625+
description: Operation result object
7626+
content:
7627+
application/json:
7628+
schema:
7629+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/schemas/BaseOperationResult'
7630+
'400':
7631+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/bad-request'
7632+
'401':
7633+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/unauthorized'
7634+
'403':
7635+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/forbidden'
7636+
'404':
7637+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/not-found'
7638+
'500':
7639+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/internal-server-error'
7640+
default:
7641+
$ref: 'https://api.swaggerhub.com/domains/Plattform_i40/Part2-API-Schemas/V3.2.0#/components/responses/default'
7642+
75397643

75407644

75417645
/serialization:

documentation/IDTA-01002-3/modules/ROOT/pages/changelog.adoc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ Note: Changes in Metamodel (IDTA-01001) will not be listed here, although they h
1414

1515
Major Changes:
1616

17+
* Add the asynchronous AASX File Server Service Specification (https://github.com/admin-shell-io/aas-specs-api/issues/347[#347])
1718
* Changing the serialization format for AASX packages from "application/asset-administration-shell-package+xml" to "application/aas+zip" in the OpenAPI files for the Asset Administration Shell Repository Service Specification and the Submodel Repository Service Specification. This change is necessary to align with the actual content type used by implementations and to avoid confusion, as the previous content type was not registered and could be misinterpreted as an XML-based format. (https://github.com/admin-shell-io/aas-specs-api/issues/538[#538])
1819

1920

@@ -25,14 +26,16 @@ Minor Changes:
2526
* Editorial: Remove links to SwaggerHub from the HTTP API section, as the links are maintained in the service specifications and profiles sections. (https://github.com/admin-shell-io/aas-specs-api/issues/475[#475])
2627
* Editorial fixes in Table 2 of the Query Language specification (https://github.com/admin-shell-io/aas-specs-api/issues/507[#507])
2728

28-
2929
=== Operation Changes w.r.t. V3.1.1 to V3.2
3030

3131
[%autowidth,width="100%",cols="40%,15%,45%",options="header",]
3232
|===
3333
h|Operation h|Kind of Change h|Comment
3434
| GenerateSerializationByIds|change a| Added a note to clarify the intended behavior for transitively referenced concept descriptions. (https://github.com/admin-shell-io/aas-specs-api/issues/510[#510])
3535
| PutAssetAdministrationShellById|change a| Added the missing `id` input parameter and a note explaining the behavior in case the AAS identifier does not match the value of `id`. (https://github.com/admin-shell-io/aas-specs-api/issues/506[#506])
36+
| PostAsyncAASXPackage|new a| New API Operation for the asynchronous AASX File Server Service Specification (https://github.com/admin-shell-io/aas-specs-api/issues/347[#347])
37+
| GetAasxAsyncStatus|new a| New API Operation for the asynchronous AASX File Server Service Specification (https://github.com/admin-shell-io/aas-specs-api/issues/347[#347])
38+
| GetAasxAsyncResult|new a| New API Operation for the asynchronous AASX File Server Service Specification (https://github.com/admin-shell-io/aas-specs-api/issues/347[#347])
3639
|===
3740

3841

documentation/IDTA-01002-3/modules/ROOT/pages/http-rest-api/http-rest-api.adoc

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,9 @@ Pagination
582582
|GetAASXByPackageId |GET |/packages/\{packageId} |base64url-encoded identifier
583583
|PutAASXByPackageId |PUT |/packages/\{packageId} |base64url-encoded identifier
584584
|DeleteAASXByPackageId |DELETE |/packages/\{packageId} |base64url-encoded identifier
585+
|PostAsyncAASXPackage |POST |/packages-async |
586+
|GetAasxAsyncStatus |GET |/packages-async/\{handleId} |
587+
|GetAasxAsyncResult |GET |/packages-async/result/\{handleId} |
585588

586589
4+h|Serialization Interface
587590
|GenerateSerializationByIds |GET |/serialization |base64url-encoded identifier; AcceptHeader: application/aasx+xml or application/json oder application/xml
@@ -687,6 +690,28 @@ Note: the invocation of the SubmodelElement "Operation" may also be conducted in
687690
In this case, the "/$value" path segment is added to the previously mentioned endpoints.
688691
====
689692

693+
694+
[#async-invocation-of-aasx-upload]
695+
== Asynchronous Invocation of an AASX File Upload
696+
The upload of an AASX file is only defined as an asynchronous operation in the current version of the specification.
697+
The expected behavior is therefore explained in detail.
698+
.Sequence for asynchronous AASX file upload
699+
[[aasx-upload-invocation]]
700+
[plantuml, aasx-upload-invocation, svg]
701+
....include::partial$diagrams/aasx-upload-invocation.puml[]
702+
....
703+
The client sends a POST request to the "/packages-async" endpoint with the AASX file in the request body.
704+
The server immediately responds with an Accepted (status code: 202) message containing the link to an endpoint where the client can fetch status information about his request (see <<aasx-upload-invocation>>).
705+
This status endpoint is located at "/packages-async/\{handleId}".
706+
In case the request is incorrect and the server already recognizes it, the server responds directly with the according status code, e.g. 400. If the server can only recognize the error during later processing and not at the time it receives the request, it responds with an Accepted (202) message at first. Hence, a received Accepted message does not guarantee the client that its request is valid in every case.
707+
If the server has not finished processing the request, the status endpoint responds with a message with the attribute "executionState" set to "Running".
708+
As soon as the processing is finished, the status endpoints deliver a Found (HTTP status code 302) response with the location of the result in the Location response header.
709+
The result is provided at the "/packages-async/result/\{handleId}" endpoint.
710+
In case incorrect inputs have been provided by the client but the server was only able to recognize this during processing, or if the server perceived any other error during processing, the server must still provide the result object with status code 200 and set the attribute "executionState" to "Failed".
711+
712+
713+
714+
690715
== Bulk Operations
691716
692717
This chapter provides a description of the Bulk APIs.

documentation/IDTA-01002-3/modules/ROOT/pages/http-rest-api/service-specifications-and-profiles.adoc

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,7 @@ See: https://app.swaggerhub.com/apis/Plattform_i40/SubmodelServiceSpecification/
320320
|===
321321
h|Service Specification / Profiles h|Description
322322
|<<aasx-file-server-service-specification-SSP-001, AasxFileServerServiceSpecification/SSP-001>>The full feature set of the AASX File Server Service Specification
323+
|<<aasx-file-server-service-specification-SSP-002, AasxFileServerServiceSpecification/SSP-002>>The async feature set of the AASX File Server Service Specification
323324
|===
324325

325326
[#aasx-file-server-service-specification-SSP-001]
@@ -352,6 +353,34 @@ AASX for packages
352353

353354
See: https://app.swaggerhub.com/apis/Plattform_i40/AasxFileServerServiceSpecification/V3.2.0_SSP-001
354355

356+
[#aasx-file-server-service-specification-SSP-002]
357+
=== AASX File Server Service Specification – Async Profile
358+
359+
[%autowidth,width="100%",cols="36%,64%",options="header",]
360+
|===
361+
h|Name: |AASX File Server Async Profile
362+
h|Profile Identifier |`\https://admin-shell.io/aas/API/3/2/AasxFileServerServiceSpecification/SSP-002`
363+
h|Feature h|Appearance
364+
|APIs and API Operations a|
365+
_File Server API:_ +
366+
xref:specification/interfaces.adoc#InvokeOperationAsync[InvokeOperationAsync] +
367+
xref:specification/interfaces.adoc#GetAasxAsyncStatus[GetAasxAsyncStatus] +
368+
xref:specification/interfaces.adoc#GetAasxAsyncResult[GetAasxAsyncResult]
369+
370+
_Description API:_ +
371+
xref:specification/interfaces.adoc#GetSelfDescription[GetDescription]
372+
373+
|xref:specification/interfaces-operation-parameters.adoc#SerializationModifier[SerializationModifier] |not applicable
374+
|SerializationFormat a|
375+
JSON for descriptions and error messages
376+
377+
AASX for packages
378+
379+
|xref:http-rest-api/http-rest-api.adoc#pagination[Pagination] |not supported
380+
|===
381+
382+
See: https://app.swaggerhub.com/apis/Plattform_i40/AasxFileServerServiceSpecification/V3.2.0_SSP-002
383+
355384
[#asset-administration-shell-registry-service-specification]
356385
== Asset Administration Shell Registry Service Specification
357386

0 commit comments

Comments
 (0)