Feature/lite2edge integration

  1. Configurable Config File Path (all modules)
  • Config file can now be set via FM_CONFIG_FILE environment variable
  • Default remains conf/config.cfg
  • Allows running multiple FM instances with different configurations
  • Applied to: main.py, tf_sdk.py, federation_management.py (both adapters), artefact_management.py
  1. TF-SDK Version Bump
  • sunrise6g-opensdk: 1.0.8 → 1.0.29
  • Brings lite2edge integration and GSMA-compliant edge cloud APIs
  1. Better Error Handling
  • create_federation(): Now includes error details in 422 response: f"Unable to get zones list from Edge Cloud Platform. Error: {e}"
  • upload_artefact(): Accept both 200 and 201 as success (was only 200)
  • Added logging to delete_app() for debugging federation context
  1. Dependency Updates
  • cffi: 1.16.0 → 2.0.0
  • pycparser: 2.21 → 2.23
  • pymongo: updated to 4.13.2

Merge request reports

Loading
+12 −0
Changes for keycloak/realm-import.json: 12 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -21,6 +21,18 @@
      "serviceAccountsEnabled": true,
      "defaultClientScopes": ["fed-mgmt"],
      "webOrigins": ["*"]
    },
    {
      "clientId": "originating-op-2",
      "enabled": true,
      "clientAuthenticatorType": "client-secret",
      "secret": "2mhznERfWclLDuVojY77Lp4Qd2r4e8Ms",
      "redirectUris": ["http://localhost:8080/*"],
      "publicClient": false,
      "directAccessGrantsEnabled": true,
      "serviceAccountsEnabled": true,
      "defaultClientScopes": ["fed-mgmt"],
      "webOrigins": ["*"]
    }
  ]
}
+9 −0
Changes for src/adapters/fm_adapter/application_onboarding_management.py: 9 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@
# limitations under the License.                                             #
# -------------------------------------------------------------------------- #
import json
import logging
from mongoengine.errors import ValidationError

from models.mongo_document import OriginatingOperatorPlatformOriginatingOP
@@ -23,6 +24,9 @@ from adapters.error import APIError
from clients import fed_manager as fm_client


logger = logging.getLogger(__name__)


def verify_required_header(partner_api_root):
    if not partner_api_root:
        raise APIError(400, "X-Partner-API-Root header is missing")
@@ -51,6 +55,11 @@ def delete_app(federation_context_id, app_id, bearer_token, partner_api_root):
            raise APIError(404, "Federation not found")
        originating_op_instance = originating_op_objects[0]

        logger.info(
            "Onboarding partner application using federation_id=%s partner_api_root=%s",
            originating_op_instance.partner_federation_id,
            partner_api_root,
        )
        # Find application onboarding at partner
        response_get = fm_client.get_profile(originating_op_instance.partner_federation_id, app_id, bearer_token,
                                              partner_api_root)
+3 −1
Changes for src/adapters/fm_adapter/federation_management.py: 3 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@
# -------------------------------------------------------------------------- #
from configparser import ConfigParser
from mongoengine.errors import ValidationError
import os


from models.federation_context_id import FederationContextId  # noqa: E501
@@ -27,7 +28,8 @@ from adapters.error import APIError


CONFIG = ConfigParser()
CONFIG.read("conf/config.cfg")
config_file = os.environ.get("FM_CONFIG_FILE", "conf/config.cfg")
CONFIG.read(config_file)
partnerOPFederationId = CONFIG.get("op_data", "partnerOPFederationId")
partnerOPCountryCode = CONFIG.get("op_data", "partnerOPCountryCode")
partnerOPMobileNetworkCode_MCC = CONFIG.get("op_data", "partnerOPMobileNetworkCode_MCC")
+5 −2
Changes for src/adapters/tf_adapter/artefact_management.py: 5 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -26,9 +26,11 @@ from models.mongo_document import OriginatingApplicationOnboardingManagement
from clients import artefact_manager
from clients import tf_sdk
from configparser import ConfigParser
import os

CONFIG = ConfigParser()
CONFIG.read("conf/config.cfg")
config_file = os.environ.get("FM_CONFIG_FILE", "conf/config.cfg")
CONFIG.read(config_file)
ARTEFACT_MANAGER_ENABLED = CONFIG.getboolean("artefact_manager", "enabled")
DST_REGISTRY = CONFIG.get("artefact_manager", "dst_registry")
DST_USERNAME = CONFIG.get("artefact_manager", "dst_username")
@@ -271,7 +273,8 @@ def upload_artefact(body, federation_context_id, bearer_token=None, partner_api_
    # Onboarding artefact to Edge Cloud Platform
    try:
        response = tf_sdk.onboarding_artefact(body.to_gsma_input())
        if response.status_code != 200:
        print(f"DEBUG: ECP response status: {response.status_code}, body: {response.text}")
        if response.status_code not in [200, 201]:
            response_data = response.json()
            return response_data, 409
    except Exception as error:
+5 −3
Changes for src/adapters/tf_adapter/federation_management.py: 5 added lines, 3 removed lines.
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@
import json
from configparser import ConfigParser
from mongoengine.errors import ValidationError
import os

from models.federation_context_id import FederationContextId  # noqa: E501
from models.federation_response_data import FederationResponseData  # noqa: E501
@@ -28,7 +29,8 @@ from adapters.error import APIError
from clients import tf_sdk

CONFIG = ConfigParser()
CONFIG.read("conf/config.cfg")
config_file = os.environ.get("FM_CONFIG_FILE", "conf/config.cfg")
CONFIG.read(config_file)
partnerOPFederationId = CONFIG.get("op_data", "partnerOPFederationId")
partnerOPCountryCode = CONFIG.get("op_data", "partnerOPCountryCode")
partnerOPMobileNetworkCode_MCC = CONFIG.get("op_data", "partnerOPMobileNetworkCode_MCC")
@@ -84,8 +86,8 @@ def create_federation(body, bearer_token, partner_api_root=None): # noqa: E501
    # Retrieve zone list from Edge Cloud Platform
    try:
        zones_list = prepare_offered_availability_zones()
    except Exception:
        raise APIError(422, "Unable to get zones list from Edge Cloud Platform")
    except Exception as e:
        raise APIError(422, f"Unable to get zones list from Edge Cloud Platform. Error: {e}")

    # Create a new MongoEngine document and save it to MongoDB
    new_federation = OriginatingOperatorPlatform(**federation_data)
Loading
Loading