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

First draft version of extensibility feature (for publish api)

parent f9e05a72
Loading
Loading
Loading
Loading
Loading
+32 −3
Original line number Diff line number Diff line
@@ -75,10 +75,39 @@ def apf_id_service_apis_post(apf_id, body): # noqa: E501
    :rtype: Union[ServiceAPIDescription, Tuple[ServiceAPIDescription, int], Tuple[ServiceAPIDescription, int, Dict[str, str]]
    """
    current_app.logger.info("Publishing service")
    if connexion.request.is_json:
        body = ServiceAPIDescription.from_dict(connexion.request.get_json())  # noqa: E501

    res = service_operations.add_serviceapidescription(apf_id, body)
    # TODO read supported features
    supp_feat_dict = ServiceAPIDescription.return_supp_feat_dict(body['supportedFeatures'])
    current_app.logger.info(supp_feat_dict)

    vendor_specific_list = []

    if connexion.request.is_json:
        # TODO check if VendorExt feature is on and deviate the flow
        if supp_feat_dict['VendorExt']:
            current_app.logger.info("VendorExt is True")
            # ##########  Edit ServiceAPIDescription object
            # current_app.logger.info(connexion.request.get_json())
            # body = ServiceAPIDescription(connexion.request.get_json())
            # current_app.logger.info(body)
            # ##########  Edit ServiceAPIDescription object

            # ##########  Add the vendor-specific attributes to database sperately
            aef_profile_array = body['aefProfiles']
            vendor_specific = []
            for profile in aef_profile_array:
                vendor_specific.append((profile['aefId'], key, val) for key, val in profile.items() if 'vendorSpecific' in key)
            for duet in vendor_specific:
                duet_lst = list(duet)
                vendor_specific_list.append(duet_lst)
                # current_app.logger.info(duet_lst[0][0])
                # current_app.logger.info(duet_lst[0][1])
                # current_app.logger.info(duet_lst[0][2])
            # ##########  Add the vendor-specific attributes to database separately
        body = ServiceAPIDescription.from_dict(connexion.request.get_json())

    current_app.logger.info(vendor_specific_list)
    res = service_operations.add_serviceapidescription(apf_id, body, vendor_specific_list)

    return res

+15 −2
Original line number Diff line number Diff line
@@ -78,7 +78,7 @@ class PublishServiceOperations(Resource):
            current_app.logger.error(exception + "::" + str(e))
            return internal_server_error(detail=exception, cause=str(e))

    def add_serviceapidescription(self, apf_id, serviceapidescription):
    def add_serviceapidescription(self, apf_id, serviceapidescription, vendor_specific):

        mycol = self.db.get_col_by_name(self.db.service_api_descriptions)

@@ -102,7 +102,19 @@ class PublishServiceOperations(Resource):
            rec = dict()
            rec['apf_id'] = apf_id
            rec['onboarding_date'] = datetime.now()
            rec.update(serviceapidescription.to_dict())
            serviceapidescription_dict = serviceapidescription.to_dict()
            if vendor_specific:
                for trio in vendor_specific:
                    trio_lst = list(trio)
                    current_app.logger.info(trio_lst)
                    for profile in serviceapidescription_dict['aef_profiles']:
                        current_app.logger.info(trio_lst[0][0])
                        current_app.logger.info(trio_lst[0][1])
                        current_app.logger.info(trio_lst[0][2])
                        current_app.logger.info(profile)
                        if profile['aef_id'] == trio_lst[0][0]:
                            profile[trio_lst[0][1]] = trio_lst[0][2]
            rec.update(serviceapidescription_dict)

            mycol.insert_one(rec)

@@ -110,6 +122,7 @@ class PublishServiceOperations(Resource):

            current_app.logger.debug("Service inserted in database")

            # TODO Have to return the vendor specific object
            res = make_response(object=serialize_clean_camel_case(serviceapidescription), status=201)
            res.headers['Location'] = "http://localhost:8080/published-apis/v1/" + \
                          str(apf_id) + "/service-apis/" + str(api_id)
+17 −0
Original line number Diff line number Diff line
@@ -93,6 +93,23 @@ class ServiceAPIDescription(Model):
        self._ccf_id = ccf_id
        self._api_prov_name = api_prov_name

    @classmethod
    def return_supp_feat_dict(cls, supp_feat):
        supp_feat_in_hex = int(supp_feat, 16)
        supp_feat_in_bin = bin(supp_feat_in_hex)[2:]

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

    @classmethod
    def from_dict(cls, dikt) -> 'ServiceAPIDescription':
        """Returns the dict as a model