diff --git a/doc/images/vendor-ext/aef_profile.png b/doc/images/vendor-ext/aef_profile.png new file mode 100644 index 0000000000000000000000000000000000000000..1ad4b8484083b875e758fd8ff99706211fb6cbe4 Binary files /dev/null and b/doc/images/vendor-ext/aef_profile.png differ diff --git a/doc/images/vendor-ext/aef_profile_2.png b/doc/images/vendor-ext/aef_profile_2.png new file mode 100644 index 0000000000000000000000000000000000000000..272e4df47a61067132b255be02a0bb52a01cc290 Binary files /dev/null and b/doc/images/vendor-ext/aef_profile_2.png differ diff --git a/doc/images/vendor-ext/publish_supported_features.png b/doc/images/vendor-ext/publish_supported_features.png new file mode 100644 index 0000000000000000000000000000000000000000..7f90a1faa35b9588d76fad3f6aaf4f80549a6386 Binary files /dev/null and b/doc/images/vendor-ext/publish_supported_features.png differ diff --git a/doc/images/vendor-ext/publish_supported_features_2.png b/doc/images/vendor-ext/publish_supported_features_2.png new file mode 100644 index 0000000000000000000000000000000000000000..30d0b63edab331eab32498f6979c75613e0fdf5a Binary files /dev/null and b/doc/images/vendor-ext/publish_supported_features_2.png differ diff --git a/doc/images/vendor-ext/service_api_description.png b/doc/images/vendor-ext/service_api_description.png new file mode 100644 index 0000000000000000000000000000000000000000..cf24a10d99932b5cf93e15261590eee965ddec5d Binary files /dev/null and b/doc/images/vendor-ext/service_api_description.png differ diff --git a/doc/images/vendor-ext/service_api_description_2.png b/doc/images/vendor-ext/service_api_description_2.png new file mode 100644 index 0000000000000000000000000000000000000000..4ed046494a984198f1b64e97ee56ffe131bd6efd Binary files /dev/null and b/doc/images/vendor-ext/service_api_description_2.png differ diff --git a/doc/vendor-ext/vendor-ext.md b/doc/vendor-ext/vendor-ext.md index 2e3822a893e370cffa6df0e45aab8d0f9ef539e2..bcf78cbf9a6e4c4fd607d0ca0c4b163cb95f4ca0 100644 --- a/doc/vendor-ext/vendor-ext.md +++ b/doc/vendor-ext/vendor-ext.md @@ -1,6 +1,189 @@ # Vendor Extensibility +Mechanism for the APIs to re-use, extend their functionalities and data models and engage with third-party API frameworks (e.g. ETSI MEC) + +Vendor specific extensions are defined on 3GPP TS 29.122 (section 5.2.13) and 29.500 (section 6.6.3) and is tightly connected with "supported-features†and "feature negotiation" procedures. + +## Vendor Extensibility in CAPIF: +Vendor Extensibility is a feature focused on the APIs that are published and exposed via CAPIF. +As a result, the feature is supported by the ServiceAPIDescription object (and any other objects embeded on it e.g. AefProfile). In the figure below, depicting all supported features of ServiceAPIDescription, +VendExt feature is noted, which enables vendor-specific extension in the body of the specific object. + + + +Vendor extensibility feature can be enabled and leveraged in 2 CAPIF APIs, Publish and Discover. + +## Vendor Extensibility in CAPIF APIs + +### Publish API +A vendor can extend the ServiceAPIDescription object by adding additional member elements. However, in order to avoid duplication of member names inside a same object +it is necessary to comply with a naming scheme for vendor-specific data elements, to avoid clashing names between vendors. +Vendor-specific member names in JSON objects shall be named in the following manner: +``` + "vendorSpecific-nnnnnnnnn": { + ... + } +``` + +where the value "nnnnnn" can be: + +1. 6-digit IANA-assigned enterprise code: + +``` + "vendorSpecific-010415": { + ... + } +``` + +2. domain name: + + +``` +"vendorSpecific-3gpp.org": { + ... + } +``` + +3. URN: + + +``` +"vendorSpecific-urn:3gpp:example": { + ... + } +``` + +A concrete example of vendor-specific extensibility exists on section 9 of ETSI GS MEC 011 V3.2.1, where ETSI MEC extends the ServiceAPIDescription as depicted on the following two figures. + + + + + +**Example:** + +ServiceAPIDescription vendorSpecific looks like: + +```json +"vendorSpecific-urn:etsi:mec:capifext:service-info": { + "serializer": "JSON", + "state": "ACTIVE", + "scopeOfLocality": "MEC_SYSTEM", + "consumedLocalOnly": "True", + "isLocal": "True", + "category": { + "href": "https://www.location.com", + "id": "location_1", + "name": "Location", + "version": "1.0" + } +} +``` + +AEFProfile vendorSpecific looks like: + +```json +"vendorSpecific-urn:etsi:mec:capifext:transport-info": { + "name": "trasport1", + "description": "Transport Info 1", + "type": "REST_HTTP", + "protocol": "HTTP", + "version": "2", + "security": { + "grantTypes": "OAUTH2_CLIENT_CREDENTIALS", + "tokenEndpoint": "https://token-endpoint/" + } +} +``` + +Complete ETSI MEC ServiceAPIDescription with vendor extensibility would be like this: + +```json +{ + "apiName": "service_1", + "vendorSpecific-urn:etsi:mec:capifext:service-info": { + "serializer": "JSON", + "state": "ACTIVE", + "scopeOfLocality": "MEC_SYSTEM", + "consumedLocalOnly": "True", + "isLocal": "True", + "category": { + "href": "https://www.location.com", + "id": "location_1", + "name": "Location", + "version": "1.0" + } + }, + "aefProfiles": [ + { + "aefId": "string", + "vendorSpecific-urn:etsi:mec:capifext:transport-info": { + "name": "trasport1", + "description": "Transport Info 1", + "type": "REST_HTTP", + "protocol": "HTTP", + "version": "2", + "security": { + "grantTypes": "OAUTH2_CLIENT_CREDENTIALS", + "tokenEndpoint": "https://token-endpoint/" + } + }, + "versions": [ + {} + ], + "protocol": "HTTP_1_1", + "dataFormat": "JSON", + "securityMethods": ["PSK"], + "interfaceDescriptions": [ + { + "ipv4Addr": "string", + "port": 65535, + "securityMethods": ["PSK"] + } + ] + } + ], + "description": "string", + "supportedFeatures": "0", + "shareableInfo": { + "isShareable": true, + "capifProvDoms": [ + "string" + ] + }, + "serviceAPICategory": "string", + "apiSuppFeats": "fffff", + "pubApiPath": { + "ccfIds": [ + "string" + ] + }, + "ccfId": "string" +} +``` + +### Discover API + +In order to use vendor-specific fields as filters in Discover API, vendor-specific query parameter shall be encoded as follows: + +```json +https://{{CAPIF_HOSTNAME}}:{{CAPIF_PORT}}/{{DISCOVER_URL}}? + ... + vend-spec-<query parameter name>={ + "target": <string that contains the JSON pointer to the attribute in the resource representation>, + "value": <query parameter value> +} +``` + +**Example:** +```json + https://{{CAPIF_HOSTNAME}}:{{CAPIF_PORT}}/{{DISCOVER_URL}}? + ... + vend-spec-type={ + "target": "/vendorSpecific-urn:etsi:mec:capifext:transport-info", + "value": "REST_HTTP" + } +``` + -DOC:Work in Progress [OCF Web]: https://ocf.etsi.org/ "OCF Web"