diff --git a/README.md b/README.md index 84068878ead2b95461fbe7cfabe614b813f8b527..c1020b01e4707451504118f2f5f14e22565d5536 100644 --- a/README.md +++ b/README.md @@ -163,6 +163,7 @@ Now, it is described in 4 simple steps how a Provider can be developed in just s provider.publish_req['publisher_apf_id'] = APF provider.publish_req['publisher_aefs_ids'] = [AEF1, AEF2] + provider.supported_features ="4" provider.publish_services() ``` diff --git a/config/capif_sdk_config.json b/config/capif_sdk_config.json index 34844f5a344cae2d12a0110e4ccfc61b4de0ce5f..7096619f0a2c99cf3b9d746298a1eb42506f48be 100644 --- a/config/capif_sdk_config.json +++ b/config/capif_sdk_config.json @@ -10,7 +10,7 @@ "invoker_folder": "", "capif_callback_url": "", "supported_features":"", - "check_authentication":{ + "check_authentication_data":{ "ip":"", "port":"" }, @@ -18,7 +18,7 @@ "csr_common_name": "", "csr_organizational_unit": "", "csr_organization": "", - "crs_locality": "", + "csr_locality": "", "csr_state_or_province_name": "", "csr_country_name": "", "csr_email_address": "" @@ -41,6 +41,7 @@ }, "provider": { "provider_folder": "", + "supported_features": "", "apfs": "", "aefs": "", "publish_req": { @@ -55,7 +56,7 @@ "csr_common_name": "", "csr_organizational_unit": "", "csr_organization": "", - "crs_locality": "", + "csr_locality": "", "csr_state_or_province_name": "", "csr_country_name": "", "csr_email_address": "" diff --git a/doc/sdk_configuration.md b/doc/sdk_configuration.md index d9193cb49086ddfa1b16e9c92f836afa2a23a9b5..97a3dafacbf164cf1088388b85df37fdd620c965 100644 --- a/doc/sdk_configuration.md +++ b/doc/sdk_configuration.md @@ -43,6 +43,7 @@ When configuring the SDK as a **Network App Invoker**, the following fields must For SDK configuration as a **Network App Provider**, the following fields are required: - `provider_folder` +- `supported_features` - `cert_generation` (fields such as `csr_common_name`, `csr_country_name`, etc.) - `APFs` - `AEFs` @@ -80,6 +81,7 @@ This file can also be populated using [environment variables](../samples/envirom - `invoker_folder`: The path (relative or absolute) where invoker information (certificates, keys, etc.) is stored. - `provider_folder`: The path (relative or absolute) where provider information is stored. +- `supported_features`: A string used to indicate the features supported by an API. The string shall contain a bitmask indicating supported features in hexadecimal representation Each character in the string shall take a value of "0" to "9", "a" to "f" or "A" to "F". [More information](https://github.com/jdegre/5GC_APIs/blob/Rel-18/TS29571_CommonData.yaml) - `capif_host`: The domain name of the CAPIF host. - `register_host`: The domain name of the register host. - `capif_https_port`: The CAPIF host port number. diff --git a/network_app_samples/network_app_invoker_sample/capif_sdk_config_sample.json b/network_app_samples/network_app_invoker_sample/capif_sdk_config_sample.json index c68a7ac08d0962dc5216c860d26698b231dc8a07..7096619f0a2c99cf3b9d746298a1eb42506f48be 100644 --- a/network_app_samples/network_app_invoker_sample/capif_sdk_config_sample.json +++ b/network_app_samples/network_app_invoker_sample/capif_sdk_config_sample.json @@ -6,7 +6,7 @@ "capif_username": "", "capif_password": "", "debug_mode": "", - "invoker":{ + "invoker": { "invoker_folder": "", "capif_callback_url": "", "supported_features":"", @@ -14,7 +14,7 @@ "ip":"", "port":"" }, - "cert_generation":{ + "cert_generation": { "csr_common_name": "", "csr_organizational_unit": "", "csr_organization": "", @@ -39,8 +39,9 @@ "service-kpis": "" } }, - "provider":{ + "provider": { "provider_folder": "", + "supported_features": "", "apfs": "", "aefs": "", "publish_req": { @@ -51,7 +52,7 @@ "" ] }, - "cert_generation":{ + "cert_generation": { "csr_common_name": "", "csr_organizational_unit": "", "csr_organization": "", @@ -61,5 +62,5 @@ "csr_email_address": "" }, "api_description_path": "" - } + } } diff --git a/network_app_samples/network_app_provider_sample/capif_sdk_config_sample.json b/network_app_samples/network_app_provider_sample/capif_sdk_config_sample.json index f2c2c796dae3df8f6348c38bef715ea5aaa32040..e6127a99edd6d6083d46c345901d5c77ce887ed0 100644 --- a/network_app_samples/network_app_provider_sample/capif_sdk_config_sample.json +++ b/network_app_samples/network_app_provider_sample/capif_sdk_config_sample.json @@ -6,14 +6,15 @@ "capif_username": "", "capif_password": "", "debug_mode": "", - "invoker":{ + "invoker": { "invoker_folder": "", "capif_callback_url": "", + "supported_features":"", "check_authentication_data":{ "ip":"", "port":"" }, - "cert_generation":{ + "cert_generation": { "csr_common_name": "", "csr_organizational_unit": "", "csr_organization": "", @@ -38,17 +39,9 @@ "service-kpis": "" } }, - "provider":{ + "provider": { "provider_folder": "", - "cert_generation":{ - "csr_common_name": "", - "csr_organizational_unit": "", - "csr_organization": "", - "csr_locality": "", - "csr_state_or_province_name": "", - "csr_country_name": "", - "csr_email_address": "" - }, + "supported_features": "", "apfs": "2", "aefs": "3", "publish_req": { @@ -59,6 +52,15 @@ "" ] }, + "cert_generation": { + "csr_common_name": "", + "csr_organizational_unit": "", + "csr_organization": "", + "csr_locality": "", + "csr_state_or_province_name": "", + "csr_country_name": "", + "csr_email_address": "" + }, "api_description_path": "" - } + } } diff --git a/opencapif_sdk/capif_invoker_connector.py b/opencapif_sdk/capif_invoker_connector.py index 528fb75d3688c939a231f9641eca2e12af47651c..3e4e78f554f4d7705cac72789cf3c6340ce22b67 100644 --- a/opencapif_sdk/capif_invoker_connector.py +++ b/opencapif_sdk/capif_invoker_connector.py @@ -82,7 +82,7 @@ class capif_invoker_connector: capif_invoker_password = os.getenv('CAPIF_PASSWORD', config.get('capif_password', '')).strip() capif_callback_url = os.getenv('INVOKER_CAPIF_CALLBACK_URL', invoker_config.get('capif_callback_url', '')).strip() - supported_features = os.getenv('INVOKER_FOLDER', invoker_config.get('supported_features', '')).strip() + supported_features = os.getenv('INVOKER_SUPPORTED_FEATURES', invoker_config.get('supported_features', '')).strip() check_authentication_data = invoker_config.get('check_authentication_data', {}) self.check_authentication = { "ip": os.getenv('INVOKER_CHECK_AUTHENTICATION_DATA_IP', check_authentication_data.get('ip', '')).strip(), diff --git a/opencapif_sdk/capif_provider_connector.py b/opencapif_sdk/capif_provider_connector.py index c96578e69977f802b7b5e626e4eda7ec34a54500..9ea6a5ba255f6de4245fa1c63bb99b26c364b952 100644 --- a/opencapif_sdk/capif_provider_connector.py +++ b/opencapif_sdk/capif_provider_connector.py @@ -99,6 +99,10 @@ class capif_provider_connector: csr_email_address = os.getenv('PROVIDER_CSR_EMAIL_ADDRESS', cert_generation.get('csr_email_address', '')).strip() # Retrieve provider specific values (APFs, AEFs) + supported_features = os.getenv('PROVIDER_SUPPORTED_FEATURES', provider_config.get('supported_features', '')).strip() + if not supported_features: + supported_features = "0" + apfs = os.getenv('PROVIDER_APFS', provider_config.get('apfs', '')).strip() aefs = os.getenv('PROVIDER_AEFS', provider_config.get('aefs', '')).strip() api_description_path = os.path.abspath(os.getenv('PROVIDER_API_DESCRIPTION_PATH', provider_config.get('api_description_path', '')).strip()) @@ -127,6 +131,7 @@ class capif_provider_connector: self.csr_state_or_province_name = csr_state_or_province_name self.csr_country_name = csr_country_name self.csr_email_address = csr_email_address + self.supported_features = supported_features self.aefs = int(aefs) self.apfs = int(apfs) @@ -276,7 +281,7 @@ class capif_provider_connector: for role in roles ], "apiProvDomInfo": "This is provider", - "suppFeat": "fff", + "suppFeat": self.supported_features, "failReason": "string", "regSec": access_token, } @@ -452,6 +457,7 @@ class capif_provider_connector: with open(service_api_description_json_full_path, "r") as service_file: data = json.load(service_file) + data["supportedFeatures"] = self.supported_features # Verifying that the number of AEFs is equal to the aefProfiles if len(AEFs_list) != len(data.get("aefProfiles", [])): self.logger.error( @@ -1262,7 +1268,7 @@ class capif_provider_connector: for role in roles ], "apiProvDomInfo": "This is provider", - "suppFeat": "fff", + "suppFeat": self.supported_features, "failReason": "string", "regSec": access_token, } diff --git a/samples/config_sample.json b/samples/config_sample.json index 1a75d7da7835b30ae7c2a0f20c0eb7824f5beb5d..7096619f0a2c99cf3b9d746298a1eb42506f48be 100644 --- a/samples/config_sample.json +++ b/samples/config_sample.json @@ -39,9 +39,9 @@ "service-kpis": "" } }, - "provider": { "provider_folder": "", + "supported_features": "", "apfs": "", "aefs": "", "publish_req": { @@ -52,7 +52,7 @@ "" ] }, - "cert_generation":{ + "cert_generation": { "csr_common_name": "", "csr_organizational_unit": "", "csr_organization": "", @@ -62,5 +62,5 @@ "csr_email_address": "" }, "api_description_path": "" - } + } } diff --git a/test/capif_sdk_config_sample_test.json b/test/capif_sdk_config_sample_test.json index f91920ef5bec78e540c6677b9f8b8918b9d7ff07..7096619f0a2c99cf3b9d746298a1eb42506f48be 100644 --- a/test/capif_sdk_config_sample_test.json +++ b/test/capif_sdk_config_sample_test.json @@ -6,15 +6,15 @@ "capif_username": "", "capif_password": "", "debug_mode": "", - "invoker":{ + "invoker": { "invoker_folder": "", "capif_callback_url": "", "supported_features":"", - "check_authorization":{ + "check_authentication_data":{ "ip":"", "port":"" }, - "cert_generation":{ + "cert_generation": { "csr_common_name": "", "csr_organizational_unit": "", "csr_organization": "", @@ -39,17 +39,9 @@ "service-kpis": "" } }, - "provider":{ + "provider": { "provider_folder": "", - "cert_generation":{ - "csr_common_name": "", - "csr_organizational_unit": "", - "csr_organization": "", - "csr_locality": "", - "csr_state_or_province_name": "", - "csr_country_name": "", - "csr_email_address": "" - }, + "supported_features": "", "apfs": "", "aefs": "", "publish_req": { @@ -60,6 +52,15 @@ "" ] }, + "cert_generation": { + "csr_common_name": "", + "csr_organizational_unit": "", + "csr_organization": "", + "csr_locality": "", + "csr_state_or_province_name": "", + "csr_country_name": "", + "csr_email_address": "" + }, "api_description_path": "" - } + } }