From ecb13532b3a0aaa36f73132d5942158b9c079d50 Mon Sep 17 00:00:00 2001 From: Stavros-Anastasios Charismiadis Date: Tue, 11 Mar 2025 14:30:20 +0200 Subject: [PATCH] implementation of feature negotiation --- .gitignore | 1 + .../controllers/default_controller.py | 4 ++-- .../service_apis/core/discoveredapis.py | 17 ++++++++++++++++- .../service_apis/models/discovered_apis.py | 12 ------------ 4 files changed, 19 insertions(+), 15 deletions(-) diff --git a/.gitignore b/.gitignore index 40d2726c..ddc84e3d 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,4 @@ results helm/capif/*.lock helm/capif/charts/tempo* +*.bak \ No newline at end of file diff --git a/services/TS29222_CAPIF_Discover_Service_API/service_apis/controllers/default_controller.py b/services/TS29222_CAPIF_Discover_Service_API/service_apis/controllers/default_controller.py index 2ce066ee..7080f39a 100644 --- a/services/TS29222_CAPIF_Discover_Service_API/service_apis/controllers/default_controller.py +++ b/services/TS29222_CAPIF_Discover_Service_API/service_apis/controllers/default_controller.py @@ -5,7 +5,7 @@ import json from flask import request, current_app from service_apis.models.discovered_apis import DiscoveredAPIs # noqa: E501 -from ..core.discoveredapis import DiscoverApisOperations +from ..core.discoveredapis import DiscoverApisOperations, return_negotiated_supp_feat_dict discover_apis = DiscoverApisOperations() @@ -55,7 +55,7 @@ def all_service_apis_get(api_invoker_id, api_name=None, api_version=None, comm_t "supported_features": supported_features} if supported_features is not None: - supp_feat_dict = DiscoveredAPIs.return_supp_feat_dict(supported_features) + supp_feat_dict = return_negotiated_supp_feat_dict(supported_features) current_app.logger.info(supp_feat_dict) if supp_feat_dict['VendSpecQueryParams']: for q_params in request.args: diff --git a/services/TS29222_CAPIF_Discover_Service_API/service_apis/core/discoveredapis.py b/services/TS29222_CAPIF_Discover_Service_API/service_apis/core/discoveredapis.py index f4b0d8fd..c850e9c1 100644 --- a/services/TS29222_CAPIF_Discover_Service_API/service_apis/core/discoveredapis.py +++ b/services/TS29222_CAPIF_Discover_Service_API/service_apis/core/discoveredapis.py @@ -10,6 +10,9 @@ from ..util import serialize_clean_camel_case from ..vendor_specific import find_attribute_in_body, filter_apis_with_vendor_specific_params, \ remove_vendor_specific_fields +TOTAL_FEATURES = 4 +SUPPORTED_FEATURES_HEX = "2" + def filter_fields(filtered_apis): key_filter = [ @@ -24,6 +27,18 @@ def filter_fields(filtered_apis): return field_filtered_api +def return_negotiated_supp_feat_dict(supp_feat): + + final_supp_feat = bin(int(supp_feat, 16) & int(SUPPORTED_FEATURES_HEX, 16))[2:].zfill(TOTAL_FEATURES) + + return { + "ApiSupportedFeatureQuery": True if final_supp_feat[3] == "1" else False, + "VendSpecQueryParams": True if final_supp_feat[2] == "1" else False, + "RNAA": True if final_supp_feat[1] == "1" else False, + "SliceBasedAPIExposure": True if final_supp_feat[0] == "1" else False + } + + class DiscoverApisOperations(Resource): def get_discoveredapis(self, api_invoker_id, query_params): @@ -79,7 +94,7 @@ class DiscoverApisOperations(Resource): vendor_specific_fields_path = find_attribute_in_body(discoved_api, '') json_docs.append(filter_fields(remove_vendor_specific_fields(discoved_api, vendor_specific_fields_path))) else: - supported_features = DiscoveredAPIs.return_supp_feat_dict(supp_feat) + supported_features = return_negotiated_supp_feat_dict(supp_feat) if supported_features['VendSpecQueryParams']: for discoved_api in discoved_apis: vendor_specific_fields_path = find_attribute_in_body(discoved_api, '') diff --git a/services/TS29222_CAPIF_Discover_Service_API/service_apis/models/discovered_apis.py b/services/TS29222_CAPIF_Discover_Service_API/service_apis/models/discovered_apis.py index cce42aef..1d943904 100644 --- a/services/TS29222_CAPIF_Discover_Service_API/service_apis/models/discovered_apis.py +++ b/services/TS29222_CAPIF_Discover_Service_API/service_apis/models/discovered_apis.py @@ -28,18 +28,6 @@ class DiscoveredAPIs(Model): self._service_api_descriptions = service_api_descriptions - @classmethod - def return_supp_feat_dict(cls, supp_feat): - TOTAL_FEATURES = 3 - supp_feat_in_hex = int(supp_feat, 16) - supp_feat_in_bin = bin(supp_feat_in_hex)[2:].zfill(TOTAL_FEATURES)[::-1] - - return { - "ApiSupportedFeatureQuery": True if supp_feat_in_bin[0] == "1" else False, - "VendSpecQueryParams": True if supp_feat_in_bin[1] == "1" else False, - "RNAA": True if supp_feat_in_bin[2] == "1" else False - } - @classmethod def from_dict(cls, dikt) -> 'DiscoveredAPIs': """Returns the dict as a model -- GitLab