From dbf4499dca4c16c9f194f816599f0b43356ea6a3 Mon Sep 17 00:00:00 2001 From: DenisGNoonan Date: Thu, 25 Apr 2024 18:28:38 +0100 Subject: [PATCH] NONRTRIC-946: Servicemanager - Add Read The Docs Issue-ID: NONRTRIC-946 Change-Id: Ia2492fae5de82dffb86b2a846e021fbb0c80955a Signed-off-by: DenisGNoonan --- README.md | 7 +- capifcore/README.md | 4 + docs/developer-guide.rst | 13 +- docs/overview.rst | 126 ++++- docs/release-notes.rst | 52 +- postman/CAPIF.postman_collection.json | 453 +++++++++++++++ postman/ServiceManager.postman_collection.json | 730 +++++++++++++++++++++++++ servicemanager/README.md | 12 +- 8 files changed, 1353 insertions(+), 44 deletions(-) create mode 100644 postman/CAPIF.postman_collection.json create mode 100644 postman/ServiceManager.postman_collection.json diff --git a/README.md b/README.md index 47afecb..d9c56f7 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,8 @@ ========================LICENSE_START================================= O-RAN-SC %% - Copyright (C) 2022: Nordix Foundation + Copyright (C) 2022-2023: Nordix Foundation + Copyright (C) 2024 OpenInfra Foundation Europe. All rights reserved. %% Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -22,5 +23,5 @@ # O-RAN-SC Non-RealTime RIC Service Management and Exposure -See [CAPIF Core](capifcore/README.md) - +* [CAPIF Core](capifcore/README.md) +* [Service Manager](servicemanager/README.md) diff --git a/capifcore/README.md b/capifcore/README.md index efea28e..47b52c3 100644 --- a/capifcore/README.md +++ b/capifcore/README.md @@ -114,3 +114,7 @@ Use docker compose file to start CAPIF core together with Keycloak: Before using CAPIF API invoker management, an invoker realm must be created in keycloak. Make sure it is created before running CAPIF core. After creating the realm in keycloak, set the name in the keycloak.yaml configuration file. To run CAPIF Core as a K8s pod together with ChartMuseum, start and stop scripts are provided. The pod configurations are provided in the `configs` folder. CAPIF Core is then available on port `31570`. + +## Postman + +A Postman collection has been included in this repo at sme/postman/CAPIF.postman_collection.json. \ No newline at end of file diff --git a/docs/developer-guide.rst b/docs/developer-guide.rst index 06efe14..0bbf325 100644 --- a/docs/developer-guide.rst +++ b/docs/developer-guide.rst @@ -1,12 +1,13 @@ .. This work is licensed under a Creative Commons Attribution 4.0 International License. .. SPDX-License-Identifier: CC-BY-4.0 -.. Copyright (C) 2022 Nordix +.. Copyright (C) 2022-2023 Nordix +.. Copyright (C) 2024 OpenInfra Foundation Europe. All rights reserved. + Developer Guide =============== -This document provides a quick start for developers of the Non-RT RIC Service Management & Exposure. - -Additional developer guides are available on the `O-RAN SC NONRTRIC Developer wiki `_. - -To build and run the CAPIF Core implementation, see the README.md file in the "capifcore" folder. +* This document provides a quick start for developers of the Non-RT RIC Service Management & Exposure. +* Additional developer guides are available on the `O-RAN SC NONRTRIC Developer wiki `_. +* To build and run the CAPIF Core implementation, see the README.md file in the "capifcore" folder. +* To build and run the Service Manager implementation, see the README.md file in the "servicemanager" folder. diff --git a/docs/overview.rst b/docs/overview.rst index eb13450..34053d5 100644 --- a/docs/overview.rst +++ b/docs/overview.rst @@ -1,12 +1,14 @@ .. This work is licensed under a Creative Commons Attribution 4.0 International License. .. SPDX-License-Identifier: CC-BY-4.0 .. Copyright (C) 2023 Nordix +.. Copyright (C) 2024 OpenInfra Foundation Europe. All rights reserved. ############# Overview ############# -Within Service Management and Exposure the CAPIF Core product is developed. It resides in the "capifcore" folder. +Service Management and Exposure has 2 components - CAPIF Core and Service Manager. Capifcore is found in the "capifcore" directory, +and Service Manager is in the "servicemanager" directory. This product is a part of :doc:`NONRTRIC `. @@ -17,11 +19,11 @@ CAPIF Introduction ************ -CAPIF stands for Common API framework and it was developed by 3GPP to enable a unified Northbound API framework across 3GPP network functions, and to ensure that there is a single and harmonized approach for API development. +CAPIF stands for Common API Framework and it was developed by 3GPP to enable a unified Northbound API framework across 3GPP network functions, and to ensure that there is a single and harmonized approach for API development. -Key features in capif includes onboarding and offloading of application functions, service discovery and management, event subscription and notification as well as authorization and authentication. +Key features in CAPIF includes onboarding and offloading of application functions, service discovery and management, event subscription and notification as well as authorization and authentication. -It was delivered in Rel-15 (Refer to 3GPP TS 23.222 and 3GPP TS 29.222) +It was delivered in Rel-15 (Refer to 3GPP TS 23.222 and 3GPP TS 29.222). Functional entities =================== @@ -48,7 +50,7 @@ The CAPIF core functions support the API invokers to access the service APIs. It API Invoker ~~~~~~~~~~~ -The API invoker is the entity which invokes the CAPIF or service APIs, typically provided by a 3rd party application provider who has service agreement with PLMN operator. +The API invoker is the entity which invokes the CAPIF or service APIs, typically provided by a 3rd party application provider. The API invoker supports the following capabilities: @@ -73,16 +75,16 @@ CAPIF core function APIs ************************ * **CAPIF_Discover_Service_API** API: This API enables the API invoker to communicate with the CAPIF core function to discover the published service API information. -* **CAPIF_Publish_Service_API** API:This API enables the API publishing function to communicate with the CAPIF core function to publish the service API information and manage the published service API information. +* **CAPIF_Publish_Service_API** API: This API enables the API publishing function to communicate with the CAPIF core function to publish the service API information and manage the published service API information. * **CAPIF_Events** API: This API enables the API subscribing entity to communicate with the CAPIF core function to subscribe to and unsubscribe from CAPIF events and receive subsequent notification of CAPIF events. This API is used for the subscription to and notifications of those CAPIF events that are not bound to any of the other CAPIF core function APIs. -* **CAPIF_API_invoker_management** API: This API enables the API invoker to communicate with the CAPIF core function to enroll as a registered user of CAPIF and manage the enrollment information. +* **CAPIF_API_Invoker_Management** API: This API enables the API invoker to communicate with the CAPIF core function to enroll as a registered user of CAPIF and manage the enrollment information. * **CAPIF_Security** API:This API enables the API invoker to communicate with the CAPIF core function to authenticate and obtain authorization to access service APIs. * **CAPIF_Monitoring** API: This API enables the API management function to communicate with the CAPIF core function to subscribe to and unsubscribe from CAPIF events related to monitoring and receive subsequent notification of CAPIF monitoring events. * **CAPIF_Logging_API_Invocation** API: This API enables the API exposing function to communicate with the CAPIF core function to log the information related to service API invocation. * **CAPIF_Auditing** API: This API enables the API management function to communicate with the CAPIF core function to retrieve the log information related to service API invocation. * **CAPIF_Access_Control_Policy** API: This API enables the API exposing function to obtain the policy to perform access control on the service API invocations. * **CAPIF_Routing_Info** API: This API enables the API exposing function to obtain the routing information to forward the API invocation to another API exposing function. -* **CAPIF_API_provider_management** API: This API enables the API Management Function to communicate with the CAPIF core function to register the API provider domain functions as authorized users of the CAPIF functionalities. +* **CAPIF_API_Provider_Management** API: This API enables the API Management Function to communicate with the CAPIF core function to register the API provider domain functions as authorized users of the CAPIF functionalities. The table below lists the CAPIF Core Function APIs. @@ -143,7 +145,7 @@ The table below lists the CAPIF Core Function APIs. Security in CAPIF ***************** -CAPIF establish security requeriments for all the interfaces defined in the specification. There are also security requeriments that are applicable to all CAPIF entities, such as: +CAPIF establishes security requirements for all the interfaces defined in the specification. There are also security requirements that are applicable to all CAPIF entities, such as: - CAPIF shall provide mechanisms to hide the topology of the PLMN trust domain from the API invokers accessing the service APIs from outside the PLMN trust domain. - CAPIF shall provide mechanisms to hide the topology of the 3rd party API provider trust domain from the API invokers accessing the service APIs from outside the 3rd party API provider trust domain. @@ -183,4 +185,108 @@ The CAPIF core function shall select a security method to be used over CAPIF-2/2 API discovery ~~~~~~~~~~~~~ -After successful authentication between API invoker and CAPIF core function, the CAPIF core function shall decide whether the API invoker is authorized to perform discovery based on API invoker ID and discovery policy. \ No newline at end of file +After successful authentication between API invoker and CAPIF core function, the CAPIF core function shall decide whether the API invoker is authorized to perform discovery based on API invoker ID and discovery policy. + +Postman +******* + +A Postman collection has been included in this repo at sme/postman/CAPIF.postman_collection.json. + +*************** +Service Manager +*************** + +Service Manager, CAPIF and Kong +******************************* + +Service Manager builds on CAPIF and depends on the Kong API Gateway. CAPIF stands for Common API Framework and it was developed by 3GPP to enable a unified Northbound API framework across 3GPP network functions, and to ensure that there is a single and harmonized approach for API development. +Among CAPIF's key features are the following. + +* Register/deregister APIs +* Publishing Service APIs +* Onboarding/offboarding API invoker +* Discovery APIs +* CAPIF events subscription/notification +* Entity authentication/authorization +* Support for 3rd party domains i.e., allow 3rd party API providers to leverage the CAPIF framework +* Support interconnection between two CAPIF providers + +Service Manager and CAPIF APIs +****************************** + +CAPIF (Common API Framework) is defined in 3GPP TS 29.222. Service Manager implements a subset of the CAPIF APIs to provide the following APIs. + +* Register/deregister APIs +* Publishing Service APIs +* Onboarding/offboarding API invoker +* Discovery APIs + +If you only need the above APIs, then Service Manager is a plugin-in replacement for CAPIF. + +CAPIF APIs implemented by Service Manager +***************************************** + +* **CAPIF_API_Provider_Management** API: This API enables the API Management Function to communicate with the CAPIF core function to register the API provider domain functions. +* **CAPIF_Publish_Service_API** API:This API enables the API publishing function to communicate with the CAPIF core function to publish the service API information and manage the published service API information. +* **CAPIF_API_Invoker_Management** API: This API enables the API invoker to communicate with the CAPIF core function to enroll as a registered user of CAPIF and manage the enrollment information. +* **CAPIF_Discover_Service_API** API: This API enables the API invoker to communicate with the CAPIF core function to discover the published service API information. + ++-----------------------------------+------------------------------+----------------------------------------------+----------------------------------------------------------------------------------------+ +| **Service Name** | **Service Operations** | **Operation Semantics** | **Consumer(s)** | ++-----------------------------------+------------------------------+----------------------------------------------+----------------------------------------------------------------------------------------+ +| CAPIF_API_Provider_Management_API | Register_API_Provider | POST /registrations | API Management Function | ++ +------------------------------+----------------------------------------------+----------------------------------------------------------------------------------------+ +| | Update_API_Provider | PUT /registrations/{registrationId} | API Management Function | ++ +------------------------------+----------------------------------------------+----------------------------------------------------------------------------------------+ +| | Deregister_API_Provider | DELETE /registrations/{registrationId} | API Management Function | ++-----------------------------------+------------------------------+----------------------------------------------+----------------------------------------------------------------------------------------+ +| CAPIF_Publish_Service_API | Publish_Service_API | POST /{apfId}/service-apis | API Publishing Function, CAPIF core function | ++ +------------------------------+----------------------------------------------+----------------------------------------------------------------------------------------+ +| | Unpublish_Service_API | DELETE /{apfId/service-apis/{serviceApiId} | API Publishing Function, CAPIF core function | ++ +------------------------------+----------------------------------------------+----------------------------------------------------------------------------------------+ +| | Update_Service_API | PUT /{apfId/service-apis/{serviceApiId} | API Publishing Function, CAPIF core function | ++ +------------------------------+----------------------------------------------+----------------------------------------------------------------------------------------+ +| | Get_Service_API | GET /{apfId}/service-apis | API Publishing Function, CAPIF core function | ++-----------------------------------+------------------------------+----------------------------------------------+----------------------------------------------------------------------------------------+ +| CAPIF_API_Invoker_Management_API | Onboard_API_Invoker | POST /onboardedInvokers | API Invoker | ++ +------------------------------+----------------------------------------------+----------------------------------------------------------------------------------------+ +| | Offboard_API_Invoker | DELETE /onboardedInvokers/{onboardingId} | API Invoker | ++ +------------------------------+----------------------------------------------+----------------------------------------------------------------------------------------+ +| | Notify_Onboarding_Completion | Subscribe/Notify | API Invoker | ++ +------------------------------+----------------------------------------------+----------------------------------------------------------------------------------------+ +| | Update_API_Invoker_Details | PUT /onboardedInvokers/{onboardingId} | API Invoker | +| +------------------------------+----------------------------------------------+----------------------------------------------------------------------------------------+ +| | Notify_Update_Completion | Subscribe/Notify | API Invoker | ++-----------------------------------+------------------------------+----------------------------------------------+----------------------------------------------------------------------------------------+ +| CAPIF_Discover_Service_API | Discover_Service_API | GET /allServiceAPIs | API Invoker, CAPIF core function | ++-----------------------------------+------------------------------+----------------------------------------------+----------------------------------------------------------------------------------------+ + +Generation of CAPIF OpenAPI Code +******************************** + +* The CAPIF APIs are generated from the OpenAPI specifications provided by 3GPP. +* The generate.sh script downloads the specifications from 3GPP, fixes them and then generates the APIs. +* The specifications are downloaded from https://www.3gpp.org/ftp/Specs/archive/29_series. + +Service Manager Integration with Kong +************************************* + +* Service Manager is a Go implementation of a service that builds on CAPIF Core and integrates with Kong. +* When publishing a service through Service Manager, we create a Kong service and Kong route. +* The JSON element that we return in the response body is updated to point to the Kong data plane. Therefore, the API interface that we return from Service Discovery has the Kong host and port, and not the original service's host and port. +* The rApp can only access the Published function through Service Manager. It cannot access the Published function directly. +* We use Kong as a reverse proxy. Instead of calling the Publishing service directly, our Invoker's API request is proxied through Kong. This gives us the advantages of using a proxied service, such as providing caching and load balancing. +* When service invocations are routed through Kong, in an R1 SME scenario where services are selectively exposed to rApps, the Kong API gateway can be used to enforce R1 SME exposure & access. This can be achieved by restricting rApps to have access only to the Kong API gateway, and so only services exposed to the rApps through the API gateway can be accessed. + +Service Manager Deployment +************************** + +* We have a stand-alone deployment and a deployment as part of NONRTRIC. +* We use the NONRTRIC deployment from the Git repo at https://gerrit.o-ran-sc.org/r/admin/repos/it/dep. +* The stand-alone deployment is in this repo at sme/servicemanager/deploy. Please see the Service Manager README. +* The Service Manager configuration is stored in a config file, ``.env``. +* For both the stand-alone and it/dep deployments, ``.env`` is volume-mounted into the Docker container from a Kubernetes config map at container run-time. + +Postman +******* +A Postman collection has been included in this repo at sme/postman/ServiceManager.postman_collection.json. \ No newline at end of file diff --git a/docs/release-notes.rst b/docs/release-notes.rst index c3f22e5..f620893 100644 --- a/docs/release-notes.rst +++ b/docs/release-notes.rst @@ -1,7 +1,7 @@ .. This work is licensed under a Creative Commons Attribution 4.0 International License. .. http://creativecommons.org/licenses/by/4.0 .. Copyright (C) 2022-2023 Nordix Foundation. All rights reserved -.. Copyright (C) 2023 CloudInfra Foundation Europe. All rights reserved +.. Copyright (C) 2023-2024 OpenInfra Foundation Europe. All rights reserved. ============= Release-Notes @@ -10,26 +10,36 @@ Release-Notes This document provides the release notes for the Non-RT RIC Service Management & Exposure (SME). -Version history SME capifcore +Version history SME CAPIFcore ============================= -+------------+----------+------------------+-----------------+ -| **Date** | **Ver.** | **Author** | **Comment** | -| | | | | -+------------+----------+------------------+-----------------+ -| 2022-12-14 | 1.0.0 | Henrik Andersson | G Release | -| | | | Initial version | -| | | | of capifcore | -+------------+----------+------------------+-----------------+ -| 2023-02-10 | 1.0.1 | Yennifer Chacon | G Maintenance | -| | | | Release | -+------------+----------+------------------+-----------------+ -| 2023-06-16 | 1.1.0 | Yennifer Chacon | H Release | -| | | | | -+------------+----------+------------------+-----------------+ -| 2023-12-15 | 1.2.0 | John Keeney | I Release | -| | | | | -+------------+----------+------------------+-----------------+ ++------------+----------+------------------+--------------------------------------+ +| **Date** | **Ver.** | **Author** | **Comment** | +| | | | | ++------------+----------+------------------+--------------------------------------+ +| 2022-12-14 | 1.0.0 | Henrik Andersson | G Release | +| | | | Initial version of Capifcore | +| | | | | ++------------+----------+------------------+--------------------------------------+ +| 2023-02-10 | 1.0.1 | Yennifer Chacon | G Maintenance | +| | | | Release | ++------------+----------+------------------+--------------------------------------+ +| 2023-06-16 | 1.1.0 | Yennifer Chacon | H Release | +| | | | | ++------------+----------+------------------+--------------------------------------+ +| 2023-12-15 | 1.2.0 | John Keeney | I Release | +| | | | | ++------------+----------+------------------+--------------------------------------+ + +Version history SME Service Manager +=================================== + ++------------+----------+------------------+--------------------------------------+ +| **Date** | **Ver.** | **Author** | **Comment** | +| | | | | ++------------+----------+------------------+--------------------------------------+ +| TBA | | | Initial release of Service Manager | ++------------+----------+------------------+--------------------------------------+ Release Data ============ @@ -50,7 +60,7 @@ G Release | **Release date** | 2022-12-14 | | | | +-----------------------------+---------------------------------------------------+ -| **Purpose of the delivery** | Introduction of capifcore | +| **Purpose of the delivery** | Introduction of Capifcore | | | | +-----------------------------+---------------------------------------------------+ @@ -70,7 +80,7 @@ G Maintenance | **Release date** | 2023-02-10 | | | | +-----------------------------+---------------------------------------------------+ -| **Purpose of the delivery** | Refactor and improvements of capifcore | +| **Purpose of the delivery** | Refactor and improvements of Capifcore | | | | +-----------------------------+---------------------------------------------------+ diff --git a/postman/CAPIF.postman_collection.json b/postman/CAPIF.postman_collection.json new file mode 100644 index 0000000..ef139b7 --- /dev/null +++ b/postman/CAPIF.postman_collection.json @@ -0,0 +1,453 @@ +{ + "info": { + "_postman_id": "1bdb5498-440f-4bdd-ad8d-bea853343cdc", + "name": "CAPIF", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", + "_exporter_id": "30653024" + }, + "item": [ + { + "name": "1. Register provider Domain", + "item": [ + { + "name": "1.- rApp registers as provider domain", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"apiProvDomInfo\": \"Provider domain\",\n \"apiProvFuncs\": [\n {\n \"apiProvFuncInfo\": \"rApp as APF\",\n \"apiProvFuncRole\": \"APF\",\n \"regInfo\": {\n \"apiProvPubKey\": \"APF-PublicKey\"\n }\n },\n {\n \"apiProvFuncInfo\": \"rApp as AEF\",\n \"apiProvFuncRole\": \"AEF\",\n \"regInfo\": {\n \"apiProvPubKey\": \"AEF-PublicKey\"\n }\n },\n {\n \"apiProvFuncInfo\": \"rApp as AMF\",\n \"apiProvFuncRole\": \"AMF\",\n \"regInfo\": {\n \"apiProvPubKey\": \"AMF-PublicKey\"\n }\n },\n {\n \"apiProvFuncInfo\": \"Gateway as entrypoint AEF\",\n \"apiProvFuncRole\": \"AEF\",\n \"regInfo\": {\n \"apiProvPubKey\": \"AEF-Gateway-PublicKey\"\n }\n }\n ],\n \"regSec\": \"PSK\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://localhost:8090/api-provider-management/v1/registrations", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8090", + "path": [ + "api-provider-management", + "v1", + "registrations" + ] + }, + "description": "StartFragment\n\nRegisters a new API Provider domain with API provider domain functions profiles.\n\nEndFragme" + }, + "response": [] + } + ], + "description": "The CAPIF API provider management APIs, as defined in 3GPP TS 23.222 \\[2\\], allow API management functions via CAPIF-5 and CAPIF-5e reference points to register, deregister and update registration information of API provider domain functions (API Exposing Function, API Publishing Function, API management Function) as a recognized API provider domain of the CAPIF domain.\n\n| Service operation name | Description |\n| --- | --- |\n| Register_API_Provider | This service operation is used by an API management function to register API provider domain functions as a recognized API provider domain of the CAPIF domain. |\n| Update_API_Provider | This service operation is used by an API management function to update the API provider domain functions details in the CAPIF domain. |\n| Deregister_API_Provider | This service operation is used by an API management function to deregister API provider domain functions as a recognized API provider domain of the CAPIF domain. |" + }, + { + "name": "2. Publish APIs", + "item": [ + { + "name": "1. rApp publishes its API example A", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"apiName\": \"example A\",\n \"description\": \"Example A API of rApp\",\n \"aefProfiles\": [\n {\n \"aefId\": \"AEF_id_rApp_as_AEF\",\n \"description\": \"Example A rApp as AEF\",\n \"versions\": [\n {\n \"apiVersion\": \"v1\",\n \"resources\": [\n {\n \"resourceName\": \"exampleA\",\n \"commType\": \"REQUEST_RESPONSE\",\n \"uri\": \"/exampleA/subscription/subscription_id_1\",\n \"operations\": [\n \"GET\"\n ]\n }\n ]\n }\n ],\n \"protocol\": \"HTTP_1_1\",\n\t\t\t\"securityMethods\": [\"PSK\"],\n\t\t\t\"interfaceDescriptions\": [\n\t\t\t\t{\n\t\t\t\t \"ipv4Addr\": \"string\",\n\t\t\t\t \"port\": 65535,\n\t\t\t\t \"securityMethods\": [\"PKI\"]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t \"ipv4Addr\": \"string\",\n\t\t\t\t \"port\": 65535,\n\t\t\t\t \"securityMethods\": [\"PKI\"]\n\t\t\t\t}\n\t\t\t ]\n }\n ]\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://localhost:8090/published-apis/v1/APF_id_rApp_as_APF/service-apis", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8090", + "path": [ + "published-apis", + "v1", + "APF_id_rApp_as_APF", + "service-apis" + ] + }, + "description": "Publish a new API" + }, + "response": [] + }, + { + "name": "2. rApp publishes its API example B", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"apiName\": \"example B\",\n \"description\": \"Example B API of rApp\",\n \"aefProfiles\": [\n {\n \"aefId\": \"AEF_id_rApp_as_AEF\",\n \"description\": \"Example B rApp as AEF\",\n \"versions\": [\n {\n \"apiVersion\": \"v1\",\n \"resources\": [\n {\n \"resourceName\": \"exampleB\",\n \"commType\": \"REQUEST_RESPONSE\",\n \"uri\": \"/exampleB/subscription/subscription_id_1\",\n \"operations\": [\n \"GET\"\n ]\n }\n ]\n }\n ],\n \"protocol\": \"HTTP_1_1\",\n\t\t\t\"securityMethods\": [\"PSK\"],\n\t\t\t\"interfaceDescriptions\": [\n\t\t\t\t{\n\t\t\t\t \"ipv4Addr\": \"string\",\n\t\t\t\t \"port\": 65535,\n\t\t\t\t \"securityMethods\": [\"PKI\"]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t \"ipv4Addr\": \"string\",\n\t\t\t\t \"port\": 65535,\n\t\t\t\t \"securityMethods\": [\"PKI\"]\n\t\t\t\t}\n\t\t\t ]\n }\n ]\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://localhost:8090/published-apis/v1/APF_id_rApp_as_APF/service-apis", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8090", + "path": [ + "published-apis", + "v1", + "APF_id_rApp_as_APF", + "service-apis" + ] + }, + "description": "Publish a new API" + }, + "response": [] + }, + { + "name": "3. rApp updates published API example A", + "request": { + "method": "PUT", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"apiName\": \"example A\",\n \"description\": \"Example A API of rApp\",\n \"aefProfiles\": [\n {\n \"aefId\": \"AEF_id_rApp_as_AEF\",\n \"description\": \"Example A rApp as AEF\",\n \"versions\": [\n {\n \"apiVersion\": \"v1\",\n \"resources\": [\n {\n \"resourceName\": \"exampleA\",\n \"commType\": \"REQUEST_RESPONSE\",\n \"uri\": \"/exampleA/subscription/subscription_id_1\",\n \"operations\": [\n \"GET\"\n ]\n }\n ]\n },\n {\n \"apiVersion\": \"v2\",\n \"resources\": [\n {\n \"resourceName\": \"exampleA\",\n \"commType\": \"REQUEST_RESPONSE\",\n \"uri\": \"/exampleA/subscription/subscription_id_2\",\n \"operations\": [\n \"GET\"\n ]\n }\n ]\n }\n ],\n \"protocol\": \"HTTP_1_1\",\n\t\t\t\"securityMethods\": [\"PSK\"],\n\t\t\t\"interfaceDescriptions\": [\n\t\t\t\t{\n\t\t\t\t \"ipv4Addr\": \"string\",\n\t\t\t\t \"port\": 65535,\n\t\t\t\t \"securityMethods\": [\"PKI\"]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t \"ipv4Addr\": \"string\",\n\t\t\t\t \"port\": 65535,\n\t\t\t\t \"securityMethods\": [\"PKI\"]\n\t\t\t\t}\n\t\t\t ]\n }\n ]\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://localhost:8090/published-apis/v1/APF_id_rApp_as_APF/service-apis/api_id_example_A?serviceApiId =api_id_example_A&apfId =APF_id_rApp_as_APF", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8090", + "path": [ + "published-apis", + "v1", + "APF_id_rApp_as_APF", + "service-apis", + "api_id_example_A" + ], + "query": [ + { + "key": "serviceApiId ", + "value": "api_id_example_A" + }, + { + "key": "apfId ", + "value": "APF_id_rApp_as_APF" + } + ] + }, + "description": "Update a published service API" + }, + "response": [] + }, + { + "name": "4. rApp delete an API", + "request": { + "method": "DELETE", + "header": [], + "url": { + "raw": "http://localhost:8090/published-apis/v1/APF_id_rApp_as_APF/service-apis/api_id_example?serviceApiId =api_id_example_B&apfId =APF_id_rApp_as_APF", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8090", + "path": [ + "published-apis", + "v1", + "APF_id_rApp_as_APF", + "service-apis", + "api_id_example" + ], + "query": [ + { + "key": "serviceApiId ", + "value": "api_id_example_B" + }, + { + "key": "apfId ", + "value": "APF_id_rApp_as_APF" + } + ] + }, + "description": "Unpublish a published service API" + }, + "response": [] + } + ], + "description": "The CAPIF publish service APIs, as defined in 3GPP TS 23.222 \\[2\\], allow API publishing function via CAPIF-4 and CAPIF-4e reference points to publish and manage published service APIs at the CAPIF core function, and allow CAPIF core function via CAPIF-6 and CAPIF-6e reference points to publish and manage published service APIs at other CAPIF core function.\n\n| **Service operation name** | **Description** |\n| --- | --- |\n| Publish_Service_API | This service operation is used by an API publishing function to publish service APIs on the CAPIF core function. This service operation is also used by CAPIF core function to publish service APIs on other CAPIF core function. |\n| Unpublish_Service_API | This service operation is used by an API publishing function to un-publish service APIs from the CAPIF core function. This service operation is also used by CAPIF core function to un-publish service APIs on other CAPIF core function. |\n| Get_Service_API | This service operation is used by an API publishing function to retrieve service APIs from the CAPIF core function. This service operation is also used by CAPIF core function to retrieve service APIs on other CAPIF core function. |\n| Update_Service_API | This service operation is used by an API publishing function to update published service APIs on the CAPIF core function. This service operation is also used by CAPIF core function to update published service APIs on other CAPIF core function. |" + }, + { + "name": "3. Invoker Management", + "item": [ + { + "name": "1. rApp onboards itself as invoker", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"apiInvokerInformation\": \"rApp as invoker 1\",\n\t \"apiList\": [\n\t\t{}\n\t],\n \"NotificationDestination\": \"http://invoker-app:8086/callback\",\n \"onboardingInformation\": {\n\t\t\"apiInvokerPublicKey\": \"{PUBLIC_KEY_INVOKER_1}\",\n\t\t\"apiInvokerCertificate\": \"apiInvokerCertificate\"\n },\n \"requestTestNotification\": true\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://localhost:8090/api-invoker-management/v1/onboardedInvokers", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8090", + "path": [ + "api-invoker-management", + "v1", + "onboardedInvokers" + ] + }, + "description": "Creates a new individual API Invoker profile." + }, + "response": [] + }, + { + "name": "2. rApp onboards itself as invoker2", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"apiInvokerInformation\": \"rApp as invoker 2\",\n\t \"apiList\": [\n\t\t{}\n\t],\n \"NotificationDestination\": \"http://invoker2-app:8086/callback\",\n \"onboardingInformation\": {\n\t\t\"apiInvokerPublicKey\": \"{PUBLIC_KEY_INVOKER_2}\",\n\t\t\"apiInvokerCertificate\": \"apiInvokerCertificate\"\n },\n \"requestTestNotification\": true\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://localhost:8090/api-invoker-management/v1/onboardedInvokers", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8090", + "path": [ + "api-invoker-management", + "v1", + "onboardedInvokers" + ] + }, + "description": "Creates a new individual API Invoker profile" + }, + "response": [] + }, + { + "name": "3. rApp invoker delete", + "request": { + "method": "DELETE", + "header": [], + "url": { + "raw": "http://localhost:8090/api-invoker-management/v1/onboardedInvokers/api_invoker_id_rApp_as_invoker_2?onboardingId=api_invoker_id_rApp_as_invoker_2", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8090", + "path": [ + "api-invoker-management", + "v1", + "onboardedInvokers", + "api_invoker_id_rApp_as_invoker_2" + ], + "query": [ + { + "key": "onboardingId", + "value": "api_invoker_id_rApp_as_invoker_2" + } + ] + }, + "description": "Deletes an individual API invoker" + }, + "response": [] + } + ], + "description": "The CAPIF API invoker management APIs, as defined in 3GPP TS 23.222 \\[2\\], allow API invokers via CAPIF-1/1e reference points to on-board and off-board itself as a recognized user of the CAPIF or update the API invoker's details on the CAPIF core function.\n\n| **Service operation name** | **Description** |\n| --- | --- |\n| Onboard_API_Invoker | This service operation is used by an API invoker to on-board itself as a recognized user of CAPIF |\n| Offboard_API_Invoker | This service operation is used by an API invoker to off-board itself as a recognized user of CAPIF |\n| Update_API_Invoker_Details | This service operation is used by an API invoker to update API invoker's details in the CAPIF core function. |" + }, + { + "name": "4. Discover Service API", + "item": [ + { + "name": "1. Invoker discovers APIs", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "http://localhost:8090/service-apis/v1/allServiceAPIs?api-invoker-id=api_invoker_id_rApp_as_invoker_1", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8090", + "path": [ + "service-apis", + "v1", + "allServiceAPIs" + ], + "query": [ + { + "key": "aef-id", + "value": "", + "disabled": true + }, + { + "key": "api-cat", + "value": "", + "disabled": true + }, + { + "key": "api-name", + "value": "", + "disabled": true + }, + { + "key": "api-version", + "value": "", + "disabled": true + }, + { + "key": "comm-type", + "value": "", + "disabled": true + }, + { + "key": "data-format", + "value": "", + "disabled": true + }, + { + "key": "preferred-aef-loc", + "value": "", + "disabled": true + }, + { + "key": "protocol", + "value": "", + "disabled": true + }, + { + "key": "supported-features", + "value": "", + "disabled": true + }, + { + "key": "api-invoker-id", + "value": "api_invoker_id_rApp_as_invoker_1" + } + ] + } + }, + "response": [] + } + ] + }, + { + "name": "5. Security API", + "item": [ + { + "name": "1. Invoker obtains security context", + "request": { + "method": "PUT", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"notificationDestination\": \"http://invoker-app:8086/callback\",\r\n \"supportedFeatures\": \"fffffff\",\r\n \"securityInfo\": [\r\n {\r\n \"aefId\": \"AEF_id_rApp_as_AEF\",\r\n \"apiId\": \"api_id_example\",\r\n \"interfaceDetails\": \r\n {\r\n \"ipv4Addr\": \"string\",\r\n \"port\": 65535,\r\n \"securityMethods\": [\r\n \"PKI\"\r\n ]\r\n },\r\n \"prefSecurityMethods\": [\r\n \"PKI\"\r\n ]\r\n }\r\n ],\r\n \"requestTestNotification\": true\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://localhost:8090/capif-security/v1/trustedInvokers/api_invoker_id_rApp_as_invoker_1", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8090", + "path": [ + "capif-security", + "v1", + "trustedInvokers", + "api_invoker_id_rApp_as_invoker_1" + ] + } + }, + "response": [] + }, + { + "name": "2. Invoker rApp retrieves OAuth access token", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "urlencoded", + "urlencoded": [ + { + "key": "client_id", + "value": "api_invoker_id_rApp_as_invoker_1", + "type": "text" + }, + { + "key": "client_secret", + "value": "k5XSlZIywPUDesZloCCHIxSlrcYX0OBC", + "type": "text" + }, + { + "key": "grant_type", + "value": "client_credentials", + "type": "text" + }, + { + "key": "scope", + "value": "3gpp#aefId1:apiName1", + "type": "text", + "disabled": true + } + ] + }, + "url": { + "raw": "http://localhost:8090/capif-security/v1/securities/api_invoker_id_rApp_as_invoker_1/token", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8090", + "path": [ + "capif-security", + "v1", + "securities", + "api_invoker_id_rApp_as_invoker_1", + "token" + ] + } + }, + "response": [] + } + ] + } + ] +} \ No newline at end of file diff --git a/postman/ServiceManager.postman_collection.json b/postman/ServiceManager.postman_collection.json new file mode 100644 index 0000000..5c2168e --- /dev/null +++ b/postman/ServiceManager.postman_collection.json @@ -0,0 +1,730 @@ +{ + "info": { + "_postman_id": "79d4786e-1ada-4252-afc4-58c7c3f4da70", + "name": "Service Manager Demo Collection", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", + "_exporter_id": "30653024" + }, + "item": [ + { + "name": "Service Manager demo", + "item": [ + { + "name": "rApp register K8s", + "item": [ + { + "name": "health check service manager", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://10.101.1.101:31575/", + "protocol": "http", + "host": [ + "10", + "101", + "1", + "101" + ], + "port": "31575", + "path": [ + "" + ] + }, + "description": "StartFragment\n\nRegisters a new API Provider domain with API provider domain functions profiles.\n\nEndFragme" + }, + "response": [] + }, + { + "name": "1. rApp registers as Kong provider", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"apiProvDomInfo\": \"Kong\",\n \"apiProvFuncs\": [\n {\n \"apiProvFuncInfo\": \"rAppKong as APF\",\n \"apiProvFuncRole\": \"APF\",\n \"regInfo\": {\n \"apiProvPubKey\": \"APF-PublicKey\"\n }\n },\n {\n \"apiProvFuncInfo\": \"rAppKong as AEF\",\n \"apiProvFuncRole\": \"AEF\",\n \"regInfo\": {\n \"apiProvPubKey\": \"AEF-PublicKey\"\n }\n }\n ],\n \"regSec\": \"PSK1\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://10.101.1.101:31575/api-provider-management/v1/registrations", + "protocol": "http", + "host": [ + "10", + "101", + "1", + "101" + ], + "port": "31575", + "path": [ + "api-provider-management", + "v1", + "registrations" + ] + }, + "description": "StartFragment\n\nRegisters a new API Provider domain with API provider domain functions profiles.\n\nEndFragme" + }, + "response": [] + }, + { + "name": "1. rApp registers as Kong provider", + "request": { + "method": "DELETE", + "header": [], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://10.101.1.101:31575/api-provider-management/v1/registrations/domain_id_Kong", + "protocol": "http", + "host": [ + "10", + "101", + "1", + "101" + ], + "port": "31575", + "path": [ + "api-provider-management", + "v1", + "registrations", + "domain_id_Kong" + ] + }, + "description": "StartFragment\n\nRegisters a new API Provider domain with API provider domain functions profiles.\n\nEndFragme" + }, + "response": [] + } + ] + }, + { + "name": "rApp publish", + "item": [ + { + "name": "2. rApp publishes its API to Kong Service Stub", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"AefProfiles\": [\n {\n \"AefId\": \"AEF_id_rAppKong_as_AEF\",\n \"interfaceDescriptions\": [\n {\n \"ipv4Addr\": \"10.101.1.101\",\n \"port\": 30951,\n \"securityMethods\": [\n \"PKI\"\n ]\n }\n ],\n \"DomainName\": \"Kong\",\n \"Protocol\": \"HTTP_1_1\",\n \"Versions\": [\n {\n \"ApiVersion\": \"\",\n \"Resources\": [\n {\n \"CommType\": \"REQUEST_RESPONSE\",\n \"Operations\": [\n \"GET\"\n ],\n \"ResourceName\": \"helloworld\",\n \"Uri\": \"/helloworld\"\n },\n {\n \"CommType\": \"REQUEST_RESPONSE\",\n \"Operations\": [\n \"GET\"\n ],\n \"ResourceName\": \"helloworld_sme\",\n \"Uri\": \"/helloworld/sme\"\n }\n ]\n }\n ]\n }\n ],\n \"ApiName\": \"helloworld\",\n \"Description\": \"Description,namespace,repoName,chartName,releaseName\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://10.101.1.101:31575/published-apis/v1/APF_id_rAppKong_as_APF/service-apis", + "protocol": "http", + "host": [ + "10", + "101", + "1", + "101" + ], + "port": "31575", + "path": [ + "published-apis", + "v1", + "APF_id_rAppKong_as_APF", + "service-apis" + ] + }, + "description": "Publish a new API" + }, + "response": [] + }, + { + "name": "2. rApp publishes its API to Kong", + "request": { + "method": "DELETE", + "header": [], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://10.101.1.101:31575/published-apis/v1/APF_id_rAppKong_as_APF/service-apis/api_id_helloworld", + "protocol": "http", + "host": [ + "10", + "101", + "1", + "101" + ], + "port": "31575", + "path": [ + "published-apis", + "v1", + "APF_id_rAppKong_as_APF", + "service-apis", + "api_id_helloworld" + ] + }, + "description": "Publish a new API" + }, + "response": [] + }, + { + "name": "3. rApp gets all published APIs", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://10.101.1.101:31575/published-apis/v1/APF_id_rAppKong_as_APF/service-apis", + "protocol": "http", + "host": [ + "10", + "101", + "1", + "101" + ], + "port": "31575", + "path": [ + "published-apis", + "v1", + "APF_id_rAppKong_as_APF", + "service-apis" + ] + }, + "description": "Publish a new API" + }, + "response": [] + }, + { + "name": "4. rApp gets a published API", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://10.101.1.101:31575/published-apis/v1/APF_id_rAppKong_as_APF/service-apis/api_id_helloworld", + "protocol": "http", + "host": [ + "10", + "101", + "1", + "101" + ], + "port": "31575", + "path": [ + "published-apis", + "v1", + "APF_id_rAppKong_as_APF", + "service-apis", + "api_id_helloworld" + ] + }, + "description": "Publish a new API" + }, + "response": [] + } + ] + }, + { + "name": "rApp onboarding", + "item": [ + { + "name": "5. rApp onboards itself as invoker", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"apiInvokerInformation\": \"rAppKong as invoker 1\",\n\t \"apiList\": [\n {\n \"aefProfiles\": [\n {\n \"aefId\": \"AEF_id_rAppKong_as_AEF\",\n \"domainName\": \"kong\",\n \"interfaceDescriptions\": [\n {\n \"ipv4Addr\": \"10.101.1.101\",\n \"port\": 32080\n }\n ],\n \"protocol\": \"HTTP_1_1\",\n \"versions\": [\n {\n \"apiVersion\": \"\",\n \"resources\": [\n {\n \"commType\": \"REQUEST_RESPONSE\",\n \"operations\": [\n \"GET\"\n ],\n \"resourceName\": \"helloworld\",\n \"uri\": \"/helloworld\"\n },\n {\n \"commType\": \"REQUEST_RESPONSE\",\n \"operations\": [\n \"GET\"\n ],\n \"resourceName\": \"helloworld_sme\",\n \"uri\": \"/helloworld/sme\"\n }\n ]\n }\n ]\n }\n ],\n \"apiId\": \"api_id_helloworld\",\n \"apiName\": \"helloworld\",\n \"description\": \"Description,namespace,repoName,chartName,releaseName\"\n }\n\t],\n \"NotificationDestination\": \"http://invoker-app-kong:8086/callback\",\n \"onboardingInformation\": {\n\t\t\"apiInvokerPublicKey\": \"{PUBLIC_KEY_INVOKER_KONG}\",\n\t\t\"apiInvokerCertificate\": \"apiInvokerCertificate\"\n },\n \"requestTestNotification\": true\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://10.101.1.101:31575/api-invoker-management/v1/onboardedInvokers", + "protocol": "http", + "host": [ + "10", + "101", + "1", + "101" + ], + "port": "31575", + "path": [ + "api-invoker-management", + "v1", + "onboardedInvokers" + ] + }, + "description": "Creates a new individual API Invoker profile." + }, + "response": [] + }, + { + "name": "5. rApp onboards itself as invoker - empty apiList", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"apiInvokerInformation\": \"rAppKong as invoker 1\",\n\t\"apiList\": [],\n \"NotificationDestination\": \"http://invoker-app-kong:8086/callback\",\n \"onboardingInformation\": {\n\t\t\"apiInvokerPublicKey\": \"{PUBLIC_KEY_INVOKER_KONG}\",\n\t\t\"apiInvokerCertificate\": \"apiInvokerCertificate\"\n },\n \"requestTestNotification\": true\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://10.101.1.101:31575/api-invoker-management/v1/onboardedInvokers", + "protocol": "http", + "host": [ + "10", + "101", + "1", + "101" + ], + "port": "31575", + "path": [ + "api-invoker-management", + "v1", + "onboardedInvokers" + ] + }, + "description": "Creates a new individual API Invoker profile." + }, + "response": [] + }, + { + "name": "5. rApp onboards itself as invoker", + "request": { + "method": "DELETE", + "header": [], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://10.101.1.101:31575/api-invoker-management/v1/onboardedInvokers/api_invoker_id_rAppKong_as_invoker_1", + "protocol": "http", + "host": [ + "10", + "101", + "1", + "101" + ], + "port": "31575", + "path": [ + "api-invoker-management", + "v1", + "onboardedInvokers", + "api_invoker_id_rAppKong_as_invoker_1" + ] + }, + "description": "Creates a new individual API Invoker profile." + }, + "response": [] + } + ] + }, + { + "name": "rApp discovery", + "item": [ + { + "name": "6. Invoker discovers APIs", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "http://10.101.1.101:31575/service-apis/v1/allServiceAPIs?api-invoker-id=api_invoker_id_rAppKong_as_invoker_1", + "protocol": "http", + "host": [ + "10", + "101", + "1", + "101" + ], + "port": "31575", + "path": [ + "service-apis", + "v1", + "allServiceAPIs" + ], + "query": [ + { + "key": "aef-id", + "value": "", + "disabled": true + }, + { + "key": "api-cat", + "value": "", + "disabled": true + }, + { + "key": "api-name", + "value": "", + "disabled": true + }, + { + "key": "api-version", + "value": "", + "disabled": true + }, + { + "key": "comm-type", + "value": "", + "disabled": true + }, + { + "key": "data-format", + "value": "", + "disabled": true + }, + { + "key": "preferred-aef-loc", + "value": "", + "disabled": true + }, + { + "key": "protocol", + "value": "", + "disabled": true + }, + { + "key": "supported-features", + "value": "", + "disabled": true + }, + { + "key": "api-invoker-id", + "value": "api_invoker_id_rAppKong_as_invoker_1" + } + ] + } + }, + "response": [] + }, + { + "name": "7. Invoker discovers APIs with api-invoker-id, aef-id", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "http://10.101.1.101:31575/service-apis/v1/allServiceAPIs?api-invoker-id=api_invoker_id_rAppKong_as_invoker_1&aef-id=AEF_id_rAppKong_as_AEF", + "protocol": "http", + "host": [ + "10", + "101", + "1", + "101" + ], + "port": "31575", + "path": [ + "service-apis", + "v1", + "allServiceAPIs" + ], + "query": [ + { + "key": "aef-id", + "value": "", + "disabled": true + }, + { + "key": "api-cat", + "value": "", + "disabled": true + }, + { + "key": "api-name", + "value": "", + "disabled": true + }, + { + "key": "api-version", + "value": "", + "disabled": true + }, + { + "key": "comm-type", + "value": "", + "disabled": true + }, + { + "key": "data-format", + "value": "", + "disabled": true + }, + { + "key": "preferred-aef-loc", + "value": "", + "disabled": true + }, + { + "key": "protocol", + "value": "", + "disabled": true + }, + { + "key": "supported-features", + "value": "", + "disabled": true + }, + { + "key": "api-invoker-id", + "value": "api_invoker_id_rAppKong_as_invoker_1" + }, + { + "key": "aef-id", + "value": "AEF_id_rAppKong_as_AEF" + } + ] + } + }, + "response": [] + }, + { + "name": "8. Invoker discovers APIs with api-invoker-id, apiName", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "http://10.101.1.101:31575/service-apis/v1/allServiceAPIs?api-invoker-id=api_invoker_id_rAppKong_as_invoker_1&apiName=helloworld", + "protocol": "http", + "host": [ + "10", + "101", + "1", + "101" + ], + "port": "31575", + "path": [ + "service-apis", + "v1", + "allServiceAPIs" + ], + "query": [ + { + "key": "aef-id", + "value": "", + "disabled": true + }, + { + "key": "api-cat", + "value": "", + "disabled": true + }, + { + "key": "api-name", + "value": "", + "disabled": true + }, + { + "key": "api-version", + "value": "", + "disabled": true + }, + { + "key": "comm-type", + "value": "", + "disabled": true + }, + { + "key": "data-format", + "value": "", + "disabled": true + }, + { + "key": "preferred-aef-loc", + "value": "", + "disabled": true + }, + { + "key": "protocol", + "value": "", + "disabled": true + }, + { + "key": "supported-features", + "value": "", + "disabled": true + }, + { + "key": "api-invoker-id", + "value": "api_invoker_id_rAppKong_as_invoker_1" + }, + { + "key": "apiName", + "value": "helloworld" + } + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Kong", + "item": [ + { + "name": "Get Routes", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "http://10.101.1.101:32081/routes", + "protocol": "http", + "host": [ + "10", + "101", + "1", + "101" + ], + "port": "32081", + "path": [ + "routes" + ] + } + }, + "response": [] + }, + { + "name": "Get Routes with Tags", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "http://10.101.1.101:32081/routes/?tags=apfId%3A%20APF_id_rAppKong_as_APF", + "protocol": "http", + "host": [ + "10", + "101", + "1", + "101" + ], + "port": "32081", + "path": [ + "routes", + "" + ], + "query": [ + { + "key": "tags", + "value": "apfId%3A%20APF_id_rAppKong_as_APF" + } + ] + } + }, + "response": [] + }, + { + "name": "Get Services", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "http://10.101.1.101:32081/services", + "protocol": "http", + "host": [ + "10", + "101", + "1", + "101" + ], + "port": "32081", + "path": [ + "services" + ] + } + }, + "response": [] + }, + { + "name": "Get Services with Tags", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "http://10.101.1.101:32081/services/?tags=apfId%3A%20APF_id_rAppKong_as_APF", + "protocol": "http", + "host": [ + "10", + "101", + "1", + "101" + ], + "port": "32081", + "path": [ + "services", + "" + ], + "query": [ + { + "key": "tags", + "value": "apfId%3A%20APF_id_rAppKong_as_APF" + } + ] + } + }, + "response": [] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/servicemanager/README.md b/servicemanager/README.md index 74c92aa..4be8951 100644 --- a/servicemanager/README.md +++ b/servicemanager/README.md @@ -20,13 +20,13 @@ limitations under the License. --> -# O-RAN-SC Non-RealTime RIC Service Management and Exposure +# O-RAN-SC Non-RealTime RIC Service Manager -This product is a Go implementation of a service that calls the CAPIF Core function. When publishing a service we create a Kong route and Kong service, https://konghq.com/. The InterfaceDescription that we return is updated to point to the Kong Data Plane. Therefore, the API interface that we return from Service Discovery has the Kong host and port, and not the original service's host and port. This allows the rApp's API call to be re-directed through Kong. +Service Manager is a Go implementation of a service that calls the CAPIF Core function. When publishing a service we create a Kong route and Kong service, https://konghq.com/. The InterfaceDescription that we return is updated to point to the Kong Data Plane. Therefore, the API interface that we return from Service Discovery has the Kong host and port, and not the original service's host and port. This allows the rApp's API call to be re-directed through Kong. ## O-RAN-SC Non-RealTime RIC CAPIF Core Implementation -This product is a Go implementation of the CAPIF Core function, which is based on the 3GPP "29.222 Common API Framework for 3GPP Northbound APIs (CAPIF)" interfaces, see https://portal.3gpp.org/desktopmodules/Specifications/SpecificationDetails.aspx?specificationId=3450. +Service Manager is a Go implementation of the CAPIF Core function, which is based on the 3GPP "29.222 Common API Framework for 3GPP Northbound APIs (CAPIF)" interfaces, see https://portal.3gpp.org/desktopmodules/Specifications/SpecificationDetails.aspx?specificationId=3450. See [CAPIF Core](../capifcore/README.md) @@ -141,4 +141,8 @@ The additional env file needs to exist in the sme/servicemanager folder so that `./deploy-to-k8s.sh --env .env.development` - ../../.env.development needs to exist. \ No newline at end of file + ../../.env.development needs to exist. + +## Postman + +A Postman collection has been included in this repo at sme/postman/ServiceManager.postman_collection.json. \ No newline at end of file -- 2.16.6