Fix/payloads to deploy on partner

This PR adds some fixes for the integration OEG-FM. This is WIP and needs more generalization for some parameters.

The way to validate this is with this "smoke-test":

Manual Testing

  • We need to make sure the OEG has the PARTNER_API_ROOT properly set pointin to FM in OP2

    • In OP1 (points to OP2's FM)
      • kubectl set env -n oop deploy/oegcontroller PARTNER_API_ROOT=http://192.168.123.178:30989
    • In OP2 (points to OP1's FM)
      • kubectl set env -n oop deploy/oegcontroller PARTNER_API_ROOT=http://192.168.123.155:30989
  • Then create a federation bash curl -X 'POST' \ 'http://192.168.123.155:32263/oeg/1.0.0/partner' \ -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "origOPFederationId": "swagger", "origOPCountryCode": "CU", "origOPMobileNetworkCodes": { "mcc": "002", "mncs": [ "02" ] }, "origOPFixedNetworkCodes": [ "53" ], "initialDate": "2025-03-18T10:28:11.907Z", "partnerStatusLink": "string", "partnerCallbackCredentials": { "tokenUrl": "string", "clientId": "string", "clientSecret": "string" } }'

  • Temp - create a zone subscription

    • FED_CONTEXT_ID=6970ae05abd4d7e3b4aa77b5
      curl --request POST \
        --url http://192.168.123.155:30989/operatorplatform/federation/v1/$FED_CONTEXT_ID/zones \
        --header 'authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJiVXppbUtUR1NrRm1WU0ZBaUFyTXkwTkltWWNPWHVwajRRSVp1ODdwZUZjIn0.eyJleHAiOjE3Njg5NzkwNjIsImlhdCI6MTc2ODk3ODc2MiwianRpIjoiODg5ODM3MmYtM2M4Mi00N2FkLWI4OGMtZGVhMzc4NTQ0OTRiIiwiaXNzIjoiaHR0cDovL2tleWNsb2FrLmZlZGVyYXRpb24tbWFuYWdlci5zdmMuY2x1c3Rlci5sb2NhbDo4MDgwL3JlYWxtcy9mZWRlcmF0aW9uIiwic3ViIjoiODI4YmQ0ZDYtZGRkYy00NTM1LWE4YjYtMTUzMmUwOGJlYjQxIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoib3JpZ2luYXRpbmctb3AtMSIsInNjb3BlIjoiZmVkLW1nbXQifQ.KjWyIoxtPrKA1v_q8pKuy00MaJ7JIyNMweRik4-xyYYDeS9V3Uy5XyMMSVrbH_ARyrTf2Qs5IdW4vq43w4Q9YfsMoyFWP69ja6dqjOfKzYKHtQCQpbr4nL-afKukpEAsxeZpzdeYC1zuWFM0sp6ZyjF82BoEiIdGC_2xXQzxPetpp4o9gGPhLm9t1xNeJZ7Tk0n6NgVdp9LLfnmUl9D_Jyl0t4CzpqkmAN75b58ZUE1uexLSQyJM6v4R5FhpO1Y6OkgtxuYmnigFlZ7eW2KyJvntR4w_P4K7MjK9rQj8QiZ3kDDGmpVuN7v-AB7s2ksk8TB4LKQrSk5_775aEc2pNA' \
        --header 'content-type: application/json' \
        --header 'x-internal: true' \
        --header 'x-partner-api-root: http://192.168.123.178:30989' \
        --data '{
          "acceptedAvailabilityZones": [
            "7f2c0b2f-3d57-4bb4-9c1f-8a3f1f4a2a9e"
          ],
          "availZoneNotifLink": "http://callback.local"
        }'
  • Onboard an app. This is a simple one:

    ```json
    curl -X 'POST' \
      'http://192.168.123.155:32263/oeg/1.0.0/apps' \
      -H 'accept: application/json' \
      -H 'Content-Type: application/json' \
      -d '{
        "appId": "d1fbb5c0-5d11-4a2d-9f60-bc4c8c6f7d24",
        "name": "nginx_web_app24",
        "appProvider": "nginx_inc",
        "version": "1.0.0",
        "packageType": "CONTAINER",
        "appRepo": {
          "type": "PUBLICREPO",
          "imagePath": "docker.io/library/nginx:1.25.4-alpine",
          "userName": "",
          "credentials": "",
          "authType": "NONE",
          "checksum": ""
        },
        "componentSpec": [
          {
            "componentName": "nginx_server",
            "networkInterfaces": [
              { "interfaceId": "eth0", "protocol": "TCP", "port": 80, "visibilityType": "VISIBILITY_EXTERNAL" }
            ]
          }
        ]
      }'
    ```
  • Create app instance:

    ```json
    curl -X 'POST' \
      'http://192.168.123.155:32263/oeg/1.0.0/appinstances' \
      -H 'accept: application/json' \
      -H 'Content-Type: application/json' \
      -d '{
      "appId": "d1fbb5c0-5d11-4a2d-9f60-bc4c8c6f7d24",
      "appZones": [
        {
          "EdgeCloudZone": {
            "edgeCloudZoneId": "7f2c0b2f-3d57-4bb4-9c1f-8a3f1f4a2a9e",
            "edgeCloudZoneName": "zone-7f2c0b2f-3d57-4bb4-9c1f-8a3f1f4a2a9e",
            "edgeCloudZoneStatus": "active",
            "edgeCloudProvider": "string",
            "edgeCloudRegion": "string"
          }
        }
      ]
    }'
    ```

Merge request reports

Loading
+675 −84

File changed.

Preview size limit exceeded, changes collapsed.

+79 −15
Changes for edge_cloud_management_api/services/federation_services.py: 79 added lines, 15 removed lines.
Original line number Diff line number Diff line
@@ -87,6 +87,7 @@ class FederationManagerClient:
            logger.error(f"DELETE /{id}/partner unexpected error: {e}")
            return {"error": str(e)}, 500


    def get_federation_context_ids(self, token: str):
        url = f"{self.base_url}/fed-context-id"
        try:
@@ -106,26 +107,62 @@ class FederationManagerClient:
            logger.error(f"GET /fed-context-id unexpected error: {e}")
            return {"error": str(e)}, 500

    def get_federation(self, federation_context_id: str, token: str):
        """Verify that a federation context exists"""
        url = f"{self.base_url}/{federation_context_id}"
        try:
            response = requests.get(
                url,
                headers=self._get_headers(token),
                timeout=10
            )
            try:
                response_body = response.json()
            except ValueError:
                response_body = response.text
            return response_body, response.status_code
        except Timeout:
            logger.error(f"GET /{federation_context_id} timed out")
            return {"error": "Request timed out"}, 408
        except ConnectionError:
            logger.error(f"GET /{federation_context_id} connection error")
            return {"error": "Connection error"}, 503
        except requests.exceptions.HTTPError as http_err:
            logger.error(f"GET /{federation_context_id} HTTP error: {http_err}")
            return {"error": str(http_err)}, response.status_code
        except Exception as e:
            logger.error(f"GET /{federation_context_id} unexpected error: {e}")
            return {"error": str(e)}, 500

        
    '''---PARTNER APP ONBOARDING---'''

    def onboard_application(self, federation_context_id: str, body: dict, token: str):
        url = f"{self.base_url}/{federation_context_id}/application/onboarding"
        try:
           response = requests.post(url, headers=self._get_headers(token), json=body, timeout=10)
           response.raise_for_status()
           return response.json()
            response = requests.post(
                url,
                headers=self._get_headers(token),
                json=body,
                timeout=10
            )
            try:
                response_body = response.json()
            except ValueError:
                response_body = response.text
            return response_body, response.status_code
        except Timeout:
            logger.error("POST /application/onboarding timed out")
          return {"error": "Request timed out"}
            return {"error": "Request timed out"}, 408
        except ConnectionError:
            logger.error("POST /application/onboarding connection error")
            return {"error": "Connection error"}
            return {"error": "Connection error"}, 503
        except requests.exceptions.HTTPError as http_err:
            logger.error(f"POST /application/onboarding HTTP error: {http_err}")
            return {"error": str(http_err), "status_code": response.status_code}
            return {"error": str(http_err)}, response.status_code
        except Exception as e:
            logger.error(f"POST /application/onboarding unexpected error: {e}")
            return {"error": str(e)}
            return {"error": str(e)}, 500


    def get_onboarded_app(self, federation_context_id: str, app_id: str, token: str):
@@ -171,11 +208,29 @@ class FederationManagerClient:
    def deploy_app_partner(self, federation_context_id: str, body: dict, token: str):
        url = f"{self.base_url}/{federation_context_id}/application/lcm"
        try:
            response = requests.post(url, headers=self._get_headers(token), json=body, timeout=10)
            return response
            response = requests.post(
                url,
                headers=self._get_headers(token),
                json=body,
                timeout=10
            )
            try:
                response_body = response.json()
            except ValueError:
                response_body = response.text
            return response_body, response.status_code
        except Timeout:
            logger.error("POST /application/lcm timed out")
            return {"error": "Request timed out"}, 408
        except ConnectionError:
            logger.error("POST /application/lcm connection error")
            return {"error": "Connection error"}, 503
        except requests.exceptions.HTTPError as http_err:
            logger.error(f"POST /application/lcm HTTP error: {http_err}")
            return {"error": str(http_err)}, response.status_code
        except Exception as e:
            logger.error(f"DELETE onboarding app unexpected error: {e}")
            return {"error": str(e), "status_code": 500}
            logger.error(f"POST /application/lcm unexpected error: {e}")
            return {"error": str(e)}, 500

    '''---AVAILABILITY ZONE INFO SYNCHRONIZATION---'''

@@ -238,14 +293,23 @@ class FederationManagerClient:

    '''---ARTEFACT API---'''

    def create_artefact(self, artefact: dict, federation_context_id, token: str):
    def create_artefact(self, artefact: dict, federation_context_id: str, token: str):
        url = f"{self.base_url}/{federation_context_id}/artefact"
        try:
            response = requests.post(url, headers=self._get_headers(token), json=artefact, timeout=10)
            return response
            response = requests.post(
                url,
                headers=self._get_headers(token),
                json=artefact,
                timeout=120
            )
            try:
                body = response.json()
            except ValueError:
                body = response.text
            return body, response.status_code
        except Exception as e:
            logger.error(f"Create artefact unexpected error: {e}")
            return {"error": str(e), "status_code": 500}
            return {"error": str(e)}, 500

class FederationManagerClientFactory:
    def __init__(self):
+1 −0
Changes for edge_cloud_management_api/specification/openapi.yaml: 1 added line, 0 removed lines.
Original line number Diff line number Diff line
@@ -183,6 +183,7 @@ paths:
              KubernetesExample:
                summary: Example for Kubernetes app
                value:
                  appId: 3fa85f64-5717-4562-b3fc-2c963f66afa6
                  name: nginx_web_app
                  appProvider: nginx_inc
                  version: 1.0.0
+1 −1
Changes for .gitignore: 1 added line, 1 removed line.
Original line number Diff line number Diff line
@@ -19,4 +19,4 @@ wheels/
htmlcov/
.mypy_cache/
.pytest_cache/
.ruff_cache/
 No newline at end of file
.ruff_cache/.idea/

e -i --root

0 → 100644
+133 −0
Changes for e -i --root: 133 added lines, 0 removed lines.
Original line number Diff line number Diff line
f1b2b7b papathanail <gpapathan@intracom-telecom.com>
5805914 geop4p <papathanail@uom.edu.gr>
ab2153c gpapathan87 <gpapathan@intracom-telecom.com>
1aa166a George Papathanail <gpapathan@intracom-telecom.com>
95b4d76 George Papathanail <gpapathan@intracom-telecom.com>
7e0a1a8 Laskaratos Dimitris <dlaskaratos@intracomtel.com>
e7c0779 George Papathanail <gpapathan@intracom-telecom.com>
ba67f75 Laskaratos Dimitris <dlaskaratos@intracomtel.com>
006a3f4 Laskaratos Dimitris <dlaskaratos@intracomtel.com>
b5c88bb Dimitrios Laskaratos <dlaskaratos@intracom-telecom.com>
f2ede60 Laskaratos Dimitris <dlaskaratos@intracomtel.com>
62d4b26 George Papathanail <gpapathan@intracom-telecom.com>
8db04a1 gpapathan87 <gpapathan@intracom-telecom.com>
0dc3e23 gpapathan87 <gpapathan@intracom-telecom.com>
668f15a gpapathan87 <gpapathan@intracom-telecom.com>
9fdc3f8 gpapathan87 <gpapathan@intracom-telecom.com>
92af725 gpapathan87 <gpapathan@intracom-telecom.com>
23918d2 gpapathan87 <gpapathan@intracom-telecom.com>
9f30d28 gpapathan87 <gpapathan@intracom-telecom.com>
21c04a4 gpapathan87 <gpapathan@intracom-telecom.com>
310f9d3 gpapathan87 <gpapathan@intracom-telecom.com>
c7cdf37 gpapathan87 <gpapathan@intracom-telecom.com>
99e91e4 gpapathan87 <gpapathan@intracom-telecom.com>
9676d5f gpapathan87 <gpapathan@intracom-telecom.com>
49a1e8b gpapathan87 <gpapathan@intracom-telecom.com>
3b64b8a gpapathan87 <gpapathan@intracom-telecom.com>
33dde08 gpapathan87 <gpapathan@intracom-telecom.com>
08bf480 gpapathan87 <gpapathan@intracom-telecom.com>
36d67df Dimitrios Laskaratos <dlaskaratos@intracom-telecom.com>
9d28ad8 Laskaratos Dimitris <dlaskaratos@intracomtel.com>
aa74771 Laskaratos Dimitris <dlaskaratos@intracomtel.com>
89a9f0b Dimitrios Laskaratos <dlaskaratos@intracom-telecom.com>
4c1a5a7 gpapathan87 <gpapathan@intracom-telecom.com>
e5bbc70 Laskaratos Dimitris <dlaskaratos@intracomtel.com>
ddc9829 Dimitrios Laskaratos <dlaskaratos@intracom-telecom.com>
3ae87ee Laskaratos Dimitris <dlaskaratos@intracomtel.com>
2c7fadb Laskaratos Dimitris <dlaskaratos@intracomtel.com>
f18e931 gpapathan87 <gpapathan@intracom-telecom.com>
f5245d1 gpapathan87 <gpapathan@intracom-telecom.com>
be4c643 gpapathan87 <gpapathan@intracom-telecom.com>
9ab4cd1 gpapathan87 <gpapathan@intracom-telecom.com>
d16b9e2 George Papathanail <gpapathan@intracom-telecom.com>
e776570 George Papathanail <gpapathan@intracom-telecom.com>
344b19b gpapathan87 <gpapathan@intracom-telecom.com>
69359fb Dimitrios Laskaratos <dlaskaratos@intracom-telecom.com>
615a75e Laskaratos Dimitris <dlaskaratos@intracomtel.com>
ca80137 Laskaratos Dimitris <dlaskaratos@intracomtel.com>
f64494c George Papathanail <gpapathan@intracom-telecom.com>
1883fe7 George Papathanail <gpapathan@intracom-telecom.com>
2c710c7 George Papathanail <gpapathan@intracom-telecom.com>
c2b19a5 George Papathanail <gpapathan@intracom-telecom.com>
f00cc34 George Papathanail <gpapathan@intracom-telecom.com>
2ef4e00 George Papathanail <gpapathan@intracom-telecom.com>
ace7d2f George Papathanail <gpapathan@intracom-telecom.com>
427da14 George Papathanail <gpapathan@intracom-telecom.com>
234aa2d George Papathanail <gpapathan@intracom-telecom.com>
c4fac3f Laskaratos Dimitris <dlaskaratos@intracomtel.com>
5019220 gpapathan87 <gpapathan@intracom-telecom.com>
1c306f8 Laskaratos Dimitris <dlaskaratos@intracomtel.com>
ffbdd36 gpapathan87 <gpapathan@intracom-telecom.com>
115dc2b gpapathan87 <gpapathan@intracom-telecom.com>
6853558 George Papathanail <gpapathan@intracom-telecom.com>
d5b16ec George Papathanail <gpapathan@intracom-telecom.com>
8fb1a20 George Papathanail <gpapathan@intracom-telecom.com>
3cd0065 George Papathanail <gpapathan@intracom-telecom.com>
e3d5a42 George Papathanail <gpapathan@intracom-telecom.com>
0d19f78 George Papathanail <gpapathan@intracom-telecom.com>
200f522 gpapathan87 <gpapathan@intracom-telecom.com>
14a961a gpapathan87 <gpapathan@intracom-telecom.com>
d1699f7 gpapathan87 <gpapathan@intracom-telecom.com>
d97ed44 gpapathan87 <gpapathan@intracom-telecom.com>
d9c0779 gpapathan87 <gpapathan@intracom-telecom.com>
b9fcf2f gpapathan87 <gpapathan@intracom-telecom.com>
691c4df gpapathan87 <gpapathan@intracom-telecom.com>
26f6c9a gpapathan87 <gpapathan@intracom-telecom.com>
9baba9a gpapathan87 <gpapathan@intracom-telecom.com>
ed1acfe gpapathan87 <gpapathan@intracom-telecom.com>
4c6e50b gpapathan87 <gpapathan@intracom-telecom.com>
26c8c0e gpapathan87 <gpapathan@intracom-telecom.com>
5c06d78 gpapathan87 <gpapathan@intracom-telecom.com>
bc1f66d gpapathan87 <gpapathan@intracom-telecom.com>
fed9024 gpapathan87 <gpapathan@intracom-telecom.com>
40a326e gpapathan87 <gpapathan@intracom-telecom.com>
cb477d5 gpapathan87 <gpapathan@intracom-telecom.com>
91fa911 gpapathan87 <gpapathan@intracom-telecom.com>
07c60a6 Laskaratos Dimitris <dlaskaratos@intracomtel.com>
1eee74c Laskaratos Dimitris <dlaskaratos@intracomtel.com>
081fb06 gpapathan87 <gpapathan@intracom-telecom.com>
2d9454f Laskaratos Dimitris <dlaskaratos@intracomtel.com>
4df132c Laskaratos Dimitris <dlaskaratos@intracomtel.com>
470d794 gpapathan87 <gpapathan@intracom-telecom.com>
f74b284 gpapathan87 <gpapathan@intracom-telecom.com>
bf8adc9 Laskaratos Dimitris <dlaskaratos@intracomtel.com>
27eb9a9 gpapathan87 <gpapathan@intracom-telecom.com>
5529ce2 gpapathan87 <gpapathan@intracom-telecom.com>
97e88f3 gpapathan87 <gpapathan@intracom-telecom.com>
993ace0 Karagkounis Dimitris <dkaragkounis@intracom-telecom.com>
c3fd363 Giorgos Papathanail <gpapathan@intracom-telecom.com>
d2ef265 Giorgos Papathanail <gpapathan@intracom-telecom.com>
2ea3991 Gr3at <33185243+Gr3at@users.noreply.github.com>
82f3614 Karagkounis Dimitris <dkaragkounis@intracom-telecom.com>
6f1df82 Karagkounis Dimitris <dkaragkounis@intracom-telecom.com>
9f45c7e Karagkounis Dimitris <dkaragkounis@intracom-telecom.com>
1552918 Gr3at <33185243+Gr3at@users.noreply.github.com>
48c19e0 Gr3at <33185243+Gr3at@users.noreply.github.com>
aad20b0 Karagkounis Dimitris <33185243+Gr3at@users.noreply.github.com>
94cbd48 Karagkounis Dimitris <33185243+Gr3at@users.noreply.github.com>
66e9937 Karagkounis Dimitris <33185243+Gr3at@users.noreply.github.com>
3df1e4b Karagkounis Dimitris <33185243+Gr3at@users.noreply.github.com>
51c6362 Karagkounis Dimitris <33185243+Gr3at@users.noreply.github.com>
2773a8d Karagkounis Dimitris <33185243+Gr3at@users.noreply.github.com>
a4bf76c Gr3at <33185243+Gr3at@users.noreply.github.com>
f1ecd0b Karagkounis Dimitris <33185243+Gr3at@users.noreply.github.com>
15d89d8 Karagkounis Dimitris <33185243+Gr3at@users.noreply.github.com>
ba152ed Karagkounis Dimitris <33185243+Gr3at@users.noreply.github.com>
ea53f89 Karagkounis Dimitris <33185243+Gr3at@users.noreply.github.com>
a06eae6 Karagkounis Dimitris <33185243+Gr3at@users.noreply.github.com>
04ca70a Karagkounis Dimitris <33185243+Gr3at@users.noreply.github.com>
85d6d40 Karagkounis Dimitris <33185243+Gr3at@users.noreply.github.com>
098dde3 Karagkounis Dimitris <33185243+Gr3at@users.noreply.github.com>
fb80e5e Karagkounis Dimitris <33185243+Gr3at@users.noreply.github.com>
9964e70 Karagkounis Dimitris <33185243+Gr3at@users.noreply.github.com>
e2d6d85 Karagkounis Dimitris <33185243+Gr3at@users.noreply.github.com>
f7938fb Karagkounis Dimitris <33185243+Gr3at@users.noreply.github.com>
9cee43e Karagkounis Dimitris <dkaragkounis@intracom-telecom.com>
37c8856 Karagkounis Dimitris <dkaragkounis@intracom-telecom.com>
f28bc07 Karagkounis Dimitris <dkaragkounis@intracom-telecom.com>
a5e2f46 Karagkounis Dimitris <dkaragkounis@intracom-telecom.com>
4f2ed3a Karagkounis Dimitris <dkaragkounis@intracom-telecom.com>
4a231db Karagkounis Dimitris <dkaragkounis@intracom-telecom.com>
ed9f3db Karagkounis Dimitris <dkaragkounis@intracom-telecom.com>
ab440c5 Karagkounis Dimitris <dkaragkounis@intracom-telecom.com>
cd80d90 Gr3at <33185243+Gr3at@users.noreply.github.com>
 No newline at end of file
Loading