Loading deploy/oeg.yaml 0 → 100644 +179 −0 Changes for deploy/oeg.yaml: 179 added lines, 0 removed lines. Original line number Diff line number Diff line --- kind: PersistentVolume apiVersion: v1 metadata: name: mongodb-oeg-pv-volume # Sets PV's name labels: type: local # Sets PV's type to local app: oegmongo spec: storageClassName: manual capacity: storage: 50Mi # Sets PV Volume accessModes: - ReadWriteOnce hostPath: path: "/mnt/data/mongodb_oeg" --- apiVersion: v1 kind: PersistentVolumeClaim metadata: creationTimestamp: null labels: io.kompose.service: mongo-oeg name: mongo-oeg spec: storageClassName: manual accessModes: - ReadWriteOnce resources: requests: storage: 50Mi status: {} --- apiVersion: apps/v1 kind: Deployment metadata: annotations: kompose.cmd: kompose convert kompose.version: 1.26.0 (40646f47) creationTimestamp: null labels: io.kompose.service: oegmongo name: oegmongo spec: replicas: 1 selector: matchLabels: io.kompose.service: oegmongo strategy: type: Recreate template: metadata: annotations: kompose.cmd: kompose convert kompose.version: 1.26.0 (40646f47) creationTimestamp: null labels: #io.kompose.network/netEMPkub: "true" io.kompose.service: oegmongo spec: containers: - image: mongo name: oegmongo ports: - containerPort: 27017 resources: {} volumeMounts: - mountPath: /data/db name: mongo-db restartPolicy: Always volumes: - name: mongo-db persistentVolumeClaim: claimName: mongo-oeg status: {} --- apiVersion: v1 kind: Service metadata: annotations: kompose.cmd: kompose convert kompose.version: 1.26.0 (40646f47) creationTimestamp: null labels: io.kompose.service: oegmongo name: oegmongo spec: type: ClusterIP ports: - name: "27017" port: 27017 targetPort: 27017 selector: io.kompose.service: oegmongo status: loadBalancer: {} --- apiVersion: apps/v1 kind: Deployment metadata: annotations: kompose.cmd: kompose convert kompose.version: 1.26.0 (40646f47) creationTimestamp: null labels: io.kompose.service: oegcontroller name: oegcontroller spec: replicas: 1 selector: matchLabels: io.kompose.service: oegcontroller strategy: {} template: metadata: annotations: kompose.cmd: kompose convert kompose.version: 1.26.0 (40646f47) creationTimestamp: null labels: io.kompose.service: oegcontroller spec: containers: - env: - name: MONGO_URI value: mongodb://oegmongo:27017 - name: SRM_HOST value: http://srm:8080/srm/1.0.0 - name: FEDERATION_MANAGER_HOST value: http://federation-manager.federation-manager.svc.cluster.local:8989/operatorplatform/federation/v1 - name: PARTNER_API_ROOT value: http://10.8.0.1:31002 - name: TOKEN_ENDPOINT value: http://federation-manager.federation-manager.svc.cluster.local:8080/realms/federation/protocol/openid-connect/token image: ghcr.io/sunriseopenoperatorplatform/oeg/oeg:1.0.1 name: oegcontroller ports: - containerPort: 8080 resources: {} imagePullPolicy: Always restartPolicy: Always status: {} --- apiVersion: v1 kind: Service metadata: name: oeg namespace: sunrise6g spec: type: ClusterIP selector: io.kompose.service: oegcontroller ports: - name: http port: 80 targetPort: 8080 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: oegcontroller-ingress namespace: sunrise6g annotations: traefik.ingress.kubernetes.io/router.entrypoints: web # traefik.ingress.kubernetes.io/rewrite-target: /$2 spec: ingressClassName: traefik rules: - host: isiath.duckdns.org http: paths: - path: /oeg pathType: Prefix backend: service: name: oeg port: number: 80 No newline at end of file docker-compose.yamldeleted 100644 → 0 +0 −20 Changes for docker-compose.yaml: 0 added lines, 20 removed lines. Original line number Diff line number Diff line version: '3.1' services: mongo: image: mongo restart: always environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: example # cloud-management-api: # image: cloud-management-api # restart: always # ports: # - 8080:8080 # environment: # ME_CONFIG_MONGODB_ADMINUSERNAME: root # ME_CONFIG_MONGODB_ADMINPASSWORD: example # ME_CONFIG_MONGODB_URL: mongodb://root:example@mongo:27017/ # ME_CONFIG_BASICAUTH: false edge_cloud_management_api/configs/env_config.py +2 −0 Changes for edge_cloud_management_api/configs/env_config.py: 2 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -12,6 +12,8 @@ class Configuration(BaseSettings): PI_EDGE_PASSWORD: str = os.getenv("PI_EDGE_PASSWORD") HTTP_PROXY: str = os.getenv("HTTP_PROXY") FEDERATION_MANAGER_HOST=os.getenv("FEDERATION_MANAGER_HOST") TOKEN_ENDPOINT = os.getenv('TOKEN_ENDPOINT') PARTNER_API_ROOT = os.getenv('PARTNER_API_ROOT') config = Configuration() edge_cloud_management_api/controllers/app_controllers.py +70 −13 Changes for edge_cloud_management_api/controllers/app_controllers.py: 70 added lines, 13 removed lines. Original line number Diff line number Diff line Loading @@ -2,9 +2,12 @@ from flask import jsonify, request from pydantic import ValidationError from edge_cloud_management_api.managers.log_manager import logger from edge_cloud_management_api.services.edge_cloud_services import PiEdgeAPIClientFactory from edge_cloud_management_api.services.federation_services import FederationManagerClientFactory from edge_cloud_management_api.services.storage_service import get_zone from edge_cloud_management_api.services.storage_service import get_fed factory = FederationManagerClientFactory() federation_client = factory.create_federation_client() class NotFound404Exception(Exception): pass Loading Loading @@ -87,28 +90,82 @@ def delete_app(appId, x_correlator=None): def create_app_instance(): logger.info("Received request to create app instance") try: body = request.get_json() logger.debug(f"Request body: {body}") app_id = body.get("appId") edge_zone_id = body.get("edgeCloudZoneId") # k8s_ref = body.get("kubernetesClusterRef") app_zones = body.get("appZones") pi_edge_client_factory = PiEdgeAPIClientFactory() pi_edge_client = pi_edge_client_factory.create_pi_edge_api_client() if not app_id or not edge_zone_id : if not app_id or not app_zones : return jsonify({"error": "Missing required fields: appId, edgeCloudZoneId, or kubernetesCLusterRef"}), 400 local_zone = get_zone(edge_zone_id) if not local_zone: # TODO: apply federation logic return 'Zone belongs to federated partner OP. Switching to Federation Manager.' zone = get_zone(app_zones[0].get('EdgeCloudZone').get('edgeCloudZoneId')) if zone.get('isLocal')=='false': # Step 1: retrieve app metadata appData = pi_edge_client.get_app(appId=app_id).get('appManifest') #Step 2: compose GSMA artefact payload artefact = {} artefact['artefactId'] = app_id artefact['appProviderId'] = appData.get('appProvider') artefact['artefactName'] = appData.get('name') artefact['artefactVersionInfo'] = appData.get('version') artefact['artefactDescription'] = '' repoInfo = appData.get('appRepo') artefact['repoType'] = repoInfo.get('type') artefact['artefactRepoLocation'] = {'repoURL': repoInfo.get('imagePath'), 'userName': repoInfo.get('userName'), 'password': repoInfo.get('credentials'), 'token': ''} exposedInterfaces = [] networkInterfaces = appData.get('componentSpec')[0].get('networkInterfaces') for ni in networkInterfaces: interface = {'interfaceId': '', 'commProtocol': ni.get('protocol'), 'commPort': ni.get('port'), 'visibilityType': ni.get('visibilityType'), 'network': '', 'InterfaceName': ''} exposedInterfaces.append(interface) artefact['componentSpec'] = [ { 'componentName': appData.get('name'), 'numOfInstances': 0, 'restartPolicy': 'RESTART_POLICY_ALWAYS', 'exposedInterfaces': exposedInterfaces, 'compEnvParams': [], 'persistentVolumes': [] } ] # Step 3: Send artefact to local fed manager fed_token = get_fed(zone.get('fedContextId')).get('token') create_artefact_response = federation_client.create_artefact(artefact=artefact, federation_context_id=zone.get('fedContextId'), token=fed_token) # Step 4: Onboard app if create_artefact_response.status_code == 200 or create_artefact_response.status_code ==409: # Step 5: Create GSM onboard app payload onboard_app = {} onboard_app['appId'] = app_id onboard_app['appProviderId'] = appData.get('appProvider') onboard_app['appDeploymentZones'] = [] appMetaData = {} appMetaData['appName'] = appData.get('name') appMetaData['version'] = appData.get('version') onboard_app['appMetaData'] = appMetaData onboard_app['appComponentSpecs'] = [{'serviceNameNB': appData.get('name'), 'serviceNameEW': appData.get('name'), 'componentName': appData.get('name'), 'artefactId': app_id } ] # Step 6: Onboard app at partner onboard_app_response = federation_client.onboard_application(federation_context_id=zone.get('fedContextId'), body=onboard_app, token=fed_token) if onboard_app_response.status_code==200: # Step 7: Construct GSMA deployment payload deploy_app = {} deploy_app['appId'] = app_id deploy_app['appVersion'] = appData.get('version') deploy_app['appProviderId'] = appData.get('appProvider') deploy_app['zoneInfo'] = {'zoneId': zone.get('edgeCloudZoneId')} # Step 8: Deploy app at partner deploy_app_response = federation_client.deploy_app_partner(federation_context_id=zone.get('fedContextId'), body=deploy_app, token = fed_token) return deploy_app_response logger.info(f"Preparing to send deployment request to SRM for appId={app_id}") pi_edge_client_factory = PiEdgeAPIClientFactory() pi_edge_client = pi_edge_client_factory.create_pi_edge_api_client() logger.info(f"Preparing to send deployment request to SRM for appId={app_id}") print("\n === Preparing Deployment Request ===") print(f" Endpoint: {pi_edge_client.base_url}/deployedServiceFunction") Loading edge_cloud_management_api/controllers/edge_cloud_controller.py +5 −0 Changes for edge_cloud_management_api/controllers/edge_cloud_controller.py: 5 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -5,6 +5,7 @@ from edge_cloud_management_api.configs.env_config import config from edge_cloud_management_api.managers.log_manager import logger from edge_cloud_management_api.services.edge_cloud_services import PiEdgeAPIClientFactory from edge_cloud_management_api.services.storage_service import insert_zones from edge_cloud_management_api.services.federation_services import FederationManagerClientFactory try: Loading @@ -13,10 +14,14 @@ try: zones = api_client.edge_cloud_zones() for zone in zones: zone['_id'] = zone.get('edgeCloudZoneId') zone['isLocal'] = 'true' insert_zones(zones) except Exception as e: logger.error(e.args) factory = FederationManagerClientFactory() federation_client = factory.create_federation_client() class EdgeCloudZone(BaseModel): edgeCloudZoneId: str = Field(..., description="Unique identifier of the Edge Cloud Zone") edgeCloudZoneName: str = Field(..., description="Name of the Edge Cloud Zone") Loading Loading
deploy/oeg.yaml 0 → 100644 +179 −0 Changes for deploy/oeg.yaml: 179 added lines, 0 removed lines. Original line number Diff line number Diff line --- kind: PersistentVolume apiVersion: v1 metadata: name: mongodb-oeg-pv-volume # Sets PV's name labels: type: local # Sets PV's type to local app: oegmongo spec: storageClassName: manual capacity: storage: 50Mi # Sets PV Volume accessModes: - ReadWriteOnce hostPath: path: "/mnt/data/mongodb_oeg" --- apiVersion: v1 kind: PersistentVolumeClaim metadata: creationTimestamp: null labels: io.kompose.service: mongo-oeg name: mongo-oeg spec: storageClassName: manual accessModes: - ReadWriteOnce resources: requests: storage: 50Mi status: {} --- apiVersion: apps/v1 kind: Deployment metadata: annotations: kompose.cmd: kompose convert kompose.version: 1.26.0 (40646f47) creationTimestamp: null labels: io.kompose.service: oegmongo name: oegmongo spec: replicas: 1 selector: matchLabels: io.kompose.service: oegmongo strategy: type: Recreate template: metadata: annotations: kompose.cmd: kompose convert kompose.version: 1.26.0 (40646f47) creationTimestamp: null labels: #io.kompose.network/netEMPkub: "true" io.kompose.service: oegmongo spec: containers: - image: mongo name: oegmongo ports: - containerPort: 27017 resources: {} volumeMounts: - mountPath: /data/db name: mongo-db restartPolicy: Always volumes: - name: mongo-db persistentVolumeClaim: claimName: mongo-oeg status: {} --- apiVersion: v1 kind: Service metadata: annotations: kompose.cmd: kompose convert kompose.version: 1.26.0 (40646f47) creationTimestamp: null labels: io.kompose.service: oegmongo name: oegmongo spec: type: ClusterIP ports: - name: "27017" port: 27017 targetPort: 27017 selector: io.kompose.service: oegmongo status: loadBalancer: {} --- apiVersion: apps/v1 kind: Deployment metadata: annotations: kompose.cmd: kompose convert kompose.version: 1.26.0 (40646f47) creationTimestamp: null labels: io.kompose.service: oegcontroller name: oegcontroller spec: replicas: 1 selector: matchLabels: io.kompose.service: oegcontroller strategy: {} template: metadata: annotations: kompose.cmd: kompose convert kompose.version: 1.26.0 (40646f47) creationTimestamp: null labels: io.kompose.service: oegcontroller spec: containers: - env: - name: MONGO_URI value: mongodb://oegmongo:27017 - name: SRM_HOST value: http://srm:8080/srm/1.0.0 - name: FEDERATION_MANAGER_HOST value: http://federation-manager.federation-manager.svc.cluster.local:8989/operatorplatform/federation/v1 - name: PARTNER_API_ROOT value: http://10.8.0.1:31002 - name: TOKEN_ENDPOINT value: http://federation-manager.federation-manager.svc.cluster.local:8080/realms/federation/protocol/openid-connect/token image: ghcr.io/sunriseopenoperatorplatform/oeg/oeg:1.0.1 name: oegcontroller ports: - containerPort: 8080 resources: {} imagePullPolicy: Always restartPolicy: Always status: {} --- apiVersion: v1 kind: Service metadata: name: oeg namespace: sunrise6g spec: type: ClusterIP selector: io.kompose.service: oegcontroller ports: - name: http port: 80 targetPort: 8080 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: oegcontroller-ingress namespace: sunrise6g annotations: traefik.ingress.kubernetes.io/router.entrypoints: web # traefik.ingress.kubernetes.io/rewrite-target: /$2 spec: ingressClassName: traefik rules: - host: isiath.duckdns.org http: paths: - path: /oeg pathType: Prefix backend: service: name: oeg port: number: 80 No newline at end of file
docker-compose.yamldeleted 100644 → 0 +0 −20 Changes for docker-compose.yaml: 0 added lines, 20 removed lines. Original line number Diff line number Diff line version: '3.1' services: mongo: image: mongo restart: always environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: example # cloud-management-api: # image: cloud-management-api # restart: always # ports: # - 8080:8080 # environment: # ME_CONFIG_MONGODB_ADMINUSERNAME: root # ME_CONFIG_MONGODB_ADMINPASSWORD: example # ME_CONFIG_MONGODB_URL: mongodb://root:example@mongo:27017/ # ME_CONFIG_BASICAUTH: false
edge_cloud_management_api/configs/env_config.py +2 −0 Changes for edge_cloud_management_api/configs/env_config.py: 2 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -12,6 +12,8 @@ class Configuration(BaseSettings): PI_EDGE_PASSWORD: str = os.getenv("PI_EDGE_PASSWORD") HTTP_PROXY: str = os.getenv("HTTP_PROXY") FEDERATION_MANAGER_HOST=os.getenv("FEDERATION_MANAGER_HOST") TOKEN_ENDPOINT = os.getenv('TOKEN_ENDPOINT') PARTNER_API_ROOT = os.getenv('PARTNER_API_ROOT') config = Configuration()
edge_cloud_management_api/controllers/app_controllers.py +70 −13 Changes for edge_cloud_management_api/controllers/app_controllers.py: 70 added lines, 13 removed lines. Original line number Diff line number Diff line Loading @@ -2,9 +2,12 @@ from flask import jsonify, request from pydantic import ValidationError from edge_cloud_management_api.managers.log_manager import logger from edge_cloud_management_api.services.edge_cloud_services import PiEdgeAPIClientFactory from edge_cloud_management_api.services.federation_services import FederationManagerClientFactory from edge_cloud_management_api.services.storage_service import get_zone from edge_cloud_management_api.services.storage_service import get_fed factory = FederationManagerClientFactory() federation_client = factory.create_federation_client() class NotFound404Exception(Exception): pass Loading Loading @@ -87,28 +90,82 @@ def delete_app(appId, x_correlator=None): def create_app_instance(): logger.info("Received request to create app instance") try: body = request.get_json() logger.debug(f"Request body: {body}") app_id = body.get("appId") edge_zone_id = body.get("edgeCloudZoneId") # k8s_ref = body.get("kubernetesClusterRef") app_zones = body.get("appZones") pi_edge_client_factory = PiEdgeAPIClientFactory() pi_edge_client = pi_edge_client_factory.create_pi_edge_api_client() if not app_id or not edge_zone_id : if not app_id or not app_zones : return jsonify({"error": "Missing required fields: appId, edgeCloudZoneId, or kubernetesCLusterRef"}), 400 local_zone = get_zone(edge_zone_id) if not local_zone: # TODO: apply federation logic return 'Zone belongs to federated partner OP. Switching to Federation Manager.' zone = get_zone(app_zones[0].get('EdgeCloudZone').get('edgeCloudZoneId')) if zone.get('isLocal')=='false': # Step 1: retrieve app metadata appData = pi_edge_client.get_app(appId=app_id).get('appManifest') #Step 2: compose GSMA artefact payload artefact = {} artefact['artefactId'] = app_id artefact['appProviderId'] = appData.get('appProvider') artefact['artefactName'] = appData.get('name') artefact['artefactVersionInfo'] = appData.get('version') artefact['artefactDescription'] = '' repoInfo = appData.get('appRepo') artefact['repoType'] = repoInfo.get('type') artefact['artefactRepoLocation'] = {'repoURL': repoInfo.get('imagePath'), 'userName': repoInfo.get('userName'), 'password': repoInfo.get('credentials'), 'token': ''} exposedInterfaces = [] networkInterfaces = appData.get('componentSpec')[0].get('networkInterfaces') for ni in networkInterfaces: interface = {'interfaceId': '', 'commProtocol': ni.get('protocol'), 'commPort': ni.get('port'), 'visibilityType': ni.get('visibilityType'), 'network': '', 'InterfaceName': ''} exposedInterfaces.append(interface) artefact['componentSpec'] = [ { 'componentName': appData.get('name'), 'numOfInstances': 0, 'restartPolicy': 'RESTART_POLICY_ALWAYS', 'exposedInterfaces': exposedInterfaces, 'compEnvParams': [], 'persistentVolumes': [] } ] # Step 3: Send artefact to local fed manager fed_token = get_fed(zone.get('fedContextId')).get('token') create_artefact_response = federation_client.create_artefact(artefact=artefact, federation_context_id=zone.get('fedContextId'), token=fed_token) # Step 4: Onboard app if create_artefact_response.status_code == 200 or create_artefact_response.status_code ==409: # Step 5: Create GSM onboard app payload onboard_app = {} onboard_app['appId'] = app_id onboard_app['appProviderId'] = appData.get('appProvider') onboard_app['appDeploymentZones'] = [] appMetaData = {} appMetaData['appName'] = appData.get('name') appMetaData['version'] = appData.get('version') onboard_app['appMetaData'] = appMetaData onboard_app['appComponentSpecs'] = [{'serviceNameNB': appData.get('name'), 'serviceNameEW': appData.get('name'), 'componentName': appData.get('name'), 'artefactId': app_id } ] # Step 6: Onboard app at partner onboard_app_response = federation_client.onboard_application(federation_context_id=zone.get('fedContextId'), body=onboard_app, token=fed_token) if onboard_app_response.status_code==200: # Step 7: Construct GSMA deployment payload deploy_app = {} deploy_app['appId'] = app_id deploy_app['appVersion'] = appData.get('version') deploy_app['appProviderId'] = appData.get('appProvider') deploy_app['zoneInfo'] = {'zoneId': zone.get('edgeCloudZoneId')} # Step 8: Deploy app at partner deploy_app_response = federation_client.deploy_app_partner(federation_context_id=zone.get('fedContextId'), body=deploy_app, token = fed_token) return deploy_app_response logger.info(f"Preparing to send deployment request to SRM for appId={app_id}") pi_edge_client_factory = PiEdgeAPIClientFactory() pi_edge_client = pi_edge_client_factory.create_pi_edge_api_client() logger.info(f"Preparing to send deployment request to SRM for appId={app_id}") print("\n === Preparing Deployment Request ===") print(f" Endpoint: {pi_edge_client.base_url}/deployedServiceFunction") Loading
edge_cloud_management_api/controllers/edge_cloud_controller.py +5 −0 Changes for edge_cloud_management_api/controllers/edge_cloud_controller.py: 5 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -5,6 +5,7 @@ from edge_cloud_management_api.configs.env_config import config from edge_cloud_management_api.managers.log_manager import logger from edge_cloud_management_api.services.edge_cloud_services import PiEdgeAPIClientFactory from edge_cloud_management_api.services.storage_service import insert_zones from edge_cloud_management_api.services.federation_services import FederationManagerClientFactory try: Loading @@ -13,10 +14,14 @@ try: zones = api_client.edge_cloud_zones() for zone in zones: zone['_id'] = zone.get('edgeCloudZoneId') zone['isLocal'] = 'true' insert_zones(zones) except Exception as e: logger.error(e.args) factory = FederationManagerClientFactory() federation_client = factory.create_federation_client() class EdgeCloudZone(BaseModel): edgeCloudZoneId: str = Field(..., description="Unique identifier of the Edge Cloud Zone") edgeCloudZoneName: str = Field(..., description="Name of the Edge Cloud Zone") Loading