@open-resource-discovery/specification 1.10.0 → 1.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/dist/types/v1/Configuration.d.ts +12 -1
- package/dist/types/v1/Document.d.ts +111 -59
- package/package.json +5 -5
- package/static/spec-v1/interfaces/Configuration.annotated.schema.json +17 -2
- package/static/spec-v1/interfaces/Configuration.schema.json +17 -2
- package/static/spec-v1/interfaces/Document.annotated.schema.json +596 -72
- package/static/spec-v1/interfaces/Document.schema.json +418 -66
@@ -1,12 +1,13 @@
|
|
1
1
|
{
|
2
2
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
3
3
|
"$id": "https://open-resource-discovery.github.io/specification/spec-v1/interfaces/Document.schema.json#",
|
4
|
+
"title": "ORD Document",
|
4
5
|
"description": "The [ORD Document](../index.md#ord-document) object serves as a wrapper for the **ORD resources** and **ORD taxonomy** and adds further top-level information\nthat are specific to the document/the service it describes.\n\nThe constraints and considerations on [ORD Documents](../index.md#ord-document) MUST be followed.",
|
5
6
|
"definitions": {
|
6
7
|
"Package": {
|
7
8
|
"type": "object",
|
8
9
|
"title": "Package",
|
9
|
-
"description": "A [**Package**](
|
10
|
+
"description": "A [**Package**](../concepts/grouping-and-bundling#package) organizes a set of related resources together, by publishing and catalog presentation concerns.\n\nThe Package can also be used to indicate which products or vendors provided the packaged resources.\nFor partner or customer content, the package can indicate this via the `vendor` and `partOfProducts` assignments.\nIn any case, the Package `ordID` namespace MUST reflect the namespace of the providing application (which hosts the resource), not the resource definition owner, which could be a customer or partner.\n\nA package SHOULD contain at least one resource. Avoid empty packages.\n\nThe package assignment of a resource MAY change, so consumers MUST not rely on this to be stable.\n\nA package does not have a `visibility` property.\nWhether it is displayed is decided by the fact, whether it contains any visible resources according to the visibility role of the aggregator.\n\nTo learn more about the concept and further guidance, see [Package](../concepts/grouping-and-bundling#package).",
|
10
11
|
"properties": {
|
11
12
|
"ordId": {
|
12
13
|
"type": "string",
|
@@ -19,7 +20,7 @@
|
|
19
20
|
},
|
20
21
|
"localId": {
|
21
22
|
"type": "string",
|
22
|
-
"description": "
|
23
|
+
"description": "The locally unique ID under which this resource can be looked up / resolved in the described system itself.\nUnlike the ORD ID it's not globally unique, but it may be useful to document the original ID / technical name.\n\nIt MAY also be used as the `<resourceName>` fragment in the ORD ID, IF it can fulfill the charset and length limitations within the ORD ID.\nBut since this is not always possible, no assumptions MUST be made about the local ID being the same as the `<resourceName>` fragment in the ORD ID.",
|
23
24
|
"maxLength": 255,
|
24
25
|
"examples": [
|
25
26
|
"SuccessFactorsRecruiting",
|
@@ -64,7 +65,12 @@
|
|
64
65
|
"policyLevel": {
|
65
66
|
"type": "string",
|
66
67
|
"description": "The [policy level](../../spec-extensions/policy-levels/) (aka. compliance level) that the described resources need to be compliant with.\nDepending on the chosen policy level, additional expectations and validations rules will be applied.\n\nThe policy level can be defined on ORD Document level, but also be overwritten on an individual package or resource level.\n",
|
67
|
-
"
|
68
|
+
"anyOf": [
|
69
|
+
{
|
70
|
+
"type": "string",
|
71
|
+
"pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
|
72
|
+
"description": "Any valid [Specification ID](../index.md#specification-id)."
|
73
|
+
},
|
68
74
|
{
|
69
75
|
"const": "none",
|
70
76
|
"description": "No policy level chosen. Only the base rules on how to create correct ORD documents apply."
|
@@ -149,7 +155,7 @@
|
|
149
155
|
},
|
150
156
|
"partOfProducts": {
|
151
157
|
"type": "array",
|
152
|
-
"description": "List of products
|
158
|
+
"description": "List of products the resources of the package are a part of.\n\nMUST be a valid reference to a [Product](#product) ORD ID.\n\n`partOfProducts` that are assigned to a `Package` are inherited to all of the ORD resources it contains.",
|
153
159
|
"items": {
|
154
160
|
"type": "string",
|
155
161
|
"pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):(product):([a-zA-Z0-9._\\-]+):()$",
|
@@ -343,7 +349,7 @@
|
|
343
349
|
]
|
344
350
|
},
|
345
351
|
"runtimeRestriction": {
|
346
|
-
"description": "If provided, all resources that are part of this package can only run on the listed runtime.\n\nMUST be a valid [
|
352
|
+
"description": "If provided, all resources that are part of this package can only run on the listed runtime.\n\nMUST be a valid [system namespace](../index.md#system-namespace).",
|
347
353
|
"type": "string",
|
348
354
|
"pattern": "^[a-z0-9]+(?:[.][a-z0-9]+){1}$",
|
349
355
|
"examples": [
|
@@ -385,7 +391,7 @@
|
|
385
391
|
"ConsumptionBundle": {
|
386
392
|
"type": "object",
|
387
393
|
"title": "Consumption Bundle",
|
388
|
-
"description": "A [**Consumption Bundle**](
|
394
|
+
"description": "A [**Consumption Bundle**](../concepts/grouping-and-bundling#consumption-bundle) groups APIs and Events together that can be consumed with the credentials and auth mechanism.\nIdeally it also includes instructions and details how to request access and credentials for resources.\n\nFor more documentation and guidance how to correctly this correctly, see [Consumption Bundle details](../concepts/grouping-and-bundling#consumption-bundle).\n\nA consumption bundle SHOULD have at least one association with a resource (0..n). Avoid empty consumption bundles.\nA consumption bundle MUST NOT contain APIs and Events that are NOT defined in the ORD document(s) returned\nby the system instance that defines the consumption bundle.\n\nPlease note that some ORD consumer use cases MAY depend on consumption bundle assignments to work with the resources.\n\nTo learn more about the concept, see [Consumption Bundle](../concepts/grouping-and-bundling#consumption-bundle).",
|
389
395
|
"properties": {
|
390
396
|
"ordId": {
|
391
397
|
"type": "string",
|
@@ -398,7 +404,7 @@
|
|
398
404
|
},
|
399
405
|
"localId": {
|
400
406
|
"type": "string",
|
401
|
-
"description": "
|
407
|
+
"description": "The locally unique ID under which this resource can be looked up / resolved in the described system itself.\nUnlike the ORD ID it's not globally unique, but it may be useful to document the original ID / technical name.\n\nIt MAY also be used as the `<resourceName>` fragment in the ORD ID, IF it can fulfill the charset and length limitations within the ORD ID.\nBut since this is not always possible, no assumptions MUST be made about the local ID being the same as the `<resourceName>` fragment in the ORD ID.",
|
402
408
|
"maxLength": 255,
|
403
409
|
"examples": [
|
404
410
|
"SuccessFactorsRecruiting",
|
@@ -563,7 +569,7 @@
|
|
563
569
|
},
|
564
570
|
"localId": {
|
565
571
|
"type": "string",
|
566
|
-
"description": "
|
572
|
+
"description": "The locally unique ID under which this resource can be looked up / resolved in the described system itself.\nUnlike the ORD ID it's not globally unique, but it may be useful to document the original ID / technical name.\n\nIt MAY also be used as the `<resourceName>` fragment in the ORD ID, IF it can fulfill the charset and length limitations within the ORD ID.\nBut since this is not always possible, no assumptions MUST be made about the local ID being the same as the `<resourceName>` fragment in the ORD ID.",
|
567
573
|
"maxLength": 255,
|
568
574
|
"examples": [
|
569
575
|
"API_BILL_OF_MATERIAL_SRV"
|
@@ -651,7 +657,7 @@
|
|
651
657
|
},
|
652
658
|
"partOfProducts": {
|
653
659
|
"type": "array",
|
654
|
-
"description": "List of products
|
660
|
+
"description": "List of products the resources of the package are a part of.\n\nMUST be a valid reference to a [Product](#product) ORD ID.\n\n`partOfProducts` that are assigned to a `Package` are inherited to all of the ORD resources it contains.",
|
655
661
|
"items": {
|
656
662
|
"type": "string",
|
657
663
|
"pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):(product):([a-zA-Z0-9._\\-]+):()$",
|
@@ -802,7 +808,12 @@
|
|
802
808
|
"apiProtocol": {
|
803
809
|
"type": "string",
|
804
810
|
"description": "API Protocol including the protocol version if applicable",
|
805
|
-
"
|
811
|
+
"anyOf": [
|
812
|
+
{
|
813
|
+
"type": "string",
|
814
|
+
"pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
|
815
|
+
"description": "Any valid [Specification ID](../index.md#specification-id)."
|
816
|
+
},
|
806
817
|
{
|
807
818
|
"const": "odata-v2",
|
808
819
|
"description": "[OData Version 2.0](https://www.odata.org/documentation/odata-version-2-0/) API.\nAn API Resource definition of type `edmx` MUST be provided.\nFor each API Resource definition: `type` MUST ONLY be set to `edmx`, `csdl-json`, `openapi-v2`, `openapi-v3`, `sap-csn-interop-effective-v1` or `custom`."
|
@@ -862,10 +873,15 @@
|
|
862
873
|
"implementationStandard": {
|
863
874
|
"type": "string",
|
864
875
|
"description": "Declares this API to be a valid implementation of an externally standardized API contract, sub-protocol or protocol variant.\n\nAll APIs that share the same implementation standard MAY be treated the same or similar by a consumer client.",
|
865
|
-
"
|
876
|
+
"anyOf": [
|
877
|
+
{
|
878
|
+
"type": "string",
|
879
|
+
"pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
|
880
|
+
"description": "Any valid [Specification ID](../index.md#specification-id).\nIf chosen, `customImplementationStandardDescription` SHOULD be provided."
|
881
|
+
},
|
866
882
|
{
|
867
883
|
"const": "sap:ord-document-api:v1",
|
868
|
-
"description": "API follows the Open Resource Discovery v1 [Document API](../index.md#ord-
|
884
|
+
"description": "API follows the Open Resource Discovery v1 [Document API](../index.md#ord-provider-api) contract."
|
869
885
|
},
|
870
886
|
{
|
871
887
|
"const": "cff:open-service-broker:v2",
|
@@ -947,7 +963,12 @@
|
|
947
963
|
"description": "List of use cases (types) how the resource is meant to be used for.\n\nThis helps consumers better to understand which use cases had been in mind by the provider\nand are therefore explicitly supported.\nThis is obviously described from a provider perspective, but stating what consumer use cases it potentially supports.\nAs it's not possible to create a list of options that are mutually exclusive, all options that apply should be provided.\n\nIf no array is defined, it is assumed that this information is not provided.",
|
948
964
|
"items": {
|
949
965
|
"type": "string",
|
950
|
-
"
|
966
|
+
"anyOf": [
|
967
|
+
{
|
968
|
+
"type": "string",
|
969
|
+
"pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
|
970
|
+
"description": "Any valid [Specification ID](../index.md#specification-id)."
|
971
|
+
},
|
951
972
|
{
|
952
973
|
"const": "data-federation",
|
953
974
|
"description": "Resources are designed to support [data federation](https://en.wikipedia.org/wiki/Federated_database_system). This goes beyond plain queries, but typically allowing connections on the data base level, in the context of a business user.\nAs consumers will directly access data, performance of the system must support these use cases."
|
@@ -995,6 +1016,28 @@
|
|
995
1016
|
"$ref": "#/definitions/EntityTypeMapping"
|
996
1017
|
}
|
997
1018
|
},
|
1019
|
+
"exposedEntityTypes": {
|
1020
|
+
"type": "array",
|
1021
|
+
"description": "Optional list of [entity types](#entity-type) that are exposed by the resource.\n\nThis replaces `entityTypeMappings`. If both is given, the `exposedEntityTypes` wins.\n\nMUST be a valid reference to an [EntityType](#entity-type) ORD ID.",
|
1022
|
+
"items": {
|
1023
|
+
"$ref": "#/definitions/ExposedEntityType"
|
1024
|
+
},
|
1025
|
+
"examples": [
|
1026
|
+
[
|
1027
|
+
{
|
1028
|
+
"ordId": "sap.odm:entityType:WorkforcePerson:v1"
|
1029
|
+
}
|
1030
|
+
],
|
1031
|
+
[
|
1032
|
+
{
|
1033
|
+
"ordId": "sap.sm:entityType:PurchaseOrderItem:v1"
|
1034
|
+
},
|
1035
|
+
{
|
1036
|
+
"ordId": "sap.sm:entityType:BusinessPartner:v1"
|
1037
|
+
}
|
1038
|
+
]
|
1039
|
+
]
|
1040
|
+
},
|
998
1041
|
"apiResourceLinks": {
|
999
1042
|
"type": "array",
|
1000
1043
|
"description": "Links with semantic meaning that are specific to API Resources.",
|
@@ -1216,7 +1259,12 @@
|
|
1216
1259
|
"policyLevel": {
|
1217
1260
|
"type": "string",
|
1218
1261
|
"description": "The [policy level](../../spec-extensions/policy-levels/) (aka. compliance level) that the described resources need to be compliant with.\nDepending on the chosen policy level, additional expectations and validations rules will be applied.\n\nThe policy level can be defined on ORD Document level, but also be overwritten on an individual package or resource level.\n",
|
1219
|
-
"
|
1262
|
+
"anyOf": [
|
1263
|
+
{
|
1264
|
+
"type": "string",
|
1265
|
+
"pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
|
1266
|
+
"description": "Any valid [Specification ID](../index.md#specification-id)."
|
1267
|
+
},
|
1220
1268
|
{
|
1221
1269
|
"const": "none",
|
1222
1270
|
"description": "No policy level chosen. Only the base rules on how to create correct ORD documents apply."
|
@@ -1303,7 +1351,7 @@
|
|
1303
1351
|
},
|
1304
1352
|
"localId": {
|
1305
1353
|
"type": "string",
|
1306
|
-
"description": "
|
1354
|
+
"description": "The locally unique ID under which this resource can be looked up / resolved in the described system itself.\nUnlike the ORD ID it's not globally unique, but it may be useful to document the original ID / technical name.\n\nIt MAY also be used as the `<resourceName>` fragment in the ORD ID, IF it can fulfill the charset and length limitations within the ORD ID.\nBut since this is not always possible, no assumptions MUST be made about the local ID being the same as the `<resourceName>` fragment in the ORD ID.",
|
1307
1355
|
"maxLength": 255,
|
1308
1356
|
"examples": [
|
1309
1357
|
"BusinessEvents_SubscriptionEvents"
|
@@ -1392,7 +1440,7 @@
|
|
1392
1440
|
},
|
1393
1441
|
"partOfProducts": {
|
1394
1442
|
"type": "array",
|
1395
|
-
"description": "List of products
|
1443
|
+
"description": "List of products the resources of the package are a part of.\n\nMUST be a valid reference to a [Product](#product) ORD ID.\n\n`partOfProducts` that are assigned to a `Package` are inherited to all of the ORD resources it contains.",
|
1396
1444
|
"items": {
|
1397
1445
|
"type": "string",
|
1398
1446
|
"pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):(product):([a-zA-Z0-9._\\-]+):()$",
|
@@ -1517,7 +1565,17 @@
|
|
1517
1565
|
"implementationStandard": {
|
1518
1566
|
"type": "string",
|
1519
1567
|
"description": "Declares this EventResource to be a valid implementation of a standardized or shared contract.\n\nAll implementations of the same implementation standard MAY be treated the same by a consumer.\nHowever, there MAY be differences in the access strategy, and compatible customizations by the implementer.\nThe implementation standard MAY define the role of the implementor (producer, consumer, both) and how it is determined.\n\nAs of now, only custom implementation standards are supported.",
|
1520
|
-
"
|
1568
|
+
"anyOf": [
|
1569
|
+
{
|
1570
|
+
"type": "string",
|
1571
|
+
"pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):(apiResource):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
|
1572
|
+
"description": "Any valid [API Resource ORD ID](../index.md#api-resource_ordid).\n\nRECOMMENDED to use if the contract is published via ORD and has an ORD ID."
|
1573
|
+
},
|
1574
|
+
{
|
1575
|
+
"type": "string",
|
1576
|
+
"pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
|
1577
|
+
"description": "Any valid [Specification ID](../index.md#specification-id).\nIf chosen, `customImplementationStandardDescription` SHOULD be provided."
|
1578
|
+
},
|
1521
1579
|
{
|
1522
1580
|
"const": "custom",
|
1523
1581
|
"description": "If chosen, a custom implementation standard MUST be provided via `customImplementationStandard` and SHOULD be described via `customImplementationStandardDescription`"
|
@@ -1572,6 +1630,28 @@
|
|
1572
1630
|
"$ref": "#/definitions/EntityTypeMapping"
|
1573
1631
|
}
|
1574
1632
|
},
|
1633
|
+
"exposedEntityTypes": {
|
1634
|
+
"type": "array",
|
1635
|
+
"description": "Optional list of [entity types](#entity-type) that are exposed by the resource.\n\nThis replaces `entityTypeMappings`. If both is given, the `exposedEntityTypes` wins.\n\nMUST be a valid reference to an [EntityType](#entity-type) ORD ID.",
|
1636
|
+
"items": {
|
1637
|
+
"$ref": "#/definitions/ExposedEntityType"
|
1638
|
+
},
|
1639
|
+
"examples": [
|
1640
|
+
[
|
1641
|
+
{
|
1642
|
+
"ordId": "sap.odm:entityType:WorkforcePerson:v1"
|
1643
|
+
}
|
1644
|
+
],
|
1645
|
+
[
|
1646
|
+
{
|
1647
|
+
"ordId": "sap.sm:entityType:PurchaseOrderItem:v1"
|
1648
|
+
},
|
1649
|
+
{
|
1650
|
+
"ordId": "sap.sm:entityType:BusinessPartner:v1"
|
1651
|
+
}
|
1652
|
+
]
|
1653
|
+
]
|
1654
|
+
},
|
1575
1655
|
"eventResourceLinks": {
|
1576
1656
|
"type": "array",
|
1577
1657
|
"description": "Links with semantic meaning that are specific to event resources.\n\nIf applicable, `eventResourceLinks` MUST be used instead of generic `links`.",
|
@@ -1793,7 +1873,12 @@
|
|
1793
1873
|
"policyLevel": {
|
1794
1874
|
"type": "string",
|
1795
1875
|
"description": "The [policy level](../../spec-extensions/policy-levels/) (aka. compliance level) that the described resources need to be compliant with.\nDepending on the chosen policy level, additional expectations and validations rules will be applied.\n\nThe policy level can be defined on ORD Document level, but also be overwritten on an individual package or resource level.\n",
|
1796
|
-
"
|
1876
|
+
"anyOf": [
|
1877
|
+
{
|
1878
|
+
"type": "string",
|
1879
|
+
"pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
|
1880
|
+
"description": "Any valid [Specification ID](../index.md#specification-id)."
|
1881
|
+
},
|
1797
1882
|
{
|
1798
1883
|
"const": "none",
|
1799
1884
|
"description": "No policy level chosen. Only the base rules on how to create correct ORD documents apply."
|
@@ -1865,7 +1950,7 @@
|
|
1865
1950
|
"EntityType": {
|
1866
1951
|
"type": "object",
|
1867
1952
|
"title": "Entity Type",
|
1868
|
-
"description": "An [**Entity Type**](
|
1953
|
+
"description": "An [**Entity Type**](../concepts/grouping-and-bundling#entity-type) describes either a business concept / term or an underlying conceptual model.\nThe same entity type can be exposed through one or multiple API and events resources.\n\nTo learn more about the concept, see [Entity Type](../concepts/grouping-and-bundling#entity-type).",
|
1869
1954
|
"properties": {
|
1870
1955
|
"ordId": {
|
1871
1956
|
"type": "string",
|
@@ -1880,7 +1965,7 @@
|
|
1880
1965
|
},
|
1881
1966
|
"localId": {
|
1882
1967
|
"type": "string",
|
1883
|
-
"description": "
|
1968
|
+
"description": "The locally unique ID under which this resource can be looked up / resolved in the described system itself.\nUnlike the ORD ID it's not globally unique, but it may be useful to document the original ID / technical name.\n\nIt MAY also be used as the `<resourceName>` fragment in the ORD ID, IF it can fulfill the charset and length limitations within the ORD ID.\nBut since this is not always possible, no assumptions MUST be made about the local ID being the same as the `<resourceName>` fragment in the ORD ID.",
|
1884
1969
|
"maxLength": 255,
|
1885
1970
|
"examples": [
|
1886
1971
|
"BusinessPartner",
|
@@ -1959,7 +2044,7 @@
|
|
1959
2044
|
},
|
1960
2045
|
"partOfProducts": {
|
1961
2046
|
"type": "array",
|
1962
|
-
"description": "List of products
|
2047
|
+
"description": "List of products the resources of the package are a part of.\n\nMUST be a valid reference to a [Product](#product) ORD ID.\n\n`partOfProducts` that are assigned to a `Package` are inherited to all of the ORD resources it contains.",
|
1963
2048
|
"items": {
|
1964
2049
|
"type": "string",
|
1965
2050
|
"pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):(product):([a-zA-Z0-9._\\-]+):()$",
|
@@ -2073,7 +2158,7 @@
|
|
2073
2158
|
},
|
2074
2159
|
"level": {
|
2075
2160
|
"type": "string",
|
2076
|
-
"description": "Defining the abstraction level of the entity type using the DDD terminology.\n\nIn Domain-Driven Design, there is a concept of entities and aggregates.\nThere are root entities which may contain further sub entities by composition.\nThe complete
|
2161
|
+
"description": "Defining the abstraction level of the entity type using the DDD terminology.\n\nIn Domain-Driven Design, there is a concept of entities and aggregates.\nThere are root entities which may contain further sub entities by composition.\nThe complete \"package\" is then called an aggregate, which gets its name and identity from the root entity.\nAn aggregate is a cluster of domain objects that can be treated as a single unit.\nThe root is the entity that is referenced from outside the aggregate. There must be only one root per aggregate.\nThe root ensures the integrity of the aggregate. A sub entity is any other non-root entity in the aggregate.\n\nSource, see [Martin Fowler on DDD Aggregate](https://martinfowler.com/bliki/DDD_Aggregate.html)",
|
2077
2162
|
"oneOf": [
|
2078
2163
|
{
|
2079
2164
|
"const": "aggregate",
|
@@ -2097,7 +2182,14 @@
|
|
2097
2182
|
"description": "States that this Entity Type is related to another Entity Type.\n\nUsually this happens if there are similar conceptual entity types across different namespaces.",
|
2098
2183
|
"items": {
|
2099
2184
|
"$ref": "#/definitions/RelatedEntityType"
|
2100
|
-
}
|
2185
|
+
},
|
2186
|
+
"examples": [
|
2187
|
+
[
|
2188
|
+
{
|
2189
|
+
"ordId": "sap.odm:entityType:WorkforcePerson:v1"
|
2190
|
+
}
|
2191
|
+
]
|
2192
|
+
]
|
2101
2193
|
},
|
2102
2194
|
"links": {
|
2103
2195
|
"type": "array",
|
@@ -2133,7 +2225,12 @@
|
|
2133
2225
|
"policyLevel": {
|
2134
2226
|
"type": "string",
|
2135
2227
|
"description": "The [policy level](../../spec-extensions/policy-levels/) (aka. compliance level) that the described resources need to be compliant with.\nDepending on the chosen policy level, additional expectations and validations rules will be applied.\n\nThe policy level can be defined on ORD Document level, but also be overwritten on an individual package or resource level.\n",
|
2136
|
-
"
|
2228
|
+
"anyOf": [
|
2229
|
+
{
|
2230
|
+
"type": "string",
|
2231
|
+
"pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
|
2232
|
+
"description": "Any valid [Specification ID](../index.md#specification-id)."
|
2233
|
+
},
|
2137
2234
|
{
|
2138
2235
|
"const": "none",
|
2139
2236
|
"description": "No policy level chosen. Only the base rules on how to create correct ORD documents apply."
|
@@ -2205,7 +2302,7 @@
|
|
2205
2302
|
"DataProduct": {
|
2206
2303
|
"type": "object",
|
2207
2304
|
"title": "Data Product",
|
2208
|
-
"description": "A [Data Product](
|
2305
|
+
"description": "A [Data Product](../concepts/data-product) is a data set exposed for consumption outside the boundaries of the producing application via APIs and described by high quality metadata that can be accessed through the [ORD Aggregator](../../spec-v1/#ord-aggregator).\n\nPlease note that this concept is in beta, see [Data Product - Beta Status](../concepts/data-product#beta-status).",
|
2209
2306
|
"properties": {
|
2210
2307
|
"ordId": {
|
2211
2308
|
"type": "string",
|
@@ -2218,7 +2315,7 @@
|
|
2218
2315
|
},
|
2219
2316
|
"localId": {
|
2220
2317
|
"type": "string",
|
2221
|
-
"description": "
|
2318
|
+
"description": "The locally unique ID under which this resource can be looked up / resolved in the described system itself.\nUnlike the ORD ID it's not globally unique, but it may be useful to document the original ID / technical name.\n\nIt MAY also be used as the `<resourceName>` fragment in the ORD ID, IF it can fulfill the charset and length limitations within the ORD ID.\nBut since this is not always possible, no assumptions MUST be made about the local ID being the same as the `<resourceName>` fragment in the ORD ID.",
|
2222
2319
|
"maxLength": 255,
|
2223
2320
|
"examples": [
|
2224
2321
|
"CustomerOrder"
|
@@ -2281,6 +2378,21 @@
|
|
2281
2378
|
},
|
2282
2379
|
"description": "Defines which groups the resource is assigned to.\n\nThe property is optional, but if given the value MUST be an array of valid Group IDs.\n\nGroups are a lightweight custom taxonomy concept.\nThey express a \"part of\" relationship to the chosen group concept.\nIf an \"identity / equals\" relationship needs to be expressed, use the `correlationIds` instead.\n\nAll resources that share the same group ID assignment are effectively grouped together."
|
2283
2380
|
},
|
2381
|
+
"partOfProducts": {
|
2382
|
+
"type": "array",
|
2383
|
+
"description": "List of products this Data Product is a part of or is related to, its e.g. data source systems.\n\nMUST be a valid reference to a [Product](#product) ORD ID.\n\n`partOfProducts` that are assigned to a `Package` are inherited to all of the ORD resources it contains.",
|
2384
|
+
"items": {
|
2385
|
+
"type": "string",
|
2386
|
+
"pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):(product):([a-zA-Z0-9._\\-]+):()$",
|
2387
|
+
"maxLength": 255
|
2388
|
+
},
|
2389
|
+
"minItems": 0,
|
2390
|
+
"examples": [
|
2391
|
+
[
|
2392
|
+
"sap:product:S4HANA_OD:"
|
2393
|
+
]
|
2394
|
+
]
|
2395
|
+
},
|
2284
2396
|
"version": {
|
2285
2397
|
"type": "string",
|
2286
2398
|
"description": "The complete [SemVer](https://semver.org/) version string.\n\nIt MUST follow the [Semantic Versioning 2.0.0](https://semver.org/) standard.\nIt SHOULD be changed if the ORD information or referenced resource definitions changed.\nIt SHOULD express minor and patch changes that don't lead to incompatible changes.\n\nWhen the `version` major version changes, the [ORD ID](../index.md#ord-id) `<majorVersion>` fragment MUST be updated to be identical.\nIn case that a resource definition file also contains a version number (e.g. [OpenAPI `info`.`version`](https://swagger.io/specification/#info-object)), it MUST be equal with the resource `version` to avoid inconsistencies.\n\nIf the resource has been extended by the user, the change MUST be indicated via `lastUpdate`.\nThe `version` MUST not be bumped for changes in extensions.\n\nThe general [Version and Lifecycle](../index.md#version-and-lifecycle) flow MUST be followed.\n\nNote: A change is only relevant for a version increment, if it affects the ORD resource or ORD taxonomy directly.\nFor example: If a resource within a `Package` changes, but the package itself did not, the package version does not need to be incremented.",
|
@@ -2438,9 +2550,14 @@
|
|
2438
2550
|
]
|
2439
2551
|
},
|
2440
2552
|
"category": {
|
2441
|
-
"description": "Category of the data-set within data product. Based on its definition, a data product is a
|
2553
|
+
"description": "Category of the data-set within data product. Based on its definition, a data product is a \"data set\" - which can include on the values below.\nBased on the type some properties of a data product may become optional/mandatory.\nConsumers might still do analytics on business object like data products.",
|
2442
2554
|
"type": "string",
|
2443
|
-
"
|
2555
|
+
"anyOf": [
|
2556
|
+
{
|
2557
|
+
"type": "string",
|
2558
|
+
"pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
|
2559
|
+
"description": "Any valid [Specification ID](../index.md#specification-id)."
|
2560
|
+
},
|
2444
2561
|
{
|
2445
2562
|
"const": "business-object",
|
2446
2563
|
"description": "Business Objects: master data, transaction data"
|
@@ -2733,7 +2850,12 @@
|
|
2733
2850
|
"policyLevel": {
|
2734
2851
|
"type": "string",
|
2735
2852
|
"description": "The [policy level](../../spec-extensions/policy-levels/) (aka. compliance level) that the described resources need to be compliant with.\nDepending on the chosen policy level, additional expectations and validations rules will be applied.\n\nThe policy level can be defined on ORD Document level, but also be overwritten on an individual package or resource level.\n",
|
2736
|
-
"
|
2853
|
+
"anyOf": [
|
2854
|
+
{
|
2855
|
+
"type": "string",
|
2856
|
+
"pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
|
2857
|
+
"description": "Any valid [Specification ID](../index.md#specification-id)."
|
2858
|
+
},
|
2737
2859
|
{
|
2738
2860
|
"const": "none",
|
2739
2861
|
"description": "No policy level chosen. Only the base rules on how to create correct ORD documents apply."
|
@@ -2855,7 +2977,12 @@
|
|
2855
2977
|
"type": {
|
2856
2978
|
"description": "Type of the API Resource Definition\nIf \"custom\" is chosen, a customType MUST be provided",
|
2857
2979
|
"type": "string",
|
2858
|
-
"
|
2980
|
+
"anyOf": [
|
2981
|
+
{
|
2982
|
+
"type": "string",
|
2983
|
+
"pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
|
2984
|
+
"description": "Any valid [Specification ID](../index.md#specification-id)."
|
2985
|
+
},
|
2859
2986
|
{
|
2860
2987
|
"const": "openapi-v2",
|
2861
2988
|
"description": "[OpenAPI 2 / Swagger 2](https://swagger.io/specification/v2/) API Definition for [REST](https://en.wikipedia.org/wiki/Representational_state_transfer) APIs.\nThe `mediaType` MUST be be set to either `application/json` or `text/yaml`."
|
@@ -2984,7 +3111,12 @@
|
|
2984
3111
|
"type": {
|
2985
3112
|
"description": "Type of the event resource definition",
|
2986
3113
|
"type": "string",
|
2987
|
-
"
|
3114
|
+
"anyOf": [
|
3115
|
+
{
|
3116
|
+
"type": "string",
|
3117
|
+
"pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
|
3118
|
+
"description": "Any valid [Specification ID](../index.md#specification-id)."
|
3119
|
+
},
|
2988
3120
|
{
|
2989
3121
|
"const": "asyncapi-v2",
|
2990
3122
|
"description": "[AsyncAPI 2](https://www.asyncapi.com/docs/specifications/2.0.0) API definition for events.\nThe SAP Event Catalog Specification also falls under this category, as it is a valid AsyncAPI definition."
|
@@ -3185,7 +3317,7 @@
|
|
3185
3317
|
},
|
3186
3318
|
"localId": {
|
3187
3319
|
"type": "string",
|
3188
|
-
"description": "
|
3320
|
+
"description": "The locally unique ID under which this resource can be looked up / resolved in the described system itself.\nUnlike the ORD ID it's not globally unique, but it may be useful to document the original ID / technical name.\n\nIt MAY also be used as the `<resourceName>` fragment in the ORD ID, IF it can fulfill the charset and length limitations within the ORD ID.\nBut since this is not always possible, no assumptions MUST be made about the local ID being the same as the `<resourceName>` fragment in the ORD ID.",
|
3189
3321
|
"maxLength": 255,
|
3190
3322
|
"examples": [
|
3191
3323
|
"SuccessFactorsRecruiting",
|
@@ -3209,14 +3341,19 @@
|
|
3209
3341
|
"type": {
|
3210
3342
|
"description": "Type of the Capability",
|
3211
3343
|
"type": "string",
|
3212
|
-
"
|
3344
|
+
"anyOf": [
|
3213
3345
|
{
|
3214
|
-
"
|
3215
|
-
"
|
3346
|
+
"type": "string",
|
3347
|
+
"pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
|
3348
|
+
"description": "Any valid [Specification ID](../index.md#specification-id)."
|
3216
3349
|
},
|
3217
3350
|
{
|
3218
3351
|
"const": "sap.mdo:mdi-capability:v1",
|
3219
3352
|
"description": "Capability for SAP Master Data Integration (MDI).\n\nFor the capability definitions: `type` MUST ONLY be set to `sap.mdo:mdi-capability-definition:v1`."
|
3353
|
+
},
|
3354
|
+
{
|
3355
|
+
"const": "custom",
|
3356
|
+
"description": "If chosen, `customType` MUST be provided."
|
3220
3357
|
}
|
3221
3358
|
],
|
3222
3359
|
"examples": [
|
@@ -3342,7 +3479,7 @@
|
|
3342
3479
|
},
|
3343
3480
|
"relatedEntityTypes": {
|
3344
3481
|
"type": "array",
|
3345
|
-
"description": "Optional list of related EntityType Resources.\
|
3482
|
+
"description": "Optional list of related EntityType Resources.\nMUST be a valid reference to an [EntityType Resource](#entity-type) ORD ID.",
|
3346
3483
|
"items": {
|
3347
3484
|
"type": "string",
|
3348
3485
|
"pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):(entityType):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$"
|
@@ -3416,14 +3553,19 @@
|
|
3416
3553
|
"type": {
|
3417
3554
|
"description": "Type of the capability resource definition",
|
3418
3555
|
"type": "string",
|
3419
|
-
"
|
3556
|
+
"anyOf": [
|
3420
3557
|
{
|
3421
|
-
"
|
3422
|
-
"
|
3558
|
+
"type": "string",
|
3559
|
+
"pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
|
3560
|
+
"description": "Any valid [Specification ID](../index.md#specification-id)."
|
3423
3561
|
},
|
3424
3562
|
{
|
3425
3563
|
"const": "sap.mdo:mdi-capability-definition:v1",
|
3426
3564
|
"description": "Specification for describing master data integration capabilities for Master Data Orchestration (MDO).\n\nThe `mediaType` MUST be set to `application/json`.\nThe capability `type` MUST be set to `sap.mdo:mdi-capability:v1`."
|
3565
|
+
},
|
3566
|
+
{
|
3567
|
+
"const": "custom",
|
3568
|
+
"description": "If chosen, a custom type MUST be provided via `customType`"
|
3427
3569
|
}
|
3428
3570
|
],
|
3429
3571
|
"examples": [
|
@@ -3499,7 +3641,7 @@
|
|
3499
3641
|
"IntegrationDependency": {
|
3500
3642
|
"type": "object",
|
3501
3643
|
"title": "Integration Dependency",
|
3502
|
-
"description": "An [Integration Dependency](
|
3644
|
+
"description": "An [Integration Dependency](../concepts/integration-dependency) states that the described system (self) can integrate with external systems (integration target) to achieve an integration purpose.\nThe purpose could be to enable a certain feature or integration scenario, but it could also be a mandatory prerequisite for the described system to work.\n\nThe integration dependency includes a list of individual **aspects** that the integration consists of.\nAspects are an \"ingredient\" for the integration scenario (and are logically combined with AND condition).\nEach aspect can express alternatives (OR condition) on what API and event resources can be used to achieve the same outcome.\n\nThe direction of connection establishment, data flow is not directly implied and needs to be inferred from the referenced resources.\n\nIt is not in scope for the Integration Dependency to describe scenarios that external consumers have with the own exposed resources.\nThis would overstep the boundary of self-description.\n\nIf an integration scenario consists of two sides integration with each other, each need to describe its own part in it as an Integration Dependency.\nTherefore, if an integration with multiple types of systems need to be setup, this SHOULD be separated into distinct Integration Dependencies.\n\nAn integration dependency is also not meant to describe a bigger process.\nInstead it focuses on the technical necessaries to create an integration for one particular purpose.\n\nTo learn more about the concept, see [Integration Dependency](../concepts/integration-dependency).",
|
3503
3645
|
"properties": {
|
3504
3646
|
"ordId": {
|
3505
3647
|
"type": "string",
|
@@ -3512,7 +3654,7 @@
|
|
3512
3654
|
},
|
3513
3655
|
"localId": {
|
3514
3656
|
"type": "string",
|
3515
|
-
"description": "
|
3657
|
+
"description": "The locally unique ID under which this resource can be looked up / resolved in the described system itself.\nUnlike the ORD ID it's not globally unique, but it may be useful to document the original ID / technical name.\n\nIt MAY also be used as the `<resourceName>` fragment in the ORD ID, IF it can fulfill the charset and length limitations within the ORD ID.\nBut since this is not always possible, no assumptions MUST be made about the local ID being the same as the `<resourceName>` fragment in the ORD ID.",
|
3516
3658
|
"maxLength": 255,
|
3517
3659
|
"examples": [
|
3518
3660
|
"SuccessFactorsRecruiting",
|
@@ -4045,7 +4187,12 @@
|
|
4045
4187
|
"properties": {
|
4046
4188
|
"type": {
|
4047
4189
|
"type": "string",
|
4048
|
-
"
|
4190
|
+
"anyOf": [
|
4191
|
+
{
|
4192
|
+
"type": "string",
|
4193
|
+
"pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
|
4194
|
+
"description": "Any valid [Specification ID](../index.md#specification-id)."
|
4195
|
+
},
|
4049
4196
|
{
|
4050
4197
|
"const": "terms-of-service",
|
4051
4198
|
"description": "Link to human-readable terms of service / use documentation."
|
@@ -4120,7 +4267,12 @@
|
|
4120
4267
|
"type": {
|
4121
4268
|
"type": "string",
|
4122
4269
|
"description": "See also: [WADG0001 WebAPI type extension](https://webapi-discovery.github.io/rfcs/rfc0001.html#webapiactions)",
|
4123
|
-
"
|
4270
|
+
"anyOf": [
|
4271
|
+
{
|
4272
|
+
"type": "string",
|
4273
|
+
"pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
|
4274
|
+
"description": "Any valid [Specification ID](../index.md#specification-id)."
|
4275
|
+
},
|
4124
4276
|
{
|
4125
4277
|
"const": "api-documentation",
|
4126
4278
|
"description": "Link to human-readable documentation describing the API or event resource in more detail."
|
@@ -4196,7 +4348,12 @@
|
|
4196
4348
|
"properties": {
|
4197
4349
|
"type": {
|
4198
4350
|
"type": "string",
|
4199
|
-
"
|
4351
|
+
"anyOf": [
|
4352
|
+
{
|
4353
|
+
"type": "string",
|
4354
|
+
"pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
|
4355
|
+
"description": "Any valid [Specification ID](../index.md#specification-id)."
|
4356
|
+
},
|
4200
4357
|
{
|
4201
4358
|
"const": "payment",
|
4202
4359
|
"description": "Links to a resource detailing pricing details of the data product."
|
@@ -4432,7 +4589,12 @@
|
|
4432
4589
|
"type": {
|
4433
4590
|
"type": "string",
|
4434
4591
|
"description": "Defines the authentication/authorization strategy through which the referenced `resourceDefinitions` are accessible.",
|
4435
|
-
"
|
4592
|
+
"anyOf": [
|
4593
|
+
{
|
4594
|
+
"type": "string",
|
4595
|
+
"pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
|
4596
|
+
"description": "Any valid [Specification ID](../index.md#specification-id).\nIf chosen, `customDescription` SHOULD be provided."
|
4597
|
+
},
|
4436
4598
|
{
|
4437
4599
|
"const": "open",
|
4438
4600
|
"description": "The resource definitions are openly accessible and not protected via authentication or authorization.\nPlease find a more detailed documentation [here](../../spec-extensions/access-strategies/open)."
|
@@ -4499,7 +4661,12 @@
|
|
4499
4661
|
"type": {
|
4500
4662
|
"type": "string",
|
4501
4663
|
"description": "The type of credential exchange strategy.",
|
4502
|
-
"
|
4664
|
+
"anyOf": [
|
4665
|
+
{
|
4666
|
+
"type": "string",
|
4667
|
+
"pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
|
4668
|
+
"description": "Any valid [Specification ID](../index.md#specification-id).\nIf chosen, `customDescription` SHOULD be provided."
|
4669
|
+
},
|
4503
4670
|
{
|
4504
4671
|
"const": "custom",
|
4505
4672
|
"description": "If chosen, `customType` MUST be provided.\nIf chosen, `customDescription` SHOULD be provided."
|
@@ -4560,7 +4727,7 @@
|
|
4560
4727
|
"GroupType": {
|
4561
4728
|
"title": "Group Type",
|
4562
4729
|
"type": "object",
|
4563
|
-
"description": "A Group Type defines the semantics of [group assignments](#group).\nWhat the Group Type means and how it is to be used correctly SHOULD be described in the `description` (which may include markdown links).\n\nGroup Types can be defined centrally (ownership by authority namespace) or decentrally (defined by application / service itself).\n\nTo learn more about the concept, see [Group Concept Documentation](
|
4730
|
+
"description": "A Group Type defines the semantics of [group assignments](#group).\nWhat the Group Type means and how it is to be used correctly SHOULD be described in the `description` (which may include markdown links).\n\nGroup Types can be defined centrally (ownership by authority namespace) or decentrally (defined by application / service itself).\n\nTo learn more about the concept, see [Group Concept Documentation](../concepts/grouping-and-bundling#Groups).",
|
4564
4731
|
"properties": {
|
4565
4732
|
"groupTypeId": {
|
4566
4733
|
"type": "string",
|
@@ -4604,7 +4771,7 @@
|
|
4604
4771
|
"Group": {
|
4605
4772
|
"title": "Group",
|
4606
4773
|
"type": "object",
|
4607
|
-
"description": "Group (instance) that resources can be assigned to.\n\nGroups are a lightweight custom taxonomy concept.\nThey express a \"part of\" relationship to the chosen group concept.\nIf an \"identity / equals\" relationship needs to be expressed, use the `correlationIds` instead.\n\nTo learn more about the concept, see [Group Concept Documentation](
|
4774
|
+
"description": "Group (instance) that resources can be assigned to.\n\nGroups are a lightweight custom taxonomy concept.\nThey express a \"part of\" relationship to the chosen group concept.\nIf an \"identity / equals\" relationship needs to be expressed, use the `correlationIds` instead.\n\nTo learn more about the concept, see [Group Concept Documentation](../concepts/grouping-and-bundling#Groups).",
|
4608
4775
|
"properties": {
|
4609
4776
|
"groupId": {
|
4610
4777
|
"type": "string",
|
@@ -4712,7 +4879,7 @@
|
|
4712
4879
|
"EntityTypeMapping": {
|
4713
4880
|
"title": "Entity Type Mapping",
|
4714
4881
|
"type": "object",
|
4715
|
-
"description": "An API or Event resource may optionally define its `entityTypeMappings`.\nThis is used to map and correlate the API models to the underlying, conceptual **entity types**.\n\nIf the mapping from API resource to entity types is not defined,\ncertain use-cases that rely on this explicit connection will not be possible.\n\nThis mapping is meant to be rather fine granular.\nTherefore, the mapping needs to be done on basis of one of the referenced resource definitions,\nas only there we know the details and the actual contents of the API Model of the API resource.\n\nFor the various resource definition formats the selection of API models may need to be expressed differently.\nAs a consequence, there are different types of selectors that are specialized toward certain resource definition formats.\n\nThe target of the mapping is a correlation to an entity type via a [Correlation ID](../../#/v1/README?id=correlation-id)\nor to an [ORD ID](../../spec-v1/#ord-id) of an entity type.\nIt is assumed that the entity types are described in more detail or on a different abstraction level via metadata.\nWhen the correlation ID is used, an ORD consumer may need to know how to access the entity type metadata through conventions.\nThis can be determined either by the namespace of the correlation ID,\nor through a defined and known `implementationStandard` that can resolve the `localId` fragment of the correlation ID .\n\nAt SAP, the metadata about entity types could be retrieved via the CSN_EXPOSURE service.\nTo indicate this, the service needs to be implemented and described in ORD with `implementationStandard` set to `sap:csn-exposure:v1`).\n\nODM 2.0 relies on the entity type mappings and uses the the mapping to express the relationship of an API to the\ncorresponding ODM entity. ORD consumers like SAP Business Accelerator Hub consume the mapping to make the relationships
|
4882
|
+
"description": "An API or Event resource may optionally define its `entityTypeMappings`.\nThis is used to map and correlate the API models to the underlying, conceptual **entity types**.\n\nIf the mapping from API resource to entity types is not defined,\ncertain use-cases that rely on this explicit connection will not be possible.\n\nThis mapping is meant to be rather fine granular.\nTherefore, the mapping needs to be done on basis of one of the referenced resource definitions,\nas only there we know the details and the actual contents of the API Model of the API resource.\n\nFor the various resource definition formats the selection of API models may need to be expressed differently.\nAs a consequence, there are different types of selectors that are specialized toward certain resource definition formats.\n\nThe target of the mapping is a correlation to an entity type via a [Correlation ID](../../#/v1/README?id=correlation-id)\nor to an [ORD ID](../../spec-v1/#ord-id) of an entity type.\nIt is assumed that the entity types are described in more detail or on a different abstraction level via metadata.\nWhen the correlation ID is used, an ORD consumer may need to know how to access the entity type metadata through conventions.\nThis can be determined either by the namespace of the correlation ID,\nor through a defined and known `implementationStandard` that can resolve the `localId` fragment of the correlation ID .\n\nAt SAP, the metadata about entity types could be retrieved via the CSN_EXPOSURE service.\nTo indicate this, the service needs to be implemented and described in ORD with `implementationStandard` set to `sap:csn-exposure:v1`).\n\nODM 2.0 relies on the entity type mappings and uses the the mapping to express the relationship of an API to the\ncorresponding ODM entity. ORD consumers like SAP Business Accelerator Hub consume the mapping to make the relationships navigate-able for customers.",
|
4716
4883
|
"properties": {
|
4717
4884
|
"apiModelSelectors": {
|
4718
4885
|
"type": "array",
|
@@ -4817,10 +4984,10 @@
|
|
4817
4984
|
}
|
4818
4985
|
]
|
4819
4986
|
},
|
4820
|
-
"
|
4821
|
-
"title": "
|
4987
|
+
"EntityTypeOrdIdTarget": {
|
4988
|
+
"title": "Entity Type Target (ORD ID)",
|
4822
4989
|
"type": "object",
|
4823
|
-
"description": "
|
4990
|
+
"description": "Define which entity type is the target of an entity type mapping\n\nEntity types can be referenced using a [ORD ID](../../spec-v1/#ord-id) of an entity type.",
|
4824
4991
|
"properties": {
|
4825
4992
|
"ordId": {
|
4826
4993
|
"type": "string",
|
@@ -4837,10 +5004,29 @@
|
|
4837
5004
|
],
|
4838
5005
|
"additionalProperties": false
|
4839
5006
|
},
|
4840
|
-
"
|
4841
|
-
"title": "Entity Type Target (
|
5007
|
+
"EntityTypeCorrelationIdTarget": {
|
5008
|
+
"title": "Entity Type Target (Correlation ID)",
|
4842
5009
|
"type": "object",
|
4843
|
-
"description": "Define which entity type is the target of an entity type mapping\n\nEntity types can be referenced using a [
|
5010
|
+
"description": "Define which entity type is the target of an entity type mapping\n\nEntity types can be referenced using a [Correlation ID](../../spec-v1/#correlation-id).",
|
5011
|
+
"properties": {
|
5012
|
+
"correlationId": {
|
5013
|
+
"type": "string",
|
5014
|
+
"pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):([a-zA-Z0-9._\\-\\/]+):([a-zA-Z0-9._\\-\\/]+)$",
|
5015
|
+
"maxLength": 255,
|
5016
|
+
"examples": [
|
5017
|
+
"sap.csnexposure:entity:Attachment"
|
5018
|
+
]
|
5019
|
+
}
|
5020
|
+
},
|
5021
|
+
"required": [
|
5022
|
+
"correlationId"
|
5023
|
+
],
|
5024
|
+
"additionalProperties": false
|
5025
|
+
},
|
5026
|
+
"RelatedEntityType": {
|
5027
|
+
"title": "Related Entity Type",
|
5028
|
+
"type": "object",
|
5029
|
+
"description": "Defines which Entity Type is related (via its ORD ID).\nIn the future, this could include stating the relationship type, too.",
|
4844
5030
|
"properties": {
|
4845
5031
|
"ordId": {
|
4846
5032
|
"type": "string",
|
@@ -4857,22 +5043,23 @@
|
|
4857
5043
|
],
|
4858
5044
|
"additionalProperties": false
|
4859
5045
|
},
|
4860
|
-
"
|
4861
|
-
"title": "Entity Type
|
5046
|
+
"ExposedEntityType": {
|
5047
|
+
"title": "Exposed Entity Type",
|
4862
5048
|
"type": "object",
|
4863
|
-
"description": "
|
5049
|
+
"description": "Defines which Entity Type is exposed through (via its ORD ID).",
|
4864
5050
|
"properties": {
|
4865
|
-
"
|
5051
|
+
"ordId": {
|
4866
5052
|
"type": "string",
|
4867
|
-
"
|
5053
|
+
"description": "The ORD ID is a stable, globally unique ID for ORD resources or taxonomy.\n\nIt MUST be a valid [ORD ID](../index.md#ord-id) of the appropriate ORD type.",
|
5054
|
+
"pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):(entityType):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
|
4868
5055
|
"maxLength": 255,
|
4869
5056
|
"examples": [
|
4870
|
-
"sap.
|
5057
|
+
"sap.s4.sot:entityType:BusinessPartner:v1"
|
4871
5058
|
]
|
4872
5059
|
}
|
4873
5060
|
},
|
4874
5061
|
"required": [
|
4875
|
-
"
|
5062
|
+
"ordId"
|
4876
5063
|
],
|
4877
5064
|
"additionalProperties": false
|
4878
5065
|
},
|
@@ -4937,9 +5124,168 @@
|
|
4937
5124
|
"removalDate": "2020-12-02T14:12:59Z"
|
4938
5125
|
}
|
4939
5126
|
]
|
5127
|
+
},
|
5128
|
+
"OrdResource": {
|
5129
|
+
"type": "object",
|
5130
|
+
"title": "ORD Resource (abstract)",
|
5131
|
+
"description": "Abstract definition of shared properties across ORD Resources.",
|
5132
|
+
"properties": {
|
5133
|
+
"ordId": {
|
5134
|
+
"type": "string",
|
5135
|
+
"description": "The ORD ID is a stable, globally unique ID for ORD resources or taxonomy.\n\nIt MUST be a valid [ORD ID](../index.md#ord-id) of the appropriate ORD type.",
|
5136
|
+
"pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):(apiResource|eventResource|capability|dataProduct):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*|)$",
|
5137
|
+
"maxLength": 255,
|
5138
|
+
"examples": []
|
5139
|
+
},
|
5140
|
+
"localId": {
|
5141
|
+
"type": "string",
|
5142
|
+
"description": "The locally unique ID under which this resource can be looked up / resolved in the described system itself.\nUnlike the ORD ID it's not globally unique, but it may be useful to document the original ID / technical name.\n\nIt MAY also be used as the `<resourceName>` fragment in the ORD ID, IF it can fulfill the charset and length limitations within the ORD ID.\nBut since this is not always possible, no assumptions MUST be made about the local ID being the same as the `<resourceName>` fragment in the ORD ID.",
|
5143
|
+
"maxLength": 255,
|
5144
|
+
"examples": []
|
5145
|
+
},
|
5146
|
+
"correlationIds": {
|
5147
|
+
"type": "array",
|
5148
|
+
"description": "Correlation IDs can be used to create a reference to related data in other repositories (especially to the system of record).\n\nThey express an \"identity\" / \"equals\" / \"mappable\" relationship to the target ID.\n\nIf a \"part of\" relationship needs to be expressed, use the `partOfGroups` assignment instead.\n\nMUST be a valid [Correlation ID](../index.md#correlation-id).",
|
5149
|
+
"items": {
|
5150
|
+
"type": "string",
|
5151
|
+
"pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):([a-zA-Z0-9._\\-\\/]+):([a-zA-Z0-9._\\-\\/]+)$",
|
5152
|
+
"maxLength": 255
|
5153
|
+
},
|
5154
|
+
"examples": []
|
5155
|
+
},
|
5156
|
+
"title": {
|
5157
|
+
"type": "string",
|
5158
|
+
"description": "Human-readable title.\n\nMUST NOT exceed 255 chars.\nMUST NOT contain line breaks.",
|
5159
|
+
"minLength": 1,
|
5160
|
+
"maxLength": 255,
|
5161
|
+
"examples": []
|
5162
|
+
},
|
5163
|
+
"shortDescription": {
|
5164
|
+
"type": "string",
|
5165
|
+
"description": "Plain text short description.\n\nMUST NOT exceed 255 chars.\nMUST NOT contain line breaks.",
|
5166
|
+
"minLength": 1,
|
5167
|
+
"maxLength": 255,
|
5168
|
+
"examples": []
|
5169
|
+
},
|
5170
|
+
"description": {
|
5171
|
+
"type": "string",
|
5172
|
+
"minLength": 1,
|
5173
|
+
"description": "Full description, notated in [CommonMark](https://spec.commonmark.org/) (Markdown).\n\nThe description SHOULD not be excessive in length and is not meant to provide full documentation.\nDetailed documentation SHOULD be attached as (typed) links.",
|
5174
|
+
"examples": []
|
5175
|
+
},
|
5176
|
+
"partOfPackage": {
|
5177
|
+
"type": "string",
|
5178
|
+
"pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):(package):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
|
5179
|
+
"maxLength": 255,
|
5180
|
+
"description": "Defines which Package the resource is part of.\n\nMUST be a valid reference to a [Package](#package) ORD ID.\n\nEvery resource MUST be part of one package.",
|
5181
|
+
"examples": []
|
5182
|
+
},
|
5183
|
+
"partOfGroups": {
|
5184
|
+
"type": "array",
|
5185
|
+
"items": {
|
5186
|
+
"type": "string",
|
5187
|
+
"pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-\\/]+):([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-\\/]+)$"
|
5188
|
+
},
|
5189
|
+
"description": "Defines which groups the resource is assigned to.\n\nThe property is optional, but if given the value MUST be an array of valid Group IDs.\n\nGroups are a lightweight custom taxonomy concept.\nThey express a \"part of\" relationship to the chosen group concept.\nIf an \"identity / equals\" relationship needs to be expressed, use the `correlationIds` instead.\n\nAll resources that share the same group ID assignment are effectively grouped together.",
|
5190
|
+
"examples": []
|
5191
|
+
},
|
5192
|
+
"version": {
|
5193
|
+
"type": "string",
|
5194
|
+
"description": "The complete [SemVer](https://semver.org/) version string.\n\nIt MUST follow the [Semantic Versioning 2.0.0](https://semver.org/) standard.\nIt SHOULD be changed if the ORD information or referenced resource definitions changed.\nIt SHOULD express minor and patch changes that don't lead to incompatible changes.\n\nWhen the `version` major version changes, the [ORD ID](../index.md#ord-id) `<majorVersion>` fragment MUST be updated to be identical.\nIn case that a resource definition file also contains a version number (e.g. [OpenAPI `info`.`version`](https://swagger.io/specification/#info-object)), it MUST be equal with the resource `version` to avoid inconsistencies.\n\nIf the resource has been extended by the user, the change MUST be indicated via `lastUpdate`.\nThe `version` MUST not be bumped for changes in extensions.\n\nThe general [Version and Lifecycle](../index.md#version-and-lifecycle) flow MUST be followed.\n\nNote: A change is only relevant for a version increment, if it affects the ORD resource or ORD taxonomy directly.\nFor example: If a resource within a `Package` changes, but the package itself did not, the package version does not need to be incremented.",
|
5195
|
+
"pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$",
|
5196
|
+
"examples": [
|
5197
|
+
"1.2.3",
|
5198
|
+
"1.0.0-alpha.1"
|
5199
|
+
]
|
5200
|
+
},
|
5201
|
+
"lastUpdate": {
|
5202
|
+
"type": "string",
|
5203
|
+
"format": "date-time",
|
5204
|
+
"description": "Optional, but RECOMMENDED indicator when (date-time) the last change to the resource (including its definitions) happened.\n\nThe date format MUST comply with [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339#section-5.6).\n\nWhen retrieved from an ORD aggregator, `lastUpdate` will be reliable there and reflect either the provider based update time or the aggregator processing time.\nTherefore consumers MAY rely on it to detect changes to the metadata and the attached resource definition files.\n\nIf the resource has attached definitions, either the `version` or `lastUpdate` property MUST be defined and updated to let the ORD aggregator know that they need to be fetched again.\n\nTogether with `systemInstanceAware`, this property SHOULD be used to optimize the metadata crawling process of the ORD aggregators.",
|
5205
|
+
"examples": [
|
5206
|
+
"2022-12-19T15:47:04+00:00"
|
5207
|
+
]
|
5208
|
+
},
|
5209
|
+
"visibility": {
|
5210
|
+
"type": "string",
|
5211
|
+
"description": "The visibility states who is allowed to \"see\" the described resource or capability.",
|
5212
|
+
"oneOf": [
|
5213
|
+
{
|
5214
|
+
"const": "public",
|
5215
|
+
"description": "Resources are publicly visible to customers and 3rd parties.\nUsually this includes an contract on the API stability, e.g. the [SAP API Deprecation Policy](https://help.sap.com/viewer/84b35b9c39b247e3ba2a31f02beee46d/Cloud/en-US/5cbfda5a9efe4e97a3e24ddaf7ec5c16.html)."
|
5216
|
+
},
|
5217
|
+
{
|
5218
|
+
"const": "internal",
|
5219
|
+
"description": "Resources are visible to other applications within the same [vendor](#vendor).\nHowever, they are not officially exposed and communicated to customers and 3rd parties.\nThey might not come with the same guarantees on API stability.\n\nInternal resources MUST NOT be made available to consumers without checking the necessary access permissions, e.g., a public API Catalog.\nInternal resources MAY be published through an internal API Catalog if the access permissions are ensured by it."
|
5220
|
+
},
|
5221
|
+
{
|
5222
|
+
"const": "private",
|
5223
|
+
"description": "Resources that are exclusive within an application or service.\nThis includes resources that may be called from outside but serve purely private purposes and are not supposed to be known by other outside parties.\nE.g., webhooks for provisioning callbacks or backing services.\n\nPrivate resources MUST NOT be made available to public consumers or consumers outside of the \"private\" scope or without the necessary access permissions."
|
5224
|
+
}
|
5225
|
+
]
|
5226
|
+
},
|
5227
|
+
"releaseStatus": {
|
5228
|
+
"type": "string",
|
5229
|
+
"description": "The `releaseStatus` specifies the stability of the resource and its external contract.",
|
5230
|
+
"oneOf": [
|
5231
|
+
{
|
5232
|
+
"const": "active",
|
5233
|
+
"description": "Resource is meant for productive use and provides a stable API contract."
|
5234
|
+
},
|
5235
|
+
{
|
5236
|
+
"const": "beta",
|
5237
|
+
"description": "The contract for the resource is beta and MAY not be meant for productive use.\nIn the SAP context, `beta` APIs may be changed or deleted at SAPs discretion."
|
5238
|
+
},
|
5239
|
+
{
|
5240
|
+
"const": "deprecated",
|
5241
|
+
"description": "Resource has been deprecated.\n\nIf successor resources exist, they MUST be referenced through `successors`.\nIf it is deprecated without defining its `successors`, a `sunsetDate` SHOULD be provided.\n\nA deprecated resource MAY be decommissioned (removed) in the future, through setting a `Tombstone`.\nOnce the resource is decommissioned, it MUST be removed from ORD (which is why there is no release status for decommissioned)."
|
5242
|
+
}
|
5243
|
+
],
|
5244
|
+
"examples": [
|
5245
|
+
"active"
|
5246
|
+
]
|
5247
|
+
},
|
5248
|
+
"links": {
|
5249
|
+
"type": "array",
|
5250
|
+
"description": "Generic links with arbitrary meaning and content.\n\n`packageLinks` MUST be preferred if applicable.",
|
5251
|
+
"items": {
|
5252
|
+
"$ref": "#/definitions/Link"
|
5253
|
+
}
|
5254
|
+
},
|
5255
|
+
"tags": {
|
5256
|
+
"type": "array",
|
5257
|
+
"items": {
|
5258
|
+
"type": "string",
|
5259
|
+
"pattern": "^[a-zA-Z0-9-_.\\/ ]*$",
|
5260
|
+
"minLength": 1
|
5261
|
+
},
|
5262
|
+
"description": "List of free text style tags.\nNo special characters are allowed except `-`, `_`, `.`, `/` and ` `.\n\nTags that are assigned to a `Package` are inherited to all of the ORD resources it contains.",
|
5263
|
+
"examples": [
|
5264
|
+
[
|
5265
|
+
"storage",
|
5266
|
+
"high-availability"
|
5267
|
+
]
|
5268
|
+
]
|
5269
|
+
},
|
5270
|
+
"labels": {
|
5271
|
+
"$ref": "#/definitions/Labels"
|
5272
|
+
},
|
5273
|
+
"documentationLabels": {
|
5274
|
+
"$ref": "#/definitions/DocumentationLabels"
|
5275
|
+
}
|
5276
|
+
},
|
5277
|
+
"required": [
|
5278
|
+
"ordId",
|
5279
|
+
"title",
|
5280
|
+
"description",
|
5281
|
+
"version",
|
5282
|
+
"visibility",
|
5283
|
+
"releaseStatus",
|
5284
|
+
"partOfPackage"
|
5285
|
+
],
|
5286
|
+
"additionalProperties": true
|
4940
5287
|
}
|
4941
5288
|
},
|
4942
|
-
"title": "ORD Document",
|
4943
5289
|
"type": "object",
|
4944
5290
|
"properties": {
|
4945
5291
|
"$schema": {
|
@@ -4970,10 +5316,11 @@
|
|
4970
5316
|
"1.7",
|
4971
5317
|
"1.8",
|
4972
5318
|
"1.9",
|
4973
|
-
"1.10"
|
5319
|
+
"1.10",
|
5320
|
+
"1.11"
|
4974
5321
|
],
|
4975
5322
|
"examples": [
|
4976
|
-
"1.
|
5323
|
+
"1.11"
|
4977
5324
|
]
|
4978
5325
|
},
|
4979
5326
|
"description": {
|
@@ -4999,7 +5346,12 @@
|
|
4999
5346
|
"policyLevel": {
|
5000
5347
|
"type": "string",
|
5001
5348
|
"description": "The [policy level](../../spec-extensions/policy-levels/) (aka. compliance level) that the described resources need to be compliant with.\nDepending on the chosen policy level, additional expectations and validations rules will be applied.\n\nThe policy level can be defined on ORD Document level, but also be overwritten on an individual package or resource level.\n",
|
5002
|
-
"
|
5349
|
+
"anyOf": [
|
5350
|
+
{
|
5351
|
+
"type": "string",
|
5352
|
+
"pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
|
5353
|
+
"description": "Any valid [Specification ID](../index.md#specification-id)."
|
5354
|
+
},
|
5003
5355
|
{
|
5004
5356
|
"const": "none",
|
5005
5357
|
"description": "No policy level chosen. Only the base rules on how to create correct ORD documents apply."
|