Commit e7c07797 authored by George Papathanail's avatar George Papathanail
Browse files

Merge branch 'dev-dimitris' into 'main'

Merge request from dimitris

See merge request !6
parents b5c88bb1 ba67f754
Loading
Loading
Loading
Loading
Loading

deploy/oeg.yaml

0 → 100644
+179 −0
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.yaml

deleted100644 → 0
+0 −20
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
+2 −0
Original line number Diff line number Diff line
@@ -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()
+71 −14
Original line number Diff line number Diff line
@@ -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
@@ -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")
+5 −0
Original line number Diff line number Diff line
@@ -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:
@@ -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