@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.
@@ -2,6 +2,7 @@
2
2
  "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.",
3
3
  "$schema": "http://json-schema.org/draft-07/schema#",
4
4
  "$id": "https://open-resource-discovery.github.io/specification/spec-v1/interfaces/Document.schema.json#",
5
+ "title": "ORD Document",
5
6
  "x-property-order": [
6
7
  "Document",
7
8
  "ApiResource",
@@ -22,7 +23,8 @@
22
23
  "Package": {
23
24
  "type": "object",
24
25
  "title": "Package",
25
- "description": "A [**Package**](../../details/articles/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](../../details/articles/grouping-and-bundling#package).",
26
+ "x-ums-type": "root",
27
+ "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).",
26
28
  "properties": {
27
29
  "ordId": {
28
30
  "type": "string",
@@ -36,7 +38,7 @@
36
38
  "localId": {
37
39
  "type": "string",
38
40
  "x-introduced-in-version": "1.2.1",
39
- "description": "Local ID, as known by the described system.\n\nThis can be the `<resourceName>` fragment in the ORD ID. In this case, make sure it fits the length limits of the ORD ID. It might also be different if e.g. localIds have incompatible charset restrictions.",
41
+ "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.",
40
42
  "maxLength": 255,
41
43
  "examples": [
42
44
  "SuccessFactorsRecruiting",
@@ -81,7 +83,12 @@
81
83
  "policyLevel": {
82
84
  "type": "string",
83
85
  "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",
84
- "oneOf": [
86
+ "anyOf": [
87
+ {
88
+ "type": "string",
89
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
90
+ "description": "Any valid [Specification ID](../index.md#specification-id)."
91
+ },
85
92
  {
86
93
  "const": "none",
87
94
  "description": "No policy level chosen. Only the base rules on how to create correct ORD documents apply."
@@ -177,7 +184,7 @@
177
184
  },
178
185
  "partOfProducts": {
179
186
  "type": "array",
180
- "description": "List of products this resource is 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.",
187
+ "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.",
181
188
  "items": {
182
189
  "type": "string",
183
190
  "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):(product):([a-zA-Z0-9._\\-]+):()$",
@@ -376,7 +383,7 @@
376
383
  "runtimeRestriction": {
377
384
  "x-introduced-in-version": "1.8.0",
378
385
  "x-feature-status": "alpha",
379
- "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).",
386
+ "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).",
380
387
  "type": "string",
381
388
  "pattern": "^[a-z0-9]+(?:[.][a-z0-9]+){1}$",
382
389
  "examples": [
@@ -420,7 +427,8 @@
420
427
  "ConsumptionBundle": {
421
428
  "type": "object",
422
429
  "title": "Consumption Bundle",
423
- "description": "A [**Consumption Bundle**](../../details/articles/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](../../details/articles/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](../../details/articles/grouping-and-bundling#consumption-bundle).",
430
+ "x-ums-type": "root",
431
+ "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).",
424
432
  "properties": {
425
433
  "ordId": {
426
434
  "type": "string",
@@ -434,7 +442,7 @@
434
442
  "localId": {
435
443
  "type": "string",
436
444
  "x-introduced-in-version": "1.2.1",
437
- "description": "Local ID, as known by the described system.\n\nThis can be the `<resourceName>` fragment in the ORD ID. In this case, make sure it fits the length limits of the ORD ID. It might also be different if e.g. localIds have incompatible charset restrictions.",
445
+ "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.",
438
446
  "maxLength": 255,
439
447
  "examples": [
440
448
  "SuccessFactorsRecruiting",
@@ -570,6 +578,7 @@
570
578
  "ConsumptionBundleReference": {
571
579
  "type": "object",
572
580
  "title": "Consumption Bundle Reference",
581
+ "x-ums-type": "embedded",
573
582
  "description": "Reference to a Consumption bundle.\n\nThis is a complex object to allow additional properties / selections to be attached.",
574
583
  "properties": {
575
584
  "ordId": {
@@ -598,6 +607,8 @@
598
607
  "ApiResource": {
599
608
  "type": "object",
600
609
  "title": "API Resource",
610
+ "x-ums-type": "root",
611
+ "x-implements": "#/definitions/OrdResource",
601
612
  "description": "The API Resource provides a high-level description of an exposed API.\nYou can find more information, such as the API resource definitions, in the links in the table below.\n\nAn API Resource bundles multiple endpoints and resources together.\nThey share the same API namespace and lifecycle (API major version).\nHowever, the exact granularity of this is up to the implementer of the API.\nAs a consequence, an API resource MUST NOT bundle together endpoints from different API versions or namespaces.\n\nA common practice is to bundle endpoints that are based on the same domain or Business Object.\n\nPlease note that APIs can be described, but still be [`disabled`](#api-resource_disabled).\n\nIf the API is not created or owned by the user of the system or by third parties (like partners), it MUST be assigned to dedicated [Packages](#package) that state this the ownership via the `vendor` property.",
602
613
  "properties": {
603
614
  "ordId": {
@@ -612,7 +623,7 @@
612
623
  "localId": {
613
624
  "type": "string",
614
625
  "x-introduced-in-version": "1.2.1",
615
- "description": "Local ID, as known by the described system.\n\nThis can be the `<resourceName>` fragment in the ORD ID. In this case, make sure it fits the length limits of the ORD ID. It might also be different if e.g. localIds have incompatible charset restrictions.",
626
+ "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.",
616
627
  "maxLength": 255,
617
628
  "examples": [
618
629
  "API_BILL_OF_MATERIAL_SRV"
@@ -664,6 +675,12 @@
664
675
  "x-association-target": [
665
676
  "#/definitions/Package/ordId"
666
677
  ],
678
+ "x-reverse-relationship": {
679
+ "propertyName": "apiResources",
680
+ "description": "The API resources that are part the given Package.",
681
+ "min": 0,
682
+ "max": "*"
683
+ },
667
684
  "maxLength": 255,
668
685
  "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.",
669
686
  "examples": [
@@ -679,6 +696,12 @@
679
696
  "#/definitions/Group/groupId"
680
697
  ]
681
698
  },
699
+ "x-reverse-relationship": {
700
+ "propertyName": "apiResourceMembers",
701
+ "description": "The API resources that are part the given Group.",
702
+ "min": 0,
703
+ "max": "*"
704
+ },
682
705
  "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."
683
706
  },
684
707
  "partOfConsumptionBundles": {
@@ -709,7 +732,7 @@
709
732
  },
710
733
  "partOfProducts": {
711
734
  "type": "array",
712
- "description": "List of products this resource is 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.",
735
+ "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.",
713
736
  "items": {
714
737
  "type": "string",
715
738
  "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):(product):([a-zA-Z0-9._\\-]+):()$",
@@ -867,7 +890,12 @@
867
890
  "apiProtocol": {
868
891
  "type": "string",
869
892
  "description": "API Protocol including the protocol version if applicable",
870
- "oneOf": [
893
+ "anyOf": [
894
+ {
895
+ "type": "string",
896
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
897
+ "description": "Any valid [Specification ID](../index.md#specification-id)."
898
+ },
871
899
  {
872
900
  "const": "odata-v2",
873
901
  "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`."
@@ -929,10 +957,15 @@
929
957
  "implementationStandard": {
930
958
  "type": "string",
931
959
  "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.",
932
- "oneOf": [
960
+ "anyOf": [
961
+ {
962
+ "type": "string",
963
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
964
+ "description": "Any valid [Specification ID](../index.md#specification-id).\nIf chosen, `customImplementationStandardDescription` SHOULD be provided."
965
+ },
933
966
  {
934
967
  "const": "sap:ord-document-api:v1",
935
- "description": "API follows the Open Resource Discovery v1 [Document API](../index.md#ord-document-api) contract."
968
+ "description": "API follows the Open Resource Discovery v1 [Document API](../index.md#ord-provider-api) contract."
936
969
  },
937
970
  {
938
971
  "const": "cff:open-service-broker:v2",
@@ -1020,7 +1053,12 @@
1020
1053
  "x-feature-status": "beta",
1021
1054
  "items": {
1022
1055
  "type": "string",
1023
- "oneOf": [
1056
+ "anyOf": [
1057
+ {
1058
+ "type": "string",
1059
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
1060
+ "description": "Any valid [Specification ID](../index.md#specification-id)."
1061
+ },
1024
1062
  {
1025
1063
  "const": "data-federation",
1026
1064
  "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."
@@ -1066,11 +1104,36 @@
1066
1104
  "entityTypeMappings": {
1067
1105
  "type": "array",
1068
1106
  "x-introduced-in-version": "1.6.0",
1107
+ "x-deprecated-in-version": "1.11.0",
1108
+ "x-deprecated": "Use the simplified `exposedEntityTypes` instead.",
1069
1109
  "description": "Describes mappings between the API Models of the described resource to the underlying, conceptual entity types.",
1070
1110
  "items": {
1071
1111
  "$ref": "#/definitions/EntityTypeMapping"
1072
1112
  }
1073
1113
  },
1114
+ "exposedEntityTypes": {
1115
+ "type": "array",
1116
+ "x-introduced-in-version": "1.11.0",
1117
+ "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.",
1118
+ "items": {
1119
+ "$ref": "#/definitions/ExposedEntityType"
1120
+ },
1121
+ "examples": [
1122
+ [
1123
+ {
1124
+ "ordId": "sap.odm:entityType:WorkforcePerson:v1"
1125
+ }
1126
+ ],
1127
+ [
1128
+ {
1129
+ "ordId": "sap.sm:entityType:PurchaseOrderItem:v1"
1130
+ },
1131
+ {
1132
+ "ordId": "sap.sm:entityType:BusinessPartner:v1"
1133
+ }
1134
+ ]
1135
+ ]
1136
+ },
1074
1137
  "apiResourceLinks": {
1075
1138
  "type": "array",
1076
1139
  "description": "Links with semantic meaning that are specific to API Resources.",
@@ -1295,7 +1358,12 @@
1295
1358
  "policyLevel": {
1296
1359
  "type": "string",
1297
1360
  "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",
1298
- "oneOf": [
1361
+ "anyOf": [
1362
+ {
1363
+ "type": "string",
1364
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
1365
+ "description": "Any valid [Specification ID](../index.md#specification-id)."
1366
+ },
1299
1367
  {
1300
1368
  "const": "none",
1301
1369
  "description": "No policy level chosen. Only the base rules on how to create correct ORD documents apply."
@@ -1375,6 +1443,8 @@
1375
1443
  "EventResource": {
1376
1444
  "type": "object",
1377
1445
  "title": "Event Resource",
1446
+ "x-ums-type": "root",
1447
+ "x-implements": "#/definitions/OrdResource",
1378
1448
  "description": "The event resource provides a high-level description of a collection of related Events. More detailed information, such as the event resource definitions, are provided in links in the table below.\nWhich events are considered \"related\" is up to the implementer. A common practice is to bundle events that are based on the same resource/Business Object. It is also an option to bundle all available events into a single event resource/event catalog.\nPlease note that event resources can be described, but still be [`disabled`](#event-resource_disabled).\nIf the event resource is not created or owned by the user / customer of the system or by partners / third parties, it MUST be assigned to dedicated [Packages](#package) that state this the ownership via the `vendor` property.",
1379
1449
  "properties": {
1380
1450
  "ordId": {
@@ -1390,7 +1460,7 @@
1390
1460
  "localId": {
1391
1461
  "type": "string",
1392
1462
  "x-introduced-in-version": "1.2.1",
1393
- "description": "Local ID, as known by the described system.\n\nThis can be the `<resourceName>` fragment in the ORD ID. In this case, make sure it fits the length limits of the ORD ID. It might also be different if e.g. localIds have incompatible charset restrictions.",
1463
+ "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.",
1394
1464
  "maxLength": 255,
1395
1465
  "examples": [
1396
1466
  "BusinessEvents_SubscriptionEvents"
@@ -1443,6 +1513,12 @@
1443
1513
  "x-association-target": [
1444
1514
  "#/definitions/Package/ordId"
1445
1515
  ],
1516
+ "x-reverse-relationship": {
1517
+ "propertyName": "eventResources",
1518
+ "description": "The event resources that are part the given Package.",
1519
+ "min": 0,
1520
+ "max": "*"
1521
+ },
1446
1522
  "maxLength": 255,
1447
1523
  "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.",
1448
1524
  "examples": [
@@ -1458,6 +1534,10 @@
1458
1534
  "#/definitions/Group/groupId"
1459
1535
  ]
1460
1536
  },
1537
+ "x-reverse-relationship": {
1538
+ "propertyName": "eventResourceMembers",
1539
+ "description": "The event resources that are part the given Group."
1540
+ },
1461
1541
  "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."
1462
1542
  },
1463
1543
  "partOfConsumptionBundles": {
@@ -1488,7 +1568,7 @@
1488
1568
  },
1489
1569
  "partOfProducts": {
1490
1570
  "type": "array",
1491
- "description": "List of products this resource is 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.",
1571
+ "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.",
1492
1572
  "items": {
1493
1573
  "type": "string",
1494
1574
  "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):(product):([a-zA-Z0-9._\\-]+):()$",
@@ -1620,7 +1700,17 @@
1620
1700
  "implementationStandard": {
1621
1701
  "type": "string",
1622
1702
  "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.",
1623
- "oneOf": [
1703
+ "anyOf": [
1704
+ {
1705
+ "type": "string",
1706
+ "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):(apiResource):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
1707
+ "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."
1708
+ },
1709
+ {
1710
+ "type": "string",
1711
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
1712
+ "description": "Any valid [Specification ID](../index.md#specification-id).\nIf chosen, `customImplementationStandardDescription` SHOULD be provided."
1713
+ },
1624
1714
  {
1625
1715
  "const": "custom",
1626
1716
  "description": "If chosen, a custom implementation standard MUST be provided via `customImplementationStandard` and SHOULD be described via `customImplementationStandardDescription`"
@@ -1672,11 +1762,36 @@
1672
1762
  "entityTypeMappings": {
1673
1763
  "type": "array",
1674
1764
  "x-introduced-in-version": "1.6.0",
1765
+ "x-deprecated-in-version": "1.11.0",
1766
+ "x-deprecated": "Use the simplified `exposedEntityTypes` instead.",
1675
1767
  "description": "Describes mappings between the API Models of the described resource to the underlying, conceptual entity types.",
1676
1768
  "items": {
1677
1769
  "$ref": "#/definitions/EntityTypeMapping"
1678
1770
  }
1679
1771
  },
1772
+ "exposedEntityTypes": {
1773
+ "type": "array",
1774
+ "x-introduced-in-version": "1.11.0",
1775
+ "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.",
1776
+ "items": {
1777
+ "$ref": "#/definitions/ExposedEntityType"
1778
+ },
1779
+ "examples": [
1780
+ [
1781
+ {
1782
+ "ordId": "sap.odm:entityType:WorkforcePerson:v1"
1783
+ }
1784
+ ],
1785
+ [
1786
+ {
1787
+ "ordId": "sap.sm:entityType:PurchaseOrderItem:v1"
1788
+ },
1789
+ {
1790
+ "ordId": "sap.sm:entityType:BusinessPartner:v1"
1791
+ }
1792
+ ]
1793
+ ]
1794
+ },
1680
1795
  "eventResourceLinks": {
1681
1796
  "type": "array",
1682
1797
  "x-introduced-in-version": "1.7.1",
@@ -1902,7 +2017,12 @@
1902
2017
  "policyLevel": {
1903
2018
  "type": "string",
1904
2019
  "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",
1905
- "oneOf": [
2020
+ "anyOf": [
2021
+ {
2022
+ "type": "string",
2023
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
2024
+ "description": "Any valid [Specification ID](../index.md#specification-id)."
2025
+ },
1906
2026
  {
1907
2027
  "const": "none",
1908
2028
  "description": "No policy level chosen. Only the base rules on how to create correct ORD documents apply."
@@ -1984,7 +2104,8 @@
1984
2104
  "EntityType": {
1985
2105
  "type": "object",
1986
2106
  "title": "Entity Type",
1987
- "description": "An [**Entity Type**](../../details/articles/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](../../details/articles/grouping-and-bundling#entity-type).",
2107
+ "x-ums-type": "root",
2108
+ "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).",
1988
2109
  "x-introduced-in-version": "1.8.0",
1989
2110
  "properties": {
1990
2111
  "ordId": {
@@ -2001,7 +2122,7 @@
2001
2122
  "localId": {
2002
2123
  "type": "string",
2003
2124
  "x-introduced-in-version": "1.2.1",
2004
- "description": "Local ID, as known by the described system.\n\nThis can be the `<resourceName>` fragment in the ORD ID. In this case, make sure it fits the length limits of the ORD ID. It might also be different if e.g. localIds have incompatible charset restrictions.",
2125
+ "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.",
2005
2126
  "maxLength": 255,
2006
2127
  "examples": [
2007
2128
  "BusinessPartner",
@@ -2067,6 +2188,12 @@
2067
2188
  "x-association-target": [
2068
2189
  "#/definitions/Package/ordId"
2069
2190
  ],
2191
+ "x-reverse-relationship": {
2192
+ "propertyName": "entityTypes",
2193
+ "description": "The entity types that are part the given Package.",
2194
+ "min": 0,
2195
+ "max": "*"
2196
+ },
2070
2197
  "maxLength": 255,
2071
2198
  "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.",
2072
2199
  "examples": [
@@ -2082,11 +2209,15 @@
2082
2209
  "#/definitions/Group/groupId"
2083
2210
  ]
2084
2211
  },
2212
+ "x-reverse-relationship": {
2213
+ "propertyName": "entityTypeMembers",
2214
+ "description": "The entity types that are part the given Group."
2215
+ },
2085
2216
  "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."
2086
2217
  },
2087
2218
  "partOfProducts": {
2088
2219
  "type": "array",
2089
- "description": "List of products this resource is 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.",
2220
+ "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.",
2090
2221
  "items": {
2091
2222
  "type": "string",
2092
2223
  "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):(product):([a-zA-Z0-9._\\-]+):()$",
@@ -2207,7 +2338,7 @@
2207
2338
  },
2208
2339
  "level": {
2209
2340
  "type": "string",
2210
- "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)",
2341
+ "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)",
2211
2342
  "oneOf": [
2212
2343
  {
2213
2344
  "const": "aggregate",
@@ -2232,7 +2363,14 @@
2232
2363
  "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.",
2233
2364
  "items": {
2234
2365
  "$ref": "#/definitions/RelatedEntityType"
2235
- }
2366
+ },
2367
+ "examples": [
2368
+ [
2369
+ {
2370
+ "ordId": "sap.odm:entityType:WorkforcePerson:v1"
2371
+ }
2372
+ ]
2373
+ ]
2236
2374
  },
2237
2375
  "links": {
2238
2376
  "type": "array",
@@ -2271,7 +2409,12 @@
2271
2409
  "policyLevel": {
2272
2410
  "type": "string",
2273
2411
  "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",
2274
- "oneOf": [
2412
+ "anyOf": [
2413
+ {
2414
+ "type": "string",
2415
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
2416
+ "description": "Any valid [Specification ID](../index.md#specification-id)."
2417
+ },
2275
2418
  {
2276
2419
  "const": "none",
2277
2420
  "description": "No policy level chosen. Only the base rules on how to create correct ORD documents apply."
@@ -2353,8 +2496,10 @@
2353
2496
  "DataProduct": {
2354
2497
  "type": "object",
2355
2498
  "title": "Data Product",
2499
+ "x-ums-type": "root",
2356
2500
  "x-introduced-in-version": "1.8.0",
2357
- "description": "A [Data Product](../../details/articles/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](../../details/articles/data-product#beta-status).",
2501
+ "x-implements": "#/definitions/OrdResource",
2502
+ "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).",
2358
2503
  "properties": {
2359
2504
  "ordId": {
2360
2505
  "type": "string",
@@ -2368,7 +2513,7 @@
2368
2513
  "localId": {
2369
2514
  "type": "string",
2370
2515
  "x-introduced-in-version": "1.2.1",
2371
- "description": "Local ID, as known by the described system.\n\nThis can be the `<resourceName>` fragment in the ORD ID. In this case, make sure it fits the length limits of the ORD ID. It might also be different if e.g. localIds have incompatible charset restrictions.",
2516
+ "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.",
2372
2517
  "maxLength": 255,
2373
2518
  "examples": [
2374
2519
  "CustomerOrder"
@@ -2421,6 +2566,12 @@
2421
2566
  "x-association-target": [
2422
2567
  "#/definitions/Package/ordId"
2423
2568
  ],
2569
+ "x-reverse-relationship": {
2570
+ "propertyName": "dataProducts",
2571
+ "description": "The data products that are part the given Package.",
2572
+ "min": 0,
2573
+ "max": "*"
2574
+ },
2424
2575
  "maxLength": 255,
2425
2576
  "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.",
2426
2577
  "examples": [
@@ -2428,7 +2579,6 @@
2428
2579
  ]
2429
2580
  },
2430
2581
  "partOfGroups": {
2431
- "x-feature-status": "beta",
2432
2582
  "type": "array",
2433
2583
  "items": {
2434
2584
  "type": "string",
@@ -2437,7 +2587,30 @@
2437
2587
  "#/definitions/Group/groupId"
2438
2588
  ]
2439
2589
  },
2440
- "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."
2590
+ "x-reverse-relationship": {
2591
+ "propertyName": "dataProductMembers",
2592
+ "description": "The data products that are part the given Group."
2593
+ },
2594
+ "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.",
2595
+ "x-feature-status": "beta"
2596
+ },
2597
+ "partOfProducts": {
2598
+ "type": "array",
2599
+ "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.",
2600
+ "items": {
2601
+ "type": "string",
2602
+ "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):(product):([a-zA-Z0-9._\\-]+):()$",
2603
+ "maxLength": 255,
2604
+ "x-association-target": [
2605
+ "#/definitions/Product/ordId"
2606
+ ]
2607
+ },
2608
+ "minItems": 0,
2609
+ "examples": [
2610
+ [
2611
+ "sap:product:S4HANA_OD:"
2612
+ ]
2613
+ ]
2441
2614
  },
2442
2615
  "version": {
2443
2616
  "type": "string",
@@ -2606,9 +2779,14 @@
2606
2779
  ]
2607
2780
  },
2608
2781
  "category": {
2609
- "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.",
2782
+ "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.",
2610
2783
  "type": "string",
2611
- "oneOf": [
2784
+ "anyOf": [
2785
+ {
2786
+ "type": "string",
2787
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
2788
+ "description": "Any valid [Specification ID](../index.md#specification-id)."
2789
+ },
2612
2790
  {
2613
2791
  "const": "business-object",
2614
2792
  "description": "Business Objects: master data, transaction data"
@@ -2638,6 +2816,12 @@
2638
2816
  "#/definitions/EntityType/ordId"
2639
2817
  ]
2640
2818
  },
2819
+ "x-reverse-relationship": {
2820
+ "propertyName": "dataProducts",
2821
+ "description": "Data Products associated to the Entity Type.",
2822
+ "min": 0,
2823
+ "max": "*"
2824
+ },
2641
2825
  "examples": [
2642
2826
  [
2643
2827
  "sap.odm:entityType:CustomerOrder:v1",
@@ -2918,7 +3102,12 @@
2918
3102
  "x-feature-status": "beta",
2919
3103
  "type": "string",
2920
3104
  "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",
2921
- "oneOf": [
3105
+ "anyOf": [
3106
+ {
3107
+ "type": "string",
3108
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
3109
+ "description": "Any valid [Specification ID](../index.md#specification-id)."
3110
+ },
2922
3111
  {
2923
3112
  "const": "none",
2924
3113
  "description": "No policy level chosen. Only the base rules on how to create correct ORD documents apply."
@@ -3006,6 +3195,7 @@
3006
3195
  "DataProductInputPort": {
3007
3196
  "type": "object",
3008
3197
  "title": "Data Product Input Port",
3198
+ "x-ums-type": "embedded",
3009
3199
  "description": "An input port of a data product states where it retrieves its data inputs from.\n\nIt is described as via an ORD Integration Dependency.",
3010
3200
  "properties": {
3011
3201
  "ordId": {
@@ -3029,6 +3219,7 @@
3029
3219
  "DataProductOutputPort": {
3030
3220
  "type": "object",
3031
3221
  "title": "Data Product Output Port",
3222
+ "x-ums-type": "embedded",
3032
3223
  "description": "A data product output port references the APIs or Events that can be used to access the data-set.\nIt MAY provide full access to the complete data set, but can also just expose a subset of it - if other output ports cover the missing parts.\n\nReferenced API or Event ORD resources don't need to be provided within the same ORD document.\nIf a data product is built against a specific API contract of another application or data product, this API resource should be referred to.\nIn this case the other application is responsible for the lifecycle of the API contract and will update its ORD description independently.",
3033
3224
  "properties": {
3034
3225
  "ordId": {
@@ -3055,11 +3246,17 @@
3055
3246
  "type": "object",
3056
3247
  "title": "API Resource Definition",
3057
3248
  "description": "Link and categorization of a machine-readable API definition.\nFor example, OpenAPI definition, OData Metadata, etc.",
3249
+ "x-ums-type": "custom",
3058
3250
  "properties": {
3059
3251
  "type": {
3060
3252
  "description": "Type of the API Resource Definition\nIf \"custom\" is chosen, a customType MUST be provided",
3061
3253
  "type": "string",
3062
- "oneOf": [
3254
+ "anyOf": [
3255
+ {
3256
+ "type": "string",
3257
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
3258
+ "description": "Any valid [Specification ID](../index.md#specification-id)."
3259
+ },
3063
3260
  {
3064
3261
  "const": "openapi-v2",
3065
3262
  "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`."
@@ -3185,12 +3382,18 @@
3185
3382
  "EventResourceDefinition": {
3186
3383
  "type": "object",
3187
3384
  "title": "Event Resource Definition",
3385
+ "x-ums-type": "custom",
3188
3386
  "description": "Link and categorization of a machine-readable API definition.\nFor example, AsyncAPI or OpenAPI with callbacks, etc.",
3189
3387
  "properties": {
3190
3388
  "type": {
3191
3389
  "description": "Type of the event resource definition",
3192
3390
  "type": "string",
3193
- "oneOf": [
3391
+ "anyOf": [
3392
+ {
3393
+ "type": "string",
3394
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
3395
+ "description": "Any valid [Specification ID](../index.md#specification-id)."
3396
+ },
3194
3397
  {
3195
3398
  "const": "asyncapi-v2",
3196
3399
  "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."
@@ -3277,6 +3480,7 @@
3277
3480
  "Product": {
3278
3481
  "type": "object",
3279
3482
  "title": "Product",
3483
+ "x-ums-type": "root",
3280
3484
  "description": "A **product** in ORD is understood as a commercial product or service.\n\nIt is a high-level entity for structuring the software portfolio from a sales / software logistics perspective.\nWhile **system type** is a technical concept, **product** covers the commercial and marketing view.\n\nPlease note that the ORD concept of a product is very simple on purpose.\nThere is no distinction between products and services and concepts like product versions, variants, etc.\n\nORD assumes that this is handled by specialized systems and that ORD only provides the means to correlate to them.",
3281
3485
  "properties": {
3282
3486
  "ordId": {
@@ -3386,7 +3590,9 @@
3386
3590
  "Capability": {
3387
3591
  "type": "object",
3388
3592
  "title": "Capability",
3593
+ "x-ums-type": "root",
3389
3594
  "x-introduced-in-version": "1.4.0",
3595
+ "x-implements": "#/definitions/OrdResource",
3390
3596
  "description": "Capabilities can be used to describe use case specific capabilities, most notably supported features or additional information (like configuration) that needs to be understood from outside.\nThis is a generic ORD concept that aims to cover many different capability discovery use cases that would otherwise need be implemented as individual service provider interfaces (SPIs).\n\nIf a capability needs to expose more information than possible with generic capability properties, a custom capability definition can be defined and referenced in ORD.\nThis is the same idea and mechanism as with API resources and their resource definition formats.",
3391
3597
  "properties": {
3392
3598
  "ordId": {
@@ -3401,7 +3607,7 @@
3401
3607
  "localId": {
3402
3608
  "type": "string",
3403
3609
  "x-introduced-in-version": "1.2.1",
3404
- "description": "Local ID, as known by the described system.\n\nThis can be the `<resourceName>` fragment in the ORD ID. In this case, make sure it fits the length limits of the ORD ID. It might also be different if e.g. localIds have incompatible charset restrictions.",
3610
+ "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.",
3405
3611
  "maxLength": 255,
3406
3612
  "examples": [
3407
3613
  "SuccessFactorsRecruiting",
@@ -3425,14 +3631,19 @@
3425
3631
  "type": {
3426
3632
  "description": "Type of the Capability",
3427
3633
  "type": "string",
3428
- "oneOf": [
3634
+ "anyOf": [
3429
3635
  {
3430
- "const": "custom",
3431
- "description": "If chosen, `customType` MUST be provided."
3636
+ "type": "string",
3637
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
3638
+ "description": "Any valid [Specification ID](../index.md#specification-id)."
3432
3639
  },
3433
3640
  {
3434
3641
  "const": "sap.mdo:mdi-capability:v1",
3435
3642
  "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`."
3643
+ },
3644
+ {
3645
+ "const": "custom",
3646
+ "description": "If chosen, `customType` MUST be provided."
3436
3647
  }
3437
3648
  ],
3438
3649
  "examples": [
@@ -3480,6 +3691,12 @@
3480
3691
  "x-association-target": [
3481
3692
  "#/definitions/Package/ordId"
3482
3693
  ],
3694
+ "x-reverse-relationship": {
3695
+ "propertyName": "capabilities",
3696
+ "description": "The capabilities that are part the given Package.",
3697
+ "min": 0,
3698
+ "max": "*"
3699
+ },
3483
3700
  "maxLength": 255,
3484
3701
  "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.",
3485
3702
  "examples": [
@@ -3495,6 +3712,10 @@
3495
3712
  "#/definitions/Group/groupId"
3496
3713
  ]
3497
3714
  },
3715
+ "x-reverse-relationship": {
3716
+ "propertyName": "capabilityMembers",
3717
+ "description": "The Capabilities that are part the given Group."
3718
+ },
3498
3719
  "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."
3499
3720
  },
3500
3721
  "version": {
@@ -3565,7 +3786,7 @@
3565
3786
  },
3566
3787
  "relatedEntityTypes": {
3567
3788
  "type": "array",
3568
- "description": "Optional list of related EntityType Resources.\n\nMUST be a valid reference to an [EntityType Resource](#entity-type) ORD ID.",
3789
+ "description": "Optional list of related EntityType Resources.\nMUST be a valid reference to an [EntityType Resource](#entity-type) ORD ID.",
3569
3790
  "items": {
3570
3791
  "type": "string",
3571
3792
  "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):(entityType):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
@@ -3573,6 +3794,12 @@
3573
3794
  "#/definitions/EntityType/ordId"
3574
3795
  ]
3575
3796
  },
3797
+ "x-reverse-relationship": {
3798
+ "propertyName": "capabilities",
3799
+ "description": "Capabilities associated to the Entity Type.",
3800
+ "min": 0,
3801
+ "max": "*"
3802
+ },
3576
3803
  "examples": [
3577
3804
  [
3578
3805
  "sap.odm:entityType:WorkforcePerson:v1"
@@ -3643,19 +3870,25 @@
3643
3870
  "type": "object",
3644
3871
  "title": "Capability Definition",
3645
3872
  "x-introduced-in-version": "1.4.0",
3873
+ "x-ums-type": "custom",
3646
3874
  "description": "Link and categorization of a machine-readable capability definition.",
3647
3875
  "properties": {
3648
3876
  "type": {
3649
3877
  "description": "Type of the capability resource definition",
3650
3878
  "type": "string",
3651
- "oneOf": [
3879
+ "anyOf": [
3652
3880
  {
3653
- "const": "custom",
3654
- "description": "If chosen, a custom type MUST be provided via `customType`"
3881
+ "type": "string",
3882
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
3883
+ "description": "Any valid [Specification ID](../index.md#specification-id)."
3655
3884
  },
3656
3885
  {
3657
3886
  "const": "sap.mdo:mdi-capability-definition:v1",
3658
3887
  "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`."
3888
+ },
3889
+ {
3890
+ "const": "custom",
3891
+ "description": "If chosen, a custom type MUST be provided via `customType`"
3659
3892
  }
3660
3893
  ],
3661
3894
  "examples": [
@@ -3731,8 +3964,9 @@
3731
3964
  "IntegrationDependency": {
3732
3965
  "type": "object",
3733
3966
  "title": "Integration Dependency",
3967
+ "x-ums-type": "root",
3734
3968
  "x-introduced-in-version": "1.7.0",
3735
- "description": "An [Integration Dependency](../../details/articles/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](../../details/articles/integration-dependency).",
3969
+ "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).",
3736
3970
  "properties": {
3737
3971
  "ordId": {
3738
3972
  "type": "string",
@@ -3746,7 +3980,7 @@
3746
3980
  "localId": {
3747
3981
  "type": "string",
3748
3982
  "x-introduced-in-version": "1.2.1",
3749
- "description": "Local ID, as known by the described system.\n\nThis can be the `<resourceName>` fragment in the ORD ID. In this case, make sure it fits the length limits of the ORD ID. It might also be different if e.g. localIds have incompatible charset restrictions.",
3983
+ "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.",
3750
3984
  "maxLength": 255,
3751
3985
  "examples": [
3752
3986
  "SuccessFactorsRecruiting",
@@ -3799,6 +4033,12 @@
3799
4033
  "x-association-target": [
3800
4034
  "#/definitions/Package/ordId"
3801
4035
  ],
4036
+ "x-reverse-relationship": {
4037
+ "propertyName": "integrationDependencies",
4038
+ "description": "The integration dependencies that are part the given Package.",
4039
+ "min": 0,
4040
+ "max": "*"
4041
+ },
3802
4042
  "maxLength": 255,
3803
4043
  "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.",
3804
4044
  "examples": [
@@ -3814,6 +4054,10 @@
3814
4054
  "#/definitions/Group/groupId"
3815
4055
  ]
3816
4056
  },
4057
+ "x-reverse-relationship": {
4058
+ "propertyName": "integrationDependencyMembers",
4059
+ "description": "The Integration Dependencies that are part the given Group."
4060
+ },
3817
4061
  "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."
3818
4062
  },
3819
4063
  "version": {
@@ -3971,6 +4215,7 @@
3971
4215
  "type": "object",
3972
4216
  "title": "Aspect",
3973
4217
  "x-introduced-in-version": "1.7.0",
4218
+ "x-ums-type": "custom",
3974
4219
  "description": "An (integration) aspect is the constituent part that makes up an Integration Dependency.\n\nEach aspect can list references to resources, which could be owned and defined by the integration target or by the described system itself.\nIn case the reference links to own resources, it is implied that they are to be used by the integration target to fulfill the Integration Dependency.\n\nIf multiple resources are given within an aspect, they are considered alternatives to each other (OR condition).\nIn case an AND condition is needed, multiple aspects need to be added to the Integration Dependency.",
3975
4220
  "properties": {
3976
4221
  "title": {
@@ -4023,6 +4268,7 @@
4023
4268
  "type": "object",
4024
4269
  "title": "API Resource Integration Aspect",
4025
4270
  "x-introduced-in-version": "1.7.0",
4271
+ "x-ums-type": "custom",
4026
4272
  "description": "API resource related integration aspect",
4027
4273
  "properties": {
4028
4274
  "ordId": {
@@ -4053,6 +4299,7 @@
4053
4299
  "type": "object",
4054
4300
  "title": "Event Resource Integration Aspect",
4055
4301
  "x-introduced-in-version": "1.7.0",
4302
+ "x-ums-type": "custom",
4056
4303
  "description": "Event resource related integration aspect",
4057
4304
  "properties": {
4058
4305
  "ordId": {
@@ -4105,6 +4352,7 @@
4105
4352
  "type": "object",
4106
4353
  "title": "Event Resource Integration Aspect Subset",
4107
4354
  "x-introduced-in-version": "1.7.0",
4355
+ "x-ums-type": "custom",
4108
4356
  "description": "Defines that Event Resource Integration Aspect only requires a subset of the referenced contract.\n\nFor events, this could be a list of the events that need to be subscribed in order to make the integration work.\nThis information helps to narrow down what is really necessary and can help optimize the integration, e.g. by only publishing the events that are really needed.",
4109
4357
  "properties": {
4110
4358
  "eventType": {
@@ -4123,6 +4371,7 @@
4123
4371
  "Vendor": {
4124
4372
  "type": "object",
4125
4373
  "title": "Vendor",
4374
+ "x-ums-type": "root",
4126
4375
  "description": "The vendor of a product or a package, usually a corporation or a customer / user.\n\nThe vendor of a `Package` is the owner or creator of the content of the package.\nThe vendor of a `Product` is the owner of the product.\n\nIf the resources are created by the customer / user of the described system, `customer:vendor:Customer:` MUST be used as vendor.\n\nBoth have already a [vendor namespace](../index.md#vendor-namespace) within their ORD ID.\nThe `Vendor` entity is giving more details on the vendor namespace.\nFor one vendor namespace there MUST only be exactly one `Vendor` ORD entity describing it.\n\nFor example: The only correct value for a SAP vendor reference is `sap:vendor:SAP:`.",
4127
4376
  "properties": {
4128
4377
  "ordId": {
@@ -4195,6 +4444,7 @@
4195
4444
  "type": "object",
4196
4445
  "title": "Changelog Entry",
4197
4446
  "description": "A changelog entry can be used to indicate changes.\nUsually they lead to a change of the version number or the release status.",
4447
+ "x-ums-type": "custom",
4198
4448
  "properties": {
4199
4449
  "version": {
4200
4450
  "type": "string",
@@ -4258,6 +4508,7 @@
4258
4508
  "type": "object",
4259
4509
  "title": "Link",
4260
4510
  "description": "Link that can be attached to packages or Open Resource Discovery resources.\n",
4511
+ "x-ums-type": "custom",
4261
4512
  "properties": {
4262
4513
  "title": {
4263
4514
  "type": "string",
@@ -4299,11 +4550,17 @@
4299
4550
  "PackageLink": {
4300
4551
  "type": "object",
4301
4552
  "title": "Package Link",
4553
+ "x-ums-type": "custom",
4302
4554
  "description": "Links with specific semantic meaning that are related to `Package`.\n\nIf a generic [Link](#link) can also be expressed via a Package Link, the latter MUST be chosen.",
4303
4555
  "properties": {
4304
4556
  "type": {
4305
4557
  "type": "string",
4306
- "oneOf": [
4558
+ "anyOf": [
4559
+ {
4560
+ "type": "string",
4561
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
4562
+ "description": "Any valid [Specification ID](../index.md#specification-id)."
4563
+ },
4307
4564
  {
4308
4565
  "const": "terms-of-service",
4309
4566
  "description": "Link to human-readable terms of service / use documentation."
@@ -4373,12 +4630,18 @@
4373
4630
  "APIEventResourceLink": {
4374
4631
  "type": "object",
4375
4632
  "title": "API and Event Resource Link",
4633
+ "x-ums-type": "custom",
4376
4634
  "description": "Links with specific semantic meaning that are related to API or event resources.\n\nIf a generic [Link](#link) can also be expressed via an API / Event Resource Link, the latter MUST be chosen.",
4377
4635
  "properties": {
4378
4636
  "type": {
4379
4637
  "type": "string",
4380
4638
  "description": "See also: [WADG0001 WebAPI type extension](https://webapi-discovery.github.io/rfcs/rfc0001.html#webapiactions)",
4381
- "oneOf": [
4639
+ "anyOf": [
4640
+ {
4641
+ "type": "string",
4642
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
4643
+ "description": "Any valid [Specification ID](../index.md#specification-id)."
4644
+ },
4382
4645
  {
4383
4646
  "const": "api-documentation",
4384
4647
  "description": "Link to human-readable documentation describing the API or event resource in more detail."
@@ -4450,11 +4713,17 @@
4450
4713
  "DataProductLink": {
4451
4714
  "type": "object",
4452
4715
  "title": "Data Product Link",
4716
+ "x-ums-type": "custom",
4453
4717
  "description": "Links with specific semantic meaning that are related to Data Product resources.\nIf a generic [Link](#link) can also be expressed via Data Product Link, the latter MUST be chosen.",
4454
4718
  "properties": {
4455
4719
  "type": {
4456
4720
  "type": "string",
4457
- "oneOf": [
4721
+ "anyOf": [
4722
+ {
4723
+ "type": "string",
4724
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
4725
+ "description": "Any valid [Specification ID](../index.md#specification-id)."
4726
+ },
4458
4727
  {
4459
4728
  "const": "payment",
4460
4729
  "description": "Links to a resource detailing pricing details of the data product."
@@ -4513,6 +4782,7 @@
4513
4782
  "SystemInstance": {
4514
4783
  "type": "object",
4515
4784
  "title": "System Instance",
4785
+ "x-ums-type": "ignore",
4516
4786
  "description": "A [system instance](../index.md#def-system-instance) is a concrete, running instance of a system type.\nIn a multi-tenant system, it corresponds to a tenant.\nIn a single-tenant system, it corresponds to the [system installation](../index.md#def-system-deployment) itself.",
4517
4787
  "properties": {
4518
4788
  "baseUrl": {
@@ -4579,6 +4849,7 @@
4579
4849
  "type": "object",
4580
4850
  "title": "System Type",
4581
4851
  "description": "A [system type](../index.md#def-system-type) is the abstract type of an application or service, from operational perspective.",
4852
+ "x-ums-type": "ignore",
4582
4853
  "properties": {
4583
4854
  "systemNamespace": {
4584
4855
  "type": "string",
@@ -4634,6 +4905,7 @@
4634
4905
  "type": "object",
4635
4906
  "title": "System Version",
4636
4907
  "description": "A [system version](../index.md#def-system-version) states the design-time version / release of a [system instance](../index.md#def-system-instance).\nIt provides versioning for operational purposes for the [system type](../index.md#def-system-type).",
4908
+ "x-ums-type": "ignore",
4637
4909
  "properties": {
4638
4910
  "version": {
4639
4911
  "type": "string",
@@ -4693,11 +4965,17 @@
4693
4965
  "type": "object",
4694
4966
  "title": "Access Strategy",
4695
4967
  "description": "Defines the [access strategy](../../spec-extensions/access-strategies/) for accessing the resource definitions.",
4968
+ "x-ums-type": "custom",
4696
4969
  "properties": {
4697
4970
  "type": {
4698
4971
  "type": "string",
4699
4972
  "description": "Defines the authentication/authorization strategy through which the referenced `resourceDefinitions` are accessible.",
4700
- "oneOf": [
4973
+ "anyOf": [
4974
+ {
4975
+ "type": "string",
4976
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
4977
+ "description": "Any valid [Specification ID](../index.md#specification-id).\nIf chosen, `customDescription` SHOULD be provided."
4978
+ },
4701
4979
  {
4702
4980
  "const": "open",
4703
4981
  "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)."
@@ -4760,12 +5038,18 @@
4760
5038
  "type": "object",
4761
5039
  "title": "Credential Exchange Strategy",
4762
5040
  "x-feature-status": "alpha",
5041
+ "x-ums-type": "custom",
4763
5042
  "description": "The credential exchange strategy specifies how a set of credentials for a particular usage\nof the APIs in the consumption bundle can be obtained.\nUntil a SAP-wide strategy for obtaining such credentials exists and is agreed upon,\nboth LoBs and aggregators (namely Unified Customer Landscape) can define their own strategy specifications.\n\nWhile the actual flow in term of API calls can differ between the different strategies,\nthe end goal would always be the possibility for automatically obtaining credentials for each client\nthat would like to use the APIs from a particular bundle.",
4764
5043
  "properties": {
4765
5044
  "type": {
4766
5045
  "type": "string",
4767
5046
  "description": "The type of credential exchange strategy.",
4768
- "oneOf": [
5047
+ "anyOf": [
5048
+ {
5049
+ "type": "string",
5050
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
5051
+ "description": "Any valid [Specification ID](../index.md#specification-id).\nIf chosen, `customDescription` SHOULD be provided."
5052
+ },
4769
5053
  {
4770
5054
  "const": "custom",
4771
5055
  "description": "If chosen, `customType` MUST be provided.\nIf chosen, `customDescription` SHOULD be provided."
@@ -4805,6 +5089,7 @@
4805
5089
  "title": "Labels",
4806
5090
  "type": "object",
4807
5091
  "description": "Generic labels that can be applied to most ORD information.\nThey are defined as an object that may have arbitrary keys.\nThe value of a key is an array of strings.\n\nLabels can be used to attach technical information that cannot be expressed natively in ORD.\nAn ORD aggregator should allow to categorize and query information based on the labels provided.\n\nIf multiple parties rely on the existence of certain label information,\nstandardization through ORD SHOULD be preferred.\n\nAll labels attached to a `Package` will be inherited to the resources they contain.\nDuplicate labels will be merged by the ORD aggregator according to the following rules:\n* Values of the same label key will be merged.\n* Duplicate values of the same label key will be removed.",
5092
+ "x-ums-type": "custom",
4808
5093
  "patternProperties": {
4809
5094
  "^[a-zA-Z0-9-_.]*$": {
4810
5095
  "type": "array",
@@ -4826,7 +5111,8 @@
4826
5111
  "GroupType": {
4827
5112
  "title": "Group Type",
4828
5113
  "type": "object",
4829
- "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](../../details/articles/grouping-and-bundling#Groups).",
5114
+ "x-ums-type": "root",
5115
+ "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).",
4830
5116
  "x-introduced-in-version": "1.9.0",
4831
5117
  "properties": {
4832
5118
  "groupTypeId": {
@@ -4871,7 +5157,8 @@
4871
5157
  "Group": {
4872
5158
  "title": "Group",
4873
5159
  "type": "object",
4874
- "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](../../details/articles/grouping-and-bundling#Groups).",
5160
+ "x-ums-type": "root",
5161
+ "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).",
4875
5162
  "x-introduced-in-version": "1.9.0",
4876
5163
  "properties": {
4877
5164
  "groupId": {
@@ -4892,7 +5179,13 @@
4892
5179
  ],
4893
5180
  "x-association-target": [
4894
5181
  "#/definitions/GroupType/groupTypeId"
4895
- ]
5182
+ ],
5183
+ "x-reverse-relationship": {
5184
+ "propertyName": "groups",
5185
+ "description": "Group instances of the group type.",
5186
+ "min": 0,
5187
+ "max": "*"
5188
+ }
4896
5189
  },
4897
5190
  "title": {
4898
5191
  "type": "string",
@@ -4930,6 +5223,7 @@
4930
5223
  "type": "object",
4931
5224
  "description": "Generic documentation labels that can be applied to most ORD information.\nThey are defined as an object that may have arbitrary keys.\nThe value of a key is an array of [CommonMark](https://spec.commonmark.org/) (Markdown) text.\n\nDocumentation Labels can be used to attach human readable documentation that cannot be expressed natively in ORD.\nA documentation tool (like an API Catalog) can use the documentation labels to provide generic documentation \"snippets\".\nDue to the given structure they can be displayed e.g. as tables.\n\nThe key of the documentation Label is plain-text (MUST not contain line breaks) and denotes the subject matter that is described.\nThe values (multiple can be provided for the same key) are [CommonMark](https://spec.commonmark.org/) (Markdown) text\nwhich describes the subject matter or lists options for the key.\n\nIn contrast to regular labels, documentation labels are not meant to be used to categorize or query information.",
4932
5225
  "x-introduced-in-version": "1.1.0",
5226
+ "x-ums-type": "custom",
4933
5227
  "patternProperties": {
4934
5228
  "^.*$": {
4935
5229
  "type": "array",
@@ -4950,6 +5244,7 @@
4950
5244
  "Extensible": {
4951
5245
  "title": "Extensible",
4952
5246
  "type": "object",
5247
+ "x-ums-type": "embedded",
4953
5248
  "description": "Contains information about the extensibility of this resource.\n\nIf applicable, a description and further resources about extending this resource are provided.",
4954
5249
  "properties": {
4955
5250
  "supported": {
@@ -4983,9 +5278,12 @@
4983
5278
  },
4984
5279
  "EntityTypeMapping": {
4985
5280
  "title": "Entity Type Mapping",
4986
- "x-introduced-in-version": "1.6.0",
4987
5281
  "type": "object",
4988
- "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 navigatable for customers.",
5282
+ "x-introduced-in-version": "1.6.0",
5283
+ "x-deprecated-in-version": "1.11.0",
5284
+ "x-deprecated": "Use the simplified `relatedEntityTypes` instead.",
5285
+ "x-ums-type": "custom",
5286
+ "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.",
4989
5287
  "properties": {
4990
5288
  "apiModelSelectors": {
4991
5289
  "type": "array",
@@ -5025,6 +5323,9 @@
5025
5323
  "ApiModelSelectorOData": {
5026
5324
  "title": "API Model Selector (OData)",
5027
5325
  "x-introduced-in-version": "1.6.0",
5326
+ "x-deprecated-in-version": "1.11.0",
5327
+ "x-deprecated": "Use the simplified `relatedEntityTypes` instead.\n\nFor creating a mapping from API model to Entity Types, consider using the [Entity Relationship](https://sap.github.io/csn-interop-specification/annotations/entity-relationship) annotations.",
5328
+ "x-ums-type": "custom",
5028
5329
  "type": "object",
5029
5330
  "description": "API Model Selector for OData, using entity set names for the selection.\n\nMUST only be used if the API Resource provides an API Resource Definition of type `edmx`.",
5030
5331
  "properties": {
@@ -5059,6 +5360,9 @@
5059
5360
  "ApiModelSelectorJsonPointer": {
5060
5361
  "title": "API Model Selector (JSON Pointer)",
5061
5362
  "x-introduced-in-version": "1.6.0",
5363
+ "x-deprecated-in-version": "1.11.0",
5364
+ "x-deprecated": "Use the simplified `relatedEntityTypes` instead.\n\nFor creating a mapping from API model to Entity Types, consider using the [Entity Relationship](https://sap.github.io/csn-interop-specification/annotations/entity-relationship) annotations.",
5365
+ "x-ums-type": "custom",
5062
5366
  "type": "object",
5063
5367
  "description": "Generic API Model Selector for JSON / YAML based resource definitions.\nIt uses a [JSON Pointer](https://datatracker.ietf.org/doc/html/rfc6901) that points to the\nentity type description within the resource definition.\n\nThe JSON Pointer always to refer to the structure of the document as originally provided, before further post-processing like resolving $ref properties.\n\nMUST only be used if the API Resource provides an API Resource Definition of media type `application/json` or `text/yaml`.",
5064
5368
  "properties": {
@@ -5092,11 +5396,14 @@
5092
5396
  }
5093
5397
  ]
5094
5398
  },
5095
- "RelatedEntityType": {
5096
- "title": "Related Entity Type",
5097
- "x-introduced-in-version": "1.9.0",
5399
+ "EntityTypeOrdIdTarget": {
5400
+ "title": "Entity Type Target (ORD ID)",
5401
+ "x-introduced-in-version": "1.6.0",
5402
+ "x-deprecated-in-version": "1.11.0",
5403
+ "x-deprecated": "Use the simplified `relatedEntityTypes` instead.",
5404
+ "x-ums-type": "custom",
5098
5405
  "type": "object",
5099
- "description": "Defines which Entity Type is related (via its ORD ID).\nIn the future, this could include stating the relationship type, too.",
5406
+ "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.",
5100
5407
  "properties": {
5101
5408
  "ordId": {
5102
5409
  "type": "string",
@@ -5116,11 +5423,35 @@
5116
5423
  ],
5117
5424
  "additionalProperties": false
5118
5425
  },
5119
- "EntityTypeOrdIdTarget": {
5120
- "title": "Entity Type Target (ORD ID)",
5426
+ "EntityTypeCorrelationIdTarget": {
5427
+ "title": "Entity Type Target (Correlation ID)",
5428
+ "type": "object",
5429
+ "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).",
5121
5430
  "x-introduced-in-version": "1.6.0",
5431
+ "x-deprecated-in-version": "1.11.0",
5432
+ "x-deprecated": "Use the simplified `relatedEntityTypes` instead.",
5433
+ "x-ums-type": "custom",
5434
+ "properties": {
5435
+ "correlationId": {
5436
+ "type": "string",
5437
+ "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):([a-zA-Z0-9._\\-\\/]+):([a-zA-Z0-9._\\-\\/]+)$",
5438
+ "maxLength": 255,
5439
+ "examples": [
5440
+ "sap.csnexposure:entity:Attachment"
5441
+ ]
5442
+ }
5443
+ },
5444
+ "required": [
5445
+ "correlationId"
5446
+ ],
5447
+ "additionalProperties": false
5448
+ },
5449
+ "RelatedEntityType": {
5450
+ "title": "Related Entity Type",
5451
+ "x-introduced-in-version": "1.9.0",
5452
+ "x-ums-type": "embedded",
5122
5453
  "type": "object",
5123
- "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.",
5454
+ "description": "Defines which Entity Type is related (via its ORD ID).\nIn the future, this could include stating the relationship type, too.",
5124
5455
  "properties": {
5125
5456
  "ordId": {
5126
5457
  "type": "string",
@@ -5140,29 +5471,35 @@
5140
5471
  ],
5141
5472
  "additionalProperties": false
5142
5473
  },
5143
- "EntityTypeCorrelationIdTarget": {
5144
- "title": "Entity Type Target (Correlation ID)",
5145
- "x-introduced-in-version": "1.6.0",
5474
+ "ExposedEntityType": {
5475
+ "title": "Exposed Entity Type",
5146
5476
  "type": "object",
5147
- "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).",
5477
+ "description": "Defines which Entity Type is exposed through (via its ORD ID).",
5478
+ "x-introduced-in-version": "1.11.0",
5479
+ "x-ums-type": "embedded",
5148
5480
  "properties": {
5149
- "correlationId": {
5481
+ "ordId": {
5150
5482
  "type": "string",
5151
- "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):([a-zA-Z0-9._\\-\\/]+):([a-zA-Z0-9._\\-\\/]+)$",
5483
+ "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.",
5484
+ "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):(entityType):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
5152
5485
  "maxLength": 255,
5153
5486
  "examples": [
5154
- "sap.csnexposure:entity:Attachment"
5487
+ "sap.s4.sot:entityType:BusinessPartner:v1"
5488
+ ],
5489
+ "x-association-target": [
5490
+ "#/definitions/EntityType/ordId"
5155
5491
  ]
5156
5492
  }
5157
5493
  },
5158
5494
  "required": [
5159
- "correlationId"
5495
+ "ordId"
5160
5496
  ],
5161
5497
  "additionalProperties": false
5162
5498
  },
5163
5499
  "Tombstone": {
5164
5500
  "type": "object",
5165
5501
  "title": "Tombstone",
5502
+ "x-ums-type": "ignore",
5166
5503
  "description": "A tombstone indicates that a previously published ORD resource or taxonomy has been removed / decommissioned.\nThis MUST be indicated explicitly, so ORD aggregators and consumers can learn about the removal.\n\nExactly one of the IDs MUST be provided to state which ORD resource or taxonomy item the Tombstone addresses.\n\nIt MUST be kept sufficiently long so that all ORD aggregators can learn about the tombstone.\nAfter that it MAY be removed.",
5167
5504
  "properties": {
5168
5505
  "ordId": {
@@ -5239,10 +5576,189 @@
5239
5576
  "removalDate": "2020-12-02T14:12:59Z"
5240
5577
  }
5241
5578
  ]
5579
+ },
5580
+ "OrdResource": {
5581
+ "type": "object",
5582
+ "title": "ORD Resource (abstract)",
5583
+ "x-abstract": true,
5584
+ "x-ums-type": "root",
5585
+ "description": "Abstract definition of shared properties across ORD Resources.",
5586
+ "properties": {
5587
+ "ordId": {
5588
+ "type": "string",
5589
+ "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.",
5590
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):(apiResource|eventResource|capability|dataProduct):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*|)$",
5591
+ "maxLength": 255,
5592
+ "examples": []
5593
+ },
5594
+ "localId": {
5595
+ "type": "string",
5596
+ "x-introduced-in-version": "1.2.1",
5597
+ "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.",
5598
+ "maxLength": 255,
5599
+ "examples": []
5600
+ },
5601
+ "correlationIds": {
5602
+ "type": "array",
5603
+ "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).",
5604
+ "items": {
5605
+ "type": "string",
5606
+ "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):([a-zA-Z0-9._\\-\\/]+):([a-zA-Z0-9._\\-\\/]+)$",
5607
+ "maxLength": 255
5608
+ },
5609
+ "examples": []
5610
+ },
5611
+ "title": {
5612
+ "type": "string",
5613
+ "description": "Human-readable title.\n\nMUST NOT exceed 255 chars.\nMUST NOT contain line breaks.",
5614
+ "minLength": 1,
5615
+ "maxLength": 255,
5616
+ "examples": []
5617
+ },
5618
+ "shortDescription": {
5619
+ "type": "string",
5620
+ "description": "Plain text short description.\n\nMUST NOT exceed 255 chars.\nMUST NOT contain line breaks.",
5621
+ "minLength": 1,
5622
+ "maxLength": 255,
5623
+ "examples": []
5624
+ },
5625
+ "description": {
5626
+ "type": "string",
5627
+ "minLength": 1,
5628
+ "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.",
5629
+ "examples": []
5630
+ },
5631
+ "partOfPackage": {
5632
+ "type": "string",
5633
+ "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):(package):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
5634
+ "x-association-target": [
5635
+ "#/definitions/Package/ordId"
5636
+ ],
5637
+ "x-reverse-relationship": null,
5638
+ "maxLength": 255,
5639
+ "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.",
5640
+ "examples": []
5641
+ },
5642
+ "partOfGroups": {
5643
+ "type": "array",
5644
+ "items": {
5645
+ "type": "string",
5646
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-\\/]+):([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-\\/]+)$",
5647
+ "x-association-target": [
5648
+ "#/definitions/Group/groupId"
5649
+ ]
5650
+ },
5651
+ "x-reverse-relationship": {
5652
+ "propertyName": "ordResourceMembers",
5653
+ "description": "The ORD resources that are part the given Group.",
5654
+ "min": 0,
5655
+ "max": "*"
5656
+ },
5657
+ "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.",
5658
+ "examples": []
5659
+ },
5660
+ "version": {
5661
+ "type": "string",
5662
+ "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.",
5663
+ "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-]+)*))?$",
5664
+ "examples": [
5665
+ "1.2.3",
5666
+ "1.0.0-alpha.1"
5667
+ ]
5668
+ },
5669
+ "lastUpdate": {
5670
+ "type": "string",
5671
+ "format": "date-time",
5672
+ "x-introduced-in-version": "1.4.0",
5673
+ "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.",
5674
+ "examples": [
5675
+ "2022-12-19T15:47:04+00:00"
5676
+ ]
5677
+ },
5678
+ "visibility": {
5679
+ "type": "string",
5680
+ "description": "The visibility states who is allowed to \"see\" the described resource or capability.",
5681
+ "oneOf": [
5682
+ {
5683
+ "const": "public",
5684
+ "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)."
5685
+ },
5686
+ {
5687
+ "const": "internal",
5688
+ "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."
5689
+ },
5690
+ {
5691
+ "const": "private",
5692
+ "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."
5693
+ }
5694
+ ]
5695
+ },
5696
+ "releaseStatus": {
5697
+ "type": "string",
5698
+ "description": "The `releaseStatus` specifies the stability of the resource and its external contract.",
5699
+ "oneOf": [
5700
+ {
5701
+ "const": "active",
5702
+ "description": "Resource is meant for productive use and provides a stable API contract."
5703
+ },
5704
+ {
5705
+ "const": "beta",
5706
+ "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."
5707
+ },
5708
+ {
5709
+ "const": "deprecated",
5710
+ "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)."
5711
+ }
5712
+ ],
5713
+ "examples": [
5714
+ "active"
5715
+ ]
5716
+ },
5717
+ "links": {
5718
+ "type": "array",
5719
+ "description": "Generic links with arbitrary meaning and content.\n\n`packageLinks` MUST be preferred if applicable.",
5720
+ "items": {
5721
+ "$ref": "#/definitions/Link"
5722
+ }
5723
+ },
5724
+ "tags": {
5725
+ "type": "array",
5726
+ "items": {
5727
+ "type": "string",
5728
+ "pattern": "^[a-zA-Z0-9-_.\\/ ]*$",
5729
+ "minLength": 1
5730
+ },
5731
+ "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.",
5732
+ "examples": [
5733
+ [
5734
+ "storage",
5735
+ "high-availability"
5736
+ ]
5737
+ ]
5738
+ },
5739
+ "labels": {
5740
+ "$ref": "#/definitions/Labels",
5741
+ "description": "Generic labels that can be applied to most ORD information."
5742
+ },
5743
+ "documentationLabels": {
5744
+ "$ref": "#/definitions/DocumentationLabels",
5745
+ "description": "Generic documentation labels that can be applied to most ORD information."
5746
+ }
5747
+ },
5748
+ "required": [
5749
+ "ordId",
5750
+ "title",
5751
+ "description",
5752
+ "version",
5753
+ "visibility",
5754
+ "releaseStatus",
5755
+ "partOfPackage"
5756
+ ],
5757
+ "additionalProperties": true
5242
5758
  }
5243
5759
  },
5244
- "title": "ORD Document",
5245
5760
  "type": "object",
5761
+ "x-ums-type": "ignore",
5246
5762
  "properties": {
5247
5763
  "$schema": {
5248
5764
  "type": "string",
@@ -5272,10 +5788,11 @@
5272
5788
  "1.7",
5273
5789
  "1.8",
5274
5790
  "1.9",
5275
- "1.10"
5791
+ "1.10",
5792
+ "1.11"
5276
5793
  ],
5277
5794
  "examples": [
5278
- "1.10"
5795
+ "1.11"
5279
5796
  ]
5280
5797
  },
5281
5798
  "description": {
@@ -5301,7 +5818,12 @@
5301
5818
  "policyLevel": {
5302
5819
  "type": "string",
5303
5820
  "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",
5304
- "oneOf": [
5821
+ "anyOf": [
5822
+ {
5823
+ "type": "string",
5824
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
5825
+ "description": "Any valid [Specification ID](../index.md#specification-id)."
5826
+ },
5305
5827
  {
5306
5828
  "const": "none",
5307
5829
  "description": "No policy level chosen. Only the base rules on how to create correct ORD documents apply."
@@ -5433,6 +5955,7 @@
5433
5955
  "groups": {
5434
5956
  "type": "array",
5435
5957
  "description": "Array of all Groups that are described in this ORD document.",
5958
+ "x-introduced-in-version": "1.9.0",
5436
5959
  "items": {
5437
5960
  "$ref": "#/definitions/Group"
5438
5961
  }
@@ -5440,6 +5963,7 @@
5440
5963
  "groupTypes": {
5441
5964
  "type": "array",
5442
5965
  "description": "Array of all Group Types that are described in this ORD document.",
5966
+ "x-introduced-in-version": "1.9.0",
5443
5967
  "items": {
5444
5968
  "$ref": "#/definitions/GroupType"
5445
5969
  }