Commit b773cdb8 authored by Stavros-Anastasios Charismiadis's avatar Stavros-Anastasios Charismiadis
Browse files

Merge branch 'OCF128-publish-api-supported-feature-negotiation' into 'staging'

Ocf128 publish api supported feature negotiation

See merge request !136
parents 5356c20e 6214d3cd
Loading
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@ from published_apis.vendor_specific import find_attribute_in_body, vendor_specif

from ..core.responses import bad_request_error
from ..core.serviceapidescriptions import PublishServiceOperations
from ..core.serviceapidescriptions import return_negotiated_supp_feat_dict
from ..core.validate_user import ControlAccess
from ..models.service_api_description import ServiceAPIDescription  # noqa: E501

@@ -88,7 +89,7 @@ def apf_id_service_apis_post(apf_id, body): # noqa: E501
            invalid_params=[{"param": "supportedFeatures", "reason": "not defined"}]
        )

    supp_feat_dict = ServiceAPIDescription.return_supp_feat_dict(
    supp_feat_dict = return_negotiated_supp_feat_dict(
        body['supportedFeatures'])

    vendor_specific = []
+29 −4
Original line number Diff line number Diff line
@@ -21,12 +21,33 @@ from .responses import (
    unauthorized_error
)


TOTAL_FEATURES = 10
SUPPORTED_FEATURES_HEX = "120"

publisher_ops = Publisher()


service_api_not_found_message = "Service API not found"


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)[::-1]

    return {
        "ApiSupportedFeaturePublishing": True if final_supp_feat[0] == "1" else False,
        "PatchUpdate": True if final_supp_feat[1] == "1" else False,
        "ExtendedIntfDesc": True if final_supp_feat[2] == "1" else False,
        "MultipleCustomOperations": True if final_supp_feat[3] == "1" else False,
        "ProtocDataFormats_Ext1": True if final_supp_feat[4] == "1" else False,
        "ApiStatusMonitoring": True if final_supp_feat[5] == "1" else False,
        "EdgeApp_2": True if final_supp_feat[6] == "1" else False,
        "RNAA": True if final_supp_feat[7] == "1" else False,
        "VendorExt": True if final_supp_feat[8] == "1" else False,
        "SliceBasedAPIExposure": True if final_supp_feat[9] == "1" else False,
        "Final": hex(int(final_supp_feat[::-1], 2))[2:].zfill(3)
    }

class PublishServiceOperations(Resource):

    def check_apf(self, apf_id):
@@ -126,7 +147,7 @@ class PublishServiceOperations(Resource):
                    vendor_specific, serviceapidescription_dict)

            rec.update(serviceapidescription_dict)
            if not ServiceAPIDescription.return_supp_feat_dict(rec.get("supported_features"))["ApiStatusMonitoring"] and rec.get("api_status", None) is not None:
            if not return_negotiated_supp_feat_dict(rec.get("supported_features"))["ApiStatusMonitoring"] and rec.get("api_status", None) is not None:
                return bad_request_error(
                    detail="Set apiStatus with apiStatusMonitoring feature inactive at supportedFeatures if not allowed",
                    cause="apiStatus can't be set if apiStatusMonitoring is inactive",
@@ -296,8 +317,9 @@ class PublishServiceOperations(Resource):
            service_api_description["apf_id"] = serviceapidescription_old["apf_id"]
            service_api_description["onboarding_date"] = serviceapidescription_old["onboarding_date"]
            service_api_description["api_id"] = serviceapidescription_old["api_id"]
            service_api_description["supported_features"] = return_negotiated_supp_feat_dict(service_api_description["supported_features"])["Final"]

            if not ServiceAPIDescription.return_supp_feat_dict(service_api_description.get("supported_features"))["ApiStatusMonitoring"] and service_api_description.get("api_status", None) is not None:
            if not return_negotiated_supp_feat_dict(service_api_description.get("supported_features"))["ApiStatusMonitoring"] and service_api_description.get("api_status", None) is not None:
                return bad_request_error(
                    detail="Set apiStatus with apiStatusMonitoring feature inactive at supportedFeatures if not allowed",
                    cause="apiStatus can't be set if apiStatusMonitoring is inactive",
@@ -382,11 +404,14 @@ class PublishServiceOperations(Resource):

            patch_service_api_description = patch_service_api_description.to_dict()
            api_status = patch_service_api_description.get("api_status", None)
            supported_features = patch_service_api_description.get("supported_features", None)
            patch_service_api_description = clean_empty(patch_service_api_description)
            if api_status:
                patch_service_api_description["api_status"]=api_status
            if supported_features:
                patch_service_api_description["supported_features"] = return_negotiated_supp_feat_dict(patch_service_api_description["supported_features"])["Final"]
            
            if not ServiceAPIDescription.return_supp_feat_dict(serviceapidescription_old.get("supported_features"))["ApiStatusMonitoring"] and patch_service_api_description.get("api_status", None) is not None:
            if not return_negotiated_supp_feat_dict(serviceapidescription_old.get("supported_features"))["ApiStatusMonitoring"] and patch_service_api_description.get("api_status", None) is not None:
                return bad_request_error(
                    detail="Set apiStatus with apiStatusMonitoring feature inactive at supportedFeatures if not allowed",
                    cause="apiStatus can't be set if apiStatusMonitoring is inactive",
@@ -471,7 +496,7 @@ class PublishServiceOperations(Resource):

    def service_api_availability_event(self, service_api_description):
        service_api_status = ""
        if ServiceAPIDescription.return_supp_feat_dict(service_api_description.get("supportedFeatures"))["ApiStatusMonitoring"]:
        if return_negotiated_supp_feat_dict(service_api_description.get("supportedFeatures"))["ApiStatusMonitoring"]:
            current_app.logger.info(
                "ApiStatusMonitoring active")
            if service_api_description.get("apiStatus") is None or len(service_api_description.get("apiStatus").get("aefIds")) > 0:
+0 −19
Original line number Diff line number Diff line
@@ -87,25 +87,6 @@ class ServiceAPIDescription(Model):
        self._ccf_id = ccf_id
        self._api_prov_name = api_prov_name

    @classmethod
    def return_supp_feat_dict(cls, supp_feat):
        TOTAL_FEATURES = 9
        supp_feat_in_hex = int(supp_feat, 16)
        supp_feat_in_bin = bin(supp_feat_in_hex)[2:].zfill(TOTAL_FEATURES)[::-1]


        return {
            "ApiSupportedFeaturePublishing": True if supp_feat_in_bin[0] == "1" else False,
            "PatchUpdate": True if supp_feat_in_bin[1] == "1" else False,
            "ExtendedIntfDesc": True if supp_feat_in_bin[2] == "1" else False,
            "MultipleCustomOperations": True if supp_feat_in_bin[3] == "1" else False,
            "ProtocDataFormats_Ext1": True if supp_feat_in_bin[4] == "1" else False,
            "ApiStatusMonitoring": True if supp_feat_in_bin[5] == "1" else False,
            "EdgeApp_2": True if supp_feat_in_bin[6] == "1" else False,
            "RNAA": True if supp_feat_in_bin[7] == "1" else False,
            "VendorExt": True if supp_feat_in_bin[8] == "1" else False
        }


    @classmethod
    def from_dict(cls, dikt) -> 'ServiceAPIDescription':
+3 −3
Original line number Diff line number Diff line
@@ -1155,7 +1155,7 @@ Update published API with apiStatus empty and apiStatusMonitoring active
    ${service_api_description_modified}=    Create Service Api Description
    ...    service_1
    ...    aef_id=${aef_ids}
    ...    supported_features=20
    ...    supported_features=020
    ...    api_status=${aef_empty_list}
    ${resp}=    Put Request Capif
    ...    ${resource_url.path}
@@ -1260,7 +1260,7 @@ Update published API with apiStatus only aef2 and apiStatusMonitoring active
    ${service_api_description_modified}=    Create Service Api Description
    ...    service_1
    ...    aef_id=${aef_ids}
    ...    supported_features=20
    ...    supported_features=020
    ...    api_status=${aef_id_2}
    ${resp}=    Put Request Capif
    ...    ${resource_url.path}
@@ -1357,7 +1357,7 @@ Published API without aefs available updated to one aef available
    ${service_api_description_modified}=    Create Service Api Description
    ...    service_1
    ...    aef_id=${aef_ids}
    ...    supported_features=20
    ...    supported_features=020
    ...    api_status=${aef_id_2}
    ${resp}=    Put Request Capif
    ...    ${resource_url.path}
+1 −1
Original line number Diff line number Diff line
@@ -84,7 +84,7 @@ Invoker subscribed to SERVICE_API_AVAILABLE, SERVICE_API_UNAVAILABLE and SERVICE
    ${service_api_description_modified}=    Create Service Api Description
    ...    service_1
    ...    aef_id=${aef_ids}
    ...    supported_features=20
    ...    supported_features=020
    ...    api_status=${aef_ids}
    ${resp}=    Put Request Capif
    ...    ${resource_url.path}
Loading