From 956c91602fb244261313907644cd69454c70aefa Mon Sep 17 00:00:00 2001 From: gpapathan87 Date: Fri, 4 Sep 2026 12:10:43 +0300 Subject: [PATCH 01/11] feat: introduce fm --- .../API_definitions/federation-manager.yaml | 4609 +++++++++++++++++ .../gsma/federation_manager/v1_2_0/router.py | 11 + .../gsma/federation_manager/v1_2_0/schemas.py | 7 + 3 files changed, 4627 insertions(+) create mode 100644 src/open_exposure_gateway/api/gsma/federation_manager/API_definitions/federation-manager.yaml create mode 100644 src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/router.py create mode 100644 src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/schemas.py diff --git a/src/open_exposure_gateway/api/gsma/federation_manager/API_definitions/federation-manager.yaml b/src/open_exposure_gateway/api/gsma/federation_manager/API_definitions/federation-manager.yaml new file mode 100644 index 0000000..9991d08 --- /dev/null +++ b/src/open_exposure_gateway/api/gsma/federation_manager/API_definitions/federation-manager.yaml @@ -0,0 +1,4609 @@ +openapi: 3.0.3 +info: + title: Federation Management Service + description: | + # Introduction + --- + RESTful APIs that allow an OP to share the edge cloud resources and capabilities securely to other partner OPs over E/WBI. + + --- + # API Scope + + --- + APIs defined in this version of the implementation can be categorized into the following areas: + * __FederationManagement__ - Create and manage directed federation relationship with a partner OP + * __AvailabilityZoneInfoSynchronization__ - Management of resources of partner OP zones and status updates + * __ArtefactManagement__ - Upload, remove, retrieve and update application descriptors, charts and packages over E/WBI towards a partner OP + * __ApplicationOnboardingManagement__ - Register, retrieve, update and remove applications over E/WBI towards a partner OP + * __ApplicationDeploymentManagement__ - Create, update, retrieve and terminate application instances over E/WBI towards a partner OP + + --- + # Definitions + --- + This section provides definitions of terminologies commonly referred to throughout the API descriptions. + + * __Accepted Zones__ - List of partner OP zones, which the originating OP has confirmed to use for its edge applications. + * __Application Provider__ - An application developer, onboarding his/her edge application on a partner operator platform (MEC). + * __Artefact__ - Descriptor, charts or any other package associated with the application. + * __Availability Zone__ - Zones that partner OP can offer to share with originating OP. + * __Device__ - Refers to user equipment like mobile phone, tablet, IOT kit, AR/VR device etc. In context of MEC users use these devices to access edge applications. + * __Directed Federation__ - A Federation between two OP instances A and B, in which edge compute resources are shared by B to A, but not from A to B. + * __Edge Application__ - Application designed to run on MEC edge cloud. + * __E/WBI__ - East west bound interface. + * __Federation__ - Relationship among member OPs who agrees to offer services and capabilities to the application providers and end users of member OPs. + * __FederationContextId__ - Partner OP defined string identifier representing a certain federation relationship. + * __Federation Identifier__ - Identify an operator platform in federation context. + * __Flavour__ - A group of compute, network and storage resources that can be requested or granted as a single unit. + * __FlavourIdentifier__ - An OP defined string identifier representing a set of compute, storage and networking resources. + * __Home OP__ - Used in federation context to identify the OP with which the application developers or user clients are registered. + * __Instance__ - Application process running on an edge. + * __LCM Service__ - Partner OP service responsible for life cycle management of edge applications. LCM service is defined as HTTP based API endpoint identified by a well-defined FQDN or IP. + * __Offered Zones__ - Zones that partner OP offer to share to the Originating OP based on the prior agreement and local configuration. + * __Onboarding__ - Submitting an application to MEC platform. + * __OP__ - Operator platform. + * __OperatorIdentifier__ - String identifier representing the owner of MEC platform. Owner could be an enterprise, a TSP or some other organization. + * __Originating OP__ - The OP when initiating the federation creation request towards the partner OP is defined as the Originating OP. + * __Partner OP__ - Operator Platform which offers its Edge Cloud capabilities to the other Operator Platforms via E/WBI. + * __Resource__ - Compute, networking and storage resources. + * __ZoneIdentifier__ - An OP defined string identifier representing a certain geographical or logical area where edge resources and services are provided. + * __Zone Confirmation__ - Procedure via which originating OP acknowledges partner OP about the partner zones it wishes to use. + * __User Clients__ - Lightweight client applications used to access edge applications. Application users run these clients on their devices (UE, IOT device, AR/VR device etc). + + --- + # API Operations + --- + + __FederationManagement__ + * __CreateFederation__ - Creates a directed federation relationship with a partner OP. + * __GetFederationDetails__ - Retrieves details about the federation relationship with the partner OP. The response shall provide info about the zones offered by the partner, partner OP network codes, information about edge discovery and LCM service etc. + * __DeleteFederationDetails__ - Remove existing federation with the partner OP. + * __NotifyFederationUpdates__ - Call back notification used by partner OP to update originating OP about any change in existing federation relationship. + * __UpdateFederation__ - API used by the Originating OP towards the partner OP, to update the parameters associated to the existing federation. + * __QueryFederationContext__ - The Originating OP retrieves federationContextId from the partner OP. + + __AvailabilityZoneInfoSynchronization__ + * __ZoneSubscribe__ - Informs partner OP that originating OP is willing to access the specified zones and partner OP shall reserve compute and network resources for these zones. + * __ZoneUnsubscribe__ - Informs partner OP that originating OP will no longer access the specified partner OP zone. + * __GetZoneData__ - Retrieves details about the computation and network resources that partner OP has reserved for an partner OP zone. + * __Notify Zone Information__ - Call back notification used by partner OP to update originating OP about changes in the resources reserved on a partner zone. + + __ArtefactManagement__ + * __UploadArtefact__ - Uploads application artefact on partner operator platform. + * __RemoveArtefact__ - Removes an artefact from partner operator platform. + * __GetArtefact__ - Retrieves details about an artefact from partner operator platform. + + __ApplicationOnboardingManagement__ + * __OnboardApplication__ - Submits an application details to a partner OP. Based on the details provided, partner OP shall do bookkeeping, resource validation and other pre-deployment operations. + * __UpdateApplication__ - Updates partner OP about changes in application compute resource requirements, QOS Profile, associated descriptor or change in associated components. + * __DeboardApplication__ - Removes an application from partner OP. + * __ViewApplication__ - Retrieves application details from partner OP. + * __OnboardExistingAppNewZones__ - Make an application available on new additional zones. + * __LockUnlockApplicationZone__ - Forbid or permit instantiation of application on a zone. + + __Application Instance Lifecycle Management__ + * __InstallApp__ - Instantiates an application on a partner OP zone. + * __GetAppInstanceDetails__ - Retrieves an application instance details from partner OP. + * __RemoveApp__ - Terminate an application instance on a partner OP zone. + * __GetAllAppInstances__ - Retrieves details about all instances of the application running on partner OP zones. + + + © 2023 GSM Association. + All rights reserved. + version: 1.2.0 +externalDocs: + description: "GSMA, E/WBI APIs v1.3.1" + url: http://www.xxxx.com +servers: +- url: "/operatorplatform/federation/v1" +security: +- oAuth2ClientCredentials: + - fed-mgmt +paths: + /partner: + post: + tags: + - FederationManagement + summary: Creates one direction federation with partner operator platform. + operationId: create_federation + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/FederationRequestData' + required: true + responses: + "200": + description: Federation meta-info request accepted + headers: + Location: + description: "Contains the URI of the newly created resource, according\ + \ to the structure: {apiRoot}/operatorplatform/federation/v1/partner/{federationContextId}" + required: true + style: simple + explode: false + schema: + type: string + Accept-Encoding: + description: "Accept-Encoding, described in IETF RFC 7694" + style: simple + explode: false + schema: + type: string + Content-Encoding: + description: "Content-Encoding, described in IETF RFC 7231" + style: simple + explode: false + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/FederationResponseData' + "400": + description: Bad request + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "401": + description: Unauthorized + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "404": + description: Not Found + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "409": + description: Conflict + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "422": + description: Unprocessable Entity + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "500": + description: Internal Server Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "503": + description: Service Unavailable + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "520": + description: Web Server Returned an Unknown Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + default: + description: Generic Error + callbacks: + onPartnerStatusEvent: + '{$request.body#/partnerStatusLink }': + post: + requestBody: + description: | + OP uses this callback api to notify partner OP about change in federation status, federation metadata or offered zone details. Allowed combinations of objectType and operationType are + - FEDERATION - STATUS: Status specified by parameter 'federationStatus'. + - ZONES - STATUS: Status specified by parameter 'zoneStatus'. + - ZONES - ADD: Use parameter 'addZones' to define add new zones + - ZONES - REMOVE: Use parameter 'removeZones' to define remove zones. + - EDGE_DISCOVERY_SERVICE - UPDATE: Use parameter 'edgeDiscoverySvcEndPoint' to specify new endpoints + - LCM_SERVICE - UPDATE: Use parameter 'lcmSvcEndPoint' to specify new endpoints + - MOBILE_NETWORK_CODES - ADD: Use parameter 'addMobileNetworkIds' to define new mobile network codes. + - MOBILE_NETWORK_CODES - REMOVE: Use parameter 'removeMobileNetworkIds' to remove mobile network codes. + - FIXED_NETWORK_CODES - ADD: Use parameter 'addFixedNetworkIds' to define new fixed network codes. + - FIXED_NETWORK_CODES - REMOVE: Use parameter 'removeFixedNetworkIds' to remove fixed network codes. + - SERVICE_APIS - ADD/REMOVE: Parameter Usage 'addServiceAPIs / removeServiceAPIs' to add or remove Service APIs support. + content: + application/json: + schema: + required: + - federationContextId + - modificationDate + - objectType + - operationType + type: object + properties: + federationContextId: + $ref: '#/components/schemas/FederationIdentifier' + objectType: + type: string + enum: + - FEDERATION + - ZONES + - EDGE_DISCOVERY_SERVICE + - LCM_SERVICE + - MOBILE_NETWORK_CODES + - FIXED_NETWORK_CODES + - SERVICE_APIS + operationType: + type: string + enum: + - STATUS + - UPDATE + - ADD + - REMOVE + edgeDiscoverySvcEndPoint: + $ref: '#/components/schemas/ServiceEndpoint' + lcmSvcEndPoint: + $ref: '#/components/schemas/ServiceEndpoint' + addMobileNetworkIds: + $ref: '#/components/schemas/MobileNetworkIds' + removeMobileNetworkIds: + $ref: '#/components/schemas/MobileNetworkIds' + addFixedNetworkIds: + $ref: '#/components/schemas/FixedNetworkIds' + removeFixedNetworkIds: + $ref: '#/components/schemas/FixedNetworkIds' + addZones: + minItems: 1 + type: array + description: "List of zones, which the operator platform\ + \ wishes to make available to developers/ISVs of requesting\ + \ operator platform." + items: + $ref: '#/components/schemas/ZoneDetails' + removeZones: + minItems: 1 + type: array + description: "List of zones, which the operator platform\ + \ no longer wishes to share." + items: + $ref: '#/components/schemas/ZoneIdentifier' + addServiceAPIs: + $ref: '#/components/schemas/serviceAPINames' + removeServiceAPIs: + $ref: '#/components/schemas/serviceAPINames' + zoneStatus: + minItems: 1 + type: array + items: + required: + - status + - zoneId + type: object + properties: + zoneId: + $ref: '#/components/schemas/ZoneIdentifier' + status: + $ref: '#/components/schemas/Status' + federationStatus: + $ref: '#/components/schemas/Status' + modificationDate: + type: string + description: Date and time of the federation modification + by the originating partner OP + format: date-time + responses: + "204": + description: Expected response to a successful call back processing + "400": + description: Bad request + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "401": + description: Unauthorized + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "404": + description: Not Found + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "409": + description: Conflict + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "422": + description: Unprocessable Entity + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "500": + description: Internal Server Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "503": + description: Service Unavailable + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "520": + description: Web Server Returned an Unknown Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + default: + description: Generic Error + x-openapi-router-controller: api.federation_management + /{federationContextId}/partner: + get: + tags: + - FederationManagement + summary: "Retrieves details about the federation context with the partner OP.\ + \ The response shall provide info about the zones offered by the partner,\ + \ partner OP network codes, information about edge discovery and LCM service\ + \ etc." + operationId: get_federation_details + parameters: + - name: federationContextId + in: path + required: true + style: simple + explode: false + schema: + $ref: '#/components/schemas/FederationContextId' + responses: + "200": + description: Federation meta-info request accepted + content: + application/json: + schema: + $ref: '#/components/schemas/inline_response_200_1' + "400": + description: Bad request + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "401": + description: Unauthorized + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "404": + description: Not Found + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "409": + description: Conflict + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "422": + description: Unprocessable Entity + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "500": + description: Internal Server Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "503": + description: Service Unavailable + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "520": + description: Web Server Returned an Unknown Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + default: + description: Generic Error + x-openapi-router-controller: api.federation_management + delete: + tags: + - FederationManagement + summary: Remove existing federation with the partner OP + operationId: delete_federation_details + parameters: + - name: federationContextId + in: path + required: true + style: simple + explode: false + schema: + $ref: '#/components/schemas/FederationContextId' + responses: + "200": + description: Federation removed successfully + "400": + description: Bad request + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "401": + description: Unauthorized + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "404": + description: Not Found + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "409": + description: Conflict + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "422": + description: Unprocessable Entity + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "500": + description: Internal Server Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "503": + description: Service Unavailable + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "520": + description: Web Server Returned an Unknown Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + default: + description: Generic Error + x-openapi-router-controller: api.federation_management + patch: + tags: + - FederationManagement + summary: "API used by the Originating OP towards the partner OP, to update the\ + \ parameters associated to the existing federation" + operationId: update_federation + parameters: + - name: federationContextId + in: path + required: true + style: simple + explode: false + schema: + $ref: '#/components/schemas/FederationContextId' + requestBody: + description: Details about changes origination OP wished to apply + content: + application/json: + schema: + $ref: '#/components/schemas/federationContextId_partner_body' + required: true + responses: + "200": + description: Federation meta-info request accepted + content: + application/json: + schema: + $ref: '#/components/schemas/inline_response_200_1' + "400": + description: Bad request + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "401": + description: Unauthorized + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "404": + description: Not Found + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "409": + description: Conflict + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "422": + description: Unprocessable Entity + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "500": + description: Internal Server Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "503": + description: Service Unavailable + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "520": + description: Web Server Returned an Unknown Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + default: + description: Generic Error + x-openapi-router-controller: api.federation_management + /fed-context-id: + get: + tags: + - FederationManagement + summary: Retrieves the existing federationContextId with partner operator platform. + operationId: get_federation_context_id + responses: + "200": + description: Federation context identifier retrieval request accepted + headers: + Location: + description: "Contains the URI of the existing resource, according to\ + \ the structure: {apiRoot}/operatorplatform/federation/v1/partner/{federationContextId}" + required: true + style: simple + explode: false + schema: + type: string + Accept-Encoding: + description: "Accept-Encoding, described in IETF RFC 7694" + style: simple + explode: false + schema: + type: string + Content-Encoding: + description: "Content-Encoding, described in IETF RFC 7231" + style: simple + explode: false + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/inline_response_200_2' + "400": + description: Bad request + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "401": + description: Unauthorized + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "404": + description: Not Found + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "409": + description: Conflict + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "422": + description: Unprocessable Entity + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "500": + description: Internal Server Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "503": + description: Service Unavailable + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "520": + description: Web Server Returned an Unknown Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + default: + description: Generic Error + x-openapi-router-controller: api.federation_management + /{federationContextId}/zones: + post: + tags: + - AvailabilityZoneInfoSynchronization + summary: Originating OP informs partner OP that it is willing to access the + specified zones and partner OP shall reserve compute and network resources + for these zones. + operationId: zone_subscribe + parameters: + - name: federationContextId + in: path + required: true + style: simple + explode: false + schema: + $ref: '#/components/schemas/FederationContextId' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ZoneRegistrationRequestData' + required: true + responses: + "200": + description: Zone registered successfully + content: + application/json: + schema: + $ref: '#/components/schemas/ZoneRegistrationResponseData' + "400": + description: Bad request + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "401": + description: Unauthorized + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "404": + description: Not Found + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "409": + description: Conflict + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "422": + description: Unprocessable Entity + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "500": + description: Internal Server Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "503": + description: Service Unavailable + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "520": + description: Web Server Returned an Unknown Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + default: + description: Generic Error + callbacks: + onZoneResourceUpdateEvent: + '{$request.body#/availZoneNotifLink}': + post: + requestBody: + description: Notification about resource availability. + content: + application/json: + schema: + required: + - federationContextId + - zoneId + - zoneResUpdInfo + type: object + properties: + federationContextId: + $ref: '#/components/schemas/FederationIdentifier' + zoneId: + $ref: '#/components/schemas/ZoneIdentifier' + zoneResUpdInfo: + type: array + items: + minProperties: 1 + type: object + properties: + availableCompResources: + minItems: 1 + type: array + description: Resources exclusively reserved for the + originator OP. + items: + $ref: '#/components/schemas/ComputeResourceInfo' + availableNetResources: + minProperties: 1 + type: object + properties: + egressBandWidth: + type: integer + description: Max dl throughput that this edge + can offer. It is defined in Mbps. + format: int32 + dedicatedNIC: + type: integer + format: int32 + supportSriov: + type: boolean + description: If this zone support SRIOV networks + or not + supportDPDK: + type: boolean + description: If this zone supports DPDK based + networking + responses: + "200": + description: Zone info notification acknowledged + "400": + description: Bad request + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "401": + description: Unauthorized + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "404": + description: Not Found + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "409": + description: Conflict + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "422": + description: Unprocessable Entity + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "500": + description: Internal Server Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "503": + description: Service Unavailable + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "520": + description: Web Server Returned an Unknown Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + default: + description: Generic Error + x-openapi-router-controller: api.availability_zone_info_synchronization + /{federationContextId}/zones/{zoneId}: + get: + tags: + - AvailabilityZoneInfoSynchronization + summary: Retrieves details about the computation and network resources that + partner OP has reserved for this zone. + operationId: get_zone_data + parameters: + - name: federationContextId + in: path + required: true + style: simple + explode: false + schema: + $ref: '#/components/schemas/FederationContextId' + - name: zoneId + in: path + required: true + style: simple + explode: false + schema: + $ref: '#/components/schemas/ZoneIdentifier' + responses: + "200": + description: Zone metadata + content: + application/json: + schema: + $ref: '#/components/schemas/ZoneRegisteredData' + "400": + description: Bad request + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "401": + description: Unauthorized + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "404": + description: Not Found + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "409": + description: Conflict + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "422": + description: Unprocessable Entity + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "500": + description: Internal Server Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "503": + description: Service Unavailable + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "520": + description: Web Server Returned an Unknown Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + default: + description: Generic Error + x-openapi-router-controller: api.availability_zone_info_synchronization + delete: + tags: + - AvailabilityZoneInfoSynchronization + summary: Assert usage of a partner OP zone. Originating OP informs partner OP + that it will no longer access the specified zone. + operationId: zone_unsubscribe + parameters: + - name: federationContextId + in: path + required: true + style: simple + explode: false + schema: + $ref: '#/components/schemas/FederationContextId' + - name: zoneId + in: path + required: true + style: simple + explode: false + schema: + $ref: '#/components/schemas/ZoneIdentifier' + responses: + "200": + description: Zone deregistered successfully + "400": + description: Bad request + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "401": + description: Unauthorized + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "404": + description: Not Found + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "409": + description: Conflict + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "422": + description: Unprocessable Entity + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "500": + description: Internal Server Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "503": + description: Service Unavailable + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "520": + description: Web Server Returned an Unknown Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + default: + description: Generic Error + x-openapi-router-controller: api.availability_zone_info_synchronization + /{federationContextId}/artefact: + post: + tags: + - ArtefactManagement + summary: Uploads application artefact on partner OP. Artefact is a zip file + containing scripts and/or packaging files like Terraform or Helm which are + required to create an instance of an application. + operationId: upload_artefact + parameters: + - name: federationContextId + in: path + required: true + style: simple + explode: false + schema: + $ref: '#/components/schemas/FederationContextId' + requestBody: + description: An application can consist of multiple components. App providers + are allowed to define separate artefacts for each component or they could + define a consolidated artefact at application level. + content: + application/json: + schema: + $ref: '#/components/schemas/federationContextId_artefact_body' + required: true + responses: + "200": + description: Artefact uploaded successfully + "400": + description: Bad request + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "401": + description: Unauthorized + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "404": + description: Not Found + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "409": + description: Conflict + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "422": + description: Unprocessable Entity + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "500": + description: Internal Server Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "503": + description: Service Unavailable + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "520": + description: Web Server Returned an Unknown Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + default: + description: Generic Error + x-openapi-router-controller: api.artefact_management + /{federationContextId}/artefact/{artefactId}: + get: + tags: + - ArtefactManagement + summary: Retrieves details about an artefact. + operationId: get_artefact + parameters: + - name: federationContextId + in: path + required: true + style: simple + explode: false + schema: + $ref: '#/components/schemas/FederationContextId' + - name: artefactId + in: path + required: true + style: simple + explode: false + schema: + $ref: '#/components/schemas/ArtefactId' + responses: + "200": + description: Artefact details + content: + application/json: + schema: + $ref: '#/components/schemas/inline_response_200_5' + "400": + description: Bad request + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "401": + description: Unauthorized + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "404": + description: Not Found + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "409": + description: Conflict + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "422": + description: Unprocessable Entity + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "500": + description: Internal Server Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "503": + description: Service Unavailable + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "520": + description: Web Server Returned an Unknown Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + default: + description: Generic Error + x-openapi-router-controller: api.artefact_management + delete: + tags: + - ArtefactManagement + summary: Removes an artefact from partner OP. + operationId: remove_artefact + parameters: + - name: federationContextId + in: path + required: true + style: simple + explode: false + schema: + $ref: '#/components/schemas/FederationContextId' + - name: artefactId + in: path + required: true + style: simple + explode: false + schema: + $ref: '#/components/schemas/ArtefactId' + responses: + "200": + description: Artefact deletion successful + "400": + description: Bad request + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "401": + description: Unauthorized + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "404": + description: Not Found + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "409": + description: Conflict + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "422": + description: Unprocessable Entity + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "500": + description: Internal Server Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "503": + description: Service Unavailable + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "520": + description: Web Server Returned an Unknown Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + default: + description: Generic Error + x-openapi-router-controller: api.artefact_management + /{federationContextId}/application/onboarding: + post: + tags: + - ApplicationOnboardingManagement + summary: "Submits an application details to a partner OP. Based on the details\ + \ provided, partner OP shall do bookkeeping, resource validation and other\ + \ pre-deployment operations." + operationId: onboard_application + parameters: + - name: federationContextId + in: path + required: true + style: simple + explode: false + schema: + $ref: '#/components/schemas/FederationContextId' + requestBody: + description: "Details about application compute resource requirements, associated\ + \ artefacts, QoS profile and regions where application shall be made available\ + \ etc." + content: + application/json: + schema: + $ref: '#/components/schemas/application_onboarding_body' + required: true + responses: + "202": + description: Application onboarded request accepted + "400": + description: Bad request + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "401": + description: Unauthorized + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "404": + description: Not Found + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "409": + description: Conflict + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "422": + description: Unprocessable Entity + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "500": + description: Internal Server Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "503": + description: Service Unavailable + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "520": + description: Web Server Returned an Unknown Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + default: + description: Generic Error + callbacks: + onApplicationOnboardStatusEvent: + '{$request.body#/appStatusCallbackLink}': + post: + requestBody: + description: Notification payload. + content: + application/json: + schema: + required: + - appId + - federationContextId + - statusInfo + type: object + properties: + federationContextId: + $ref: '#/components/schemas/FederationIdentifier' + appId: + $ref: '#/components/schemas/AppIdentifier' + statusInfo: + minItems: 1 + type: array + items: + required: + - onboardStatusInfo + - zoneId + type: object + properties: + zoneId: + $ref: '#/components/schemas/ZoneIdentifier' + onboardStatusInfo: + type: string + description: Defines change in application status. + This change could be related to application itself + or an application instance status + enum: + - PENDING + - ONBOARDED + - DEBOARDING + - REMOVED + - FAILED + responses: + "204": + description: Application status updated + "400": + description: Bad request + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "401": + description: Unauthorized + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "404": + description: Not Found + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "409": + description: Conflict + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "422": + description: Unprocessable Entity + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "500": + description: Internal Server Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "503": + description: Service Unavailable + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "520": + description: Web Server Returned an Unknown Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + default: + description: Generic Error + x-openapi-router-controller: api.application_onboarding_management + /{federationContextId}/application/onboarding/app/{appId}: + get: + tags: + - ApplicationOnboardingManagement + summary: Retrieves application details from partner OP + operationId: view_application + parameters: + - name: federationContextId + in: path + required: true + style: simple + explode: false + schema: + $ref: '#/components/schemas/FederationContextId' + - name: appId + in: path + required: true + style: simple + explode: false + schema: + $ref: '#/components/schemas/AppIdentifier' + responses: + "200": + description: Application details + content: + application/json: + schema: + $ref: '#/components/schemas/inline_response_200_7' + "400": + description: Bad request + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "401": + description: Unauthorized + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "404": + description: Not Found + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "409": + description: Conflict + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "422": + description: Unprocessable Entity + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "500": + description: Internal Server Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "503": + description: Service Unavailable + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "520": + description: Web Server Returned an Unknown Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + default: + description: Generic Error + x-openapi-router-controller: api.application_onboarding_management + delete: + tags: + - ApplicationOnboardingManagement + summary: "Deboards the application from any zones, if any, and deletes the App." + operationId: delete_app + parameters: + - name: federationContextId + in: path + required: true + style: simple + explode: false + schema: + $ref: '#/components/schemas/FederationContextId' + - name: appId + in: path + required: true + style: simple + explode: false + schema: + $ref: '#/components/schemas/AppIdentifier' + responses: + "200": + description: App deletion successful + "400": + description: Bad request + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "401": + description: Unauthorized + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "404": + description: Not Found + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "409": + description: Conflict + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "422": + description: Unprocessable Entity + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "500": + description: Internal Server Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "503": + description: Service Unavailable + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "520": + description: Web Server Returned an Unknown Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + default: + description: Generic Error + x-openapi-router-controller: api.application_onboarding_management + patch: + tags: + - ApplicationOnboardingManagement + summary: "Updates partner OP about changes in application compute resource requirements,\ + \ QOS Profile, associated descriptor or change in associated components" + operationId: update_application + parameters: + - name: federationContextId + in: path + required: true + style: simple + explode: false + schema: + $ref: '#/components/schemas/FederationContextId' + - name: appId + in: path + required: true + style: simple + explode: false + schema: + $ref: '#/components/schemas/AppIdentifier' + requestBody: + description: "Details about application compute resource requirements, associated\ + \ artefact and QOS profile that needs to be updated." + content: + application/json: + schema: + $ref: '#/components/schemas/app_appId_body' + required: true + responses: + "202": + description: Application update request accepted + "400": + description: Bad request + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "401": + description: Unauthorized + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "404": + description: Not Found + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "409": + description: Conflict + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "422": + description: Unprocessable Entity + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "500": + description: Internal Server Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "503": + description: Service Unavailable + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "520": + description: Web Server Returned an Unknown Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + default: + description: Generic Error + x-openapi-router-controller: api.application_onboarding_management + /{federationContextId}/application/lcm: + post: + tags: + - ApplicationDeploymentManagement + summary: Instantiates an application on a partner OP zone. + operationId: install_app + parameters: + - name: federationContextId + in: path + required: true + style: simple + explode: false + schema: + $ref: '#/components/schemas/FederationContextId' + requestBody: + description: Details about application and zones where application instance + should be created. It also definea call back URI which the partner OP shall + use update home OP about a change in instance status. + content: + application/json: + schema: + $ref: '#/components/schemas/application_lcm_body' + responses: + "202": + description: Application instance creation request accepted. + content: + application/json: + schema: + $ref: '#/components/schemas/inline_response_202' + "400": + description: Bad request + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "401": + description: Unauthorized + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "404": + description: Not Found + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "409": + description: Conflict + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "422": + description: Unprocessable Entity + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "500": + description: Internal Server Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "503": + description: Service Unavailable + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "520": + description: Web Server Returned an Unknown Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + default: + description: Generic Error + callbacks: + onInstanceStatusEvent: + '{$request.body#/appInstCallbackLink}': + post: + requestBody: + description: Notification payload. + content: + application/json: + schema: + required: + - appId + - appInstanceId + - appInstanceInfo + - federationContextId + - zoneId + type: object + properties: + federationContextId: + $ref: '#/components/schemas/FederationIdentifier' + appId: + $ref: '#/components/schemas/AppIdentifier' + appInstanceId: + $ref: '#/components/schemas/InstanceIdentifier' + zoneId: + $ref: '#/components/schemas/ZoneIdentifier' + appInstanceInfo: + minProperties: 1 + type: object + properties: + appInstanceState: + type: string + description: Running status of the application instance. + enum: + - PENDING + - READY + - FAILED + - TERMINATING + message: + type: string + description: Event information or failure message. + accesspointInfo: + minItems: 1 + type: array + description: Information about the IP and Port exposed + by the OP. Application clients shall use these access + points to reach this application instance + items: + required: + - accessPoints + - interfaceId + type: object + properties: + interfaceId: + pattern: "^[A-Za-z0-9][A-Za-z0-9_]{6,30}[A-Za-z0-9]$" + type: string + description: This is the interface Identifier + that app provider defines when application is + onboarded. + accessPoints: + $ref: '#/components/schemas/ServiceEndpoint' + modificationDate: + type: string + description: Date and time of the instance state modification + by partner OP. + format: date-time + responses: + "204": + description: Application instance state notification acknowledged + "400": + description: Bad request + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "401": + description: Unauthorized + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "404": + description: Not Found + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "409": + description: Conflict + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "422": + description: Unprocessable Entity + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "500": + description: Internal Server Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "503": + description: Service Unavailable + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "520": + description: Web Server Returned an Unknown Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + default: + description: Generic Error + x-openapi-router-controller: api.application_deployment_management + /{federationContextId}/application/lcm/app/{appId}/instance/{appInstanceId}/zone/{zoneId}: + get: + tags: + - ApplicationDeploymentManagement + summary: Retrieves an application instance details from partner OP. + operationId: get_app_instance_details + parameters: + - name: federationContextId + in: path + required: true + style: simple + explode: false + schema: + $ref: '#/components/schemas/FederationContextId' + - name: appId + in: path + required: true + style: simple + explode: false + schema: + $ref: '#/components/schemas/AppIdentifier' + - name: appInstanceId + in: path + required: true + style: simple + explode: false + schema: + $ref: '#/components/schemas/InstanceIdentifier' + - name: zoneId + in: path + required: true + style: simple + explode: false + schema: + $ref: '#/components/schemas/ZoneIdentifier' + responses: + "200": + description: Application instance details + content: + application/json: + schema: + $ref: '#/components/schemas/inline_response_200_8' + "400": + description: Bad request + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "401": + description: Unauthorized + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "404": + description: Not Found + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "409": + description: Conflict + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "422": + description: Unprocessable Entity + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "500": + description: Internal Server Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "503": + description: Service Unavailable + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "520": + description: Web Server Returned an Unknown Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + default: + description: Generic Error + x-openapi-router-controller: api.application_deployment_management + delete: + tags: + - ApplicationDeploymentManagement + summary: Terminate an application instance on a partner OP zone. + operationId: remove_app + parameters: + - name: federationContextId + in: path + required: true + style: simple + explode: false + schema: + $ref: '#/components/schemas/FederationContextId' + - name: appId + in: path + required: true + style: simple + explode: false + schema: + $ref: '#/components/schemas/AppIdentifier' + - name: appInstanceId + in: path + required: true + style: simple + explode: false + schema: + $ref: '#/components/schemas/InstanceIdentifier' + - name: zoneId + in: path + required: true + style: simple + explode: false + schema: + $ref: '#/components/schemas/ZoneIdentifier' + responses: + "200": + description: Application instance termination request accepted + "400": + description: Bad request + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "401": + description: Unauthorized + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "404": + description: Not Found + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "409": + description: Conflict + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "422": + description: Unprocessable Entity + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "500": + description: Internal Server Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "503": + description: Service Unavailable + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "520": + description: Web Server Returned an Unknown Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + default: + description: Generic Error + x-openapi-router-controller: api.application_deployment_management + /{federationContextId}/application/lcm/app/{appId}/appProvider/{appProviderId}: + get: + tags: + - ApplicationDeploymentManagement + summary: Retrieves all application instance of partner OP + operationId: get_all_app_instances + parameters: + - name: federationContextId + in: path + required: true + style: simple + explode: false + schema: + $ref: '#/components/schemas/FederationContextId' + - name: appId + in: path + required: true + style: simple + explode: false + schema: + $ref: '#/components/schemas/AppIdentifier' + - name: appProviderId + in: path + required: true + style: simple + explode: false + schema: + $ref: '#/components/schemas/AppProviderId' + responses: + "200": + description: Application Instance details + content: + application/json: + schema: + minItems: 1 + type: array + items: + $ref: '#/components/schemas/inline_response_200_9' + x-content-type: application/json + "400": + description: Bad request + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "401": + description: Unauthorized + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "404": + description: Not Found + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "409": + description: Conflict + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "422": + description: Unprocessable Entity + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "500": + description: Internal Server Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "503": + description: Service Unavailable + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "520": + description: Web Server Returned an Unknown Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + default: + description: Generic Error + x-openapi-router-controller: api.application_deployment_management + +components: + schemas: + AppIdentifier: + pattern: "^(?:[A-Za-z][A-Za-z0-9_]{7,63}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$" + type: string + description: Identifier used to refer to an application. + AppProviderId: + pattern: "^[A-Za-z][A-Za-z0-9_]{7,63}$" + type: string + description: UserId of the app provider. Identifier is relevant only in context + of this federation. + ArtefactId: + type: string + description: A globally unique identifier associated with the artefact. Originating + OP generates this identifier when artefact is submitted over NBI. + format: uuid + CountryCode: + pattern: "^[A-Z]{2}$" + type: string + description: ISO 3166-1 Alpha-2 code for the country of Partner operator + CPUArchType: + type: string + description: "CPU Instruction Set Architecture (ISA) E.g., Intel, Arm etc." + enum: + - ISA_X86 + - ISA_X86_64 + - ISA_ARM_64 + InstanceIdentifier: + #pattern: "^[A-Za-z0-9][A-Za-z0-9_]{6,62}[A-Za-z0-9]$" + type: string + description: Unique identifier generated by the partner OP to identify an instance + of the application on a specific zone. + InstanceState: + type: string + description: Running status of the application instance. + enum: + - PENDING + - READY + - FAILED + - TERMINATING + Ipv4Addr: + pattern: "^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$" + type: string + example: 198.51.100.1 + Ipv6Addr: + type: string + example: 2001:db8:85a3::8a2e:370:7334 + allOf: + - pattern: "^((:|(0?|([1-9a-f][0-9a-f]{0,3}))):)((0?|([1-9a-f][0-9a-f]{0,3})):){0,6}(:|(0?|([1-9a-f][0-9a-f]{0,3})))$" + - pattern: "^((([^:]+:){7}([^:]+))|((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?))$" + Fqdn: + type: string + FixedNetworkIds: + minItems: 1 + type: array + description: List of network identifier associated with the fixed line network + of the operator platform. + items: + type: string + FederationContextId: + pattern: "^[A-Za-z0-9][A-Za-z0-9-]*$" + type: string + description: This identifier shall be provided by the partner OP on successful + verification and validation of the federation create request and is used by + partner op to identify this newly created federation context. Originating + OP shall provide this identifier in any subsequent request towards the partner + op. + readOnly: true + FederationIdentifier: + pattern: "^[A-Za-z0-9][A-Za-z0-9-]*$" + type: string + description: Globally unique identifier allocated to an operator platform. This + is valid and used only in context of MEC federation interface. + FileId: + type: string + description: A globally unique identifier associated with the image file. Originating + OP generates this identifier when file is uploaded over NBI. + format: uuid + FlavourId: + type: string + description: An identifier to refer to a specific combination of compute resources + GeoLocation: + pattern: "^([-+]?)([\\d]{1,2})((((\\.)([\\d]{1,4}))?(,)))(([-+]?)([\\d]{1,3})((\\\ + .)([\\d]{1,4}))?)$" + type: string + description: "Latitude,Longitude as decimal fraction up to 4 digit precision" + Mcc: + pattern: "^\\d{3}$" + type: string + Mnc: + pattern: "^\\d{2,3}$" + type: string + Port: + minimum: 0 + type: integer + Status: + type: string + enum: + - FAILED + - TEMPORARY_FAILURE + - AVAILABLE + - LOCKED + - NOT_AVAILABLE + Uri: + type: string + Vcpu: + pattern: "^\\d+((\\.\\d{1,3})|(m))?$" + type: string + description: "Number of vcpus in whole, decimal up to millivcpu, or millivcpu\ + \ format." + example: "{\"whole\":{\"value\":2},\"decimal\":{\"value\":0.5},\"millivcpu\"\ + :{\"value\":\"500m\"}}" + Version: + pattern: "^(\\d{1,2}\\.)?(\\d{1,2}\\.)?(\\d{1,2})$" + type: string + description: Versioning info in the format major.minor.patch + VirtImageType: + type: string + description: "Indicate if the file is Container image or VM image (QCOW2, OVA)" + enum: + - QCOW2 + - DOCKER + - OVA + ZoneIdentifier: + pattern: "^[A-Za-z0-9][A-Za-z0-9-]*$" + type: string + description: Human readable name of the zone. + FederationHealthInfo: + required: + - federationStatus + - numOfAcceptedZones + type: object + properties: + federationStatus: + $ref: '#/components/schemas/State' + numOfAcceptedZones: + type: string + numOfActiveAlarms: + type: string + numOfApplications: + type: string + example: + numOfApplications: numOfApplications + federationStatus: + alarmState: RAISED + numOfActiveAlarms: numOfActiveAlarms + numOfAcceptedZones: numOfAcceptedZones + FederationSupportedAPIs: + required: + - artefactAPI + - availabilityZoneAPI + - edgeApplicationAPI + - federationBaseAPI + - fileAPI + type: object + properties: + federationBaseAPI: + $ref: '#/components/schemas/FederationAPIResources' + availabilityZoneAPI: + $ref: '#/components/schemas/FederationAPIResources' + edgeApplicationAPI: + $ref: '#/components/schemas/FederationAPIResources' + artefactAPI: + $ref: '#/components/schemas/FederationAPIResources' + fileAPI: + $ref: '#/components/schemas/FederationAPIResources' + serviceAPIFederation: + $ref: '#/components/schemas/FederationAPIResources' + resourceMonitoringAPI: + $ref: '#/components/schemas/FederationAPIResources' + faultManagementAPI: + $ref: '#/components/schemas/FederationAPIResources' + eventManagementAPI: + $ref: '#/components/schemas/FederationAPIResources' + example: + availabilityZoneAPI: null + artefactAPI: null + fileAPI: null + resourceMonitoringAPI: null + faultManagementAPI: null + federationBaseAPI: + name: FEDERATION + apiOperations: + - httpMethods: + - POST + - POST + href: href + - httpMethods: + - POST + - POST + href: href + serviceAPIFederation: null + eventManagementAPI: null + edgeApplicationAPI: null + FederationAPINames: + type: string + enum: + - FEDERATION + - AVAILZONE + - ARTEFACT + - FILE + - SVSAPEFED + - RESMONITOR + - EVENTMGMT + - FAULTMGMT + HttpMethods: + type: string + enum: + - POST + - PUT + - PATCH + - DELETE + - GET + HttpResources: + required: + - href + - httpMethods + type: object + properties: + href: + $ref: '#/components/schemas/Uri' + httpMethods: + type: array + description: List of HTTP Methods supported for the given API category + items: + $ref: '#/components/schemas/HttpMethods' + example: + httpMethods: + - POST + - POST + href: href + FederationAPIResources: + required: + - apiOperations + - name + type: object + properties: + name: + $ref: '#/components/schemas/FederationAPINames' + apiOperations: + type: array + description: List of HTTP Methods supported for the given API category + items: + $ref: '#/components/schemas/HttpResources' + example: + name: FEDERATION + apiOperations: + - httpMethods: + - POST + - POST + href: href + - httpMethods: + - POST + - POST + href: href + State: + required: + - alarmState + type: object + properties: + alarmState: + type: string + description: Defines the alarm state during its life cycle (raised | updated + | cleared). + enum: + - RAISED + - UPDATED + - CLEAR + example: + alarmState: RAISED + serviceType: + type: string + description: An identifier to refer to partner OP capabilities for application + providers. + enum: + - api_federation + serviceAPINames: + minItems: 1 + type: array + description: "List of Service API capability names an OP supports and offers\ + \ to other OPs \"quality_on_demand\", \"device_location\" etc." + items: + type: string + enum: + - QualityOnDemand + - DeviceLocation + - DeviceStatus + - SimSwap + - NumberVerification + - DeviceIdentifier + serviceAPINameVal: + type: string + enum: + - QualityOnDemand + - DeviceLocation + - DeviceStatus + - SimSwap + - NumberVerification + - DeviceIdentifier + description: Name of the Service API + serviceRoutingInfo: + minItems: 1 + type: array + description: List of public IP addresses MNO manages for UEs to connect with + public data networks + items: + pattern: "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\\ + /([0-9]|[1-2][0-9]|3[0-2]))?$" + type: string + AppComponentSpecs: + minItems: 1 + type: array + description: "An application may consist of more than one component. Each component\ + \ is associated with a descriptor and may exposes its services externally\ + \ or internally. App providers are required to provide details about all\ + \ these components, their associated descriptors and their DNS names." + items: + $ref: '#/components/schemas/AppComponentSpecs_inner' + AppMetaData: + required: + - accessToken + - appName + - version + type: object + properties: + appName: + pattern: "^[A-Za-z][A-Za-z0-9_]{7,31}$" + type: string + description: Name of the application. Application provider define a human + readable name for the application + version: + type: string + description: Version info of the application + appDescription: + maxLength: 256 + minLength: 16 + type: string + description: Brief application description provided by application provider + mobilitySupport: + type: boolean + description: Indicates if an application is sensitive to user mobility and + can be relocated. Default is “FALSE” + default: false + accessToken: + pattern: "^[A-Za-z][A-Za-z0-9_]{31,63}$" + type: string + description: "An application Access key, to be used with UNI interface to\ + \ authorize UCs Access to a given application" + category: + type: string + description: Possible categorization of the application + enum: + - IOT + - HEALTH_CARE + - GAMING + - VIRTUAL_REALITY + - SOCIALIZING + - SURVEILLANCE + - ENTERTAINMENT + - CONNECTIVITY + - PRODUCTIVITY + - SECURITY + - INDUSTRIAL + - EDUCATION + - OTHERS + description: Application metadata details + example: + appName: appName + mobilitySupport: false + appDescription: appDescription + accessToken: accessToken + category: IOT + version: version + AppQoSProfile: + required: + - latencyConstraints + type: object + properties: + latencyConstraints: + type: string + description: "Latency requirements for the application. Allowed values (non-standardized)\ + \ are none, low and ultra-low. Ultra-Low may corresponds to range 15 -\ + \ 30 msec, Low correspond to range 30 - 50 msec. None means 51 and above" + enum: + - NONE + - LOW + - ULTRALOW + bandwidthRequired: + minimum: 1 + type: integer + description: Data transfer bandwidth requirement (minimum limit) for the + application. It should in Mbits/sec + format: int32 + multiUserClients: + type: string + description: Single user type application are designed to serve just one + client. Multi user type application is designed to serve multiple clients + default: APP_TYPE_SINGLE_USER + enum: + - APP_TYPE_SINGLE_USER + - APP_TYPE_MULTI_USER + noOfUsersPerAppInst: + type: integer + description: Maximum no of clients that can connect to an instance of this + application. This parameter is relevant only for application of type multi + user + default: 1 + appProvisioning: + type: boolean + description: Define if application can be instantiated or not + default: true + description: "Parameters corresponding to the performance constraints, tenancy\ + \ details etc." + example: + bandwidthRequired: 1 + multiUserClients: APP_TYPE_SINGLE_USER + noOfUsersPerAppInst: 6 + latencyConstraints: NONE + appProvisioning: true + CallbackCredentials: + required: + - clientId + - clientSecret + - tokenUrl + type: object + properties: + tokenUrl: + $ref: '#/components/schemas/Uri' + clientId: + type: string + description: Client id for oauth2 client credentials flow. + clientSecret: + type: string + description: Client secret for oauth2 client credentials flow. + description: "Authentication credentials for callbacks. Callbacks use the same\ + \ security scheme, flows, and scopes as the forward path." + CompEnvParams: + required: + - envValueType + - envVarName + type: object + properties: + envVarName: + pattern: "^[A-Za-z0-9][A-Za-z0-9_]{6,30}[A-Za-z0-9]$" + type: string + description: Name of environment variable + envValueType: + type: string + enum: + - USER_DEFINED + - PLATFORM_DEFINED_DYNAMIC_PORT + - PLATFORM_DEFINED_DNS + - PLATFORM_DEFINED_IP + envVarValue: + pattern: "^[A-Za-z0-9][A-Za-z0-9_]{6,62}[A-Za-z0-9]$" + type: string + description: Value to be assigned to environment variable + envVarSrc: + type: string + description: "Full path of parameter from componentSpec that should be used\ + \ to generate the environment value. Eg. networkResourceProfile[1]. interfaceId." + description: Environment variables are key value pairs that should be injected + when component in instantiated + CommandLineParams: + required: + - command + type: object + properties: + command: + type: array + description: List of commands that application should invoke when an instance + is created. + items: + type: string + commandArgs: + type: array + description: List of arguments required by the command. + items: + type: string + description: List of commands and arguments that shall be invoked when the component + instance is created. This is valid only for container based deployment. + DeploymentConfig: + required: + - configType + - contents + type: object + properties: + configType: + type: string + description: Config type. + enum: + - DOCKER_COMPOSE + - KUBERNETES_MANIFEST + - CLOUD_INIT + - HELM_VALUES + contents: + type: string + description: Contents of the configuration. + description: "Configuration used when deploying a component. May override other\ + \ ComponentSpec parameters related to deployment like restart policy, command\ + \ line parameters, environment variables, etc." + ComponentSpec: + required: + - componentName + - computeResourceProfile + - images + - numOfInstances + - restartPolicy + type: object + properties: + componentName: + # pattern: "^[A-Za-z0-9][A-Za-z0-9_]{6,62}[A-Za-z0-9]$" + type: string + description: Must be a valid RFC 1035 label name. Component name must be + unique with an application + images: + minItems: 1 + type: array + description: List of all images associated with the component. Images are + specified using the file identifiers. Partner OP provides these images + using file upload api. + items: + $ref: '#/components/schemas/FileId' + numOfInstances: + type: integer + description: Number of component instances to be launched. + format: int32 + restartPolicy: + type: string + description: How the platform shall handle component failure + enum: + - RESTART_POLICY_ALWAYS + - RESTART_POLICY_NEVER + commandLineParams: + $ref: '#/components/schemas/CommandLineParams' + exposedInterfaces: + minItems: 1 + type: array + description: Each application component exposes some ports either for external + users or for inter component communication. Application provider is required + to specify which ports are to be exposed and the type of traffic that + will flow through these ports. + items: + $ref: '#/components/schemas/InterfaceDetails' + computeResourceProfile: + $ref: '#/components/schemas/ComputeResourceInfo' + compEnvParams: + type: array + items: + $ref: '#/components/schemas/CompEnvParams' + deploymentConfig: + $ref: '#/components/schemas/DeploymentConfig' + persistentVolumes: + minItems: 1 + type: array + description: The ephemeral volume a container process may need to temporary + store internal data + items: + $ref: '#/components/schemas/PersistentVolumeDetails' + description: "Details about compute, networking and storage requirements for\ + \ each component of the application. App provider should define all information\ + \ needed to instantiate the component. If artefact is being defined at component\ + \ level this section should have information just about the component. In\ + \ case the artefact is being defined at application level the section should\ + \ provide details about all the components." + ComputeResourceInfo: + required: + - cpuArchType + - memory + - numCPU + type: object + properties: + cpuArchType: + type: string + description: "CPU Instruction Set Architecture (ISA) E.g., Intel, Arm etc." + enum: + - ISA_X86_64 + - ISA_ARM_64 + numCPU: + $ref: '#/components/schemas/Vcpu' + memory: + type: integer + description: Amount of RAM in Mbytes + format: int64 + diskStorage: + type: integer + description: Amount of disk storage in Gbytes for a given ISA type + format: int32 + gpu: + type: array + items: + $ref: '#/components/schemas/GpuInfo' + vpu: + type: integer + description: Number of Intel VPUs available for a given ISA type + fpga: + type: integer + description: Number of FPGAs available for a given ISA type + hugepages: + type: array + items: + $ref: '#/components/schemas/HugePage' + cpuExclusivity: + type: boolean + description: Support for exclusive CPUs + example: + hugepages: + - number: 7 + pageSize: 2MB + - number: 7 + pageSize: 2MB + memory: 0 + fpga: 2 + cpuArchType: ISA_X86_64 + diskStorage: 6 + numCPU: "{\"whole\":{\"value\":2},\"decimal\":{\"value\":0.5},\"millivcpu\"\ + :{\"value\":\"500m\"}}" + vpu: 5 + cpuExclusivity: true + gpu: + - gpuMemory: 1 + gpuVendorType: Nvidia + gpuModeName: gpuModeName + numGPU: 5 + - gpuMemory: 1 + gpuVendorType: Nvidia + gpuModeName: gpuModeName + numGPU: 5 + FederationRequestData: + required: + - initialDate + - origOPFederationId + - partnerStatusLink + type: object + properties: + origOPFederationId: + $ref: '#/components/schemas/FederationIdentifier' + origOPCountryCode: + $ref: '#/components/schemas/CountryCode' + origOPMobileNetworkCodes: + $ref: '#/components/schemas/MobileNetworkIds' + origOPFixedNetworkCodes: + $ref: '#/components/schemas/FixedNetworkIds' + initialDate: + type: string + description: Time zone info of the federation initiated by the originating + OP + format: date-time + partnerStatusLink: + $ref: '#/components/schemas/Uri' + partnerCallbackCredentials: + $ref: '#/components/schemas/CallbackCredentials' + FederationResponseData: + required: + - federationContextId + - partnerOPFederationId + - platformCaps + type: object + properties: + partnerOPFederationId: + $ref: '#/components/schemas/FederationIdentifier' + partnerOPCountryCode: + $ref: '#/components/schemas/CountryCode' + federationContextId: + $ref: '#/components/schemas/FederationContextId' + edgeDiscoveryServiceEndPoint: + $ref: '#/components/schemas/ServiceEndpoint' + lcmServiceEndPoint: + $ref: '#/components/schemas/ServiceEndpoint' + partnerOPMobileNetworkCodes: + $ref: '#/components/schemas/MobileNetworkIds' + partnerOPFixedNetworkCodes: + $ref: '#/components/schemas/FixedNetworkIds' + offeredAvailabilityZones: + minItems: 1 + type: array + description: "List of zones, which the operator platform wishes to make\ + \ available to developers/ISVs of requesting operator platform." + items: + $ref: '#/components/schemas/ZoneDetails' + platformCaps: + type: array + items: + type: string + description: "Home routing - Operator platform is capable of routing edge\ + \ application data traffic from its edges to user device in their home\ + \ location. This is the case where user devices are served in their\ + \ home region (requesting platform region, non-roaming) but the corresponding\ + \ edge application are in operator platform edges. Anchoring - Operator\ + \ platform is capable of routing edge application traffic for roaming\ + \ user devices to edge application in user device home network. Service\ + \ APIs - Capability to handle Service APIs (e.g., CAMARA APIs) from\ + \ the Leading OP" + enum: + - homeRouting + - Anchoring + - serviceAPIs + - faultMgmt + - eventMgmt + - resourceMonitor + example: + offeredAvailabilityZones: + - geographyDetails: geographyDetails + zoneId: zoneId + geolocation: geolocation + - geographyDetails: geographyDetails + zoneId: zoneId + geolocation: geolocation + platformCaps: + - homeRouting + - homeRouting + partnerOPCountryCode: partnerOPCountryCode + federationContextId: federationContextId + lcmServiceEndPoint: null + partnerOPFederationId: partnerOPFederationId + edgeDiscoveryServiceEndPoint: + ipv4Addresses: + - 198.51.100.1 + - 198.51.100.1 + port: 0 + fqdn: fqdn + ipv6Addresses: + - 2001:db8:85a3::8a2e:370:7334 + - 2001:db8:85a3::8a2e:370:7334 + partnerOPMobileNetworkCodes: + mncs: + - mncs + - mncs + mcc: mcc + partnerOPFixedNetworkCodes: + - partnerOPFixedNetworkCodes + - partnerOPFixedNetworkCodes + Flavour: + required: + - cpuArchType + - flavourId + - memorySize + - numCPU + - storageSize + - supportedOSTypes + type: object + properties: + flavourId: + $ref: '#/components/schemas/FlavourId' + cpuArchType: + $ref: '#/components/schemas/CPUArchType' + supportedOSTypes: + minItems: 1 + type: array + description: "A list of operating systems which this flavour configuration\ + \ can support e.g., RHEL Linux, Ubuntu 18.04 LTS, MS Windows 2012 R2." + items: + $ref: '#/components/schemas/OSType' + numCPU: + type: integer + description: Number of available vCPUs + format: int32 + memorySize: + type: integer + description: Amount of RAM in Mbytes + format: int32 + storageSize: + type: integer + description: Amount of disk storage in Gbytes + format: int32 + gpu: + type: array + items: + $ref: '#/components/schemas/GpuInfo' + fpga: + type: integer + description: Number of FPGAs + format: int32 + vpu: + type: integer + description: Number of Intel VPUs available + hugepages: + type: array + items: + $ref: '#/components/schemas/HugePage' + cpuExclusivity: + type: boolean + description: Support for exclusive CPUs + example: + hugepages: + - null + - null + flavourId: flavourId + memorySize: 3 + fpga: 4 + cpuArchType: ISA_X86 + storageSize: 2 + numCPU: 9 + vpu: 7 + cpuExclusivity: true + supportedOSTypes: + - license: OS_LICENSE_TYPE_FREE + distribution: RHEL + version: OS_VERSION_UBUNTU_2204_LTS + architecture: x86_64 + - license: OS_LICENSE_TYPE_FREE + distribution: RHEL + version: OS_VERSION_UBUNTU_2204_LTS + architecture: x86_64 + gpu: + - null + - null + GpuInfo: + required: + - gpuMemory + - gpuModeName + - gpuVendorType + - numGPU + type: object + properties: + gpuVendorType: + type: string + description: "GPU vendor name e.g. NVIDIA, AMD etc." + example: Nvidia + enum: + - GPU_PROVIDER_NVIDIA + - GPU_PROVIDER_AMD + gpuModeName: + type: string + description: "Model name corresponding to vendorType may include info e.g.\ + \ for NVIDIA, model name could be “Tesla M60”, “Tesla V100” etc." + gpuMemory: + type: integer + description: GPU memory in Mbytes + numGPU: + type: integer + description: Number of GPUs + example: + gpuMemory: 1 + gpuVendorType: Nvidia + gpuModeName: gpuModeName + numGPU: 5 + HugePage: + required: + - number + - pageSize + type: object + properties: + pageSize: + type: string + description: Size of hugepage + enum: + - 2MB + - 4MB + - 1GB + number: + type: integer + description: Total number of huge pages + example: + number: 7 + pageSize: 2MB + InterfaceDetails: + required: + - commPort + - commProtocol + - interfaceId + - visibilityType + type: object + properties: + interfaceId: + pattern: "^[A-Za-z0-9][A-Za-z0-9_]{6,30}[A-Za-z0-9]$" + type: string + description: Each Port and corresponding traffic protocol exposed by the + component is identified by a name. Application client on user device requires + this to uniquely identify the interface. + commProtocol: + type: string + description: "Defines the IP transport communication protocol i.e., TCP,\ + \ UDP or HTTP" + enum: + - TCP + - UDP + - HTTP_HTTPS + commPort: + maximum: 65535 + minimum: 1 + type: integer + description: Port number exposed by the component. OP may generate a dynamic + port towards the UCs corresponding to this internal port and forward the + client traffic from dynamic port to container Port. + format: int32 + visibilityType: + type: string + description: "Defines whether the interface is exposed to outer world or\ + \ not i.e., external, or internal. If this is set to \"external\", then\ + \ it is exposed to external applications otherwise it is exposed internally\ + \ to edge application components within edge cloud. When exposed to external\ + \ world, an external dynamic port is assigned for UC traffic and mapped\ + \ to the internal container Port" + enum: + - VISIBILITY_EXTERNAL + - VISIBILITY_INTERNAL + network: + pattern: "^[A-Za-z][A-Za-z0-9_]{6,30}[A-Za-z0-9]$" + type: string + description: Name of the network. In case the application has to be associated + with more than 1 network then app provider must define the name of the + network on which this interface has to be exposed. This parameter is + required only if the port has to be exposed on a specific network other + than default. + InterfaceName: + pattern: "^[a-z][a-z0-9]{3}$" + type: string + description: Interface Name. Required only if application has to be attached + to a network other than default. + InvalidParam: + required: + - param + type: object + properties: + param: + type: string + reason: + type: string + MobileNetworkIds: + type: object + properties: + mcc: + $ref: '#/components/schemas/Mcc' + mncs: + minItems: 1 + type: array + items: + $ref: '#/components/schemas/Mnc' + example: + mncs: + - mncs + - mncs + mcc: mcc + ObjectRepoLocation: + type: object + properties: + repoURL: + $ref: '#/components/schemas/Uri' + userName: + type: string + description: Username to access the repository + password: + type: string + description: Password to access the repository + token: + type: string + description: Authorization token to access the repository + example: + repoURL: repoURL + password: password + userName: userName + token: token + OSType: + required: + - architecture + - distribution + - license + - version + type: object + properties: + architecture: + type: string + example: x86_64 + enum: + - x86_64 + - x86 + distribution: + type: string + enum: + - RHEL + - UBUNTU + - COREOS + - FEDORA + - WINDOWS + - OTHER + version: + type: string + enum: + - OS_VERSION_UBUNTU_2204_LTS + - OS_VERSION_RHEL_8 + - OS_VERSION_RHEL_7 + - OS_VERSION_DEBIAN_11 + - OS_VERSION_COREOS_STABLE + - OS_MS_WINDOWS_2012_R2 + - OTHER + license: + type: string + enum: + - OS_LICENSE_TYPE_FREE + - OS_LICENSE_TYPE_ON_DEMAND + - NOT_SPECIFIED + example: + license: OS_LICENSE_TYPE_FREE + distribution: RHEL + version: OS_VERSION_UBUNTU_2204_LTS + architecture: x86_64 + PersistentVolumeDetails: + required: + - volumeMountPath + - volumeName + - volumeSize + type: object + properties: + volumeSize: + type: string + description: "size of the volume given by user (10GB, 20GB, 50 GB or 100GB)" + enum: + - 10Gi + - 20Gi + - 50Gi + - 100Gi + volumeMountPath: + type: string + description: Defines the mount path of the volume + volumeName: + type: string + description: Human readable name for the volume + ephemeralType: + type: boolean + description: It indicates the ephemeral storage on the node and contents + are not preserved if containers restarts + default: false + accessMode: + type: string + description: Values are RW (read/write) and RO (read-only)l + default: RW + enum: + - RW + - RO + sharingPolicy: + type: string + description: "Exclusive or Shared. If shared, then in case of multiple containers\ + \ same volume will be shared across the containers." + default: EXCLUSIVE + enum: + - EXCLUSIVE + - SHARED + ProblemDetails: + type: object + properties: + title: + type: string + detail: + type: string + cause: + type: string + invalidParams: + minItems: 1 + type: array + items: + $ref: '#/components/schemas/InvalidParam' + ServiceEndpoint: + required: + - port + type: object + properties: + port: + $ref: '#/components/schemas/Port' + fqdn: + $ref: '#/components/schemas/Fqdn' + ipv4Addresses: + minItems: 1 + type: array + items: + $ref: '#/components/schemas/Ipv4Addr' + ipv6Addresses: + minItems: 1 + type: array + items: + $ref: '#/components/schemas/Ipv6Addr' + example: + ipv4Addresses: + - 198.51.100.1 + - 198.51.100.1 + port: 0 + fqdn: fqdn + ipv6Addresses: + - 2001:db8:85a3::8a2e:370:7334 + - 2001:db8:85a3::8a2e:370:7334 + anyOf: + - required: + - fqdn + - required: + - ipv4Addresses + - required: + - ipv6Addresses + ZoneDetails: + required: + - geographyDetails + - geolocation + - zoneId + type: object + properties: + zoneId: + $ref: '#/components/schemas/ZoneIdentifier' + geolocation: + $ref: '#/components/schemas/GeoLocation' + geographyDetails: + type: string + description: "Details about cities or state covered by the edge. Details\ + \ about the type of locality for eg rural, urban, industrial etc. This\ + \ information is defined in human readable form." + example: + geographyDetails: geographyDetails + zoneId: zoneId + geolocation: geolocation + ZoneRegistrationRequestData: + required: + - acceptedAvailabilityZones + - availZoneNotifLink + type: object + properties: + acceptedAvailabilityZones: + minItems: 1 + type: array + items: + $ref: '#/components/schemas/ZoneIdentifier' + availZoneNotifLink: + $ref: '#/components/schemas/Uri' + ZoneRegistrationResponseData: + required: + - acceptedZoneResourceInfo + type: object + properties: + acceptedZoneResourceInfo: + minItems: 1 + type: array + items: + $ref: '#/components/schemas/ZoneRegisteredData' + example: + acceptedZoneResourceInfo: + - networkResources: + supportDPDK: true + supportSriov: true + egressBandWidth: 1 + dedicatedNIC: 1 + reservedComputeResources: + - hugepages: + - number: 7 + pageSize: 2MB + - number: 7 + pageSize: 2MB + memory: 0 + fpga: 2 + cpuArchType: ISA_X86_64 + diskStorage: 6 + numCPU: "{\"whole\":{\"value\":2},\"decimal\":{\"value\":0.5},\"millivcpu\"\ + :{\"value\":\"500m\"}}" + vpu: 5 + cpuExclusivity: true + gpu: + - gpuMemory: 1 + gpuVendorType: Nvidia + gpuModeName: gpuModeName + numGPU: 5 + - gpuMemory: 1 + gpuVendorType: Nvidia + gpuModeName: gpuModeName + numGPU: 5 + - hugepages: + - number: 7 + pageSize: 2MB + - number: 7 + pageSize: 2MB + memory: 0 + fpga: 2 + cpuArchType: ISA_X86_64 + diskStorage: 6 + numCPU: "{\"whole\":{\"value\":2},\"decimal\":{\"value\":0.5},\"millivcpu\"\ + :{\"value\":\"500m\"}}" + vpu: 5 + cpuExclusivity: true + gpu: + - gpuMemory: 1 + gpuVendorType: Nvidia + gpuModeName: gpuModeName + numGPU: 5 + - gpuMemory: 1 + gpuVendorType: Nvidia + gpuModeName: gpuModeName + numGPU: 5 + zoneId: zoneId + flavoursSupported: + - hugepages: + - null + - null + flavourId: flavourId + memorySize: 3 + fpga: 4 + cpuArchType: ISA_X86 + storageSize: 2 + numCPU: 9 + vpu: 7 + cpuExclusivity: true + supportedOSTypes: + - license: OS_LICENSE_TYPE_FREE + distribution: RHEL + version: OS_VERSION_UBUNTU_2204_LTS + architecture: x86_64 + - license: OS_LICENSE_TYPE_FREE + distribution: RHEL + version: OS_VERSION_UBUNTU_2204_LTS + architecture: x86_64 + gpu: + - null + - null + - hugepages: + - null + - null + flavourId: flavourId + memorySize: 3 + fpga: 4 + cpuArchType: ISA_X86 + storageSize: 2 + numCPU: 9 + vpu: 7 + cpuExclusivity: true + supportedOSTypes: + - license: OS_LICENSE_TYPE_FREE + distribution: RHEL + version: OS_VERSION_UBUNTU_2204_LTS + architecture: x86_64 + - license: OS_LICENSE_TYPE_FREE + distribution: RHEL + version: OS_VERSION_UBUNTU_2204_LTS + architecture: x86_64 + gpu: + - null + - null + computeResourceQuotaLimits: + - null + - null + zoneServiceLevelObjsInfo: + latencyRanges: + minLatency: 1 + maxLatency: 6 + jitterRanges: + maxJitter: 1 + minJitter: 1 + throughputRanges: + minThroughput: 1 + maxThroughput: 5 + - networkResources: + supportDPDK: true + supportSriov: true + egressBandWidth: 1 + dedicatedNIC: 1 + reservedComputeResources: + - hugepages: + - number: 7 + pageSize: 2MB + - number: 7 + pageSize: 2MB + memory: 0 + fpga: 2 + cpuArchType: ISA_X86_64 + diskStorage: 6 + numCPU: "{\"whole\":{\"value\":2},\"decimal\":{\"value\":0.5},\"millivcpu\"\ + :{\"value\":\"500m\"}}" + vpu: 5 + cpuExclusivity: true + gpu: + - gpuMemory: 1 + gpuVendorType: Nvidia + gpuModeName: gpuModeName + numGPU: 5 + - gpuMemory: 1 + gpuVendorType: Nvidia + gpuModeName: gpuModeName + numGPU: 5 + - hugepages: + - number: 7 + pageSize: 2MB + - number: 7 + pageSize: 2MB + memory: 0 + fpga: 2 + cpuArchType: ISA_X86_64 + diskStorage: 6 + numCPU: "{\"whole\":{\"value\":2},\"decimal\":{\"value\":0.5},\"millivcpu\"\ + :{\"value\":\"500m\"}}" + vpu: 5 + cpuExclusivity: true + gpu: + - gpuMemory: 1 + gpuVendorType: Nvidia + gpuModeName: gpuModeName + numGPU: 5 + - gpuMemory: 1 + gpuVendorType: Nvidia + gpuModeName: gpuModeName + numGPU: 5 + zoneId: zoneId + flavoursSupported: + - hugepages: + - null + - null + flavourId: flavourId + memorySize: 3 + fpga: 4 + cpuArchType: ISA_X86 + storageSize: 2 + numCPU: 9 + vpu: 7 + cpuExclusivity: true + supportedOSTypes: + - license: OS_LICENSE_TYPE_FREE + distribution: RHEL + version: OS_VERSION_UBUNTU_2204_LTS + architecture: x86_64 + - license: OS_LICENSE_TYPE_FREE + distribution: RHEL + version: OS_VERSION_UBUNTU_2204_LTS + architecture: x86_64 + gpu: + - null + - null + - hugepages: + - null + - null + flavourId: flavourId + memorySize: 3 + fpga: 4 + cpuArchType: ISA_X86 + storageSize: 2 + numCPU: 9 + vpu: 7 + cpuExclusivity: true + supportedOSTypes: + - license: OS_LICENSE_TYPE_FREE + distribution: RHEL + version: OS_VERSION_UBUNTU_2204_LTS + architecture: x86_64 + - license: OS_LICENSE_TYPE_FREE + distribution: RHEL + version: OS_VERSION_UBUNTU_2204_LTS + architecture: x86_64 + gpu: + - null + - null + computeResourceQuotaLimits: + - null + - null + zoneServiceLevelObjsInfo: + latencyRanges: + minLatency: 1 + maxLatency: 6 + jitterRanges: + maxJitter: 1 + minJitter: 1 + throughputRanges: + minThroughput: 1 + maxThroughput: 5 + ZoneRegisteredData: + required: + - computeResourceQuotaLimits + - flavoursSupported + - reservedComputeResources + - zoneId + type: object + properties: + zoneId: + $ref: '#/components/schemas/ZoneIdentifier' + reservedComputeResources: + minItems: 1 + type: array + description: Resources exclusively reserved for the originator OP. + items: + $ref: '#/components/schemas/ComputeResourceInfo' + computeResourceQuotaLimits: + minItems: 1 + type: array + description: Max quota on resources partner OP allows over reserved resources. + items: + $ref: '#/components/schemas/ComputeResourceInfo' + flavoursSupported: + minItems: 1 + type: array + items: + $ref: '#/components/schemas/Flavour' + networkResources: + $ref: '#/components/schemas/ZoneRegisteredData_networkResources' + zoneServiceLevelObjsInfo: + $ref: '#/components/schemas/ZoneRegisteredData_zoneServiceLevelObjsInfo' + example: + networkResources: + supportDPDK: true + supportSriov: true + egressBandWidth: 1 + dedicatedNIC: 1 + reservedComputeResources: + - hugepages: + - number: 7 + pageSize: 2MB + - number: 7 + pageSize: 2MB + memory: 0 + fpga: 2 + cpuArchType: ISA_X86_64 + diskStorage: 6 + numCPU: "{\"whole\":{\"value\":2},\"decimal\":{\"value\":0.5},\"millivcpu\"\ + :{\"value\":\"500m\"}}" + vpu: 5 + cpuExclusivity: true + gpu: + - gpuMemory: 1 + gpuVendorType: Nvidia + gpuModeName: gpuModeName + numGPU: 5 + - gpuMemory: 1 + gpuVendorType: Nvidia + gpuModeName: gpuModeName + numGPU: 5 + - hugepages: + - number: 7 + pageSize: 2MB + - number: 7 + pageSize: 2MB + memory: 0 + fpga: 2 + cpuArchType: ISA_X86_64 + diskStorage: 6 + numCPU: "{\"whole\":{\"value\":2},\"decimal\":{\"value\":0.5},\"millivcpu\"\ + :{\"value\":\"500m\"}}" + vpu: 5 + cpuExclusivity: true + gpu: + - gpuMemory: 1 + gpuVendorType: Nvidia + gpuModeName: gpuModeName + numGPU: 5 + - gpuMemory: 1 + gpuVendorType: Nvidia + gpuModeName: gpuModeName + numGPU: 5 + zoneId: zoneId + flavoursSupported: + - hugepages: + - null + - null + flavourId: flavourId + memorySize: 3 + fpga: 4 + cpuArchType: ISA_X86 + storageSize: 2 + numCPU: 9 + vpu: 7 + cpuExclusivity: true + supportedOSTypes: + - license: OS_LICENSE_TYPE_FREE + distribution: RHEL + version: OS_VERSION_UBUNTU_2204_LTS + architecture: x86_64 + - license: OS_LICENSE_TYPE_FREE + distribution: RHEL + version: OS_VERSION_UBUNTU_2204_LTS + architecture: x86_64 + gpu: + - null + - null + - hugepages: + - null + - null + flavourId: flavourId + memorySize: 3 + fpga: 4 + cpuArchType: ISA_X86 + storageSize: 2 + numCPU: 9 + vpu: 7 + cpuExclusivity: true + supportedOSTypes: + - license: OS_LICENSE_TYPE_FREE + distribution: RHEL + version: OS_VERSION_UBUNTU_2204_LTS + architecture: x86_64 + - license: OS_LICENSE_TYPE_FREE + distribution: RHEL + version: OS_VERSION_UBUNTU_2204_LTS + architecture: x86_64 + gpu: + - null + - null + computeResourceQuotaLimits: + - null + - null + zoneServiceLevelObjsInfo: + latencyRanges: + minLatency: 1 + maxLatency: 6 + jitterRanges: + maxJitter: 1 + minJitter: 1 + throughputRanges: + minThroughput: 1 + maxThroughput: 5 + inline_response_200: + required: + - federationSupportedAPIs + type: object + properties: + federationSupportedAPIs: + $ref: '#/components/schemas/FederationSupportedAPIs' + example: + federationSupportedAPIs: + availabilityZoneAPI: null + artefactAPI: null + fileAPI: null + resourceMonitoringAPI: null + faultManagementAPI: null + federationBaseAPI: + name: FEDERATION + apiOperations: + - httpMethods: + - POST + - POST + href: href + - httpMethods: + - POST + - POST + href: href + serviceAPIFederation: null + eventManagementAPI: null + edgeApplicationAPI: null + inline_response_200_1: + required: + - edgeDiscoveryServiceEndPoint + - lcmServiceEndPoint + type: object + properties: + edgeDiscoveryServiceEndPoint: + $ref: '#/components/schemas/ServiceEndpoint' + lcmServiceEndPoint: + $ref: '#/components/schemas/ServiceEndpoint' + allowedMobileNetworkIds: + $ref: '#/components/schemas/MobileNetworkIds' + allowedFixedNetworkIds: + $ref: '#/components/schemas/FixedNetworkIds' + offeredAvailabilityZones: + minItems: 1 + type: array + items: + $ref: '#/components/schemas/ZoneDetails' + example: + allowedFixedNetworkIds: + - allowedFixedNetworkIds + - allowedFixedNetworkIds + offeredAvailabilityZones: + - geographyDetails: geographyDetails + zoneId: zoneId + geolocation: geolocation + - geographyDetails: geographyDetails + zoneId: zoneId + geolocation: geolocation + lcmServiceEndPoint: null + allowedMobileNetworkIds: + mncs: + - mncs + - mncs + mcc: mcc + edgeDiscoveryServiceEndPoint: + ipv4Addresses: + - 198.51.100.1 + - 198.51.100.1 + port: 0 + fqdn: fqdn + ipv6Addresses: + - 2001:db8:85a3::8a2e:370:7334 + - 2001:db8:85a3::8a2e:370:7334 + federationContextId_partner_body: + required: + - modificationDate + - objectType + - operationType + type: object + properties: + objectType: + type: string + enum: + - MOBILE_NETWORK_CODES + - FIXED_NETWORK_CODES + operationType: + type: string + enum: + - ADD_CODES + - REMOVE_CODES + - UPDATE_CODES + addMobileNetworkIds: + $ref: '#/components/schemas/MobileNetworkIds' + removeMobileNetworkIds: + $ref: '#/components/schemas/MobileNetworkIds' + addFixedNetworkIds: + $ref: '#/components/schemas/FixedNetworkIds' + removeFixedNetworkIds: + $ref: '#/components/schemas/FixedNetworkIds' + modificationDate: + type: string + description: Date and time of the federation modification by the originating + partner OP + format: date-time + inline_response_200_2: + required: + - FederationContextId + type: object + properties: + FederationContextId: + $ref: '#/components/schemas/FederationContextId' + example: + FederationContextId: FederationContextId + inline_response_200_3: + required: + - federationHealthStatus + type: object + properties: + federationHealthStatus: + $ref: '#/components/schemas/FederationHealthInfo' + example: + federationHealthStatus: + numOfApplications: numOfApplications + federationStatus: + alarmState: RAISED + numOfActiveAlarms: numOfActiveAlarms + numOfAcceptedZones: numOfAcceptedZones + inline_response_200_4: + required: + - ServiceType + - apiRoutingInfo + - serviceCaps + type: object + properties: + serviceCaps: + $ref: '#/components/schemas/serviceAPINames' + serviceType: + $ref: '#/components/schemas/serviceType' + apiRoutingInfo: + $ref: '#/components/schemas/serviceRoutingInfo' + example: + serviceType: api_federation + serviceCaps: + - QualityOnDemand + - QualityOnDemand + apiRoutingInfo: + - apiRoutingInfo + - apiRoutingInfo + federationContextId_artefact_body: + required: + - appProviderId + - artefactDescriptorType + - artefactId + - artefactName + - artefactVersionInfo + - artefactVirtType + - componentSpec + type: object + properties: + artefactId: + $ref: '#/components/schemas/ArtefactId' + appProviderId: + $ref: '#/components/schemas/AppProviderId' + artefactName: + # pattern: "^[A-Za-z][A-Za-z0-9_]{7,31}$" + type: string + description: Name of the artefact. + artefactVersionInfo: + type: string + description: Artefact version information + artefactDescription: + maxLength: 256 + type: string + description: Brief description of the artefact by the application provider + artefactVirtType: + type: string + enum: + - VM_TYPE + - CONTAINER_TYPE + artefactFileName: + maxLength: 32 + minLength: 8 + type: string + description: Name of the file. + artefactFileFormat: + type: string + description: Artefacts like Helm charts or Terraform scripts may need compressed + format. + enum: + - WINZIP + - TAR + - TEXT + - TARGZ + artefactDescriptorType: + type: string + description: Type of descriptor present in the artefact. App provider can + either define either a Helm chart or a Terraform script or container spec. + enum: + - HELM + - TERRAFORM + - ANSIBLE + - SHELL + - COMPONENTSPEC + repoType: + type: string + description: "Artefact or file repository location. PUBLICREPO is used of\ + \ public URLs like GitHub, Helm repo, docker registry etc., PRIVATEREPO\ + \ is used for private repo managed by the application developer, UPLOAD\ + \ is for the case when artefact/file is uploaded from MEC web portal.\ + \ OP should pull the image from ‘repoUrl' immediately after receiving\ + \ the request and then send back the response. In case the repoURL corresponds\ + \ to a docker registry, use docker v2 http api to do the pull." + enum: + - PRIVATEREPO + - PUBLICREPO + - UPLOAD + artefactRepoLocation: + $ref: '#/components/schemas/ObjectRepoLocation' + artefactFile: + type: string + description: Helm archive/Terraform archive/container spec file or Binary + image associated with an application component. + format: binary + componentSpec: + minItems: 1 + type: array + description: "Details about compute, networking and storage requirements\ + \ for each component of the application. App provider should define all\ + \ information needed to instantiate the component. If artefact is being\ + \ defined at component level this section should have information just\ + \ about the component. In case the artefact is being defined at application\ + \ level the section should provide details about all the components." + items: + $ref: '#/components/schemas/ComponentSpec' + inline_response_200_5: + required: + - appProviderId + - artefactDescriptorType + - artefactId + - artefactName + - artefactVersionInfo + - artefactVirtType + type: object + properties: + artefactId: + $ref: '#/components/schemas/ArtefactId' + appProviderId: + $ref: '#/components/schemas/AppProviderId' + artefactName: + # pattern: "^[A-Za-z][A-Za-z0-9_]{7,31}$" + type: string + description: Name of the artefact. + artefactDescription: + maxLength: 256 + type: string + description: Brief description of the artefact by the application provider + artefactVersionInfo: + type: string + description: Artefact version information + artefactVirtType: + type: string + enum: + - VM_TYPE + - CONTAINER_TYPE + artefactFileName: + maxLength: 32 + minLength: 8 + type: string + description: Name of the file. + artefactFileFormat: + type: string + description: Artefacts like Helm charts or Terraform scripts may need compressed + format. + enum: + - WINZIP + - TAR + - TEXT + - TARGZ + artefactDescriptorType: + type: string + description: Type of descriptor present in the artefact. App provider can + either define either a Helm chart or a Terraform script or container spec. + enum: + - HELM + - TERRAFORM + - ANSIBLE + - SHELL + - COMPONENTSPEC + repoType: + type: string + description: "Artefact or file repository location. PUBLICREPO is used of\ + \ public URLs like GitHub, Helm repo, docker registry etc., PRIVATEREPO\ + \ is used for private repo managed by the application developer, UPLOAD\ + \ is for the case when artefact/file is uploaded from MEC web portal.\ + \ OP should pull the image from ‘repoUrl' immediately after receiving\ + \ the request and then send back the response. In case the repoURL corresponds\ + \ to a docker registry, use docker v2 http api to do the pull." + enum: + - PRIVATEREPO + - PUBLICREPO + - UPLOAD + artefactRepoLocation: + $ref: '#/components/schemas/ObjectRepoLocation' + example: + artefactName: artefactName + artefactDescriptorType: HELM + artefactFileName: artefactFileName + repoType: PRIVATEREPO + artefactDescription: artefactDescription + appProviderId: appProviderId + artefactId: 046b6c7f-0b8a-43b9-b35d-6489e6daee91 + artefactVirtType: VM_TYPE + artefactVersionInfo: artefactVersionInfo + artefactRepoLocation: + repoURL: repoURL + password: password + userName: userName + token: token + artefactFileFormat: WINZIP + federationContextId_files_body: + required: + - appProviderId + - fileId + - fileName + - fileType + - fileVersionInfo + - imgInsSetArch + - imgOSType + type: object + properties: + fileId: + $ref: '#/components/schemas/FileId' + appProviderId: + $ref: '#/components/schemas/AppProviderId' + fileName: + pattern: "^[A-Za-z][A-Za-z0-9_]{7,31}$" + type: string + description: Name of the image file. App provides specifies this name + when image is uploaded on originating OP over NBI. + fileDescription: + maxLength: 128 + minLength: 8 + type: string + description: Brief description about the image file. + fileVersionInfo: + type: string + description: File version information + fileType: + $ref: '#/components/schemas/VirtImageType' + checksum: + type: string + description: "MD5 checksum for VM and file-based images, sha256 digest for\ + \ containers" + imgOSType: + $ref: '#/components/schemas/OSType' + imgInsSetArch: + $ref: '#/components/schemas/CPUArchType' + repoType: + type: string + description: "Artefact or file repository location. PUBLICREPO is used of\ + \ public URLs like GitHub, Helm repo, docker registry etc., PRIVATEREPO\ + \ is used for private repo managed by the application developer, UPLOAD\ + \ is for the case when artefact/file is uploaded from MEC web portal.\ + \ OP should pull the image from ‘repoUrl' immediately after receiving\ + \ the request and then send back the response. In case the repoURL corresponds\ + \ to a docker registry, use docker v2 http api to do the pull." + enum: + - PRIVATEREPO + - PUBLICREPO + - UPLOAD + fileRepoLocation: + $ref: '#/components/schemas/ObjectRepoLocation' + file: + type: string + description: Binary image associated with an application component. + format: binary + inline_response_200_6: + required: + - appProviderId + - fileId + - fileName + - fileType + - fileVersionInfo + - imgInsSetArch + - imgOSType + type: object + properties: + fileId: + $ref: '#/components/schemas/FileId' + appProviderId: + $ref: '#/components/schemas/AppProviderId' + fileName: + pattern: "^[A-Za-z][A-Za-z0-9_]{7,31}$" + type: string + description: Name of the image file. App provides specifies this name + when image is uploaded on originating OP over NBI. + fileDescription: + maxLength: 128 + minLength: 8 + type: string + description: Brief description about the image file. + fileVersionInfo: + type: string + description: File version information + fileType: + $ref: '#/components/schemas/VirtImageType' + checksum: + type: string + description: "MD5 checksum for VM and file-based images, sha256 digest for\ + \ containers" + imgOSType: + $ref: '#/components/schemas/OSType' + imgInsSetArch: + $ref: '#/components/schemas/CPUArchType' + repoType: + type: string + description: "Artefact or file repository location. PUBLICREPO is used of\ + \ public URLs like GitHub, Helm repo, docker registry etc., PRIVATEREPO\ + \ is used for private repo managed by the application developer, UPLOAD\ + \ is for the case when artefact/file is uploaded from MEC web portal.\ + \ OP should pull the image from ‘repoUrl' immediately after receiving\ + \ the request and then send back the response. In case the repoURL corresponds\ + \ to a docker registry, use docker v2 http api to do the pull." + enum: + - PRIVATEREPO + - PUBLICREPO + - UPLOAD + fileRepoLocation: + $ref: '#/components/schemas/ObjectRepoLocation' + example: + fileDescription: fileDescription + fileName: fileName + fileVersionInfo: fileVersionInfo + repoType: PRIVATEREPO + appProviderId: appProviderId + checksum: checksum + imgInsSetArch: ISA_X86 + imgOSType: + license: OS_LICENSE_TYPE_FREE + distribution: RHEL + version: OS_VERSION_UBUNTU_2204_LTS + architecture: x86_64 + fileRepoLocation: + repoURL: repoURL + password: password + userName: userName + token: token + fileType: QCOW2 + fileId: 046b6c7f-0b8a-43b9-b35d-6489e6daee91 + application_onboarding_body: + required: + - appComponentSpecs + - appId + - appMetaData + - appProviderId + - appQoSProfile + - appStatusCallbackLink + type: object + properties: + appId: + $ref: '#/components/schemas/AppIdentifier' + appProviderId: + $ref: '#/components/schemas/AppProviderId' + appDeploymentZones: + minItems: 1 + type: array + description: Details about partner OP zones where the application should + be made available; This field when specified will instruct the OP to + restrict application instantiation only on the listed zones. + items: + $ref: '#/components/schemas/ZoneIdentifier' + appMetaData: + $ref: '#/components/schemas/AppMetaData' + appQoSProfile: + $ref: '#/components/schemas/AppQoSProfile' + appComponentSpecs: + $ref: '#/components/schemas/AppComponentSpecs' + appStatusCallbackLink: + $ref: '#/components/schemas/Uri' + inline_response_200_7: + required: + - appComponentSpecs + - appDeploymentZones + - appId + - appMetaData + - appProviderId + - appQoSProfile + type: object + properties: + appId: + $ref: '#/components/schemas/AppIdentifier' + appProviderId: + $ref: '#/components/schemas/AppProviderId' + appDeploymentZones: + minItems: 1 + type: array + description: Details about partner OP zones where the application should + be made available; This field when specified will instruct the OP to + restrict application instantiation only on the listed zones. + items: + $ref: '#/components/schemas/inline_response_200_7_appDeploymentZones' + appMetaData: + $ref: '#/components/schemas/AppMetaData' + appQoSProfile: + $ref: '#/components/schemas/AppQoSProfile' + appComponentSpecs: + $ref: '#/components/schemas/AppComponentSpecs' + example: + appMetaData: + appName: appName + mobilitySupport: false + appDescription: appDescription + accessToken: accessToken + category: IOT + version: version + appProviderId: appProviderId + appId: appId + appQoSProfile: + bandwidthRequired: 1 + multiUserClients: APP_TYPE_SINGLE_USER + noOfUsersPerAppInst: 6 + latencyConstraints: NONE + appProvisioning: true + appDeploymentZones: + - zoneInfo: zoneInfo + countryCode: countryCode + - zoneInfo: zoneInfo + countryCode: countryCode + appComponentSpecs: + - serviceNameEW: serviceNameEW + serviceNameNB: serviceNameNB + artefactId: 046b6c7f-0b8a-43b9-b35d-6489e6daee91 + componentName: componentName + - serviceNameEW: serviceNameEW + serviceNameNB: serviceNameNB + artefactId: 046b6c7f-0b8a-43b9-b35d-6489e6daee91 + componentName: componentName + federationContextIdapplicationonboardingappappId_appUpdQoSProfile: + type: object + properties: + latencyConstraints: + type: string + description: "Latency requirements for the application.Allowed values (non-standardized)\ + \ are none, low and ultra-low. Ultra-Low may corresponds to range 15 -\ + \ 30 msec, Low correspond to range 30 - 50 msec. None means 51 and above" + enum: + - NONE + - LOW + - ULTRALOW + bandwidthRequired: + minimum: 1 + type: integer + description: Data transfer bandwidth requirement (minimum limit) for the + application. It should in Mbits/sec + format: int32 + mobilitySupport: + type: boolean + description: Indicates if an application is sensitive to user mobility and + can be relocated. Default is “FALSE” + default: false + multiUserClients: + type: string + description: Single user type application are designed to serve just one + client. Multi user type application is designed to serve multiple clients + enum: + - APP_TYPE_SINGLE_USER + - APP_TYPE_MULTI_USER + noOfUsersPerAppInst: + type: integer + description: Maximum no of clients that can connect to an instance of this + application. This parameter is relevant only for application of type multi + user + default: 1 + appProvisioning: + type: boolean + description: Define if application can be instantiated or not + default: true + description: "Parameters corresponding to the performance constraints, tenancy\ + \ details etc." + federationContextIdapplicationonboardingappappId_appComponentSpecs: + required: + - artefactId + type: object + properties: + serviceNameNB: + pattern: "^[A-Za-z0-9][A-Za-z0-9_]{6,62}[A-Za-z0-9]$" + type: string + description: Must be a valid RFC 1035 label name. This defines the DNS + name via which the component can be accessed over NBI. Access via serviceNameNB + is restricted on specific ports. Platform shall expose component access + externally via this DNS name + serviceNameEW: + pattern: "^[A-Za-z0-9][A-Za-z0-9_]{6,62}[A-Za-z0-9]$" + type: string + description: Must be a valid RFC 1035 label name. This defines the DNS + name via which the component can be accessed via peer components. Access + via serviceNameEW is open on all ports. Platform shall not expose serviceNameEW + externally outside edge. + componentName: + pattern: "^[A-Za-z0-9][A-Za-z0-9_]{6,62}[A-Za-z0-9]$" + type: string + description: Must be a valid RFC 1035 label name. Component name must be + unique with an application + artefactId: + $ref: '#/components/schemas/ArtefactId' + app_appId_body: + minProperties: 1 + type: object + properties: + appUpdQoSProfile: + $ref: '#/components/schemas/federationContextIdapplicationonboardingappappId_appUpdQoSProfile' + appComponentSpecs: + $ref: '#/components/schemas/AppComponentSpecs' + appId_zoneForbid_body: + minItems: 1 + required: + - forbid + - zoneId + type: array + properties: + zoneId: + $ref: '#/components/schemas/ZoneIdentifier' + forbid: + type: boolean + description: Value 'true' will forbid application instantiation on this + zone. No new instance of the application can be created on this zone. + items: + type: object + description: List of zones where application instantiation shall be forbidden + or allowed. + federationContextIdapplicationlcm_zoneInfo: + required: + - flavourId + #- zoneId + type: object + properties: + zoneId: + type: string + #$ref: '#/components/schemas/ZoneIdentifier' + flavourId: + $ref: '#/components/schemas/FlavourId' + resourceConsumption: + type: string + description: "Specifies if the application can be instantiated using pre-reserved\ + \ resource or not. App provider can pre-reserve a pool of compute resource\ + \ on each zone. 'RESERVED_RES_SHALL' instruct OP to use only the pre-reserved\ + \ resources. 'RESERVED_RES_PREFER' instruct to first try using pre-reserved\ + \ resource, if none available go for non-reserved resources. 'RESERVED_RES_AVOID'\ + \ instruct OP not to use pre-reserved resource if possible, it is a choice\ + \ depending upon circumstances 'RESERVED_RES_FORBID' instruct OP not to\ + \ use pre-reserved resources." + default: RESERVED_RES_AVOID + enum: + - RESERVED_RES_SHALL + - RESERVED_RES_PREFER + - RESERVED_RES_AVOID + - RESERVED_RES_FORBID + resPool: + pattern: "^[A-Za-z0-9][A-Za-z0-9_]{6,30}[A-Za-z0-9]$" + type: string + description: Resource pool to be used for application instantiation on this + zone. Valid only if IE 'resourceConsumption' is set to 'RESERVED_RES_SHALL' + or 'RESERVED_RES_PREFER' + application_lcm_body: + required: + - appId + - appInstCallbackLink + - appProviderId + - appVersion + - zoneInfo + type: object + properties: + appId: + $ref: '#/components/schemas/AppIdentifier' + appVersion: + type: string + description: Version info of the application + appProviderId: + $ref: '#/components/schemas/AppProviderId' + zoneInfo: + $ref: '#/components/schemas/federationContextIdapplicationlcm_zoneInfo' + appInstCallbackLink: + $ref: '#/components/schemas/Uri' + inline_response_202: + required: + - appInstIdentifier + - zoneId + type: object + properties: + zoneId: + $ref: '#/components/schemas/ZoneIdentifier' + appInstIdentifier: + $ref: '#/components/schemas/InstanceIdentifier' + example: + appInstIdentifier: appInstIdentifier + zoneId: zoneId + inline_response_200_8: + minProperties: 1 + type: object + properties: + appInstanceState: + $ref: '#/components/schemas/InstanceState' + accesspointInfo: + minItems: 1 + type: array + description: Information about the IP and Port exposed by the OP. Application + clients shall use these access points to reach this application instance + items: + $ref: '#/components/schemas/inline_response_200_8_accesspointInfo' + example: + appInstanceState: PENDING + accesspointInfo: + - interfaceId: interfaceId + accessPoints: + ipv4Addresses: + - 198.51.100.1 + - 198.51.100.1 + port: 0 + fqdn: fqdn + ipv6Addresses: + - 2001:db8:85a3::8a2e:370:7334 + - 2001:db8:85a3::8a2e:370:7334 + - interfaceId: interfaceId + accessPoints: + ipv4Addresses: + - 198.51.100.1 + - 198.51.100.1 + port: 0 + fqdn: fqdn + ipv6Addresses: + - 2001:db8:85a3::8a2e:370:7334 + - 2001:db8:85a3::8a2e:370:7334 + federationContextIdapplicationlcmappappIdappProviderappProviderId_appInstanceInfo: + required: + - appInstIdentifier + - appInstanceState + type: object + properties: + appInstIdentifier: + $ref: '#/components/schemas/InstanceIdentifier' + appInstanceState: + $ref: '#/components/schemas/InstanceState' + example: + appInstIdentifier: appInstIdentifier + appInstanceState: PENDING + inline_response_200_9: + required: + - appInstanceInfo + - zoneId + type: object + properties: + zoneId: + $ref: '#/components/schemas/ZoneIdentifier' + appInstanceInfo: + minItems: 1 + type: array + items: + $ref: '#/components/schemas/federationContextIdapplicationlcmappappIdappProviderappProviderId_appInstanceInfo' + example: + appInstanceInfo: + - appInstIdentifier: appInstIdentifier + appInstanceState: PENDING + - appInstIdentifier: appInstIdentifier + appInstanceState: PENDING + zoneId: zoneId + AppComponentSpecs_inner: + required: + - artefactId + type: object + properties: + serviceNameNB: + pattern: "^[A-Za-z0-9][A-Za-z0-9_]{6,62}[A-Za-z0-9]$" + type: string + description: Must be a valid RFC 1035 label name. This defines the DNS name + via which the component can be accessed over NBI. Access via serviceNameNB + is restricted on specific ports. Platform shall expose component access + externally via this DNS name + serviceNameEW: + pattern: "^[A-Za-z0-9][A-Za-z0-9_]{6,62}[A-Za-z0-9]$" + type: string + description: Must be a valid RFC 1035 label name. This defines the DNS name + via which the component can be accessed via peer components. Access via + serviceNameEW is open on all ports. Platform shall not expose serviceNameEW + externally outside edge. + componentName: + pattern: "^[A-Za-z0-9][A-Za-z0-9_]{6,62}[A-Za-z0-9]$" + type: string + description: Must be a valid RFC 1035 label name. Component name must be + unique with an application + artefactId: + $ref: '#/components/schemas/ArtefactId' + example: + serviceNameEW: serviceNameEW + serviceNameNB: serviceNameNB + artefactId: 046b6c7f-0b8a-43b9-b35d-6489e6daee91 + componentName: componentName + ZoneRegisteredData_networkResources: + required: + - dedicatedNIC + - egressBandWidth + - supportDPDK + - supportSriov + type: object + properties: + egressBandWidth: + type: integer + description: Max dl throughput that this edge can offer. It is defined in + Mbps. + format: int32 + dedicatedNIC: + type: integer + description: Number of network interface cards which can be dedicatedly + assigned to application pods on isolated networks. This includes virtual + as well physical NICs + format: int32 + supportSriov: + type: boolean + description: If this zone support SRIOV networks or not + supportDPDK: + type: boolean + description: If this zone supports DPDK based networking. + example: + supportDPDK: true + supportSriov: true + egressBandWidth: 1 + dedicatedNIC: 1 + ZoneRegisteredData_zoneServiceLevelObjsInfo_latencyRanges: + type: object + properties: + minLatency: + minimum: 1 + type: integer + description: The time for data/packet to reach from UC to edge application. + It represent mínimum latency in milli seconds that may exist between UCs + and edge apps in this zone but it can be higher in actual. + format: int32 + maxLatency: + type: integer + description: The maximum limit of latency between UC and Edge App in milli + seconds. + format: int32 + example: + minLatency: 1 + maxLatency: 6 + ZoneRegisteredData_zoneServiceLevelObjsInfo_jitterRanges: + type: object + properties: + minJitter: + minimum: 1 + type: integer + format: int32 + maxJitter: + type: integer + description: The maximum limit of network jitter between UC and Edge App + in milli seconds. + format: int32 + example: + maxJitter: 1 + minJitter: 1 + ZoneRegisteredData_zoneServiceLevelObjsInfo_throughputRanges: + type: object + properties: + minThroughput: + minimum: 1 + type: integer + description: The minimum limit of network throughput between UC and Edge + App in Mega bits per seconds (Mbps). + format: int32 + maxThroughput: + type: integer + description: The maximum limit of network throughput between UC and Edge + App in Mega bits per seconds (Mbps). + format: int32 + example: + minThroughput: 1 + maxThroughput: 5 + ZoneRegisteredData_zoneServiceLevelObjsInfo: + required: + - jitterRanges + - latencyRanges + - throughputRanges + type: object + properties: + latencyRanges: + $ref: '#/components/schemas/ZoneRegisteredData_zoneServiceLevelObjsInfo_latencyRanges' + jitterRanges: + $ref: '#/components/schemas/ZoneRegisteredData_zoneServiceLevelObjsInfo_jitterRanges' + throughputRanges: + $ref: '#/components/schemas/ZoneRegisteredData_zoneServiceLevelObjsInfo_throughputRanges' + description: It is a measure of the actual amount of data that is being sent + over a network per unit of time and indicates máximum supported value for + a zone + example: + latencyRanges: + minLatency: 1 + maxLatency: 6 + jitterRanges: + maxJitter: 1 + minJitter: 1 + throughputRanges: + minThroughput: 1 + maxThroughput: 5 + inline_response_200_7_appDeploymentZones: + required: + - countryCode + - zoneInfo + type: object + properties: + countryCode: + $ref: '#/components/schemas/CountryCode' + zoneInfo: + $ref: '#/components/schemas/ZoneIdentifier' + example: + zoneInfo: zoneInfo + countryCode: countryCode + inline_response_200_8_accesspointInfo: + required: + - accessPoints + - interfaceId + type: object + properties: + interfaceId: + pattern: "^[A-Za-z0-9][A-Za-z0-9_]{6,30}[A-Za-z0-9]$" + type: string + description: This is the interface identifier that app provider defines + when application is onboarded. + accessPoints: + $ref: '#/components/schemas/ServiceEndpoint' + example: + interfaceId: interfaceId + accessPoints: + ipv4Addresses: + - 198.51.100.1 + - 198.51.100.1 + port: 0 + fqdn: fqdn + ipv6Addresses: + - 2001:db8:85a3::8a2e:370:7334 + - 2001:db8:85a3::8a2e:370:7334 + responses: + "400": + description: Bad request + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "401": + description: Unauthorized + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "404": + description: Not Found + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "409": + description: Conflict + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "412": + description: Precondition Failed + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "422": + description: Unprocessable Entity + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "500": + description: Internal Server Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "501": + description: Not Implemented + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "503": + description: Service Unavailable + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + "520": + description: Web Server Returned an Unknown Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + default: + description: Generic Error + securitySchemes: + oAuth2ClientCredentials: + type: oauth2 + flows: + clientCredentials: + tokenUrl: http://127.0.0.1:8080/realms/federation/protocol/openid-connect/token + scopes: + fed-mgmt: Access to the federation APIs + x-tokenInfoFunc: api.authorization.check_oAuth2ClientCredentials + x-scopeValidateFunc: api.authorization.validate_scope_oAuth2ClientCredentials diff --git a/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/router.py b/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/router.py new file mode 100644 index 0000000..82bec75 --- /dev/null +++ b/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/router.py @@ -0,0 +1,11 @@ +"""FastAPI routes for the GSMA Federation Manager API (EWBI OPG v1.2.0). + +Endpoints defined by ``API_definitions/federation-manager.yaml``. +""" + +from fastapi import APIRouter + +# GSMA OPG serves the Federation Management API at {apiRoot}/operatorplatform/federation/v1. +BASE_PATH = "/operatorplatform/federation/v1" + +router = APIRouter(prefix=BASE_PATH, tags=["Federation Manager"]) diff --git a/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/schemas.py b/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/schemas.py new file mode 100644 index 0000000..364aef9 --- /dev/null +++ b/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/schemas.py @@ -0,0 +1,7 @@ +"""Pydantic models for the GSMA Federation Manager API (EWBI OPG v1.2.0). + +Request/response schemas derived from +``API_definitions/federation-manager.yaml``. +""" + +from __future__ import annotations -- GitLab From 834497fa52b1a4c5acb90096eed38300680bf2a9 Mon Sep 17 00:00:00 2001 From: gpapathan87 Date: Fri, 4 Sep 2026 13:11:25 +0300 Subject: [PATCH 02/11] feat: add GSMA Federation Manager FederationManagement HTTP surface --- .../gsma/federation_manager/v1_2_0/router.py | 99 ++++++++ .../gsma/federation_manager/v1_2_0/schemas.py | 220 +++++++++++++++++- src/open_exposure_gateway/main.py | 8 + .../unit/test_federation_manager_endpoints.py | 77 ++++++ 4 files changed, 403 insertions(+), 1 deletion(-) create mode 100644 tests/unit/test_federation_manager_endpoints.py diff --git a/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/router.py b/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/router.py index 82bec75..92374fc 100644 --- a/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/router.py +++ b/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/router.py @@ -1,11 +1,110 @@ """FastAPI routes for the GSMA Federation Manager API (EWBI OPG v1.2.0). Endpoints defined by ``API_definitions/federation-manager.yaml``. + +This module currently exposes the ``FederationManagement`` tag only, and every +handler is a surface stub that raises :class:`NotImplementedException` (HTTP 501). +The request/response contract (path, schema, error codes) is live and visible in +the OpenAPI document; the fulfilment logic is added in a later step. """ +from typing import Any + from fastapi import APIRouter +from open_exposure_gateway.api.gsma.federation_manager.v1_2_0.schemas import ( + FederationContextId, + FederationContextIdResponse, + FederationDetails, + FederationPatchRequest, + FederationRequestData, + FederationResponseData, + ProblemDetails, +) +from open_exposure_gateway.core.exceptions import NotImplementedException + # GSMA OPG serves the Federation Management API at {apiRoot}/operatorplatform/federation/v1. BASE_PATH = "/operatorplatform/federation/v1" router = APIRouter(prefix=BASE_PATH, tags=["Federation Manager"]) + +# Every Federation Manager error response is an RFC 7807 ProblemDetails (federation-manager.yaml). +_ERROR_RESPONSES: dict[int | str, dict[str, Any]] = { + 400: {"model": ProblemDetails, "description": "Bad request"}, + 401: {"model": ProblemDetails, "description": "Unauthorized"}, + 404: {"model": ProblemDetails, "description": "Not found"}, + 409: {"model": ProblemDetails, "description": "Conflict"}, + 422: {"model": ProblemDetails, "description": "Unprocessable entity"}, + 500: {"model": ProblemDetails, "description": "Internal server error"}, + 501: {"model": ProblemDetails, "description": "Not implemented"}, + 503: {"model": ProblemDetails, "description": "Service unavailable"}, + 520: {"model": ProblemDetails, "description": "Unknown error"}, +} + + +def _responses(*codes: int) -> dict[int | str, dict[str, Any]]: + return {code: _ERROR_RESPONSES[code] for code in codes} + + +_NOT_IMPLEMENTED = "Federation Manager is not implemented in this release" + + +@router.post( + "/partner", + summary="Create a one-direction federation with a partner operator platform", + operation_id="create_federation", + response_model=FederationResponseData, + response_model_exclude_none=True, + responses=_responses(400, 401, 404, 409, 422, 500, 501, 503, 520), +) +async def create_federation(request: FederationRequestData) -> Any: + raise NotImplementedException(message=_NOT_IMPLEMENTED) + + +@router.get( + "/{federationContextId}/partner", + summary="Retrieve details about the federation context with the partner OP", + operation_id="get_federation_details", + response_model=FederationDetails, + response_model_exclude_none=True, + responses=_responses(400, 401, 404, 409, 422, 500, 501, 503, 520), +) +async def get_federation_details(federationContextId: FederationContextId) -> Any: + raise NotImplementedException(message=_NOT_IMPLEMENTED) + + +@router.patch( + "/{federationContextId}/partner", + summary="Update the parameters associated with an existing federation", + operation_id="update_federation", + response_model=FederationDetails, + response_model_exclude_none=True, + responses=_responses(400, 401, 404, 409, 422, 500, 501, 503, 520), +) +async def update_federation( + federationContextId: FederationContextId, request: FederationPatchRequest +) -> Any: + raise NotImplementedException(message=_NOT_IMPLEMENTED) + + +@router.delete( + "/{federationContextId}/partner", + summary="Remove an existing federation with the partner OP", + operation_id="delete_federation_details", + status_code=200, + responses=_responses(400, 401, 404, 409, 422, 500, 501, 503, 520), +) +async def delete_federation_details(federationContextId: FederationContextId) -> Any: + raise NotImplementedException(message=_NOT_IMPLEMENTED) + + +@router.get( + "/fed-context-id", + summary="Retrieve the existing federationContextId with the partner operator platform", + operation_id="get_federation_context_id", + response_model=FederationContextIdResponse, + response_model_exclude_none=True, + responses=_responses(400, 401, 404, 409, 422, 500, 501, 503, 520), +) +async def get_federation_context_id() -> Any: + raise NotImplementedException(message=_NOT_IMPLEMENTED) diff --git a/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/schemas.py b/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/schemas.py index 364aef9..dec8a4c 100644 --- a/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/schemas.py +++ b/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/schemas.py @@ -1,7 +1,225 @@ """Pydantic models for the GSMA Federation Manager API (EWBI OPG v1.2.0). Request/response schemas derived from -``API_definitions/federation-manager.yaml``. +``API_definitions/federation-manager.yaml``. Only the ``FederationManagement`` +tag is modelled here; the other tags (zones, artefacts, application onboarding +and LCM) are added as they are implemented. + +Schema names follow the OpenAPI ``operationId`` intent rather than the generated +``inline_response_*`` / ``*_body`` names: ``FederationDetails`` is the spec's +``inline_response_200_1``, ``FederationContextIdResponse`` is +``inline_response_200_2`` and ``FederationPatchRequest`` is +``federationContextId_partner_body``. """ from __future__ import annotations + +from datetime import datetime +from enum import StrEnum +from typing import Annotated, Optional + +from pydantic import BaseModel, ConfigDict, Field, StringConstraints, model_validator + +# --- Scalar types (OpenAPI: string/integer with pattern or format) ------------- + +# "^[A-Za-z0-9][A-Za-z0-9-]*$" is shared by FederationContextId, FederationIdentifier +# and ZoneIdentifier in the spec. +_ID_PATTERN = r"^[A-Za-z0-9][A-Za-z0-9-]*$" + +FederationContextId = Annotated[str, StringConstraints(pattern=_ID_PATTERN)] +"""Allocated by the partner OP when a federation context is created; echoed by the +Originating OP on every subsequent request.""" + +FederationIdentifier = Annotated[str, StringConstraints(pattern=_ID_PATTERN)] +"""Globally unique identifier of an operator platform, in the MEC federation context.""" + +ZoneIdentifier = Annotated[str, StringConstraints(pattern=_ID_PATTERN)] + +CountryCode = Annotated[str, StringConstraints(pattern=r"^[A-Z]{2}$")] +"""ISO 3166-1 Alpha-2 country code of the partner operator.""" + +Mcc = Annotated[str, StringConstraints(pattern=r"^\d{3}$")] +Mnc = Annotated[str, StringConstraints(pattern=r"^\d{2,3}$")] + +GeoLocation = Annotated[ + str, + StringConstraints( + pattern=r"^([-+]?)([\d]{1,2})((((\.)([\d]{1,4}))?(,)))(([-+]?)([\d]{1,3})((\.)([\d]{1,4}))?)$" + ), +] +"""``Latitude,Longitude`` as a decimal fraction, up to 4-digit precision.""" + +Ipv4Addr = Annotated[ + str, + StringConstraints( + pattern=r"^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}" + r"([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$" + ), +] +Ipv6Addr = Annotated[ + str, + StringConstraints( + pattern=r"^((:|(0?|([1-9a-f][0-9a-f]{0,3}))):)" + r"((0?|([1-9a-f][0-9a-f]{0,3})):){0,6}(:|(0?|([1-9a-f][0-9a-f]{0,3})))$" + ), +] + +Fqdn = str +Uri = str +Port = Annotated[int, Field(ge=0)] + +# A non-empty list of fixed-line network identifiers. +FixedNetworkIds = Annotated[list[str], Field(min_length=1)] + + +# --- Enumerations ------------------------------------------------------------- + + +class PlatformCapability(StrEnum): + """Capabilities an operator platform advertises to a federation partner.""" + + HOME_ROUTING = "homeRouting" + ANCHORING = "Anchoring" + SERVICE_APIS = "serviceAPIs" + FAULT_MGMT = "faultMgmt" + EVENT_MGMT = "eventMgmt" + RESOURCE_MONITOR = "resourceMonitor" + + +class NetworkCodeObjectType(StrEnum): + MOBILE_NETWORK_CODES = "MOBILE_NETWORK_CODES" + FIXED_NETWORK_CODES = "FIXED_NETWORK_CODES" + + +class NetworkCodeOperationType(StrEnum): + ADD_CODES = "ADD_CODES" + REMOVE_CODES = "REMOVE_CODES" + UPDATE_CODES = "UPDATE_CODES" + + +# --- Object schemas -------------------------------------------------------------- + + +class MobileNetworkIds(BaseModel): + """MCC plus the set of MNCs associated with an operator platform's mobile network.""" + + mcc: Optional[Mcc] = None + mncs: Optional[Annotated[list[Mnc], Field(min_length=1)]] = None + + +class CallbackCredentials(BaseModel): + """OAuth2 client-credentials used by the partner OP to authenticate callbacks.""" + + model_config = ConfigDict(extra="forbid") + + tokenUrl: Uri + clientId: str + clientSecret: str + + +class ServiceEndpoint(BaseModel): + """Reachability information for the edge-discovery or LCM service of an OP. + + The spec requires ``port`` plus at least one of ``fqdn`` / ``ipv4Addresses`` / + ``ipv6Addresses``. + """ + + port: Port + fqdn: Optional[Fqdn] = None + ipv4Addresses: Optional[Annotated[list[Ipv4Addr], Field(min_length=1)]] = None + ipv6Addresses: Optional[Annotated[list[Ipv6Addr], Field(min_length=1)]] = None + + @model_validator(mode="after") + def _at_least_one_address(self) -> ServiceEndpoint: + if not (self.fqdn or self.ipv4Addresses or self.ipv6Addresses): + raise ValueError("one of fqdn, ipv4Addresses or ipv6Addresses is required") + return self + + +class ZoneDetails(BaseModel): + """An availability zone an OP offers to the developers of a federation partner.""" + + zoneId: ZoneIdentifier + geolocation: GeoLocation + geographyDetails: str + + +class InvalidParam(BaseModel): + param: str + reason: Optional[str] = None + + +class ProblemDetails(BaseModel): + """RFC 7807 error body used by every Federation Manager error response.""" + + title: Optional[str] = None + detail: Optional[str] = None + cause: Optional[str] = None + invalidParams: Optional[Annotated[list[InvalidParam], Field(min_length=1)]] = None + + +class FederationRequestData(BaseModel): + """Body of ``POST /partner`` -- the Originating OP's federation create request.""" + + model_config = ConfigDict(extra="forbid") + + origOPFederationId: FederationIdentifier + initialDate: datetime + partnerStatusLink: Uri + origOPCountryCode: Optional[CountryCode] = None + origOPMobileNetworkCodes: Optional[MobileNetworkIds] = None + origOPFixedNetworkCodes: Optional[FixedNetworkIds] = None + partnerCallbackCredentials: Optional[CallbackCredentials] = None + + +class FederationResponseData(BaseModel): + """``200`` body of ``POST /partner`` -- the partner OP's federation context.""" + + partnerOPFederationId: FederationIdentifier + federationContextId: FederationContextId + platformCaps: list[PlatformCapability] + partnerOPCountryCode: Optional[CountryCode] = None + edgeDiscoveryServiceEndPoint: Optional[ServiceEndpoint] = None + lcmServiceEndPoint: Optional[ServiceEndpoint] = None + partnerOPMobileNetworkCodes: Optional[MobileNetworkIds] = None + partnerOPFixedNetworkCodes: Optional[FixedNetworkIds] = None + offeredAvailabilityZones: Optional[Annotated[list[ZoneDetails], Field(min_length=1)]] = None + + +class FederationDetails(BaseModel): + """``200`` body of ``GET`` / ``PATCH`` ``/{federationContextId}/partner``. + + The spec's ``inline_response_200_1``. + """ + + edgeDiscoveryServiceEndPoint: ServiceEndpoint + lcmServiceEndPoint: ServiceEndpoint + allowedMobileNetworkIds: Optional[MobileNetworkIds] = None + allowedFixedNetworkIds: Optional[FixedNetworkIds] = None + offeredAvailabilityZones: Optional[Annotated[list[ZoneDetails], Field(min_length=1)]] = None + + +class FederationContextIdResponse(BaseModel): + """``200`` body of ``GET /fed-context-id``. The spec's ``inline_response_200_2``. + + The wire field name is ``FederationContextId`` (capitalised) per the spec. + """ + + FederationContextId: FederationContextId + + +class FederationPatchRequest(BaseModel): + """Body of ``PATCH /{federationContextId}/partner``. + + The spec's ``federationContextId_partner_body``. + """ + + model_config = ConfigDict(extra="forbid") + + objectType: NetworkCodeObjectType + operationType: NetworkCodeOperationType + modificationDate: datetime + addMobileNetworkIds: Optional[MobileNetworkIds] = None + removeMobileNetworkIds: Optional[MobileNetworkIds] = None + addFixedNetworkIds: Optional[FixedNetworkIds] = None + removeFixedNetworkIds: Optional[FixedNetworkIds] = None diff --git a/src/open_exposure_gateway/main.py b/src/open_exposure_gateway/main.py index 13b4b94..fb375eb 100644 --- a/src/open_exposure_gateway/main.py +++ b/src/open_exposure_gateway/main.py @@ -44,6 +44,9 @@ from open_exposure_gateway.api.error_handlers import ( register_exception_handlers, x_correlator_header, ) +from open_exposure_gateway.api.gsma.federation_manager.v1_2_0.router import ( + router as federation_manager_router, +) from open_exposure_gateway.api.platform.health import router as health_router from open_exposure_gateway.application.services.edge_application_management_service import ( EdgeApplicationManagementService, @@ -159,6 +162,10 @@ openapi_tags = [ "name": "Location retrieval", "description": "Retrieve the location of a device", }, + { + "name": "Federation Manager", + "description": "GSMA OPG Federation Management (EWBI) -- partner federation lifecycle", + }, { "name": "Platform", "description": "Platform-specific endpoints (health, readiness probes)", @@ -309,6 +316,7 @@ def create_app(lifespan: Optional[Lifespan[FastAPI]] = None) -> FastAPI: app.include_router(edge_application_management_router) app.include_router(quality_on_demand_router) app.include_router(location_retrieval_router) + app.include_router(federation_manager_router) return app diff --git a/tests/unit/test_federation_manager_endpoints.py b/tests/unit/test_federation_manager_endpoints.py new file mode 100644 index 0000000..900b427 --- /dev/null +++ b/tests/unit/test_federation_manager_endpoints.py @@ -0,0 +1,77 @@ +"""GSMA Federation Manager -- surface stub. + +The FederationManagement routes are wired into the app and visible in the OpenAPI +document, but every handler returns HTTP 501 until fulfilment logic is added. +""" + +from datetime import datetime, timezone +from typing import Any + +import pytest +from fastapi.testclient import TestClient +from pydantic import ValidationError + +from open_exposure_gateway.api.gsma.federation_manager.v1_2_0.router import BASE_PATH +from open_exposure_gateway.api.gsma.federation_manager.v1_2_0.schemas import ( + FederationRequestData, +) +from open_exposure_gateway.main import app + +client = TestClient(app, raise_server_exceptions=False) + +_CTX = "fed-ctx-1" +_VALID_CREATE = { + "origOPFederationId": "orig-op-1", + "initialDate": "2026-09-04T12:00:00Z", + "partnerStatusLink": "https://orig-op.example.com/status", +} +_VALID_PATCH = { + "objectType": "MOBILE_NETWORK_CODES", + "operationType": "ADD_CODES", + "modificationDate": "2026-09-04T12:00:00Z", +} + +_ENDPOINTS = [ + ("post", f"{BASE_PATH}/partner", _VALID_CREATE), + ("get", f"{BASE_PATH}/{_CTX}/partner", None), + ("patch", f"{BASE_PATH}/{_CTX}/partner", _VALID_PATCH), + ("delete", f"{BASE_PATH}/{_CTX}/partner", None), + ("get", f"{BASE_PATH}/fed-context-id", None), +] + +_OPERATION_IDS = { + "create_federation", + "get_federation_details", + "update_federation", + "delete_federation_details", + "get_federation_context_id", +} + + +@pytest.mark.parametrize(("method", "path", "body"), _ENDPOINTS) +def test_endpoint_returns_501(method: str, path: str, body: dict[str, Any] | None) -> None: + response = client.request(method, path, json=body) + assert response.status_code == 501 + + +def test_openapi_exposes_federation_management_operations() -> None: + paths = app.openapi()["paths"] + seen = { + op["operationId"] + for methods in paths.values() + for op in methods.values() + if isinstance(op, dict) and "operationId" in op + } + assert _OPERATION_IDS <= seen + + +def test_federation_request_data_round_trips() -> None: + model = FederationRequestData.model_validate(_VALID_CREATE) + assert model.origOPFederationId == "orig-op-1" + assert model.initialDate == datetime(2026, 9, 4, 12, 0, tzinfo=timezone.utc) + + +def test_federation_request_data_requires_partner_status_link() -> None: + payload = {k: v for k, v in _VALID_CREATE.items() if k != "partnerStatusLink"} + with pytest.raises(ValidationError): + FederationRequestData.model_validate(payload) -- GitLab From e7a6e7da46ef2b5051db6db8463d3e2e38f4c2b6 Mon Sep 17 00:00:00 2001 From: gpapathan87 Date: Fri, 4 Sep 2026 13:23:02 +0300 Subject: [PATCH 03/11] feat: add post /{federationcontextid}/zones endpoint --- .../gsma/federation_manager/v1_2_0/router.py | 35 +++- .../gsma/federation_manager/v1_2_0/schemas.py | 168 ++++++++++++++++++ src/open_exposure_gateway/main.py | 4 + .../unit/test_federation_manager_endpoints.py | 19 ++ 4 files changed, 221 insertions(+), 5 deletions(-) diff --git a/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/router.py b/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/router.py index 92374fc..022f582 100644 --- a/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/router.py +++ b/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/router.py @@ -2,10 +2,11 @@ Endpoints defined by ``API_definitions/federation-manager.yaml``. -This module currently exposes the ``FederationManagement`` tag only, and every -handler is a surface stub that raises :class:`NotImplementedException` (HTTP 501). -The request/response contract (path, schema, error codes) is live and visible in -the OpenAPI document; the fulfilment logic is added in a later step. +This module currently exposes the ``FederationManagement`` tag plus +``zone_subscribe`` from ``AvailabilityZoneInfoSynchronization``, and every handler +is a surface stub that raises :class:`NotImplementedException` (HTTP 501). The +request/response contract (path, schema, error codes) is live and visible in the +OpenAPI document; the fulfilment logic is added in a later step. """ from typing import Any @@ -20,13 +21,17 @@ from open_exposure_gateway.api.gsma.federation_manager.v1_2_0.schemas import ( FederationRequestData, FederationResponseData, ProblemDetails, + ZoneRegistrationRequestData, + ZoneRegistrationResponseData, ) from open_exposure_gateway.core.exceptions import NotImplementedException # GSMA OPG serves the Federation Management API at {apiRoot}/operatorplatform/federation/v1. BASE_PATH = "/operatorplatform/federation/v1" -router = APIRouter(prefix=BASE_PATH, tags=["Federation Manager"]) +# Tags are set per route (not on the router) so each endpoint carries only its own +# federation-manager.yaml tag. +router = APIRouter(prefix=BASE_PATH) # Every Federation Manager error response is an RFC 7807 ProblemDetails (federation-manager.yaml). _ERROR_RESPONSES: dict[int | str, dict[str, Any]] = { @@ -51,6 +56,7 @@ _NOT_IMPLEMENTED = "Federation Manager is not implemented in this release" @router.post( "/partner", + tags=["Federation Manager"], summary="Create a one-direction federation with a partner operator platform", operation_id="create_federation", response_model=FederationResponseData, @@ -63,6 +69,7 @@ async def create_federation(request: FederationRequestData) -> Any: @router.get( "/{federationContextId}/partner", + tags=["Federation Manager"], summary="Retrieve details about the federation context with the partner OP", operation_id="get_federation_details", response_model=FederationDetails, @@ -75,6 +82,7 @@ async def get_federation_details(federationContextId: FederationContextId) -> An @router.patch( "/{federationContextId}/partner", + tags=["Federation Manager"], summary="Update the parameters associated with an existing federation", operation_id="update_federation", response_model=FederationDetails, @@ -89,6 +97,7 @@ async def update_federation( @router.delete( "/{federationContextId}/partner", + tags=["Federation Manager"], summary="Remove an existing federation with the partner OP", operation_id="delete_federation_details", status_code=200, @@ -100,6 +109,7 @@ async def delete_federation_details(federationContextId: FederationContextId) -> @router.get( "/fed-context-id", + tags=["Federation Manager"], summary="Retrieve the existing federationContextId with the partner operator platform", operation_id="get_federation_context_id", response_model=FederationContextIdResponse, @@ -108,3 +118,18 @@ async def delete_federation_details(federationContextId: FederationContextId) -> ) async def get_federation_context_id() -> Any: raise NotImplementedException(message=_NOT_IMPLEMENTED) + + +@router.post( + "/{federationContextId}/zones", + tags=["Availability Zone Info Synchronization"], + summary="Subscribe to partner OP availability zones and reserve zone resources", + operation_id="zone_subscribe", + response_model=ZoneRegistrationResponseData, + response_model_exclude_none=True, + responses=_responses(400, 401, 404, 409, 422, 500, 501, 503, 520), +) +async def zone_subscribe( + federationContextId: FederationContextId, request: ZoneRegistrationRequestData +) -> Any: + raise NotImplementedException(message=_NOT_IMPLEMENTED) diff --git a/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/schemas.py b/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/schemas.py index dec8a4c..43cfb61 100644 --- a/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/schemas.py +++ b/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/schemas.py @@ -223,3 +223,171 @@ class FederationPatchRequest(BaseModel): removeMobileNetworkIds: Optional[MobileNetworkIds] = None addFixedNetworkIds: Optional[FixedNetworkIds] = None removeFixedNetworkIds: Optional[FixedNetworkIds] = None + + +# --- AvailabilityZoneInfoSynchronization -------------------------------------- +# +# Schemas for ``POST /{federationContextId}/zones`` (``zone_subscribe``): the +# Originating OP subscribes to a set of the partner OP's availability zones and +# the partner OP reserves compute/network resources for them. + +FlavourId = str +Vcpu = Annotated[str, StringConstraints(pattern=r"^\d+((\.\d{1,3})|(m))?$")] +"""vCPU count in whole, decimal (up to millivcpu) or millivcpu (``500m``) form.""" + + +class ComputeCpuArchType(StrEnum): + """CPU ISA as used inside ``ComputeResourceInfo`` (narrower than ``CpuArchType``).""" + + ISA_X86_64 = "ISA_X86_64" + ISA_ARM_64 = "ISA_ARM_64" + + +class CpuArchType(StrEnum): + """CPU ISA as used inside ``Flavour``.""" + + ISA_X86 = "ISA_X86" + ISA_X86_64 = "ISA_X86_64" + ISA_ARM_64 = "ISA_ARM_64" + + +class GpuVendorType(StrEnum): + NVIDIA = "GPU_PROVIDER_NVIDIA" + AMD = "GPU_PROVIDER_AMD" + + +class HugePageSize(StrEnum): + SIZE_2MB = "2MB" + SIZE_4MB = "4MB" + SIZE_1GB = "1GB" + + +class OsArchitecture(StrEnum): + X86_64 = "x86_64" + X86 = "x86" + + +class OsDistribution(StrEnum): + RHEL = "RHEL" + UBUNTU = "UBUNTU" + COREOS = "COREOS" + FEDORA = "FEDORA" + WINDOWS = "WINDOWS" + OTHER = "OTHER" + + +class OsVersion(StrEnum): + UBUNTU_2204_LTS = "OS_VERSION_UBUNTU_2204_LTS" + RHEL_8 = "OS_VERSION_RHEL_8" + RHEL_7 = "OS_VERSION_RHEL_7" + DEBIAN_11 = "OS_VERSION_DEBIAN_11" + COREOS_STABLE = "OS_VERSION_COREOS_STABLE" + MS_WINDOWS_2012_R2 = "OS_MS_WINDOWS_2012_R2" + OTHER = "OTHER" + + +class OsLicense(StrEnum): + FREE = "OS_LICENSE_TYPE_FREE" + ON_DEMAND = "OS_LICENSE_TYPE_ON_DEMAND" + NOT_SPECIFIED = "NOT_SPECIFIED" + + +class GpuInfo(BaseModel): + gpuVendorType: GpuVendorType + gpuModeName: str + gpuMemory: int + numGPU: int + + +class HugePage(BaseModel): + pageSize: HugePageSize + number: int + + +class OSType(BaseModel): + architecture: OsArchitecture + distribution: OsDistribution + version: OsVersion + license: OsLicense + + +class ComputeResourceInfo(BaseModel): + cpuArchType: ComputeCpuArchType + numCPU: Vcpu + memory: int + diskStorage: Optional[int] = None + gpu: Optional[list[GpuInfo]] = None + vpu: Optional[int] = None + fpga: Optional[int] = None + hugepages: Optional[list[HugePage]] = None + cpuExclusivity: Optional[bool] = None + + +class Flavour(BaseModel): + flavourId: FlavourId + cpuArchType: CpuArchType + supportedOSTypes: Annotated[list[OSType], Field(min_length=1)] + numCPU: int + memorySize: int + storageSize: int + gpu: Optional[list[GpuInfo]] = None + fpga: Optional[int] = None + vpu: Optional[int] = None + hugepages: Optional[list[HugePage]] = None + cpuExclusivity: Optional[bool] = None + + +class ZoneNetworkResources(BaseModel): + """The spec's ``ZoneRegisteredData_networkResources``.""" + + egressBandWidth: int + dedicatedNIC: int + supportSriov: bool + supportDPDK: bool + + +class LatencyRange(BaseModel): + minLatency: Optional[Annotated[int, Field(ge=1)]] = None + maxLatency: Optional[int] = None + + +class JitterRange(BaseModel): + minJitter: Optional[Annotated[int, Field(ge=1)]] = None + maxJitter: Optional[int] = None + + +class ThroughputRange(BaseModel): + minThroughput: Optional[Annotated[int, Field(ge=1)]] = None + maxThroughput: Optional[int] = None + + +class ZoneServiceLevelObjectives(BaseModel): + """The spec's ``ZoneRegisteredData_zoneServiceLevelObjsInfo``.""" + + latencyRanges: LatencyRange + jitterRanges: JitterRange + throughputRanges: ThroughputRange + + +class ZoneRegisteredData(BaseModel): + zoneId: ZoneIdentifier + reservedComputeResources: Annotated[list[ComputeResourceInfo], Field(min_length=1)] + computeResourceQuotaLimits: Annotated[list[ComputeResourceInfo], Field(min_length=1)] + flavoursSupported: Annotated[list[Flavour], Field(min_length=1)] + networkResources: Optional[ZoneNetworkResources] = None + zoneServiceLevelObjsInfo: Optional[ZoneServiceLevelObjectives] = None + + +class ZoneRegistrationRequestData(BaseModel): + """Body of ``POST /{federationContextId}/zones``.""" + + model_config = ConfigDict(extra="forbid") + + acceptedAvailabilityZones: Annotated[list[ZoneIdentifier], Field(min_length=1)] + availZoneNotifLink: Uri + + +class ZoneRegistrationResponseData(BaseModel): + """``200`` body of ``POST /{federationContextId}/zones``.""" + + acceptedZoneResourceInfo: Annotated[list[ZoneRegisteredData], Field(min_length=1)] diff --git a/src/open_exposure_gateway/main.py b/src/open_exposure_gateway/main.py index fb375eb..aefd0b2 100644 --- a/src/open_exposure_gateway/main.py +++ b/src/open_exposure_gateway/main.py @@ -166,6 +166,10 @@ openapi_tags = [ "name": "Federation Manager", "description": "GSMA OPG Federation Management (EWBI) -- partner federation lifecycle", }, + { + "name": "Availability Zone Info Synchronization", + "description": "GSMA OPG availability-zone subscription and resource reservation", + }, { "name": "Platform", "description": "Platform-specific endpoints (health, readiness probes)", diff --git a/tests/unit/test_federation_manager_endpoints.py b/tests/unit/test_federation_manager_endpoints.py index 900b427..3d757e7 100644 --- a/tests/unit/test_federation_manager_endpoints.py +++ b/tests/unit/test_federation_manager_endpoints.py @@ -14,6 +14,7 @@ from pydantic import ValidationError from open_exposure_gateway.api.gsma.federation_manager.v1_2_0.router import BASE_PATH from open_exposure_gateway.api.gsma.federation_manager.v1_2_0.schemas import ( FederationRequestData, + ZoneRegistrationRequestData, ) from open_exposure_gateway.main import app @@ -30,6 +31,10 @@ _VALID_PATCH = { "operationType": "ADD_CODES", "modificationDate": "2026-09-04T12:00:00Z", } +_VALID_ZONE_SUBSCRIBE = { + "acceptedAvailabilityZones": ["zone-a"], + "availZoneNotifLink": "https://orig-op.example.com/zone-notif", +} _ENDPOINTS = [ ("post", f"{BASE_PATH}/partner", _VALID_CREATE), @@ -37,6 +42,7 @@ _ENDPOINTS = [ ("patch", f"{BASE_PATH}/{_CTX}/partner", _VALID_PATCH), ("delete", f"{BASE_PATH}/{_CTX}/partner", None), ("get", f"{BASE_PATH}/fed-context-id", None), + ("post", f"{BASE_PATH}/{_CTX}/zones", _VALID_ZONE_SUBSCRIBE), ] _OPERATION_IDS = { @@ -45,6 +51,7 @@ _OPERATION_IDS = { "update_federation", "delete_federation_details", "get_federation_context_id", + "zone_subscribe", } @@ -75,3 +82,15 @@ def test_federation_request_data_requires_partner_status_link() -> None: payload = {k: v for k, v in _VALID_CREATE.items() if k != "partnerStatusLink"} with pytest.raises(ValidationError): FederationRequestData.model_validate(payload) + + +def test_zone_registration_request_data_round_trips() -> None: + model = ZoneRegistrationRequestData.model_validate(_VALID_ZONE_SUBSCRIBE) + assert model.acceptedAvailabilityZones == ["zone-a"] + + +def test_zone_registration_request_data_rejects_empty_zone_list() -> None: + with pytest.raises(ValidationError): + ZoneRegistrationRequestData.model_validate( + {"acceptedAvailabilityZones": [], "availZoneNotifLink": "https://x.example.com"} + ) -- GitLab From 5fb9ccb0cb6f0804f02a9d9b60b660e8614573bd Mon Sep 17 00:00:00 2001 From: gpapathan87 Date: Mon, 7 Sep 2026 13:25:26 +0300 Subject: [PATCH 04/11] feat: add stateless nats-based FM proxy --- src/open_exposure_gateway/core/config.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/open_exposure_gateway/core/config.py b/src/open_exposure_gateway/core/config.py index e898f9c..f1ef996 100644 --- a/src/open_exposure_gateway/core/config.py +++ b/src/open_exposure_gateway/core/config.py @@ -69,6 +69,11 @@ class LocationRetrievalSettings(BaseModel): return self.service_specification_id == DEFAULT_LOCATION_RETRIEVAL_SERVICE_SPECIFICATION_ID +class FmSettings(BaseModel): + request_subject: str = "fm.federation.create" + request_timeout_seconds: float = 10.0 + + class Settings(BaseSettings): model_config = SettingsConfigDict( env_file=".env", @@ -91,6 +96,7 @@ class Settings(BaseSettings): callback_settings: CallbackSettings = CallbackSettings() qod_settings: QodSettings = QodSettings() location_retrieval_settings: LocationRetrievalSettings = LocationRetrievalSettings() + fm_settings: FmSettings = FmSettings() @lru_cache -- GitLab From bce9c94e625403aefa4f2b11a8e1d6a90d555a0e Mon Sep 17 00:00:00 2001 From: gpapathan87 Date: Mon, 14 Sep 2026 10:08:25 +0300 Subject: [PATCH 05/11] fix: remove dead code-replace nats config with http --- src/open_exposure_gateway/core/config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/open_exposure_gateway/core/config.py b/src/open_exposure_gateway/core/config.py index f1ef996..9152f61 100644 --- a/src/open_exposure_gateway/core/config.py +++ b/src/open_exposure_gateway/core/config.py @@ -70,8 +70,8 @@ class LocationRetrievalSettings(BaseModel): class FmSettings(BaseModel): - request_subject: str = "fm.federation.create" - request_timeout_seconds: float = 10.0 + base_url: HttpUrl = HttpUrl("http://localhost:8082") + timeout: float = 10.0 class Settings(BaseSettings): -- GitLab From 15d0588095422da16f111daf9ad53a1bc1c3e4d7 Mon Sep 17 00:00:00 2001 From: gpapathan87 Date: Mon, 14 Sep 2026 10:12:30 +0300 Subject: [PATCH 06/11] remove patch endpoint --- .../gsma/federation_manager/v1_2_0/router.py | 16 --------- .../gsma/federation_manager/v1_2_0/schemas.py | 33 ++----------------- .../unit/test_federation_manager_endpoints.py | 7 ---- 3 files changed, 2 insertions(+), 54 deletions(-) diff --git a/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/router.py b/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/router.py index 022f582..c7f6aa3 100644 --- a/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/router.py +++ b/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/router.py @@ -17,7 +17,6 @@ from open_exposure_gateway.api.gsma.federation_manager.v1_2_0.schemas import ( FederationContextId, FederationContextIdResponse, FederationDetails, - FederationPatchRequest, FederationRequestData, FederationResponseData, ProblemDetails, @@ -80,21 +79,6 @@ async def get_federation_details(federationContextId: FederationContextId) -> An raise NotImplementedException(message=_NOT_IMPLEMENTED) -@router.patch( - "/{federationContextId}/partner", - tags=["Federation Manager"], - summary="Update the parameters associated with an existing federation", - operation_id="update_federation", - response_model=FederationDetails, - response_model_exclude_none=True, - responses=_responses(400, 401, 404, 409, 422, 500, 501, 503, 520), -) -async def update_federation( - federationContextId: FederationContextId, request: FederationPatchRequest -) -> Any: - raise NotImplementedException(message=_NOT_IMPLEMENTED) - - @router.delete( "/{federationContextId}/partner", tags=["Federation Manager"], diff --git a/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/schemas.py b/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/schemas.py index 43cfb61..70f8dab 100644 --- a/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/schemas.py +++ b/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/schemas.py @@ -7,9 +7,8 @@ and LCM) are added as they are implemented. Schema names follow the OpenAPI ``operationId`` intent rather than the generated ``inline_response_*`` / ``*_body`` names: ``FederationDetails`` is the spec's -``inline_response_200_1``, ``FederationContextIdResponse`` is -``inline_response_200_2`` and ``FederationPatchRequest`` is -``federationContextId_partner_body``. +``inline_response_200_1`` and ``FederationContextIdResponse`` is +``inline_response_200_2``. """ from __future__ import annotations @@ -86,17 +85,6 @@ class PlatformCapability(StrEnum): RESOURCE_MONITOR = "resourceMonitor" -class NetworkCodeObjectType(StrEnum): - MOBILE_NETWORK_CODES = "MOBILE_NETWORK_CODES" - FIXED_NETWORK_CODES = "FIXED_NETWORK_CODES" - - -class NetworkCodeOperationType(StrEnum): - ADD_CODES = "ADD_CODES" - REMOVE_CODES = "REMOVE_CODES" - UPDATE_CODES = "UPDATE_CODES" - - # --- Object schemas -------------------------------------------------------------- @@ -208,23 +196,6 @@ class FederationContextIdResponse(BaseModel): FederationContextId: FederationContextId -class FederationPatchRequest(BaseModel): - """Body of ``PATCH /{federationContextId}/partner``. - - The spec's ``federationContextId_partner_body``. - """ - - model_config = ConfigDict(extra="forbid") - - objectType: NetworkCodeObjectType - operationType: NetworkCodeOperationType - modificationDate: datetime - addMobileNetworkIds: Optional[MobileNetworkIds] = None - removeMobileNetworkIds: Optional[MobileNetworkIds] = None - addFixedNetworkIds: Optional[FixedNetworkIds] = None - removeFixedNetworkIds: Optional[FixedNetworkIds] = None - - # --- AvailabilityZoneInfoSynchronization -------------------------------------- # # Schemas for ``POST /{federationContextId}/zones`` (``zone_subscribe``): the diff --git a/tests/unit/test_federation_manager_endpoints.py b/tests/unit/test_federation_manager_endpoints.py index 3d757e7..878568c 100644 --- a/tests/unit/test_federation_manager_endpoints.py +++ b/tests/unit/test_federation_manager_endpoints.py @@ -26,11 +26,6 @@ _VALID_CREATE = { "initialDate": "2026-09-04T12:00:00Z", "partnerStatusLink": "https://orig-op.example.com/status", } -_VALID_PATCH = { - "objectType": "MOBILE_NETWORK_CODES", - "operationType": "ADD_CODES", - "modificationDate": "2026-09-04T12:00:00Z", -} _VALID_ZONE_SUBSCRIBE = { "acceptedAvailabilityZones": ["zone-a"], "availZoneNotifLink": "https://orig-op.example.com/zone-notif", @@ -39,7 +34,6 @@ _VALID_ZONE_SUBSCRIBE = { _ENDPOINTS = [ ("post", f"{BASE_PATH}/partner", _VALID_CREATE), ("get", f"{BASE_PATH}/{_CTX}/partner", None), - ("patch", f"{BASE_PATH}/{_CTX}/partner", _VALID_PATCH), ("delete", f"{BASE_PATH}/{_CTX}/partner", None), ("get", f"{BASE_PATH}/fed-context-id", None), ("post", f"{BASE_PATH}/{_CTX}/zones", _VALID_ZONE_SUBSCRIBE), @@ -48,7 +42,6 @@ _ENDPOINTS = [ _OPERATION_IDS = { "create_federation", "get_federation_details", - "update_federation", "delete_federation_details", "get_federation_context_id", "zone_subscribe", -- GitLab From ba260cc477fc9b66961071ba06f019bca420eb5e Mon Sep 17 00:00:00 2001 From: gpapathan87 Date: Mon, 14 Sep 2026 10:15:16 +0300 Subject: [PATCH 07/11] feat: add get_zone_data and zone_unsubscribe stubs --- .../gsma/federation_manager/v1_2_0/router.py | 42 +++++++++++++++++-- .../unit/test_federation_manager_endpoints.py | 5 +++ 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/router.py b/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/router.py index c7f6aa3..893f747 100644 --- a/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/router.py +++ b/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/router.py @@ -3,10 +3,11 @@ Endpoints defined by ``API_definitions/federation-manager.yaml``. This module currently exposes the ``FederationManagement`` tag plus -``zone_subscribe`` from ``AvailabilityZoneInfoSynchronization``, and every handler -is a surface stub that raises :class:`NotImplementedException` (HTTP 501). The -request/response contract (path, schema, error codes) is live and visible in the -OpenAPI document; the fulfilment logic is added in a later step. +``zone_subscribe``, ``get_zone_data`` and ``zone_unsubscribe`` from +``AvailabilityZoneInfoSynchronization``, and every handler is a surface stub that +raises :class:`NotImplementedException` (HTTP 501). The request/response contract +(path, schema, error codes) is live and visible in the OpenAPI document; the +fulfilment logic is added in a later step. """ from typing import Any @@ -20,6 +21,8 @@ from open_exposure_gateway.api.gsma.federation_manager.v1_2_0.schemas import ( FederationRequestData, FederationResponseData, ProblemDetails, + ZoneIdentifier, + ZoneRegisteredData, ZoneRegistrationRequestData, ZoneRegistrationResponseData, ) @@ -117,3 +120,34 @@ async def zone_subscribe( federationContextId: FederationContextId, request: ZoneRegistrationRequestData ) -> Any: raise NotImplementedException(message=_NOT_IMPLEMENTED) + + +@router.get( + "/{federationContextId}/zones/{zoneId}", + tags=["Availability Zone Info Synchronization"], + summary=( + "Retrieves details about the computation and network resources that partner " + "OP has reserved for this zone" + ), + operation_id="get_zone_data", + response_model=ZoneRegisteredData, + response_model_exclude_none=True, + responses=_responses(400, 401, 404, 409, 422, 500, 501, 503, 520), +) +async def get_zone_data(federationContextId: FederationContextId, zoneId: ZoneIdentifier) -> Any: + raise NotImplementedException(message=_NOT_IMPLEMENTED) + + +@router.delete( + "/{federationContextId}/zones/{zoneId}", + tags=["Availability Zone Info Synchronization"], + summary=( + "Assert usage of a partner OP zone. Originating OP informs partner OP that " + "it will no longer access the specified zone" + ), + operation_id="zone_unsubscribe", + status_code=200, + responses=_responses(400, 401, 404, 409, 422, 500, 501, 503, 520), +) +async def zone_unsubscribe(federationContextId: FederationContextId, zoneId: ZoneIdentifier) -> Any: + raise NotImplementedException(message=_NOT_IMPLEMENTED) diff --git a/tests/unit/test_federation_manager_endpoints.py b/tests/unit/test_federation_manager_endpoints.py index 878568c..58e3a90 100644 --- a/tests/unit/test_federation_manager_endpoints.py +++ b/tests/unit/test_federation_manager_endpoints.py @@ -21,6 +21,7 @@ from open_exposure_gateway.main import app client = TestClient(app, raise_server_exceptions=False) _CTX = "fed-ctx-1" +_ZONE = "zone-a" _VALID_CREATE = { "origOPFederationId": "orig-op-1", "initialDate": "2026-09-04T12:00:00Z", @@ -37,6 +38,8 @@ _ENDPOINTS = [ ("delete", f"{BASE_PATH}/{_CTX}/partner", None), ("get", f"{BASE_PATH}/fed-context-id", None), ("post", f"{BASE_PATH}/{_CTX}/zones", _VALID_ZONE_SUBSCRIBE), + ("get", f"{BASE_PATH}/{_CTX}/zones/{_ZONE}", None), + ("delete", f"{BASE_PATH}/{_CTX}/zones/{_ZONE}", None), ] _OPERATION_IDS = { @@ -45,6 +48,8 @@ _OPERATION_IDS = { "delete_federation_details", "get_federation_context_id", "zone_subscribe", + "get_zone_data", + "zone_unsubscribe", } -- GitLab From 89a0e9cc66744737c02fbbd17f393108fc6bf11e Mon Sep 17 00:00:00 2001 From: gpapathan87 Date: Mon, 14 Sep 2026 10:21:26 +0300 Subject: [PATCH 08/11] feat: add FmCLient --- .../adapters/http/fm_client.py | 64 +++++++++ tests/unit/test_fm_client.py | 121 ++++++++++++++++++ 2 files changed, 185 insertions(+) create mode 100644 src/open_exposure_gateway/adapters/http/fm_client.py create mode 100644 tests/unit/test_fm_client.py diff --git a/src/open_exposure_gateway/adapters/http/fm_client.py b/src/open_exposure_gateway/adapters/http/fm_client.py new file mode 100644 index 0000000..7db5bb2 --- /dev/null +++ b/src/open_exposure_gateway/adapters/http/fm_client.py @@ -0,0 +1,64 @@ +import httpx +import structlog + +from open_exposure_gateway.core.config import get_settings + +logger = structlog.get_logger(__name__) + +# fm/requirements-and-design.md §L.3b says FM exposes "matching internal endpoints" +# under /internal/federation/ without naming them per operation. Mirroring the +# operator-facing suffix 1:1 is the reading agreed on until FM's side is built and +# confirms the actual paths. +_INTERNAL_PREFIX = "/internal/federation" + + +class FmUnavailableError(Exception): + """FM did not answer the internal call (connection failure or timeout).""" + + +class FmClient: + def __init__(self) -> None: + settings = get_settings() + self.base_url = str(settings.fm_settings.base_url).rstrip("/") + self.timeout = settings.fm_settings.timeout + + async def relay( + self, + method: str, + path: str, + content: bytes | None, + content_type: str | None, + x_correlator: str | None, + ) -> httpx.Response: + """Forward one federation-lifecycle operation to FM, unaltered. + + `path` is the operator-facing suffix after + ``/operatorplatform/federation/v1`` (e.g. ``/partner``, + ``/{federationContextId}/zones/{zoneId}``). The request body is forwarded + as the raw bytes the caller sent -- no parsing, no reshaping -- and the + caller relays the returned response body and status the same way. + """ + url = f"{self.base_url}{_INTERNAL_PREFIX}{path}" + headers = {"X-Correlator": x_correlator} if x_correlator else None + if content_type: + headers = {**(headers or {}), "Content-Type": content_type} + + log = logger.bind(method=method, url=url, x_correlator=x_correlator) + + try: + async with httpx.AsyncClient(timeout=self.timeout) as client: + return await client.request( + method=method, + url=url, + content=content, + headers=headers, + ) + except httpx.TimeoutException as exc: + log.exception("FM request timed out") + raise FmUnavailableError("FM request timed out") from exc + except httpx.ConnectError as exc: + log.exception("FM connection failed") + raise FmUnavailableError("Could not connect to FM") from exc + except httpx.RequestError as exc: + log.exception("FM request error") + raise FmUnavailableError("FM request failed") from exc diff --git a/tests/unit/test_fm_client.py b/tests/unit/test_fm_client.py new file mode 100644 index 0000000..f404827 --- /dev/null +++ b/tests/unit/test_fm_client.py @@ -0,0 +1,121 @@ +"""FmClient.relay -- byte-for-byte forwarding and the FM-unreachable failure mode. + +FmClient does no parsing or domain mapping, so what's tested here is that the +request/response pass through untouched and that connection failures surface as +FmUnavailableError rather than an OEG CAMARA exception. +""" + +from collections.abc import Callable +from typing import Any + +import httpx +import pytest + +from open_exposure_gateway.adapters.http.fm_client import FmClient, FmUnavailableError + +HttpHandler = Callable[[httpx.Request], httpx.Response] + + +def _client(monkeypatch: pytest.MonkeyPatch, handler: HttpHandler) -> FmClient: + transport = httpx.MockTransport(handler) + + class _PatchedAsyncClient(httpx.AsyncClient): + def __init__(self, *args: Any, **kwargs: Any) -> None: + kwargs["transport"] = transport + super().__init__(*args, **kwargs) + + monkeypatch.setattr(httpx, "AsyncClient", _PatchedAsyncClient) + + client = FmClient.__new__(FmClient) + client.base_url = "http://fm:8082" + client.timeout = 1.0 + return client + + +async def test_relay_forwards_method_url_body_and_correlator( + monkeypatch: pytest.MonkeyPatch, +) -> None: + seen: dict[str, Any] = {} + + def handler(request: httpx.Request) -> httpx.Response: + seen["method"] = request.method + seen["url"] = str(request.url) + seen["content"] = request.content + seen["content_type"] = request.headers.get("content-type") + seen["x_correlator"] = request.headers.get("x-correlator") + return httpx.Response(200, content=b'{"federationContextId": "ctx-1"}') + + client = _client(monkeypatch, handler) + response = await client.relay( + "POST", + "/partner", + content=b'{"origOPFederationId": "op-1"}', + content_type="application/json", + x_correlator="corr-1", + ) + + assert seen["method"] == "POST" + assert seen["url"] == "http://fm:8082/internal/federation/partner" + assert seen["content"] == b'{"origOPFederationId": "op-1"}' + assert seen["content_type"] == "application/json" + assert seen["x_correlator"] == "corr-1" + assert response.status_code == 200 + assert response.content == b'{"federationContextId": "ctx-1"}' + + +async def test_relay_returns_fm_error_response_untouched(monkeypatch: pytest.MonkeyPatch) -> None: + client = _client( + monkeypatch, + lambda request: httpx.Response( + 409, + content=b'{"status": 409, "detail": "federation already exists"}', + headers={"content-type": "application/problem+json"}, + ), + ) + + response = await client.relay( + "POST", "/partner", content=b"{}", content_type="application/json", x_correlator=None + ) + + assert response.status_code == 409 + assert response.headers["content-type"] == "application/problem+json" + assert response.content == b'{"status": 409, "detail": "federation already exists"}' + + +async def test_relay_without_correlator_or_content_type_omits_headers( + monkeypatch: pytest.MonkeyPatch, +) -> None: + seen: dict[str, Any] = {} + + def handler(request: httpx.Request) -> httpx.Response: + seen["x_correlator"] = request.headers.get("x-correlator") + return httpx.Response(200) + + client = _client(monkeypatch, handler) + await client.relay("GET", "/fed-context-id", content=None, content_type=None, x_correlator=None) + + assert seen["x_correlator"] is None + + +async def test_relay_timeout_raises_fm_unavailable(monkeypatch: pytest.MonkeyPatch) -> None: + def handler(request: httpx.Request) -> httpx.Response: + raise httpx.ReadTimeout("timed out") + + client = _client(monkeypatch, handler) + + with pytest.raises(FmUnavailableError): + await client.relay( + "GET", "/fed-context-id", content=None, content_type=None, x_correlator=None + ) + + +async def test_relay_connect_error_raises_fm_unavailable(monkeypatch: pytest.MonkeyPatch) -> None: + def handler(request: httpx.Request) -> httpx.Response: + raise httpx.ConnectError("connection refused") + + client = _client(monkeypatch, handler) + + with pytest.raises(FmUnavailableError): + await client.relay( + "GET", "/fed-context-id", content=None, content_type=None, x_correlator=None + ) -- GitLab From 1c2d6fc71a99959cdf6e229f42b9ad3109e18d2b Mon Sep 17 00:00:00 2001 From: gpapathan87 Date: Mon, 14 Sep 2026 10:31:14 +0300 Subject: [PATCH 09/11] feat: wire federation-lifecycle routes to FmClient --- .../gsma/federation_manager/v1_2_0/router.py | 154 +++++++++++----- src/open_exposure_gateway/core/state.py | 2 + src/open_exposure_gateway/dependencies.py | 5 + src/open_exposure_gateway/main.py | 3 + .../unit/test_federation_manager_endpoints.py | 168 ++++++++++++------ 5 files changed, 235 insertions(+), 97 deletions(-) diff --git a/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/router.py b/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/router.py index 893f747..012875f 100644 --- a/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/router.py +++ b/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/router.py @@ -1,32 +1,38 @@ """FastAPI routes for the GSMA Federation Manager API (EWBI OPG v1.2.0). -Endpoints defined by ``API_definitions/federation-manager.yaml``. - -This module currently exposes the ``FederationManagement`` tag plus -``zone_subscribe``, ``get_zone_data`` and ``zone_unsubscribe`` from -``AvailabilityZoneInfoSynchronization``, and every handler is a surface stub that -raises :class:`NotImplementedException` (HTTP 501). The request/response contract -(path, schema, error codes) is live and visible in the OpenAPI document; the -fulfilment logic is added in a later step. +Endpoints defined by ``API_definitions/federation-manager.yaml``. Every handler is a +stateless synchronous relay to FM (ADR-0046, ADR-0048): the raw request body is +forwarded to FM's matching internal endpoint unaltered, and FM's response body and +status are relayed back unaltered. OEG does no request/response parsing or +reshaping on this path -- the Pydantic schemas in ``schemas.py`` are referenced +here only to document the response contract in the OpenAPI document (via +``response_model``); they are not used to build, validate or serialize the actual +request/response bodies at runtime, which would risk silently altering a payload +OEG's hand-maintained models don't fully cover. + +This module exposes the ``FederationManagement`` tag plus ``zone_subscribe``, +``get_zone_data`` and ``zone_unsubscribe`` from +``AvailabilityZoneInfoSynchronization``. ``update_federation`` +(``PATCH /{federationContextId}/partner``) is out of scope. """ -from typing import Any +from typing import Annotated, Any -from fastapi import APIRouter +from fastapi import APIRouter, Depends, Request, Response +from open_exposure_gateway.adapters.http.fm_client import FmClient, FmUnavailableError +from open_exposure_gateway.api.camara.common import XCorrelatorHeader from open_exposure_gateway.api.gsma.federation_manager.v1_2_0.schemas import ( FederationContextId, FederationContextIdResponse, FederationDetails, - FederationRequestData, FederationResponseData, ProblemDetails, ZoneIdentifier, ZoneRegisteredData, - ZoneRegistrationRequestData, ZoneRegistrationResponseData, ) -from open_exposure_gateway.core.exceptions import NotImplementedException +from open_exposure_gateway.dependencies import get_fm_client # GSMA OPG serves the Federation Management API at {apiRoot}/operatorplatform/federation/v1. BASE_PATH = "/operatorplatform/federation/v1" @@ -35,6 +41,8 @@ BASE_PATH = "/operatorplatform/federation/v1" # federation-manager.yaml tag. router = APIRouter(prefix=BASE_PATH) +FmClientDep = Annotated[FmClient, Depends(get_fm_client)] + # Every Federation Manager error response is an RFC 7807 ProblemDetails (federation-manager.yaml). _ERROR_RESPONSES: dict[int | str, dict[str, Any]] = { 400: {"model": ProblemDetails, "description": "Bad request"}, @@ -43,7 +51,6 @@ _ERROR_RESPONSES: dict[int | str, dict[str, Any]] = { 409: {"model": ProblemDetails, "description": "Conflict"}, 422: {"model": ProblemDetails, "description": "Unprocessable entity"}, 500: {"model": ProblemDetails, "description": "Internal server error"}, - 501: {"model": ProblemDetails, "description": "Not implemented"}, 503: {"model": ProblemDetails, "description": "Service unavailable"}, 520: {"model": ProblemDetails, "description": "Unknown error"}, } @@ -53,7 +60,40 @@ def _responses(*codes: int) -> dict[int | str, dict[str, Any]]: return {code: _ERROR_RESPONSES[code] for code in codes} -_NOT_IMPLEMENTED = "Federation Manager is not implemented in this release" +async def _relay( + fm_client: FmClient, + method: str, + path: str, + request: Request, + x_correlator: str | None, +) -> Response: + """Forward one federation-lifecycle operation to FM and relay its answer unaltered. + + ``path`` is the operator-facing suffix after ``BASE_PATH`` (e.g. ``/partner``), + which ``FmClient`` maps onto FM's internal endpoint. + """ + body = await request.body() + try: + fm_response = await fm_client.relay( + method, + path, + content=body or None, + content_type=request.headers.get("content-type"), + x_correlator=x_correlator, + ) + except FmUnavailableError as exc: + problem = ProblemDetails(title="Federation Manager unavailable", detail=str(exc)) + return Response( + content=problem.model_dump_json(exclude_none=True), + status_code=503, + media_type="application/problem+json", + ) + + return Response( + content=fm_response.content, + status_code=fm_response.status_code, + media_type=fm_response.headers.get("content-type"), + ) @router.post( @@ -62,11 +102,12 @@ _NOT_IMPLEMENTED = "Federation Manager is not implemented in this release" summary="Create a one-direction federation with a partner operator platform", operation_id="create_federation", response_model=FederationResponseData, - response_model_exclude_none=True, - responses=_responses(400, 401, 404, 409, 422, 500, 501, 503, 520), + responses=_responses(400, 401, 404, 409, 422, 500, 503, 520), ) -async def create_federation(request: FederationRequestData) -> Any: - raise NotImplementedException(message=_NOT_IMPLEMENTED) +async def create_federation( + request: Request, fm_client: FmClientDep, x_correlator: XCorrelatorHeader = None +) -> Response: + return await _relay(fm_client, "POST", "/partner", request, x_correlator) @router.get( @@ -75,11 +116,15 @@ async def create_federation(request: FederationRequestData) -> Any: summary="Retrieve details about the federation context with the partner OP", operation_id="get_federation_details", response_model=FederationDetails, - response_model_exclude_none=True, - responses=_responses(400, 401, 404, 409, 422, 500, 501, 503, 520), + responses=_responses(400, 401, 404, 409, 422, 500, 503, 520), ) -async def get_federation_details(federationContextId: FederationContextId) -> Any: - raise NotImplementedException(message=_NOT_IMPLEMENTED) +async def get_federation_details( + federationContextId: FederationContextId, + request: Request, + fm_client: FmClientDep, + x_correlator: XCorrelatorHeader = None, +) -> Response: + return await _relay(fm_client, "GET", f"/{federationContextId}/partner", request, x_correlator) @router.delete( @@ -88,10 +133,17 @@ async def get_federation_details(federationContextId: FederationContextId) -> An summary="Remove an existing federation with the partner OP", operation_id="delete_federation_details", status_code=200, - responses=_responses(400, 401, 404, 409, 422, 500, 501, 503, 520), + responses=_responses(400, 401, 404, 409, 422, 500, 503, 520), ) -async def delete_federation_details(federationContextId: FederationContextId) -> Any: - raise NotImplementedException(message=_NOT_IMPLEMENTED) +async def delete_federation_details( + federationContextId: FederationContextId, + request: Request, + fm_client: FmClientDep, + x_correlator: XCorrelatorHeader = None, +) -> Response: + return await _relay( + fm_client, "DELETE", f"/{federationContextId}/partner", request, x_correlator + ) @router.get( @@ -100,11 +152,12 @@ async def delete_federation_details(federationContextId: FederationContextId) -> summary="Retrieve the existing federationContextId with the partner operator platform", operation_id="get_federation_context_id", response_model=FederationContextIdResponse, - response_model_exclude_none=True, - responses=_responses(400, 401, 404, 409, 422, 500, 501, 503, 520), + responses=_responses(400, 401, 404, 409, 422, 500, 503, 520), ) -async def get_federation_context_id() -> Any: - raise NotImplementedException(message=_NOT_IMPLEMENTED) +async def get_federation_context_id( + request: Request, fm_client: FmClientDep, x_correlator: XCorrelatorHeader = None +) -> Response: + return await _relay(fm_client, "GET", "/fed-context-id", request, x_correlator) @router.post( @@ -113,13 +166,15 @@ async def get_federation_context_id() -> Any: summary="Subscribe to partner OP availability zones and reserve zone resources", operation_id="zone_subscribe", response_model=ZoneRegistrationResponseData, - response_model_exclude_none=True, - responses=_responses(400, 401, 404, 409, 422, 500, 501, 503, 520), + responses=_responses(400, 401, 404, 409, 422, 500, 503, 520), ) async def zone_subscribe( - federationContextId: FederationContextId, request: ZoneRegistrationRequestData -) -> Any: - raise NotImplementedException(message=_NOT_IMPLEMENTED) + federationContextId: FederationContextId, + request: Request, + fm_client: FmClientDep, + x_correlator: XCorrelatorHeader = None, +) -> Response: + return await _relay(fm_client, "POST", f"/{federationContextId}/zones", request, x_correlator) @router.get( @@ -131,11 +186,18 @@ async def zone_subscribe( ), operation_id="get_zone_data", response_model=ZoneRegisteredData, - response_model_exclude_none=True, - responses=_responses(400, 401, 404, 409, 422, 500, 501, 503, 520), + responses=_responses(400, 401, 404, 409, 422, 500, 503, 520), ) -async def get_zone_data(federationContextId: FederationContextId, zoneId: ZoneIdentifier) -> Any: - raise NotImplementedException(message=_NOT_IMPLEMENTED) +async def get_zone_data( + federationContextId: FederationContextId, + zoneId: ZoneIdentifier, + request: Request, + fm_client: FmClientDep, + x_correlator: XCorrelatorHeader = None, +) -> Response: + return await _relay( + fm_client, "GET", f"/{federationContextId}/zones/{zoneId}", request, x_correlator + ) @router.delete( @@ -147,7 +209,15 @@ async def get_zone_data(federationContextId: FederationContextId, zoneId: ZoneId ), operation_id="zone_unsubscribe", status_code=200, - responses=_responses(400, 401, 404, 409, 422, 500, 501, 503, 520), + responses=_responses(400, 401, 404, 409, 422, 500, 503, 520), ) -async def zone_unsubscribe(federationContextId: FederationContextId, zoneId: ZoneIdentifier) -> Any: - raise NotImplementedException(message=_NOT_IMPLEMENTED) +async def zone_unsubscribe( + federationContextId: FederationContextId, + zoneId: ZoneIdentifier, + request: Request, + fm_client: FmClientDep, + x_correlator: XCorrelatorHeader = None, +) -> Response: + return await _relay( + fm_client, "DELETE", f"/{federationContextId}/zones/{zoneId}", request, x_correlator + ) diff --git a/src/open_exposure_gateway/core/state.py b/src/open_exposure_gateway/core/state.py index 8af4926..919e777 100644 --- a/src/open_exposure_gateway/core/state.py +++ b/src/open_exposure_gateway/core/state.py @@ -2,6 +2,7 @@ from typing import Protocol from sqlalchemy.ext.asyncio import AsyncEngine, AsyncSession, async_sessionmaker +from open_exposure_gateway.adapters.http.fm_client import FmClient from open_exposure_gateway.ports.databus_port import DataBusPort from open_exposure_gateway.ports.qod_callback_port import QodCallbackDeliveryPort from open_exposure_gateway.ports.srm_port import SRMClientPort @@ -13,3 +14,4 @@ class AppState(Protocol): db_engine: AsyncEngine session_maker: async_sessionmaker[AsyncSession] qod_callback_client: QodCallbackDeliveryPort + fm_client: FmClient diff --git a/src/open_exposure_gateway/dependencies.py b/src/open_exposure_gateway/dependencies.py index afe4e08..97fae3b 100644 --- a/src/open_exposure_gateway/dependencies.py +++ b/src/open_exposure_gateway/dependencies.py @@ -24,6 +24,7 @@ from open_exposure_gateway.adapters.database.repos.operations import ( from open_exposure_gateway.adapters.database.repos.qod_sessions import ( SqlQodSessionRepository, ) +from open_exposure_gateway.adapters.http.fm_client import FmClient from open_exposure_gateway.api.camara.common import XCorrelatorHeader from open_exposure_gateway.api.error_handlers import x_correlator_header from open_exposure_gateway.application.services.edge_application_management_service import ( @@ -140,6 +141,10 @@ def get_qod_callback_client(request: Request) -> QodCallbackDeliveryPort: return get_app_state(request=request).qod_callback_client +def get_fm_client(request: Request) -> FmClient: + return get_app_state(request=request).fm_client + + def get_edge_app_service( srm: SRMClientPort = Depends(get_client), publisher: DataBusPort = Depends(get_publisher), diff --git a/src/open_exposure_gateway/main.py b/src/open_exposure_gateway/main.py index aefd0b2..1348433 100644 --- a/src/open_exposure_gateway/main.py +++ b/src/open_exposure_gateway/main.py @@ -29,6 +29,7 @@ from open_exposure_gateway.adapters.databus.nats_adapter import ( NatsOperationStatusConsumer, ) from open_exposure_gateway.adapters.http.callback_client import HttpCallbackClient +from open_exposure_gateway.adapters.http.fm_client import FmClient from open_exposure_gateway.adapters.http.qod_callback_client import HttpQodCallbackClient from open_exposure_gateway.adapters.http.srm_client import SRMClient from open_exposure_gateway.api.camara.edge_application_management.vwip.router import ( @@ -239,6 +240,7 @@ async def default_lifespan(app: FastAPI) -> AsyncGenerator[None, None]: raise qod_callback_client = HttpQodCallbackClient() + fm_client = FmClient() try: publisher = NatsMessagePublisher(settings.nats_settings) @@ -278,6 +280,7 @@ async def default_lifespan(app: FastAPI) -> AsyncGenerator[None, None]: app.state.db_engine = db_engine app.state.session_maker = session_maker app.state.qod_callback_client = qod_callback_client + app.state.fm_client = fm_client yield diff --git a/tests/unit/test_federation_manager_endpoints.py b/tests/unit/test_federation_manager_endpoints.py index 58e3a90..8777c1a 100644 --- a/tests/unit/test_federation_manager_endpoints.py +++ b/tests/unit/test_federation_manager_endpoints.py @@ -1,45 +1,80 @@ -"""GSMA Federation Manager -- surface stub. +"""GSMA Federation Manager -- stateless relay to FM (ADR-0046, ADR-0048). -The FederationManagement routes are wired into the app and visible in the OpenAPI -document, but every handler returns HTTP 501 until fulfilment logic is added. +Every route forwards the raw request body to FM's matching internal endpoint and +relays FM's response back unaltered. These tests exercise that relay contract +through a fake FmClient (no real FM, no real network) rather than FmClient's own +transport behaviour, which test_fm_client.py already covers. """ -from datetime import datetime, timezone +from collections.abc import Generator from typing import Any +import httpx import pytest from fastapi.testclient import TestClient -from pydantic import ValidationError +from open_exposure_gateway.adapters.http.fm_client import FmUnavailableError from open_exposure_gateway.api.gsma.federation_manager.v1_2_0.router import BASE_PATH -from open_exposure_gateway.api.gsma.federation_manager.v1_2_0.schemas import ( - FederationRequestData, - ZoneRegistrationRequestData, -) +from open_exposure_gateway.dependencies import get_fm_client from open_exposure_gateway.main import app -client = TestClient(app, raise_server_exceptions=False) - _CTX = "fed-ctx-1" _ZONE = "zone-a" -_VALID_CREATE = { - "origOPFederationId": "orig-op-1", - "initialDate": "2026-09-04T12:00:00Z", - "partnerStatusLink": "https://orig-op.example.com/status", -} -_VALID_ZONE_SUBSCRIBE = { - "acceptedAvailabilityZones": ["zone-a"], - "availZoneNotifLink": "https://orig-op.example.com/zone-notif", -} + + +class _FakeFmClient: + def __init__(self) -> None: + self.calls: list[dict[str, Any]] = [] + self.response = httpx.Response( + 200, + content=b'{"federationContextId": "fed-ctx-1"}', + headers={"content-type": "application/json"}, + ) + self.raise_unavailable = False + + async def relay( + self, + method: str, + path: str, + content: bytes | None, + content_type: str | None, + x_correlator: str | None, + ) -> httpx.Response: + self.calls.append( + { + "method": method, + "path": path, + "content": content, + "content_type": content_type, + "x_correlator": x_correlator, + } + ) + if self.raise_unavailable: + raise FmUnavailableError("FM request timed out") + return self.response + + +@pytest.fixture +def fake_fm_client() -> Generator[_FakeFmClient, None, None]: + fake = _FakeFmClient() + app.dependency_overrides[get_fm_client] = lambda: fake + yield fake + app.dependency_overrides.clear() + + +@pytest.fixture +def client() -> TestClient: + return TestClient(app) + _ENDPOINTS = [ - ("post", f"{BASE_PATH}/partner", _VALID_CREATE), - ("get", f"{BASE_PATH}/{_CTX}/partner", None), - ("delete", f"{BASE_PATH}/{_CTX}/partner", None), - ("get", f"{BASE_PATH}/fed-context-id", None), - ("post", f"{BASE_PATH}/{_CTX}/zones", _VALID_ZONE_SUBSCRIBE), - ("get", f"{BASE_PATH}/{_CTX}/zones/{_ZONE}", None), - ("delete", f"{BASE_PATH}/{_CTX}/zones/{_ZONE}", None), + ("post", f"{BASE_PATH}/partner", "POST", "/partner", b'{"a": 1}'), + ("get", f"{BASE_PATH}/{_CTX}/partner", "GET", f"/{_CTX}/partner", None), + ("delete", f"{BASE_PATH}/{_CTX}/partner", "DELETE", f"/{_CTX}/partner", None), + ("get", f"{BASE_PATH}/fed-context-id", "GET", "/fed-context-id", None), + ("post", f"{BASE_PATH}/{_CTX}/zones", "POST", f"/{_CTX}/zones", b'{"a": 1}'), + ("get", f"{BASE_PATH}/{_CTX}/zones/{_ZONE}", "GET", f"/{_CTX}/zones/{_ZONE}", None), + ("delete", f"{BASE_PATH}/{_CTX}/zones/{_ZONE}", "DELETE", f"/{_CTX}/zones/{_ZONE}", None), ] _OPERATION_IDS = { @@ -53,10 +88,57 @@ _OPERATION_IDS = { } -@pytest.mark.parametrize(("method", "path", "body"), _ENDPOINTS) -def test_endpoint_returns_501(method: str, path: str, body: dict[str, Any] | None) -> None: - response = client.request(method, path, json=body) - assert response.status_code == 501 +@pytest.mark.parametrize(("http_method", "url", "fm_method", "fm_path", "body"), _ENDPOINTS) +def test_endpoint_relays_to_fm_unaltered( + client: TestClient, + fake_fm_client: _FakeFmClient, + http_method: str, + url: str, + fm_method: str, + fm_path: str, + body: bytes | None, +) -> None: + headers = {"x-correlator": "corr-1"} + if body: + headers["content-type"] = "application/json" + response = client.request(http_method, url, content=body, headers=headers) + + assert response.status_code == 200 + assert response.content == b'{"federationContextId": "fed-ctx-1"}' + assert len(fake_fm_client.calls) == 1 + call = fake_fm_client.calls[0] + assert call["method"] == fm_method + assert call["path"] == fm_path + assert call["content"] == body + assert call["x_correlator"] == "corr-1" + + +def test_fm_error_response_is_relayed_unaltered( + client: TestClient, fake_fm_client: _FakeFmClient +) -> None: + fake_fm_client.response = httpx.Response( + 409, + content=b'{"detail": "federation already exists"}', + headers={"content-type": "application/problem+json"}, + ) + + response = client.get(f"{BASE_PATH}/{_CTX}/partner") + + assert response.status_code == 409 + assert response.headers["content-type"] == "application/problem+json" + assert response.content == b'{"detail": "federation already exists"}' + + +def test_fm_unavailable_returns_problem_details_503( + client: TestClient, fake_fm_client: _FakeFmClient +) -> None: + fake_fm_client.raise_unavailable = True + + response = client.get(f"{BASE_PATH}/fed-context-id") + + assert response.status_code == 503 + assert response.headers["content-type"] == "application/problem+json" + assert response.json()["title"] == "Federation Manager unavailable" def test_openapi_exposes_federation_management_operations() -> None: @@ -68,27 +150,3 @@ def test_openapi_exposes_federation_management_operations() -> None: if isinstance(op, dict) and "operationId" in op } assert _OPERATION_IDS <= seen - - -def test_federation_request_data_round_trips() -> None: - model = FederationRequestData.model_validate(_VALID_CREATE) - assert model.origOPFederationId == "orig-op-1" - assert model.initialDate == datetime(2026, 9, 4, 12, 0, tzinfo=timezone.utc) - - -def test_federation_request_data_requires_partner_status_link() -> None: - payload = {k: v for k, v in _VALID_CREATE.items() if k != "partnerStatusLink"} - with pytest.raises(ValidationError): - FederationRequestData.model_validate(payload) - - -def test_zone_registration_request_data_round_trips() -> None: - model = ZoneRegistrationRequestData.model_validate(_VALID_ZONE_SUBSCRIBE) - assert model.acceptedAvailabilityZones == ["zone-a"] - - -def test_zone_registration_request_data_rejects_empty_zone_list() -> None: - with pytest.raises(ValidationError): - ZoneRegistrationRequestData.model_validate( - {"acceptedAvailabilityZones": [], "availZoneNotifLink": "https://x.example.com"} - ) -- GitLab From 84fe03689033a6ce2cd0fe95615a90c6fea8dcff Mon Sep 17 00:00:00 2001 From: gpapathan87 Date: Mon, 14 Sep 2026 10:55:59 +0300 Subject: [PATCH 10/11] feat: validate federation request bodies for shape before forwarding --- .../gsma/federation_manager/v1_2_0/router.py | 103 ++++++++++++++---- .../unit/test_federation_manager_endpoints.py | 86 ++++++++++++++- 2 files changed, 166 insertions(+), 23 deletions(-) diff --git a/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/router.py b/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/router.py index 012875f..2868387 100644 --- a/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/router.py +++ b/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/router.py @@ -3,12 +3,14 @@ Endpoints defined by ``API_definitions/federation-manager.yaml``. Every handler is a stateless synchronous relay to FM (ADR-0046, ADR-0048): the raw request body is forwarded to FM's matching internal endpoint unaltered, and FM's response body and -status are relayed back unaltered. OEG does no request/response parsing or -reshaping on this path -- the Pydantic schemas in ``schemas.py`` are referenced -here only to document the response contract in the OpenAPI document (via -``response_model``); they are not used to build, validate or serialize the actual -request/response bodies at runtime, which would risk silently altering a payload -OEG's hand-maintained models don't fully cover. +status are relayed back unaltered. OEG does not reshape the request on this path -- +the two POST bodies (``FederationRequestData``, ``ZoneRegistrationRequestData``) are +validated for shape before being forwarded, but the *validated* object is only used +as a gate; the original raw bytes are what's actually sent to FM, so a field OEG's +model doesn't happen to cover is still forwarded unchanged rather than dropped. The +remaining schemas in ``schemas.py`` are referenced here only to document the +response contract in the OpenAPI document (via ``response_model``); FM's response is +never parsed against them. This module exposes the ``FederationManagement`` tag plus ``zone_subscribe``, ``get_zone_data`` and ``zone_unsubscribe`` from @@ -16,9 +18,11 @@ This module exposes the ``FederationManagement`` tag plus ``zone_subscribe``, (``PATCH /{federationContextId}/partner``) is out of scope. """ +import json from typing import Annotated, Any from fastapi import APIRouter, Depends, Request, Response +from pydantic import BaseModel, ValidationError from open_exposure_gateway.adapters.http.fm_client import FmClient, FmUnavailableError from open_exposure_gateway.api.camara.common import XCorrelatorHeader @@ -26,10 +30,12 @@ from open_exposure_gateway.api.gsma.federation_manager.v1_2_0.schemas import ( FederationContextId, FederationContextIdResponse, FederationDetails, + FederationRequestData, FederationResponseData, ProblemDetails, ZoneIdentifier, ZoneRegisteredData, + ZoneRegistrationRequestData, ZoneRegistrationResponseData, ) from open_exposure_gateway.dependencies import get_fm_client @@ -51,6 +57,7 @@ _ERROR_RESPONSES: dict[int | str, dict[str, Any]] = { 409: {"model": ProblemDetails, "description": "Conflict"}, 422: {"model": ProblemDetails, "description": "Unprocessable entity"}, 500: {"model": ProblemDetails, "description": "Internal server error"}, + 502: {"model": ProblemDetails, "description": "Bad gateway"}, 503: {"model": ProblemDetails, "description": "Service unavailable"}, 520: {"model": ProblemDetails, "description": "Unknown error"}, } @@ -60,19 +67,62 @@ def _responses(*codes: int) -> dict[int | str, dict[str, Any]]: return {code: _ERROR_RESPONSES[code] for code in codes} +def _problem_response(status_code: int, title: str, detail: str) -> Response: + problem = ProblemDetails(title=title, detail=detail) + return Response( + content=problem.model_dump_json(exclude_none=True), + status_code=status_code, + media_type="application/problem+json", + ) + + +def _is_valid_json(content: bytes) -> bool: + try: + json.loads(content) + except ValueError: + return False + return True + + async def _relay( fm_client: FmClient, method: str, path: str, request: Request, x_correlator: str | None, + request_schema: type[BaseModel] | None = None, ) -> Response: """Forward one federation-lifecycle operation to FM and relay its answer unaltered. ``path`` is the operator-facing suffix after ``BASE_PATH`` (e.g. ``/partner``), - which ``FmClient`` maps onto FM's internal endpoint. + which ``FmClient`` maps onto FM's internal endpoint. A body that isn't even + syntactically JSON can't reach FM meaningfully, so that's rejected here + (ADR-0047: OEG-authored 400); the mirror case on the way back -- FM answering + with a body it labelled JSON that isn't actually parseable -- is ADR-0047's 502. + + When ``request_schema`` is given, the parsed body is also validated against it + as a shape check before being forwarded. The validated object itself is + discarded afterwards -- what's sent to FM is always the original raw bytes, so + this is a gate, not a reshape. """ body = await request.body() + if body: + try: + parsed = json.loads(body) + except ValueError: + return _problem_response( + 400, "Malformed request body", "Request body is not valid JSON" + ) + if request_schema is not None: + try: + request_schema.model_validate(parsed) + except ValidationError as exc: + return _problem_response( + 400, + "Request body does not match the expected schema", + str(exc.errors())[:512], + ) + try: fm_response = await fm_client.relay( method, @@ -82,11 +132,13 @@ async def _relay( x_correlator=x_correlator, ) except FmUnavailableError as exc: - problem = ProblemDetails(title="Federation Manager unavailable", detail=str(exc)) - return Response( - content=problem.model_dump_json(exclude_none=True), - status_code=503, - media_type="application/problem+json", + return _problem_response(503, "Federation Manager unavailable", str(exc)) + + if fm_response.content and not _is_valid_json(fm_response.content): + return _problem_response( + 502, + "Federation Manager returned an unusable response", + "Response body is not valid JSON", ) return Response( @@ -102,12 +154,14 @@ async def _relay( summary="Create a one-direction federation with a partner operator platform", operation_id="create_federation", response_model=FederationResponseData, - responses=_responses(400, 401, 404, 409, 422, 500, 503, 520), + responses=_responses(400, 401, 404, 409, 422, 500, 502, 503, 520), ) async def create_federation( request: Request, fm_client: FmClientDep, x_correlator: XCorrelatorHeader = None ) -> Response: - return await _relay(fm_client, "POST", "/partner", request, x_correlator) + return await _relay( + fm_client, "POST", "/partner", request, x_correlator, request_schema=FederationRequestData + ) @router.get( @@ -116,7 +170,7 @@ async def create_federation( summary="Retrieve details about the federation context with the partner OP", operation_id="get_federation_details", response_model=FederationDetails, - responses=_responses(400, 401, 404, 409, 422, 500, 503, 520), + responses=_responses(400, 401, 404, 409, 422, 500, 502, 503, 520), ) async def get_federation_details( federationContextId: FederationContextId, @@ -133,7 +187,7 @@ async def get_federation_details( summary="Remove an existing federation with the partner OP", operation_id="delete_federation_details", status_code=200, - responses=_responses(400, 401, 404, 409, 422, 500, 503, 520), + responses=_responses(400, 401, 404, 409, 422, 500, 502, 503, 520), ) async def delete_federation_details( federationContextId: FederationContextId, @@ -152,7 +206,7 @@ async def delete_federation_details( summary="Retrieve the existing federationContextId with the partner operator platform", operation_id="get_federation_context_id", response_model=FederationContextIdResponse, - responses=_responses(400, 401, 404, 409, 422, 500, 503, 520), + responses=_responses(400, 401, 404, 409, 422, 500, 502, 503, 520), ) async def get_federation_context_id( request: Request, fm_client: FmClientDep, x_correlator: XCorrelatorHeader = None @@ -166,7 +220,7 @@ async def get_federation_context_id( summary="Subscribe to partner OP availability zones and reserve zone resources", operation_id="zone_subscribe", response_model=ZoneRegistrationResponseData, - responses=_responses(400, 401, 404, 409, 422, 500, 503, 520), + responses=_responses(400, 401, 404, 409, 422, 500, 502, 503, 520), ) async def zone_subscribe( federationContextId: FederationContextId, @@ -174,7 +228,14 @@ async def zone_subscribe( fm_client: FmClientDep, x_correlator: XCorrelatorHeader = None, ) -> Response: - return await _relay(fm_client, "POST", f"/{federationContextId}/zones", request, x_correlator) + return await _relay( + fm_client, + "POST", + f"/{federationContextId}/zones", + request, + x_correlator, + request_schema=ZoneRegistrationRequestData, + ) @router.get( @@ -186,7 +247,7 @@ async def zone_subscribe( ), operation_id="get_zone_data", response_model=ZoneRegisteredData, - responses=_responses(400, 401, 404, 409, 422, 500, 503, 520), + responses=_responses(400, 401, 404, 409, 422, 500, 502, 503, 520), ) async def get_zone_data( federationContextId: FederationContextId, @@ -209,7 +270,7 @@ async def get_zone_data( ), operation_id="zone_unsubscribe", status_code=200, - responses=_responses(400, 401, 404, 409, 422, 500, 503, 520), + responses=_responses(400, 401, 404, 409, 422, 500, 502, 503, 520), ) async def zone_unsubscribe( federationContextId: FederationContextId, diff --git a/tests/unit/test_federation_manager_endpoints.py b/tests/unit/test_federation_manager_endpoints.py index 8777c1a..ed5530c 100644 --- a/tests/unit/test_federation_manager_endpoints.py +++ b/tests/unit/test_federation_manager_endpoints.py @@ -21,6 +21,15 @@ from open_exposure_gateway.main import app _CTX = "fed-ctx-1" _ZONE = "zone-a" +_VALID_CREATE_BODY = ( + b'{"origOPFederationId": "orig-op-1", "initialDate": "2026-09-04T12:00:00Z", ' + b'"partnerStatusLink": "https://orig-op.example.com/status"}' +) +_VALID_ZONE_SUBSCRIBE_BODY = ( + b'{"acceptedAvailabilityZones": ["zone-a"], ' + b'"availZoneNotifLink": "https://orig-op.example.com/zone-notif"}' +) + class _FakeFmClient: def __init__(self) -> None: @@ -68,11 +77,11 @@ def client() -> TestClient: _ENDPOINTS = [ - ("post", f"{BASE_PATH}/partner", "POST", "/partner", b'{"a": 1}'), + ("post", f"{BASE_PATH}/partner", "POST", "/partner", _VALID_CREATE_BODY), ("get", f"{BASE_PATH}/{_CTX}/partner", "GET", f"/{_CTX}/partner", None), ("delete", f"{BASE_PATH}/{_CTX}/partner", "DELETE", f"/{_CTX}/partner", None), ("get", f"{BASE_PATH}/fed-context-id", "GET", "/fed-context-id", None), - ("post", f"{BASE_PATH}/{_CTX}/zones", "POST", f"/{_CTX}/zones", b'{"a": 1}'), + ("post", f"{BASE_PATH}/{_CTX}/zones", "POST", f"/{_CTX}/zones", _VALID_ZONE_SUBSCRIBE_BODY), ("get", f"{BASE_PATH}/{_CTX}/zones/{_ZONE}", "GET", f"/{_CTX}/zones/{_ZONE}", None), ("delete", f"{BASE_PATH}/{_CTX}/zones/{_ZONE}", "DELETE", f"/{_CTX}/zones/{_ZONE}", None), ] @@ -141,6 +150,79 @@ def test_fm_unavailable_returns_problem_details_503( assert response.json()["title"] == "Federation Manager unavailable" +def test_malformed_request_body_returns_problem_details_400( + client: TestClient, fake_fm_client: _FakeFmClient +) -> None: + response = client.post( + f"{BASE_PATH}/partner", + content=b"{not valid json", + headers={"content-type": "application/json"}, + ) + + assert response.status_code == 400 + assert response.headers["content-type"] == "application/problem+json" + assert response.json()["title"] == "Malformed request body" + assert fake_fm_client.calls == [] + + +def test_wrong_shape_request_body_returns_problem_details_400( + client: TestClient, fake_fm_client: _FakeFmClient +) -> None: + """Valid JSON, but missing FederationRequestData's required fields.""" + response = client.post( + f"{BASE_PATH}/partner", + content=b'{"a": 1}', + headers={"content-type": "application/json"}, + ) + + assert response.status_code == 400 + assert response.headers["content-type"] == "application/problem+json" + assert response.json()["title"] == "Request body does not match the expected schema" + assert fake_fm_client.calls == [] + + +def test_wrong_shape_zone_subscribe_body_returns_problem_details_400( + client: TestClient, fake_fm_client: _FakeFmClient +) -> None: + """acceptedAvailabilityZones must be non-empty.""" + response = client.post( + f"{BASE_PATH}/{_CTX}/zones", + content=b'{"acceptedAvailabilityZones": [], "availZoneNotifLink": "https://x.example.com"}', + headers={"content-type": "application/json"}, + ) + + assert response.status_code == 400 + assert fake_fm_client.calls == [] + + +def test_valid_shape_request_body_is_still_forwarded_as_raw_bytes( + client: TestClient, fake_fm_client: _FakeFmClient +) -> None: + """Shape validation is a gate, not a reshape -- FM gets the original bytes.""" + response = client.post( + f"{BASE_PATH}/partner", + content=_VALID_CREATE_BODY, + headers={"content-type": "application/json"}, + ) + + assert response.status_code == 200 + assert fake_fm_client.calls[0]["content"] == _VALID_CREATE_BODY + + +def test_unparseable_fm_response_returns_problem_details_502( + client: TestClient, fake_fm_client: _FakeFmClient +) -> None: + fake_fm_client.response = httpx.Response( + 200, content=b"{not valid json", headers={"content-type": "application/json"} + ) + + response = client.get(f"{BASE_PATH}/fed-context-id") + + assert response.status_code == 502 + assert response.headers["content-type"] == "application/problem+json" + assert response.json()["title"] == "Federation Manager returned an unusable response" + + def test_openapi_exposes_federation_management_operations() -> None: paths = app.openapi()["paths"] seen = { -- GitLab From c72628ff98fbf009d7d119d5c01b1b2153fe33dc Mon Sep 17 00:00:00 2001 From: gpapathan87 Date: Tue, 15 Sep 2026 12:56:14 +0300 Subject: [PATCH 11/11] feat: pin federation-lifecycle relay to GSMA OPG.04 v1.4.0 and partnerOid to paths --- .../adapters/http/fm_client.py | 21 +- ...WBI-Federation-API-v1.4.0-oop-profile.yaml | 7843 +++++++++++++++++ .../API_definitions/federation-manager.yaml | 4609 ---------- .../{v1_2_0 => v1_4_0}/router.py | 167 +- .../{v1_2_0 => v1_4_0}/schemas.py | 71 +- src/open_exposure_gateway/main.py | 2 +- .../unit/test_federation_manager_endpoints.py | 66 +- tests/unit/test_fm_client.py | 26 +- 8 files changed, 8085 insertions(+), 4720 deletions(-) create mode 100644 src/open_exposure_gateway/api/gsma/federation_manager/API_definitions/OPG.04-v6.0-EWBI-Federation-API-v1.4.0-oop-profile.yaml delete mode 100644 src/open_exposure_gateway/api/gsma/federation_manager/API_definitions/federation-manager.yaml rename src/open_exposure_gateway/api/gsma/federation_manager/{v1_2_0 => v1_4_0}/router.py (62%) rename src/open_exposure_gateway/api/gsma/federation_manager/{v1_2_0 => v1_4_0}/schemas.py (82%) diff --git a/src/open_exposure_gateway/adapters/http/fm_client.py b/src/open_exposure_gateway/adapters/http/fm_client.py index 7db5bb2..3ce8491 100644 --- a/src/open_exposure_gateway/adapters/http/fm_client.py +++ b/src/open_exposure_gateway/adapters/http/fm_client.py @@ -5,11 +5,9 @@ from open_exposure_gateway.core.config import get_settings logger = structlog.get_logger(__name__) -# fm/requirements-and-design.md §L.3b says FM exposes "matching internal endpoints" -# under /internal/federation/ without naming them per operation. Mirroring the -# operator-facing suffix 1:1 is the reading agreed on until FM's side is built and -# confirms the actual paths. -_INTERNAL_PREFIX = "/internal/federation" +# OEG's platform-namespace federation routes (/platform/v1/federation/...) mirror +# FM's own /internal/... routes 1:1, so this is a plain prefix swap -- nothing else. +_INTERNAL_PREFIX = "/internal" class FmUnavailableError(Exception): @@ -29,14 +27,16 @@ class FmClient: content: bytes | None, content_type: str | None, x_correlator: str | None, + params: tuple[tuple[str, str], ...] | None = None, ) -> httpx.Response: """Forward one federation-lifecycle operation to FM, unaltered. - `path` is the operator-facing suffix after - ``/operatorplatform/federation/v1`` (e.g. ``/partner``, - ``/{federationContextId}/zones/{zoneId}``). The request body is forwarded - as the raw bytes the caller sent -- no parsing, no reshaping -- and the - caller relays the returned response body and status the same way. + `path` is the operator-facing suffix after ``/platform/v1/federation`` + (e.g. ``/partners/{partnerOpId}/federations``, + ``/partners/{partnerOpId}/federations/{federationContextId}/zones/{zoneId}``). + The request body and query string are forwarded as the caller sent them -- + no parsing, no reshaping -- and the caller relays the returned response + body and status the same way. """ url = f"{self.base_url}{_INTERNAL_PREFIX}{path}" headers = {"X-Correlator": x_correlator} if x_correlator else None @@ -52,6 +52,7 @@ class FmClient: url=url, content=content, headers=headers, + params=params, ) except httpx.TimeoutException as exc: log.exception("FM request timed out") diff --git a/src/open_exposure_gateway/api/gsma/federation_manager/API_definitions/OPG.04-v6.0-EWBI-Federation-API-v1.4.0-oop-profile.yaml b/src/open_exposure_gateway/api/gsma/federation_manager/API_definitions/OPG.04-v6.0-EWBI-Federation-API-v1.4.0-oop-profile.yaml new file mode 100644 index 0000000..a792d8a --- /dev/null +++ b/src/open_exposure_gateway/api/gsma/federation_manager/API_definitions/OPG.04-v6.0-EWBI-Federation-API-v1.4.0-oop-profile.yaml @@ -0,0 +1,7843 @@ +# GENERATED by scripts/apply_overlay.py — do not edit. +# base: OPG.04-v6.0-EWBI-Federation-API-v1.4.0.yaml (sha256 890801d61c148762897f18ce3b88823c0d486b1defdd04227f6a65f97c62fccf) +# overlay: opg04-v1.4.0-oop-profile.overlay.yaml (version 0.1.0, 15 actions) +openapi: 3.0.3 +info: + version: 1.4.0 + title: Federation Management Service + description: "# Introduction\n---\nRESTful APIs that allow an OP to share the edge cloud resources and\ + \ capabilities securely to other partner OPs over E/WBI.\n\n---\n# API Scope\n\n---\nAPIs defined\ + \ in this version of the specification can be categorized into the following areas:\n* __FederationAPIManagement__\ + \ - Retrieves federation resources and methods a partner OP support on E/WBI\n* __FederationManagement__\ + \ - Create and manage directed federation relationship with a partner OP\n* __AvailabilityZoneInfoSynchronization__\ + \ - Management of resources of partner OP zones and status updates\n* __ArtefactManagement__ - Upload,\ + \ remove, retrieve and update application descriptors, charts and packages over E/WBI towards a partner\ + \ OP\n\n* __FileManagement__ - Upload, remove, retrieve and update application binaries over E/WBI\ + \ towards a partner OP\n* __ApplicationOnboardingManagement__ - Register, retrieve, update and remove\ + \ applications over E/WBI towards a partner OP\n* __ApplicationDeploymentManagement__ - Create, update,\ + \ retrieve and terminate application instances over E/WBI towards a partner OP\n* __AppProviderResourceManagement__\ + \ - Static resource reservation for an application provider over E/WBI for partner OP zones\n* __EdgeNodeSharing__\ + \ - Edge discovery procedures towards partner OP over E/WBI.\n* __ServiceAPIManagement__ - Service\ + \ APIs capability sharing, forwarding, notification and API context management \n* __SubscribeMonitoringInfo__\ + \ - The Originating OP subscribe for receiving the resource utilization reports periodically from\ + \ the partner OP for existing federation\n* __FaultManagement__ - The Partner OP performs the alarm\ + \ reporting and clearances to the Originating OP on existing federation\n* __EventsReporting__ - The\ + \ Partner OP notifies the detection of events as created by the Originating OP on the existing federation\n\ + * __NetworkEventsReporting__ - The Partner OP notifies the network events applied for offered network\ + \ capabilities on the existing federation\n* __ApplicationEventsReporting__ - The Partner OP notifies\ + \ the applications events of the federated applications\n* __ApplicationPolicyManagement__ - The application-level\ + \ policy requested by Originating OP for federated applications\n* __OperationPolicyManagement__ -\ + \ The operation-level policy requested by Originating OP for federated edge cloud resources\n\n---\n\ + # Definitions\n---\nThis section provides definitions of terminologies commonly referred to throughout\ + \ the API descriptions.\n\n* __Accepted Zones__ - List of partner OP zones, which the originating\ + \ OP has confirmed to use for its edge applications\n* __Anchoring__ - Partner OP capability to serve\ + \ application clients (still in their home location) from application instances running on partner\ + \ zones.\n* __Application Provider__ - An application developer, onboarding his/her edge application\ + \ on a partner operator platform (MEC).\n* __Artefact__ - Descriptor, charts or any other package\ + \ associated with the application.\n* __Availability Zone__ - Zones that partner OP can offer to share\ + \ with originating OP.\n* __Device__ - Refers to user equipment like mobile phone, tablet, IOT kit,\ + \ AR/VR device etc. In context of MEC users use these devices to access edge applications\n* __Directed\ + \ Federation__ - A Federation between two OP instances A and B, in which edge compute resources are\ + \ shared by B to A, but not from A to B.\n* __Edge Application__ - Application designed to run on\ + \ MEC edge cloud\n* __Edge Discovery Service__ - Partner OP service responsible to select most optimal\ + \ edge( within partner OP) for edge application instantiation. Edge discovery service is defined as\ + \ HTTP based API endpoint identified by a well-defined FQDN or IP.\n* __E/WBI__ - East west bound\ + \ interface.\n* __Federation__ - Relationship among member OPs who agrees to offer services and capabilities\ + \ to the application providers and end users of member OPs\n* __FederationContextId__ - Partner OP\ + \ defined string identifier representing a certain federation relationship.\n* __Federation Identifier__\ + \ - Identify an operator platform in federation context.\n* __FileId__ - An OP defined string identifier\ + \ representing a certain application image uploaded by an application provider\n* __Flavour__ - A\ + \ group of compute, network and storage resources that can be requested or granted as a single unit\n\ + * __FlavourIdentifier__ - An OP defined string identifier representing a set of compute, storage and\ + \ networking resources\n* __Home OP__ - Used in federation context to identify the OP with which the\ + \ application developers or user clients are registered.\n* __Home Routing__ - Partner OP capability\ + \ to direct roaming user client traffic towards application instances running on home OP zones.\n\ + * __Instance__ - Application process running on an edge\n* __LCM Service__ - Partner OP service responsible\ + \ for life cycle management of edge applications. LCM service is defined as HTTP based API endpoint\ + \ identified by a well-defined FQDN or IP.\n* __Offered Zones__ - Zones that partner OP offer to share\ + \ to the Originating OP based on the prior agreement and local configuration.\n* __Onboarding__ -\ + \ Submitting an application to MEC platform\n* __OP__ - Operator platform.\n* __OperatorIdentifier__\ + \ - String identifier representing the owner of MEC platform. Owner could be an enterprise, a TSP\ + \ or some other organization\n* __Originating OP__ - The OP when initiating the federation creation\ + \ request towards the partner OP is defined as the Originating OP\n* __Partner OP__ - Operator Platform\ + \ which offers its Edge Cloud capabilities to the other Operator Platforms via E/WBI.\n* __Resource__\ + \ - Compute, networking and storage resources.\n* __Resource Pool__ - A group of compute, networking\ + \ and storage resources. Application provider pre-reserve resources on partner OP zone, these resources\ + \ are reserved in terms of flavours.\n* __ZoneIdentifier__ - An OP defined string identifier representing\ + \ a certain geographical or logical area where edge resources and services are provided\n* __Zone\ + \ Confirmation__ - Procedure via which originating OP acknowledges partner OP about the partner zones\ + \ it wishes to use.\n* __User Clients__ - Lightweight client applications used to access edge applications.\ + \ Application users run these clients on their devices (UE, IOT device, AR/VR device etc)\n* __ServiceAPIManagement__\ + \ - Service APIs capability sharing, forwarding, notification and API context management\n\n---\n\ + # API Operations\n---\n\n__FederationManagement__\n* __CreateFederation__ - Creates a directed federation\ + \ relationship with a partner OP\n* __GetFederationDetails__ - Retrieves details about the federation\ + \ relationship with the partner OP. The response shall provide info about the zones offered by the\ + \ partner, partner OP network codes, information about edge discovery and LCM service etc.\n* __DeleteFederationDetails__\ + \ - Remove existing federation with the partner OP\n* __NotifyFederationUpdates__ - Call back notification\ + \ used by partner OP to update originating OP about any change in existing federation relationship\n\ + * __UpdateFederation__ - API used by the Originating OP towards the partner OP, to update the parameters\ + \ associated to the existing federation\n* __QueryFederationContext__ - The Originating OP retrieves\ + \ federationContextId from the partner OP\n* __HealthCheckFederation__ - The Originating OP sends\ + \ health check message to the partner OP to check the health of the the existing federation\n* __RenewFederation__\ + \ - The Originating OP requests the partner OP to renew the existing federation relationship\n* __GetNetworkCapabilities__\ + \ - The Originating OP requests the partner OP to share the offered network capabilities information\ + \ \n\n__AvailabilityZoneInfoSynchronization__\n* __ZoneSubscribe__ - Informs partner OP that\ + \ originating OP is willing to access the specified zones and partner OP shall reserve compute and\ + \ network resources for these zones.\n* __ZoneUnsubscribe__ - Informs partner OP that originating\ + \ OP will no longer access the specified partner OP zone.\n* __GetZoneData__ - Retrieves details about\ + \ the computation and network resources that partner OP has reserved for an partner OP zone.\n* __Notify\ + \ Zone Information__ - Call back notification used by partner OP to update originating OP about changes\ + \ in the resources reserved on a partner zone.\n\n__ArtefactManagement__\n* __UploadArtefact__ - Uploads\ + \ application artefact on partner operator platform.\n* __RemoveArtefact__ - Removes an artefact from\ + \ partner operator platform.\n* __GetArtefact__ - Retrieves details about an artefact from partner\ + \ operator platform.\n* __UploadFile__ Upload application binaries to partner operator platform\n\ + * __RemoveFile__ - Removes application binaries from partner operator platform\n* __ViewFile__ - Retrieves\ + \ details about binaries associated with an application from partner operator platform\n\n__ApplicationOnboardingManagement__\n\ + * __OnboardApplication__ - Submits an application details to a partner OP. Based on the details provided,\ + \ partner OP shall do bookkeeping, resource validation and other pre-deployment operations\n* __UpdateApplication__\ + \ - Updates partner OP about changes in application compute resource requirements, QOS Profile, associated\ + \ descriptor or change in associated components\n* __DeboardApplication__ - Removes an application\ + \ from partner OP\n* __ViewApplication__ - Retrieves application details from partner OP\n* __OnboardExistingAppNewZones__\ + \ - Make an application available on new additional zones\n* __LockUnlockApplicationZone__ - Forbid\ + \ or permit instantiation of application on a zone\n\n__Application Instance Lifecycle Management__\n\ + * __InstallApp__ - Instantiates an application on a partner OP zone.\n* __GetAppInstanceDetails__\ + \ - Retrieves an application instance details from partner OP.\n* __RemoveApp__ - Terminate an application\ + \ instance on a partner OP zone.\n* __GetAllAppInstances__ - Retrieves details about all instances\ + \ of the application running on partner OP zones.\n\n\n__AppProviderResourceManagement__\n* __CreateResourcePools__\ + \ - Reserves resources (compute, network and storage) on a partner OP zone. ISVs registered with\ + \ home OP reserves resources on a partner OP zone.\n* __UpdateISVResPool__ - Updates resources reserved\ + \ for a pool by an ISV\n* __ViewISVResPool__ - Retrieves the resource pool reserved by an ISV\n* __RemoveISVResPool__\ + \ - Deletes the resource pool reserved by an ISV\n\n\n__EdgeNodeSharing__\n*__GetCandidateZones__\ + \ - Edge discovery procedures towards partner OP over E/WBI. Originating OP request partner OP to\ + \ provide a list of candidate zones where an application instance can be created.\n\n__ServiceAPIManagement__\n\ + *__ServiceAPIRequestForwarding__ - Forward the NBI Service API requests to Partner OP over E/WBI.\n\ + *__RemoveServiceAPISession__ - Remove the existing Service API session with Partner OP over E/WBI.\n\ + *__ServiceAPIRequestForwarding__ - Retrieve Service API session context with Partner OP over E/WBI.\n\ + \n__ConsumptionReportingManagement__\n*__SubscribeForResourceConsumption__ - Originating OP Subscription\ + \ for edge resource consumption reporting by Partner OP over E/WBI.\n\n__EventManagement__\n*__SubscribeForEventNotifications__\ + \ - Originating OP Subscription for edge services related events reporting by Partner OP over E/WBI.\n\ + \n__Alarm Management__\n*__SubscribeForAlarmManagement__ - Originating OP Subscription for reporting\ + \ of alarms by Partner OP over E/WBI.\n\n__Network Capabilities Event Management__\n*__SubscribeForNetworkCapabilitiesNotifications__\ + \ - Originating OP Subscription for reporting of network events for application of network capabilities\ + \ by Partner OP over E/WBI.\n\n\n__Applications Event Notifications Management__\n*__SubscribeForApplicationEventsNotifications__\ + \ - Originating OP Subscription for reporting of application-level events by Partner OP over E/WBI.\n\ + \n\n© 2024 GSM Association.\nAll rights reserved.\n" +externalDocs: + description: GSMA, E/WBI APIs v1.4.1 + url: http://www.xxxx.com +servers: +- url: '{apiRoot}/operatorplatform/federation/v1' + variables: + apiRoot: + default: https://operatorplatform.com +security: +- oAuth2ClientCredentials: + - fed-mgmt +- notifClientCredentials: + - fed-mgmt-notif +components: + securitySchemes: + oAuth2ClientCredentials: + type: oauth2 + flows: + clientCredentials: + tokenUrl: /oauth2/token + scopes: + fed-mgmt: Access to the federation APIs + notifClientCredentials: + type: oauth2 + flows: + clientCredentials: + tokenUrl: /oauth2/token + scopes: + fed-mgmt-notif: Access to the federation notification APIs + schemas: + AppIdentifier: + type: string + pattern: ^[A-Za-z][A-Za-z0-9_]{7,63}$ + description: Identifier used to refer to an application. + AppProviderId: + type: string + pattern: ^[A-Za-z][A-Za-z0-9_]{7,63}$ + description: UserId of the app provider. Identifier is relevant only in context of this federation. + ArtefactId: + type: string + format: uuid + description: A globally unique identifier associated with the artefact. Originating OP generates + this identifier when artefact is submitted over NBI. + CountryCode: + type: string + description: ISO 3166-1 Alpha-2 code for the country of Partner operator + pattern: ^[A-Z]{2}$ + CPUArchType: + type: string + enum: + - ISA_X86 + - ISA_X86_64 + - ISA_ARM_64 + description: CPU Instruction Set Architecture (ISA) E.g., Intel, Arm etc. + InstanceIdentifier: + type: string + pattern: ^[A-Za-z0-9][A-Za-z0-9_]{6,62}[A-Za-z0-9]$ + description: Unique identifier generated by the partner OP to identify an instance of the application + on a specific zone. + InstanceState: + type: string + enum: + - PENDING + - READY + - FAILED + - TERMINATING + description: Running status of the application instance. + TransactionId: + description: A unique transaction id for this request in UUID format. It is used for tracking the + request + example: ab1d6gh5-79c2-3256-7hvb-d897549x40f7 + format: uuid + type: string + Ipv4Addr: + type: string + pattern: ^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$ + example: 198.51.100.1 + Ipv6Addr: + type: string + allOf: + - pattern: ^((:|(0?|([1-9a-f][0-9a-f]{0,3}))):)((0?|([1-9a-f][0-9a-f]{0,3})):){0,6}(:|(0?|([1-9a-f][0-9a-f]{0,3})))$ + - pattern: ^((([^:]+:){7}([^:]+))|((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?))$ + example: 2001:db8:85a3::8a2e:370:7334 + Fqdn: + type: string + FixedNetworkIds: + type: array + items: + type: string + description: List of network identifier associated with the fixed line network of the operator platform. + minItems: 1 + FederationContextId: + type: string + pattern: ^[A-Za-z0-9][A-Za-z0-9-]*$ + readOnly: true + description: This identifier shall be provided by the partner OP on successful verification and + validation of the federation create request and is used by partner op to identify this newly created + federation context. Originating OP shall provide this identifier in any subsequent request towards + the partner op. + FederationIdentifier: + type: string + pattern: ^[A-Za-z0-9][A-Za-z0-9-]*$ + description: Globally unique identifier allocated to an operator platform. This is valid and used + only in context of MEC federation interface. + FileId: + type: string + format: uuid + description: A globally unique identifier associated with the image file. Originating OP generates + this identifier when file is uploaded over NBI. + FileName: + type: string + pattern: ^[A-Za-z][A-Za-z0-9_]{7,31}$ + description: Name of the image file. App provides specifies this name when image is uploaded on + originating OP over NBI. + FileDescription: + type: string + minLength: 8 + maxLength: 128 + description: Brief description about the image file. + FileVersionInfo: + type: string + description: File version information. + FlavourId: + type: string + description: An identifier to refer to a specific combination of compute resources + GeoLocation: + type: string + description: Latitude,Longitude as decimal fraction up to 4 digit precision + pattern: ^([-+]?)([\d]{1,2})((((\.)([\d]{1,4}))?(,)))(([-+]?)([\d]{1,3})((\.)([\d]{1,4}))?)$ + Mcc: + type: string + pattern: ^\d{3}$ + Mnc: + type: string + pattern: ^\d{2,3}$ + OnboardStatusInfo: + type: string + enum: + - PENDING + - ONBOARDED + - DEBOARDING + - REMOVED + - FAILED + description: Defines change in application status. This change could be related to application itself + or an application instance status + PoolName: + type: string + pattern: ^[A-Za-z0-9][A-Za-z0-9_]{6,30}[A-Za-z0-9]$ + description: ISV defined name of the resource pool. + PoolId: + type: string + pattern: ^[A-Za-z0-9][A-Za-z0-9_]{6,30}[A-Za-z0-9]$ + description: OP defined Identifier for the pool reserved for the ISV. It should be unique with an + OP. + Port: + type: integer + minimum: 0 + Status: + type: string + enum: + - FAILED + - TEMPORARY_FAILURE + - AVAILABLE + - LOCKED + - NOT_AVAILABLE + Uri: + type: string + Vcpu: + type: string + pattern: ^\d+((\.\d{1,3})|(m))?$ + description: Number of vcpus in whole, decimal up to millivcpu, or millivcpu format. + example: + whole: + value: 2 + decimal: + value: 0.5 + millivcpu: + value: 500m + VirtImageType: + type: string + enum: + - QCOW2 + - DOCKER + - OVA + description: Indicate if the file is Container image or VM image (QCOW2, OVA) + ZoneIdentifier: + type: string + pattern: ^[A-Za-z0-9][A-Za-z0-9-]*$ + description: Human readable name of the zone. + FederationHealthInfo: + type: object + required: + - federationStatus + - federationStartTime + - numOfAcceptedZones + properties: + federationStatus: + $ref: '#/components/schemas/Status' + federationStartTime: + $ref: '#/components/schemas/dateAndTimeZoneObject' + numOfAcceptedZones: + type: string + numOfActiveAlarms: + type: string + numOfApplications: + type: string + FederationSupportedAPIs: + type: object + required: + - federationBaseAPI + - availabilityZoneAPI + - edgeApplicationAPI + - artefactAPI + - fileAPI + properties: + federationBaseAPI: + $ref: '#/components/schemas/FederationAPIResources' + availabilityZoneAPI: + $ref: '#/components/schemas/FederationAPIResources' + edgeApplicationAPI: + $ref: '#/components/schemas/FederationAPIResources' + artefactAPI: + $ref: '#/components/schemas/FederationAPIResources' + fileAPI: + $ref: '#/components/schemas/FederationAPIResources' + serviceAPIFederation: + $ref: '#/components/schemas/FederationAPIResources' + resourceMonitoringAPI: + $ref: '#/components/schemas/FederationAPIResources' + faultManagementAPI: + $ref: '#/components/schemas/FederationAPIResources' + eventManagementAPI: + $ref: '#/components/schemas/FederationAPIResources' + FederationAPINames: + type: string + enum: + - FEDERATION + - AVAILZONE + - ARTEFACT + - FILE + - SVSAPEFED + - RESMONITOR + - EVENTMGMT + - FAULTMGMT + HttpMethods: + type: string + enum: + - POST + - PUT + - PATCH + - DELETE + - GET + HttpResources: + type: object + required: + - href + - httpMethods + properties: + href: + $ref: '#/components/schemas/Uri' + httpMethods: + type: array + items: + $ref: '#/components/schemas/HttpMethods' + minItems: 1 + description: List of HTTP Methods supported for the given API category + FederationAPIResources: + type: object + required: + - name + - apiOperations + properties: + name: + $ref: '#/components/schemas/FederationAPINames' + apiOperations: + type: array + items: + $ref: '#/components/schemas/HttpResources' + minItems: 1 + description: List of HTTP Methods supported for the given API category + monitoringSubsType: + type: string + enum: + - edge_resource + - app_resource + - alarm + - all + description: Denotes types of edge resources, faults and events at partner OP to be reported to + Originating OP. + resourceSubscriptionInfo: + type: object + required: + - monitoringType + - subscriptionId + - dateAndTime + properties: + monitoringType: + $ref: '#/components/schemas/monitoringSubsType' + dateAndTime: + $ref: '#/components/schemas/dateAndTimeZoneObject' + subscriptionId: + type: string + format: uuid + description: Partner OP managed identifier for new subscription. + utilizationValue: + type: object + required: + - resType + - value + - unit + properties: + resType: + $ref: '#/components/schemas/resourceType' + value: + type: string + description: Whole number that represent the value of given resource type. + unit: + type: string + enum: + - Percent + - MBPS + - GB + - TB + - CORES + - SECONDS + - MINUTES + description: Indicate the resource measurement Unit + resourceType: + type: string + enum: + - CPU + - MEMORY + - DISK + - Network + - FLAVOUR + description: Indicate the type of resource + edgeResUtilizeMetrics: + type: object + required: + - edgeMetrics + - federationContextId + - sequenceNum + properties: + edgeMetrics: + type: array + items: + $ref: '#/components/schemas/edgeComputeMetrics' + minItems: 1 + description: List of edge cloud resource metrics per zone + federationContextId: + $ref: '#/components/schemas/FederationContextId' + sequenceNum: + type: integer + description: Monotonically increasing counter for sequencing resource monitoring reports + edgeComputeMetrics: + type: object + required: + - zoneId + - startTime + - endTime + - cpuUtil + - memUtil + - diskUtil + - networkUtil + - flavourUtil + properties: + zoneId: + $ref: '#/components/schemas/ZoneIdentifier' + startTime: + $ref: '#/components/schemas/dateAndTimeZoneObject' + endTime: + $ref: '#/components/schemas/dateAndTimeZoneObject' + cpuUtil: + $ref: '#/components/schemas/cpuUtilization' + memUtil: + $ref: '#/components/schemas/memUtilization' + diskUtil: + $ref: '#/components/schemas/diskUtilization' + networkUtil: + $ref: '#/components/schemas/networkUtilization' + flavourUtil: + $ref: '#/components/schemas/flavourUtilization' + memUtilization: + type: object + required: + - noOfSamples + - averageUtilization + - maxUtilization + - minUtilization + properties: + noOfSamples: + type: string + description: Number of samples used for calculating metrics. + averageUtilization: + $ref: '#/components/schemas/utilizationValue' + maxUtilization: + $ref: '#/components/schemas/utilizationValue' + minUtilization: + $ref: '#/components/schemas/utilizationValue' + effectiveUtilization: + $ref: '#/components/schemas/utilizationValue' + diskUtilization: + type: object + required: + - noOfSamples + - averageUtilization + - maxUtilization + - minUtilization + properties: + noOfSamples: + type: string + description: Number of samples used for calculating metrics. + averageUtilization: + $ref: '#/components/schemas/utilizationValue' + maxUtilization: + $ref: '#/components/schemas/utilizationValue' + minUtilization: + $ref: '#/components/schemas/utilizationValue' + effectiveUtilization: + $ref: '#/components/schemas/utilizationValue' + networkUtilization: + type: object + required: + - noOfSamples + - ingressUsage + - egressUsage + - averageThroughput + - maxThroughput + - minThroughput + properties: + noOfSamples: + type: string + description: Number of samples used for calculating metrics. + ingressUsage: + $ref: '#/components/schemas/utilizationValue' + egressUsage: + $ref: '#/components/schemas/utilizationValue' + averageThroughput: + $ref: '#/components/schemas/utilizationValue' + maxThroughput: + $ref: '#/components/schemas/utilizationValue' + minThroughput: + $ref: '#/components/schemas/utilizationValue' + flavourUtilization: + type: array + items: + $ref: '#/components/schemas/flavourMetrics' + minItems: 1 + description: List of compute flavours metrics per zone + flavourMetrics: + type: object + required: + - noOfSamples + - flavourId + - averageUtilization + - maxUtilization + - minUtilization + properties: + noOfSamples: + type: string + description: Number of samples used for calculating metrics. + flavourId: + $ref: '#/components/schemas/FlavourId' + averageUtilization: + $ref: '#/components/schemas/utilizationValue' + averageThroughput: + $ref: '#/components/schemas/utilizationValue' + maxUtilization: + $ref: '#/components/schemas/utilizationValue' + minUtilization: + $ref: '#/components/schemas/utilizationValue' + appsResUtilizeInfo: + type: object + required: + - appMetrics + - federationContextId + - sequenceNum + properties: + appMetrics: + type: array + items: + $ref: '#/components/schemas/appsResUtilizeMetrics' + minItems: 1 + description: List of edge cloud resource metrics per zone + federationContextId: + $ref: '#/components/schemas/FederationContextId' + sequenceNum: + type: integer + description: Monotonically increasing counter for sequencing app monitoring reports + appsResUtilizeMetrics: + type: object + required: + - zoneId + - startTime + - endTime + - appZoneMetrics + properties: + zoneId: + $ref: '#/components/schemas/ZoneIdentifier' + startTime: + $ref: '#/components/schemas/dateAndTimeZoneObject' + endTime: + $ref: '#/components/schemas/dateAndTimeZoneObject' + appZoneMetrics: + $ref: '#/components/schemas/appMetrics' + appMetrics: + type: array + items: + $ref: '#/components/schemas/appAggrResUtil' + minItems: 1 + description: List of edge cloud resource metrics per zone + appAggrResUtil: + type: object + required: + - appId + - appProvId + - noOfAppInstances + - appInstances + - cpuUtil + - memUtil + - diskUtil + - networkUtil + - flavourUtil + properties: + appId: + $ref: '#/components/schemas/AppIdentifier' + appProvId: + $ref: '#/components/schemas/AppProviderId' + noOfAppInstances: + type: integer + description: No of application instances of appId in a zone + appInstances: + type: array + items: + $ref: '#/components/schemas/InstanceIdentifier' + minItems: 1 + cpuUtil: + $ref: '#/components/schemas/cpuUtilization' + memUtil: + $ref: '#/components/schemas/memUtilization' + diskUtil: + $ref: '#/components/schemas/diskUtilization' + networkUtil: + $ref: '#/components/schemas/networkUtilization' + flavourUtil: + $ref: '#/components/schemas/flavourUtilization' + cpuUtilization: + type: object + required: + - cpuType + - noOfSamples + - averageUtilization + - maxUtilization + - minUtilization + - effectiveUtilization + properties: + cpuType: + $ref: '#/components/schemas/monitoringSubsType' + noOfSamples: + type: string + description: Number of samples used for calculating metrics. + averageUtilization: + $ref: '#/components/schemas/utilizationValue' + maxUtilization: + $ref: '#/components/schemas/utilizationValue' + minUtilization: + $ref: '#/components/schemas/utilizationValue' + effectiveUtilization: + $ref: '#/components/schemas/utilizationValue' + thresholdVal: + type: object + required: + - value + - unit + properties: + value: + type: string + unit: + type: string + enum: + - percent + - CORES + - TB + - GB + - MBPS + - GBPS + description: The unit of resources measurement e.g. number of cores, mega bits per seconds etc. + EventSubscription: + type: object + required: + - resUsageType + - periodicity + - eventListner + properties: + resUsageType: + $ref: '#/components/schemas/resourceType' + periodicity: + $ref: '#/components/schemas/periodicityInterval' + eventListner: + $ref: '#/components/schemas/Uri' + EventSubscriptionInfo: + type: object + required: + - resUsageType + - periodicity + - subscriptionId + properties: + resUsageType: + $ref: '#/components/schemas/resourceType' + periodicity: + $ref: '#/components/schemas/periodicityInterval' + subscriptionId: + type: string + format: uuid + eventCriterion: + type: object + required: + - resUsageType + - triggerCondition + - thresholdVal + - numOccurance + - monitorDuration + properties: + resUsageType: + $ref: '#/components/schemas/resourceType' + triggerCondition: + type: string + enum: + - GT + - GTE + - EQ + - LT + - LEQ + description: The condition evaluation operator to compare threashold value of a resource for + event detection. + thresholdVal: + $ref: '#/components/schemas/thresholdVal' + numOccurance: + type: integer + description: Number of times the trigger condition is detected + monitorDuration: + $ref: '#/components/schemas/periodicityInterval' + eventInfo: + type: object + required: + - eventId + - eventCriterion + properties: + eventId: + type: string + eventCriterion: + $ref: '#/components/schemas/eventCriterion' + eventTypeList: + type: array + items: + $ref: '#/components/schemas/eventCriterion' + minItems: 1 + description: List of event criterion + detectedEvent: + type: object + required: + - zoneId + - eventId + - startTime + - endTime + - numOccurance + properties: + zoneId: + $ref: '#/components/schemas/ZoneIdentifier' + eventId: + type: string + startTime: + $ref: '#/components/schemas/dateAndTimeZoneObject' + endTime: + $ref: '#/components/schemas/dateAndTimeZoneObject' + numOccurance: + type: integer + CapabilityID: + type: string + enum: + - NW_CAP_CONN_STATE_CHANGE + - NW_CAP_LOCATION_RETRIEVAL + - NW_CAP_USERPLANE_MGMT_EVENTS + - NW_CAP_DYNAMIC_QOS + description: The enumerated list of network capabilities that an OP can use for various services + via SBI-NR. + DeviceConnStatusChangeCap: + type: object + required: + - capabilityId + - maxiDetectionTime + properties: + capabilityId: + $ref: '#/components/schemas/CapabilityID' + maxiDetectionTime: + type: string + description: The maximum detection time in seconds that the OP can determine the UE change of + connectivity with the mobile network. + LocationRetrievalCap: + type: object + required: + - capabilityId + - locationType + properties: + capabilityId: + $ref: '#/components/schemas/CapabilityID' + locationType: + type: string + enum: + - CELL_LEVEL_ACCURACY + - REGISTRATION_AREA_ACCURACY + - TRACKING_AREA_ACCURACY + - GEO_LOCATION_ACCURACY + description: The enumerated list of UE location accuracy that an OP can determine via SBI-NR. + locationAccuracy: + type: string + enum: + - LAST_KNOWN_LOCATION + - CURRENT_LOCATION + - INITIAL_LOCATION + description: The enumerated list of type of network location of an UE that an OP can determine + via SBI-NR. + UserPlaneMgmtEvtCap: + type: object + required: + - capabilityId + - maxUserPlaneLatency + properties: + capabilityId: + $ref: '#/components/schemas/CapabilityID' + maxUserPlaneLatency: + type: string + description: Indicates the maximum user plane latency in units of milliseconds to decide whether + edge relocation is needed to ascertain latency remain in this range. + DynamicQoSCap: + type: object + required: + - capabilityId + - supportedQoS + properties: + capabilityId: + $ref: '#/components/schemas/CapabilityID' + supportedQoS: + type: string + description: Set of one or more 5G QoS Identifier (5QI or 4G QCI) created via concatanation + of Resource Type and 5QI values i.e., GBR1, GBR2, GBR65, NONGBR79 etc. + NetworkCapAppInfoList: + type: array + items: + required: + - appProviderId + - appId + - AppInstNetworkCapInvoked + - zoneId + properties: + appProviderId: + $ref: '#/components/schemas/AppProviderId' + appId: + $ref: '#/components/schemas/AppIdentifier' + zoneId: + $ref: '#/components/schemas/ZoneIdentifier' + appInstNetworkCapInvoked: + $ref: '#/components/schemas/AppInstNetworkCapList' + minItems: 1 + AppInstNetworkCapList: + type: object + required: + - appInstanceNwCapInfo + properties: + appInstanceNwCapInfo: + type: array + items: + type: object + required: + - appInstIdentifier + - appInstanceState + - networkCapInvoked + properties: + appInstIdentifier: + $ref: '#/components/schemas/InstanceIdentifier' + appInstanceState: + $ref: '#/components/schemas/InstanceState' + networkCapInvoked: + $ref: '#/components/schemas/NetworkCapInvoked' + minItems: 1 + NetworkCapInvoked: + type: object + required: + - networkEventId + - capabilityId + - zoneId + - detectionTime + - nwCapabilitySLI + properties: + networkEventId: + type: string + format: uuid + description: Unique identifier allocated for a network event + capabilityId: + $ref: '#/components/schemas/CapabilityID' + invocationTime: + $ref: '#/components/schemas/dateAndTimeZoneObject' + nwCapabilitySLI: + type: string + zoneId: + $ref: '#/components/schemas/ZoneIdentifier' + NetworkCapSubsInfo: + type: object + required: + - appId + - appProviderId + - capabilityId + properties: + appId: + $ref: '#/components/schemas/AppIdentifier' + appProviderId: + $ref: '#/components/schemas/AppProviderId' + capabilityId: + $ref: '#/components/schemas/CapabilityID' + NetworkEventsList: + type: array + items: + $ref: '#/components/schemas/NetworkCapInvoked' + minItems: 1 + description: List of network capabilities events detected + EventsList: + type: array + items: + $ref: '#/components/schemas/detectedEvent' + minItems: 1 + description: List of events detected + EventSubscriptionIdentifier: + type: string + format: uuid + description: Event subscription identifier allocated for enabling event reporting + EventIdentifier: + type: string + format: uuid + description: Event identifier allocated for event detected + SubscriptionIdentifier: + type: object + required: + - subsId + properties: + subsId: + type: string + format: uuid + description: Generic subscription identifier + AlarmObjectInfo: + type: object + required: + - alarmType + - alarmId + - perceivedSeverity + - probableCause + - alarmedObject + - sourceSystemId + - state + - alarmRaisedTime + properties: + alarmType: + $ref: '#/components/schemas/AlarmType' + alarmId: + $ref: '#/components/schemas/AlarmIdentifier' + perceivedSeverity: + $ref: '#/components/schemas/PerceivedSeverity' + probableCause: + $ref: '#/components/schemas/ProbableCause' + alarmedObject: + $ref: '#/components/schemas/AlarmedObject' + sourceSystemId: + $ref: '#/components/schemas/SourceSystemId' + state: + $ref: '#/components/schemas/State' + alarmRaisedTime: + $ref: '#/components/schemas/AlarmRaisedTime' + affectedService: + $ref: '#/components/schemas/AffectedService' + alarmDetails: + $ref: '#/components/schemas/AlarmDetails' + specificProblem: + $ref: '#/components/schemas/SpecificProblem' + serviceAffecting: + $ref: '#/components/schemas/ServiceAffecting' + ActiveAlarmsList: + type: array + items: + $ref: '#/components/schemas/AlarmObjectInfo' + minItems: 1 + description: List of active alarms + AlarmType: + type: object + required: + - alarmType + properties: + alarmType: + type: string + enum: + - EDGERES + - APPLICATION + - ARTEFACT + - EDGEDISC + - FEDERATION + - SECURITY + - APIFEDERATION + - FILE + description: Alarm type category + AlarmIdentifier: + type: object + required: + - alarmId + properties: + alarmId: + type: string + description: Alarm identifier to refer to an alarm instance + PerceivedSeverity: + type: object + required: + - severity + properties: + severity: + type: string + enum: + - MAJOR + - MINOR + - CRITICAL + - WARNING + - INFOMATIONAL + description: Alarm severity + ProbableCause: + type: object + required: + - cause + properties: + cause: + type: string + description: Probale cause of the alarm + AlarmedObject: + type: object + required: + - alarmId + - href + properties: + alarmId: + $ref: '#/components/schemas/AlarmIdentifier' + href: + $ref: '#/components/schemas/Uri' + SourceSystemId: + type: object + required: + - sourceSystemId + properties: + sourceSystemId: + type: string + description: Source system identity + State: + type: object + required: + - alarmState + properties: + alarmState: + type: string + enum: + - RAISED + - UPDATED + - CLEAR + description: Defines the alarm state during its life cycle (raised | updated | cleared). + AlarmRaisedTime: + type: object + required: + - alarmRaisedTime + properties: + alarmRaisedTime: + type: string + format: date-time + description: Defines the alarm raised time at source + AffectedService: + type: object + required: + - affectedService + properties: + affectedService: + type: array + items: + type: string + minItems: 1 + description: Defines the affected services e.g., edge discovery, application services, API services + etc at source + AlarmDetails: + type: object + required: + - alarmDetails + properties: + alarmDetails: + type: string + description: Detailed information of the alarm + SpecificProblem: + type: object + required: + - specificProblem + properties: + specificProblem: + type: string + description: Specific information related to the alarm + ServiceAffecting: + type: string + enum: + - true + - false + description: Specific information related to the alarm + PatchableParams: + type: string + enum: + - /perceivedSeverity + - /probableCause + - /alarmedObject + - /sourceSystemId + - /state + - /affectedService + - /alarmDetails + - /specificProblem + - /serviceAffecting + AlarmUpdateOps: + type: string + enum: + - REPLACE + description: Operations that can be performed to update the parameters of an alarm + UpdatedParam: + type: object + required: + - alarmUpdateOps + - patchableParam + - patchValue + properties: + alarmUpdateOps: + $ref: '#/components/schemas/AlarmUpdateOps' + patchableParam: + $ref: '#/components/schemas/PatchableParams' + patchValue: + type: string + description: Value to be replaced for the alarm parameter being updated + UpdatedAlarmParameters: + type: object + required: + - alarmId + - updateParams + properties: + alarmId: + $ref: '#/components/schemas/AlarmIdentifier' + updateParams: + type: array + items: + $ref: '#/components/schemas/UpdatedParam' + minItems: 1 + description: List of alarm parameters to be updated in an update operation + serviceType: + type: string + enum: + - api_federation + description: An identifier to refer to partner OP capabilities for application providers. + serviceAPINames: + type: array + items: + type: string + enum: + - QualityOnDemand + - DeviceLocation + - DeviceStatus + - SimSwap + - NumberVerification + - DeviceIdentifier + minItems: 1 + description: List of Service API capability names an OP supports and offers to other OPs "quality_on_demand", + "device_location" etc. + serviceAPINameVal: + type: string + enum: + - QualityOnDemand + - DeviceLocation + - DeviceStatus + - SimSwap + - NumberVerification + - DeviceIdentifier + description: Name of the Service API + serviceRoutingInfo: + type: array + items: + type: string + pattern: ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))?$ + minItems: 1 + description: List of public IP addresses MNO manages for UEs to connect with public data networks + customerID: + type: string + format: uuid + description: Leading OP managed identifier associated to API Provider of the Leading OP. + txnIdentifier: + type: string + description: A API transaction identifier generated by the Partner OP for each API request + connectID: + type: string + description: An identifier generated by the Partner OP to represent the end user identity in the + Service API request. + apiContentType: + type: string + enum: + - application/json + description: Indicate the Service API body schema in JSON format + serviceAPIContent: + type: object + required: + - mediaType + - APIContent + properties: + mediaType: + $ref: '#/components/schemas/apiContentType' + APIContent: + type: object + additionalProperties: true + PlatformCaps: + type: array + items: + type: string + enum: + - homeRouting + - Anchoring + - serviceAPIs + - faultMgmt + - eventMgmt + - resourceMonitor + - networkEventMgmt + - appNotificationMgmt + - appLevelPolicyMgmt + - opsLevelPolicyMgmt + description: Home routing - Operator platform is capable of routing edge application data traffic + from its edges to user device in their home location. This is the case where user devices are + served in their home region (requesting platform region, non-roaming) but the corresponding edge + application are in operator platform edges. Anchoring - Operator platform is capable of routing + edge application traffic for roaming user devices to edge application in user device home network. + Service APIs - Capability to handle Service APIs (e.g., CAMARA APIs) from the Leading OP + expiryInterval: + type: object + required: + - numHours + - numMins + - numSecs + properties: + numHours: + type: integer + format: int32 + description: Number of Hours for Expiry (0-23) + numMins: + type: integer + format: int32 + description: Number of Minutes for Expiry (0-59) + numSecs: + type: integer + format: int32 + description: Number of Seconds for Expiry (0-59) + periodicityInterval: + type: object + required: + - numHours + - numMins + properties: + numHours: + type: integer + format: int32 + description: Number of Hours for Expiry (0-23) + numMins: + type: integer + format: int32 + description: Number of Minutes for Expiry (0-59) + periodicNotifConfig: + type: object + properties: + periodicity: + $ref: '#/components/schemas/periodicityInterval' + notificationListner: + $ref: '#/components/schemas/Uri' + targetUserContext: + type: object + required: + - connectID + - expiryDuration + properties: + connectID: + $ref: '#/components/schemas/connectID' + expiryDuration: + $ref: '#/components/schemas/expiryInterval' + serviceAPIResponse: + type: object + properties: + customerID: + $ref: '#/components/schemas/customerID' + targetUserContext: + $ref: '#/components/schemas/targetUserContext' + txnIdentifier: + $ref: '#/components/schemas/txnIdentifier' + apiResponse: + type: object + required: + - mediaType + - responseContent + properties: + mediaType: + type: string + description: May contain value e.g. "application/json". + responseContent: + type: object + additionalProperties: true + description: Result of the Service API processing, formatted according to mediaType and + defined by the Service API specification. + required: + - customerID + - txnIdentifier + anyOf: + - required: + - targetUserContext + - required: + - apiResponse + svcEventType: + type: string + enum: + - evt_timerexpiry + - evt_network + - evt_delete + serviceAPIEventDef: + type: object + required: + - NetworkEventDef + properties: + NetworkEventDef: + type: object + additionalProperties: true + serviceAPINetworkEvent: + type: object + required: + - connectID + - customerID + - EventType + properties: + connectID: + $ref: '#/components/schemas/connectID' + customerID: + $ref: '#/components/schemas/customerID' + EventType: + $ref: '#/components/schemas/svcEventType' + serviceAPIEventDef: + $ref: '#/components/schemas/serviceAPIEventDef' + expiryDuration: + $ref: '#/components/schemas/expiryInterval' + ServiceNameNB: + type: string + pattern: ^[A-Za-z0-9][A-Za-z0-9_]{6,62}[A-Za-z0-9]$ + description: Must be a valid RFC 1035 label name. This defines the DNS name via which the component + can be accessed over NBI. Access via serviceNameNB is restricted on specific ports. Platform + shall expose component access externally via this DNS name + ServiceNameEW: + type: string + pattern: ^[A-Za-z0-9][A-Za-z0-9_]{6,62}[A-Za-z0-9]$ + description: Must be a valid RFC 1035 label name. This defines the DNS name via which the component + can be accessed via peer components. Access via serviceNameEW is open on all ports. Platform + shall not expose serviceNameEW externally outside edge. + ComponentName: + type: string + pattern: ^[A-Za-z0-9][A-Za-z0-9_]{6,62}[A-Za-z0-9]$ + description: Must be a valid RFC 1035 label name. Component name must be unique with an application + ApplEventsSubsInfo: + type: object + required: + - appEventSubsId + - appEvtSubsStartTime + - appEvtSubsLastReportTime + - appEvtSubsNumApps + - appEvtSubsPeriodicity + properties: + appEventSubsId: + $ref: '#/components/schemas/EventSubscriptionIdentifier' + appEvtSubsStartTime: + $ref: '#/components/schemas/dateAndTimeZoneObject' + appEvtSubsLastReportTime: + $ref: '#/components/schemas/dateAndTimeZoneObject' + appEvtSubsNumApps: + type: integer + appEvtSubsPeriodicity: + $ref: '#/components/schemas/periodicityInterval' + AppsForNotif: + type: object + required: + - appId + - appProviderId + - appZones + - appEvents + properties: + appId: + $ref: '#/components/schemas/AppIdentifier' + appProviderId: + $ref: '#/components/schemas/AppProviderId' + appZones: + $ref: '#/components/schemas/AppZones' + appEvents: + $ref: '#/components/schemas/AppEvents' + AddAppsForNotif: + type: array + items: + $ref: '#/components/schemas/AppsForNotif' + minItems: 1 + RemoveAppsForNotif: + type: array + items: + $ref: '#/components/schemas/AppsForNotif' + minItems: 1 + AppEventTypes: + type: string + enum: + - evt_type_app_relocation + - evt_type_app_session_cont + - evt_type_app_restarts + - evt_type_app_upscale + - evt_type_app_downscale + description: Application-level events + AppEvents: + type: array + items: + $ref: '#/components/schemas/AppEventTypes' + minItems: 1 + description: List of availability zones where application events are to be monitored + AppZones: + type: array + items: + $ref: '#/components/schemas/ZoneIdentifier' + minItems: 1 + description: List of availability zones where application events are to be monitored + ApplInstEventTypeInfo: + type: object + required: + - applInstEvent + - applInstEventCount + properties: + applInstEvent: + $ref: '#/components/schemas/AppEventTypes' + applInstEventCount: + type: integer + description: Number of occurances of given epplication event + ApplInstEventsContainer: + type: object + required: + - appInstanceId + - appInstEventsList + properties: + appInstanceId: + $ref: '#/components/schemas/InstanceIdentifier' + appInstEventsList: + type: array + items: + $ref: '#/components/schemas/ApplInstEventTypeInfo' + minItems: 1 + description: Application instance events list + ApplInstEventsList: + type: object + required: + - appInstanceEventsList + properties: + appInstanceEventsList: + type: array + items: + $ref: '#/components/schemas/ApplInstEventsContainer' + minItems: 1 + description: Application instance events list for one or more applications + ZoneLevelApplEventsList: + type: object + required: + - zoneId + - appsEventsList + properties: + zoneId: + $ref: '#/components/schemas/ZoneIdentifier' + appsEventsList: + type: array + items: + $ref: '#/components/schemas/ApplInstEventsList' + minItems: 1 + description: Applications instance events list in a availability zone + ApplEventsList: + type: object + required: + - appId + - appProviderId + - aggrApplEvents + properties: + appId: + $ref: '#/components/schemas/AppIdentifier' + appProviderId: + $ref: '#/components/schemas/AppProviderId' + aggrApplEvents: + type: array + items: + $ref: '#/components/schemas/ZoneLevelApplEventsList' + minItems: 1 + description: Applications instance events list in a availability zone + AggrApplEventsList: + type: object + required: + - startTime + - endTime + - aggrAppsEventsList + properties: + startTime: + $ref: '#/components/schemas/dateAndTimeZoneObject' + endTime: + $ref: '#/components/schemas/dateAndTimeZoneObject' + aggrAppsEventsList: + type: array + items: + $ref: '#/components/schemas/ApplEventsList' + minItems: 1 + description: Applications events list in a various availability zones for different application + providers + ApplPolicyIdentifier: + type: string + pattern: ^[A-Za-z][A-Za-z0-9_]{7,63}$ + description: Application-level Policy unique identifier + ApplPolicyMetaInfo: + type: object + required: + - applPolicyTypeIdentifier + - policyVersion + properties: + applPolicyTypeIdentifier: + $ref: '#/components/schemas/ApplPolicyTypeIdentifier' + policyVersion: + type: string + description: Policy template version using Semantic Versioning 2.0.0 in MAJOR.MINOR.PATCH format + ApplPolicyTypeIdentifier: + type: string + pattern: ^[A-Za-z][A-Za-z0-9_]{7,63}$ + description: Application-level Policy unique identifier + AppPolicyTemplate: + type: object + required: + - applPolicyName + - applPolicyMetaInfo + - applPolicyType + - applPolicyScope + - applPolicyDescription + - applPolicyRules + properties: + applPolicyName: + type: string + maxLength: 64 + description: Brief policy template name on policy objective + applPolicyMetaInfo: + $ref: '#/components/schemas/ApplPolicyMetaInfo' + applPolicyType: + $ref: '#/components/schemas/ApplPolicyType' + applPolicyScope: + $ref: '#/components/schemas/ApplPolicyScope' + applPolicyDescription: + type: string + maxLength: 256 + description: Brief policy template description on policy objective + applPolicyRules: + type: array + items: + $ref: '#/components/schemas/ApplPolicyRule' + minItems: 1 + description: Set of policy action rules for a given policy + ApplPolicyTemplateList: + type: array + items: + $ref: '#/components/schemas/AppPolicyTemplate' + minItems: 1 + description: List of Application policy templates from the Partner OP + ApplPolicyType: + type: string + enum: + - static + - dynamic + description: Policy attribute that the given policy intent to control specific resources e.g. compute + capacity expansion statically vs dynamic scaling of app instance + ApplPolicyScope: + type: string + enum: + - zonal + - global + description: Application-level Policy scope defines if a policy is a set of availability zones or + applies globally to all zones + ApplPolicyRule: + type: array + items: + $ref: '#/components/schemas/GenericPolicyRule' + minItems: 1 + description: List of Application policies + GenericPolicyRule: + type: object + required: + - ruleLHSParamType + - ruleOperator + - ruleRHSParamVal + - ruleAction + - ruleDescription + properties: + ruleLHSParamType: + $ref: '#/components/schemas/RuleLHSParamType' + ruleOperator: + $ref: '#/components/schemas/RuleOperatorType' + ruleRHSParamVal: + $ref: '#/components/schemas/RuleRHSParamVal' + ruleAction: + $ref: '#/components/schemas/RuleActionType' + ruleDescription: + type: string + maxLength: 256 + description: Brief description of the actions to be performed + RuleLHSParamType: + type: string + enum: + - AppsPolicy.App.Metadata.QoS.Latency + - AppsPolicy.App.Metadata.Compute.CPU + - AppsPolicy.App.Metadata.Compute.GPU + - AppsPolicy.App.Metadata.Location.AZ + - AppsPolicy.App.Metadata.Location.Region + - OpsPolicy.EdgeCloud.Metadata.QoS.Latency + - OpsPolicy.EdgeCloud.Metadata.Compute.CPU + - OpsPolicy.EdgeCloud.Metadata.Compute.GPU + - OpsPolicy.EdgeCloud.Metadata.Network.SRIOV + description: Resource attributes that policy will act on to determine the target pplication after + applying the policy rules + RuleRHSParamVal: + type: object + properties: + latencyRanges: + $ref: '#/components/schemas/LatencyRanges' + computeResourceProfile: + $ref: '#/components/schemas/ComputeResourceProfile' + appLocation: + type: array + items: + $ref: '#/components/schemas/AppLocation' + minItems: 1 + networkCaps: + $ref: '#/components/schemas/NetworkCaps' + description: Permitted type specific value objects for types in ruleLHSParamType + AppLocation: + type: string + enum: + - zones + - regions + description: Application Location in terms of availability zones or regions + LatencyRanges: + type: object + required: + - minLatency + - maxLatency + - unit + properties: + minLatency: + type: string + description: Minimum latency in milliseconds + maxLatency: + type: string + description: Maximum latency in milliseconds + unit: + type: string + enum: + - MS + description: Maximum latency in milliseconds + description: Latency ranges that can be experienced in the Partner OP environment + ComputeResourceProfile: + type: object + required: + - resourceSpec + properties: + resourceSpec: + $ref: '#/components/schemas/ResourceSpec' + description: Type and amount of compute resources + ResourceSpec: + type: object + required: + - resourceType + - resourceModel + - resourceCount + properties: + resourceType: + type: string + enum: + - CPU + - GPU + - FPGA + resourceModel: + type: string + enum: + - Intel-x86_64 + - Arm64 + - Nvidia + resourceCount: + type: string + description: Resource type and architecture specification + NetworkCaps: + type: object + properties: + nwAccelType: + type: string + enum: + - SRIOV + - DPDK + nwAccelSpeed: + type: string + enum: + - 1Gbps + - 10Gbps + - 100Gbps + description: Type and speed of network acceleration resources + RuleOperatorType: + type: object + properties: + StringRuleOperatorType: + $ref: '#/components/schemas/StringRuleOperatorType' + BinaryRuleOperatorType: + $ref: '#/components/schemas/BinaryRuleOperatorType' + description: Defines the logical operations that policy rule will execute on application attribute + value + BinaryRuleOperatorType: + type: string + enum: + - EQ + - LT + - GT + description: Operations that can be applied on Parameter e.g., “Binary Operation” EQ(EQual) + StringRuleOperatorType: + type: string + enum: + - EQ + - NOTEQ + description: Operations that can be applied on Parameter e.g., String Operation” EQ(EQual), NOTEQ(Not + Equal) + RuleActionType: + type: object + required: + - actionType + - actionTargetType + properties: + actionType: + $ref: '#/components/schemas/ActionType' + actionTargetType: + $ref: '#/components/schemas/RuleLHSParamType' + ActionType: + type: string + enum: + - restrict + - prefer + - priortize + - allow + - deny + description: Action to be taken once a policy rule is applied on target resource indicated by RuleLHSParamType + ApplConcretePolicy: + type: object + required: + - policyId + - policyParamLimits + properties: + policyId: + $ref: '#/components/schemas/ApplPolicyIdentifier' + policyParamLimits: + $ref: '#/components/schemas/ApplPolicyRule' + description: Application policy id and policy parameter value limits registered by the Originating + OP + AssocApplPolicies: + type: object + required: + - policyId + - appIdList + properties: + policyId: + $ref: '#/components/schemas/ApplPolicyIdentifier' + appIdList: + $ref: '#/components/schemas/AppIdLocList' + AppIdLocList: + type: object + required: + - appId + - appProvId + properties: + appId: + $ref: '#/components/schemas/AppIdentifier' + appProvId: + $ref: '#/components/schemas/AppProviderId' + zoneIds: + type: array + items: + $ref: '#/components/schemas/ZoneIdentifier' + minItems: 1 + RegisteredAppPolicyList: + type: array + items: + $ref: '#/components/schemas/ApplConcretePolicy' + minItems: 1 + description: Applications policies registered by the Originating OP + OpsPolicyIdentifier: + type: string + pattern: ^[A-Za-z][A-Za-z0-9_]{7,63}$ + description: Operation-level Policy unique identifier + OpsPolicyTypeIdentifier: + type: string + pattern: ^[A-Za-z][A-Za-z0-9_]{7,63}$ + description: Operation-level Policy template unique identifier + OpslPolicyMetaInfo: + type: object + required: + - opslPolicyTypeIdentifier + - policyVersion + properties: + opslPolicyTypeIdentifier: + $ref: '#/components/schemas/OpsPolicyTypeIdentifier' + policyVersion: + type: string + description: Policy template version using Semantic Versioning 2.0.0 in MAJOR.MINOR.PATCH format + OpsPolicyTemplateList: + type: array + items: + $ref: '#/components/schemas/OpsPolicyTemplate' + minItems: 1 + description: List of Operation policy templates from the Partner OP + OpsConcretePolicy: + type: object + required: + - policyId + - policyParamLimits + properties: + policyId: + $ref: '#/components/schemas/OpsPolicyIdentifier' + policyParamLimits: + $ref: '#/components/schemas/OpsPolicyRule' + description: Application policy id and policy parameter value limits registered by the Originating + OP + OpsPolicyTemplate: + type: object + required: + - opsPolicyName + - OpslPolicyMetaInfo + - opsPolicyType + - opsPolicyScope + - opsPolicyDescription + - opsPolicyRules + properties: + opsPolicyName: + type: string + maxLength: 64 + description: Brief policy template name on policy objective + opslPolicyMetaInfo: + $ref: '#/components/schemas/OpslPolicyMetaInfo' + opsPolicyType: + $ref: '#/components/schemas/OpsPolicyType' + opsPolicyScope: + $ref: '#/components/schemas/OpsPolicyScope' + opsPolicyDescription: + type: string + maxLength: 256 + description: Brief policy template description on policy objective + opsPolicyRules: + type: array + items: + $ref: '#/components/schemas/OpsPolicyRule' + minItems: 1 + description: Set of policy action rules for a given policy + OpsPolicyRule: + type: object + properties: + opsPolicyRule: + $ref: '#/components/schemas/GenericPolicyRule' + description: Operation policies rule defines the action to be taken against the subscribed policy + template + OpsPolicyType: + type: string + enum: + - static + - dynamic + description: Policy attribute that defines if the policy rules applies to static part of the infra + or dynamic part of the edge cloud infra + OpsPolicyScope: + type: string + enum: + - zonal + - global + description: Operation-level Policy scope defines if a policy is a set of availability zones or + applies globally to all zones + AssocOpsPolicies: + type: object + required: + - policyId + - appIdList + properties: + policyId: + $ref: '#/components/schemas/OpsPolicyIdentifier' + appIdList: + $ref: '#/components/schemas/AppIdLocList' + AvailZoneIdLocList: + type: object + required: + - zoneIds + properties: + zoneIds: + type: array + items: + $ref: '#/components/schemas/ZoneIdentifier' + minItems: 1 + RegisteredOpsPolicyList: + type: array + items: + $ref: '#/components/schemas/OpsConcretePolicy' + minItems: 1 + description: Operation policies registered by the Originating OP + AppComponentSpecs: + description: An application may consist of more than one component. Each component is associated + with a descriptor and may exposes its services externally or internally. App providers are required + to provide details about all these components, their associated descriptors and their DNS names. + type: array + items: + type: object + required: + - artefactId + properties: + serviceNameNB: + $ref: '#/components/schemas/ServiceNameNB' + serviceNameEW: + $ref: '#/components/schemas/ServiceNameEW' + componentName: + $ref: '#/components/schemas/ComponentName' + artefactId: + $ref: '#/components/schemas/ArtefactId' + minItems: 1 + AppMetaData: + description: Application metadata details + type: object + required: + - appName + - version + - accessToken + properties: + appName: + type: string + pattern: ^[A-Za-z][A-Za-z0-9_]{7,31}$ + description: Name of the application. Application provider define a human readable name for + the application + version: + type: string + description: Version info of the application + appDescription: + type: string + minLength: 16 + maxLength: 256 + description: Brief application description provided by application provider + mobilitySupport: + $ref: '#/components/schemas/MobilitySupport' + accessToken: + type: string + pattern: ^[A-Za-z][A-Za-z0-9_]{31,63}$ + description: An application Access key, to be used with UNI interface to authorize UCs Access + to a given application + category: + type: string + enum: + - IOT + - HEALTH_CARE + - GAMING + - VIRTUAL_REALITY + - SOCIALIZING + - SURVEILLANCE + - ENTERTAINMENT + - CONNECTIVITY + - PRODUCTIVITY + - SECURITY + - INDUSTRIAL + - EDUCATION + - OTHERS + description: Possible categorization of the application + AppQoSProfile: + description: Parameters corresponding to the performance constraints, tenancy details etc. + type: object + required: + - latencyConstraints + properties: + latencyConstraints: + $ref: '#/components/schemas/LatencyConstraints' + bandwidthRequired: + $ref: '#/components/schemas/BandwidthRequired' + multiUserClients: + $ref: '#/components/schemas/MultiUserClients' + noOfUsersPerAppInst: + $ref: '#/components/schemas/NoOfUsersPerAppInst' + appProvisioning: + $ref: '#/components/schemas/AppProvisioning' + EdgeAppFQDN: + type: string + description: DNS FQDN assigned to application instances in an availability zone. User Clients can + resolve the FQDN to communicate with the edge instances of the application + ClientLocation: + type: object + minProperties: 1 + properties: + geo_location: + type: string + description: Latitude, Longitude as decimal fraction up to 4 digit precision + pattern: ^([-+]?)([\d]{1,2})(((\.)(\d+)(,)))(\s*)(([-+]?)([\d]{1,3})((\.)(\d+))?)$ + rad_location: + description: Information about the 4G/5G Cell ids where the client is currently served. + type: array + items: + type: object + required: + - carrier + - mcc + - mnc + - cellId + properties: + carrier: + type: string + enum: + - 5G + - LTE + mcc: + type: integer + minimum: 1 + maximum: 999 + description: Mobile country code of the network as broadcasted in the serving cell + mnc: + type: integer + minimum: 1 + maximum: 999 + description: Mobile network code of the network as broadcasted in the serving cell + cellId: + type: integer + description: it could be a CGI (if carrier is LTE) or NCGI (if carrier is 5G). + areaCode: + type: integer + description: Routing area code or Traffic area code where client is being served. + CompEnvParams: + description: Environment variables are key value pairs that should be injected when component in + instantiated + type: object + required: + - envVarName + - envValueType + properties: + envVarName: + type: string + pattern: ^[A-Za-z0-9][A-Za-z0-9_]{6,30}[A-Za-z0-9]$ + description: Name of environment variable + envValueType: + type: string + enum: + - USER_DEFINED + - PLATFORM_DEFINED_DYNAMIC_PORT + - PLATFORM_DEFINED_DNS + - PLATFORM_DEFINED_IP + envVarValue: + type: string + pattern: ^[A-Za-z0-9][A-Za-z0-9_]{6,62}[A-Za-z0-9]$ + description: Value to be assigned to environment variable + envVarSrc: + type: string + description: Full path of parameter from componentSpec that should be used to generate the environment + value. Eg. networkResourceProfile[1]. interfaceId. + CommandLineParams: + description: List of commands and arguments that shall be invoked when the component instance is + created. This is valid only for container based deployment. + type: object + required: + - command + properties: + command: + type: array + items: + type: string + description: List of commands that application should invoke when an instance is created. + commandArgs: + type: array + items: + type: string + description: List of arguments required by the command. + DeploymentConfig: + description: Configuration used when deploying a component. May override other ComponentSpec parameters + related to deployment like restart policy, command line parameters, environment variables, etc. + type: object + required: + - configType + - contents + properties: + configType: + type: string + enum: + - DOCKER_COMPOSE + - KUBERNETES_MANIFEST + - CLOUD_INIT + - HELM_VALUES + description: Config type. + contents: + type: string + description: Contents of the configuration. + ComponentSpec: + description: Details about compute, networking and storage requirements for each component of the + application. App provider should define all information needed to instantiate the component. If + artefact is being defined at component level this section should have information just about the + component. In case the artefact is being defined at application level the section should provide + details about all the components. + type: object + required: + - componentName + - images + - numOfInstances + - restartPolicy + - computeResourceProfile + properties: + componentName: + type: string + pattern: ^[A-Za-z0-9][A-Za-z0-9_]{6,62}[A-Za-z0-9]$ + description: Must be a valid RFC 1035 label name. Component name must be unique with an application + images: + description: List of all images associated with the component. Images are specified using the + file identifiers. Partner OP provides these images using file upload api. + type: array + items: + $ref: '#/components/schemas/FileId' + minItems: 1 + numOfInstances: + type: integer + format: int32 + description: Number of component instances to be launched. + restartPolicy: + type: string + enum: + - RESTART_POLICY_ALWAYS + - RESTART_POLICY_NEVER + description: How the platform shall handle component failure + commandLineParams: + $ref: '#/components/schemas/CommandLineParams' + exposedInterfaces: + description: Each application component exposes some ports either for external users or for + inter component communication. Application provider is required to specify which ports are + to be exposed and the type of traffic that will flow through these ports. + type: array + items: + $ref: '#/components/schemas/InterfaceDetails' + minItems: 1 + computeResourceProfile: + $ref: '#/components/schemas/ComputeResourceInfo' + compEnvParams: + type: array + items: + $ref: '#/components/schemas/CompEnvParams' + deploymentConfig: + $ref: '#/components/schemas/DeploymentConfig' + persistentVolumes: + description: The ephemeral volume a container process may need to temporary store internal data + type: array + items: + $ref: '#/components/schemas/PersistentVolumeDetails' + minItems: 1 + ComputeResourceInfo: + type: object + required: + - cpuArchType + - numCPU + - memory + properties: + cpuArchType: + type: string + enum: + - ISA_X86_64 + - ISA_ARM_64 + description: CPU Instruction Set Architecture (ISA) E.g., Intel, Arm etc. + numCPU: + $ref: '#/components/schemas/Vcpu' + memory: + type: integer + format: int64 + description: Amount of RAM in Mbytes + diskStorage: + type: integer + format: int32 + description: Amount of disk storage in Gbytes for a given ISA type + gpu: + type: array + items: + $ref: '#/components/schemas/GpuInfo' + vpu: + type: integer + description: Number of Intel VPUs available for a given ISA type + fpga: + type: integer + description: Number of FPGAs available for a given ISA type + hugepages: + type: array + items: + $ref: '#/components/schemas/HugePage' + cpuExclusivity: + type: boolean + description: Support for exclusive CPUs + nodeDiscoveryResponse: + type: object + required: + - edgeNodes + - discoveredAppInsts + properties: + edgeNodes: + $ref: '#/components/schemas/DiscoveredEdgeNodes' + discoveredAppInsts: + $ref: '#/components/schemas/DiscoveredAppInsts' + description: Candidate availability zones and details of already running instances of the given + application + DiscoveredEdgeNodes: + type: array + items: + type: object + required: + - zoneId + - latencyServiceEndPoints + properties: + zoneId: + $ref: '#/components/schemas/ZoneIdentifier' + latencyServiceEndPoints: + $ref: '#/components/schemas/ServiceEndpoint' + minItems: 1 + description: List of candidate zones where application instance could be created. LatencyServiceEndpoint + is responsible for responding to latency measurement request from client + DiscoveredAppInsts: + type: array + items: + type: object + required: + - appId + - appProviderId + - appInstances + properties: + appId: + $ref: '#/components/schemas/AppIdentifier' + appProviderId: + $ref: '#/components/schemas/AppProviderId' + appInstances: + type: array + items: + type: object + required: + - instancesInfo + properties: + instancesInfo: + type: object + required: + - zoneId + - appProviderId + properties: + zoneId: + $ref: '#/components/schemas/ZoneIdentifier' + instanceDetails: + $ref: '#/components/schemas/InstanceDetails' + minItems: 1 + InstanceDetails: + type: array + items: + type: object + required: + - appInstanceInfo + properties: + appInstanceInfo: + type: object + required: + - instanceIdentifier + - instanceState + properties: + instanceIdentifier: + $ref: '#/components/schemas/InstanceIdentifier' + instancestate: + $ref: '#/components/schemas/InstanceState' + minItems: 1 + FederationRequestData: + type: object + required: + - initialDate + - partnerStatusLink + properties: + origOPFederationId: + $ref: '#/components/schemas/FederationIdentifier' + origOPCountryCode: + $ref: '#/components/schemas/CountryCode' + origOPMobileNetworkCodes: + $ref: '#/components/schemas/MobileNetworkIds' + origOPFixedNetworkCodes: + $ref: '#/components/schemas/FixedNetworkIds' + initialDate: + type: string + format: date-time + description: Time zone info of the federation initiated by the originating OP + partnerStatusLink: + $ref: '#/components/schemas/Uri' + FederationResponseData: + type: object + required: + - federationContextId + - platformCaps + properties: + partnerOPFederationId: + $ref: '#/components/schemas/FederationIdentifier' + partnerOPCountryCode: + $ref: '#/components/schemas/CountryCode' + federationContextId: + $ref: '#/components/schemas/FederationContextId' + edgeDiscoveryServiceEndPoint: + $ref: '#/components/schemas/ServiceEndpoint' + lcmServiceEndPoint: + $ref: '#/components/schemas/ServiceEndpoint' + partnerOPMobileNetworkCodes: + $ref: '#/components/schemas/MobileNetworkIds' + partnerOPFixedNetworkCodes: + $ref: '#/components/schemas/FixedNetworkIds' + offeredAvailabilityZones: + type: array + items: + $ref: '#/components/schemas/ZoneDetails' + minItems: 1 + description: List of zones, which the operator platform wishes to make available to developers/ISVs + of requesting operator platform. + platformCaps: + $ref: '#/components/schemas/PlatformCaps' + federationExpiryDate: + type: string + format: date-time + description: Date and Time zone info of the existing federation expiry + federationRenewalDate: + type: string + format: date-time + description: Date and Time zone info of the existing federation renewal. Shall be less than + federationExpiryDate + dateAndTimeZoneObject: + type: string + format: date-time + description: Date and Time zone info format + Flavour: + type: object + required: + - flavourId + - cpuArchType + - supportedOSTypes + - numCPU + - memorySize + - storageSize + properties: + flavourId: + $ref: '#/components/schemas/FlavourId' + cpuArchType: + $ref: '#/components/schemas/CPUArchType' + supportedOSTypes: + description: A list of operating systems which this flavour configuration can support e.g., + RHEL Linux, Ubuntu 18.04 LTS, MS Windows 2012 R2. + type: array + items: + $ref: '#/components/schemas/OSType' + minItems: 1 + numCPU: + type: integer + format: int32 + description: Number of available vCPUs + memorySize: + type: integer + format: int32 + description: Amount of RAM in Mbytes + storageSize: + type: integer + format: int32 + description: Amount of disk storage in Gbytes + gpu: + type: array + items: + $ref: '#/components/schemas/GpuInfo' + fpga: + type: integer + format: int32 + description: Number of FPGAs + vpu: + type: integer + description: Number of Intel VPUs available + hugepages: + type: array + items: + $ref: '#/components/schemas/HugePage' + cpuExclusivity: + type: boolean + description: Support for exclusive CPUs + GpuInfo: + type: object + required: + - gpuVendorType + - gpuModeName + - gpuMemory + - numGPU + properties: + gpuVendorType: + type: string + enum: + - GPU_PROVIDER_NVIDIA + - GPU_PROVIDER_AMD + description: GPU vendor name e.g. NVIDIA, AMD etc. + example: Nvidia + gpuModeName: + type: string + description: Model name corresponding to vendorType may include info e.g. for NVIDIA, model + name could be “Tesla M60”, “Tesla V100” etc. + gpuMemory: + type: integer + description: GPU memory in Mbytes + numGPU: + type: integer + description: Number of GPUs + HugePage: + type: object + required: + - pageSize + - number + properties: + pageSize: + type: string + enum: + - 2MB + - 4MB + - 1GB + description: Size of hugepage + number: + type: integer + description: Total number of huge pages + InterfaceDetails: + type: object + required: + - interfaceId + - commProtocol + - commPort + - visibilityType + properties: + interfaceId: + type: string + description: Each Port and corresponding traffic protocol exposed by the component is identified + by a name. Application client on user device requires this to uniquely identify the interface. + pattern: ^[A-Za-z0-9][A-Za-z0-9_]{6,30}[A-Za-z0-9]$ + commProtocol: + type: string + enum: + - TCP + - UDP + - HTTP_HTTPS + description: Defines the IP transport communication protocol i.e., TCP, UDP or HTTP + commPort: + type: integer + format: int32 + minimum: 1 + maximum: 65535 + description: Port number exposed by the component. OP may generate a dynamic port towards the + UCs corresponding to this internal port and forward the client traffic from dynamic port to + container Port. + visibilityType: + description: Defines whether the interface is exposed to outer world or not i.e., external, + or internal. If this is set to "external", then it is exposed to external applications otherwise + it is exposed internally to edge application components within edge cloud. When exposed to + external world, an external dynamic port is assigned for UC traffic and mapped to the internal + container Port + type: string + enum: + - VISIBILITY_EXTERNAL + - VISIBILITY_INTERNAL + network: + type: string + pattern: ^[A-Za-z][A-Za-z0-9_]{6,30}[A-Za-z0-9]$ + description: Name of the network. In case the application has to be associated with more than + 1 network then app provider must define the name of the network on which this interface has + to be exposed. This parameter is required only if the port has to be exposed on a specific + network other than default. + InterfaceName: + type: string + pattern: ^[a-z][a-z0-9]{3}$ + description: Interface Name. Required only if application has to be attached to a network other + than default. + InvalidParam: + type: object + properties: + param: + type: string + reason: + type: string + required: + - param + MobileNetworkIds: + type: object + properties: + mcc: + $ref: '#/components/schemas/Mcc' + mncs: + type: array + items: + $ref: '#/components/schemas/Mnc' + minItems: 1 + ObjectRepoLocation: + type: object + properties: + repoURL: + $ref: '#/components/schemas/Uri' + userName: + type: string + description: Username to access the repository + password: + type: string + description: Password to access the repository + token: + type: string + description: Authorization token to access the repository + OSType: + type: object + required: + - architecture + - distribution + - version + - license + properties: + architecture: + type: string + enum: + - x86_64 + - x86 + example: x86_64 + distribution: + type: string + enum: + - RHEL + - UBUNTU + - COREOS + - FEDORA + - WINDOWS + - OTHER + version: + type: string + enum: + - OS_VERSION_UBUNTU_2204_LTS + - OS_VERSION_RHEL_8 + - OS_VERSION_RHEL_7 + - OS_VERSION_DEBIAN_11 + - OS_VERSION_COREOS_STABLE + - OS_MS_WINDOWS_2012_R2 + - OTHER + license: + type: string + enum: + - OS_LICENSE_TYPE_FREE + - OS_LICENSE_TYPE_ON_DEMAND + - NOT_SPECIFIED + RepoType: + type: string + enum: + - PRIVATEREPO + - PUBLICREPO + - UPLOAD + description: Artefact or file repository location. PUBLICREPO is used of public URLs like GitHub, + Helm repo, docker registry etc., PRIVATEREPO is used for private repo managed by the application + developer, UPLOAD is for the case when artefact/file is uploaded from MEC web portal. OP should + pull the image from ‘repoUrl' immediately after receiving the request and then send back the response. + In case the repoURL corresponds to a docker registry, use docker v2 http api to do the pull. + ArtefactName: + type: string + pattern: ^[A-Za-z][A-Za-z0-9_]{7,31}$ + description: Name of the artefact. + ArtefactVersionInfo: + type: string + description: Artefact version information + ArtefactDescription: + type: string + maxLength: 256 + description: Brief description of the artefact by the application provider + ArtefactVirtType: + type: string + enum: + - VM_TYPE + - CONTAINER_TYPE + ArtefactFileName: + type: string + minLength: 8 + maxLength: 32 + description: Name of the file. + ArtefactFileFormat: + type: string + enum: + - ZIP + - TAR + - TEXT + - TARGZ + description: Artefacts like Helm charts or Terraform scripts may need compressed format. + ArtefactDescriptorType: + type: string + enum: + - HELM + - TERRAFORM + - ANSIBLE + - SHELL + - COMPONENTSPEC + description: Type of descriptor present in the artefact. App provider can either define either + a Helm chart or a Terraform script or container spec. + LatencyConstraints: + type: string + enum: + - NONE + - LOW + - ULTRALOW + description: Latency requirements for the application.Allowed values (non-standardized) are none, + low and ultra-low. Ultra-Low may corresponds to range 15 - 30 msec, Low correspond to range 30 + - 50 msec. None means 51 and above + BandwidthRequired: + type: integer + format: int32 + minimum: 1 + description: Data transfer bandwidth requirement (minimum limit) for the application. It should + in Mbits/sec + MobilitySupport: + type: boolean + default: false + description: Indicates if an application is sensitive to user mobility and can be relocated. Default + is “FALSE” + MultiUserClients: + type: string + enum: + - APP_TYPE_SINGLE_USER + - APP_TYPE_MULTI_USER + description: Single user type application are designed to serve just one client. Multi user type + application is designed to serve multiple clients + NoOfUsersPerAppInst: + type: integer + default: 1 + description: Maximum no of clients that can connect to an instance of this application. This parameter + is relevant only for application of type multi user + AppProvisioning: + type: boolean + default: true + description: Define if application can be instantiated or not + AppComponents: + description: An application may consist of more than one component. Each component is associated + with a descriptor and may exposes its services externally or internally. App providers are required + to provide details about all these components, their associated descriptors and their DNS names. + type: array + items: + type: object + required: + - componentName + anyOf: + - required: + - serviceNameNB + - required: + - serviceNameEW + - required: + - artefactId + properties: + serviceNameNB: + $ref: '#/components/schemas/ServiceNameNB' + serviceNameEW: + $ref: '#/components/schemas/ServiceNameEW' + componentName: + $ref: '#/components/schemas/ComponentName' + artefactId: + $ref: '#/components/schemas/ArtefactId' + minItems: 1 + PersistentVolumeDetails: + type: object + required: + - volumeSize + - volumeMountPath + - volumeName + properties: + volumeSize: + type: string + enum: + - 10Gi + - 20Gi + - 50Gi + - 100Gi + description: size of the volume given by user (10GB, 20GB, 50 GB or 100GB) + volumeMountPath: + type: string + description: Defines the mount path of the volume + volumeName: + type: string + description: Human readable name for the volume + ephemeralType: + type: boolean + default: false + description: It indicates the ephemeral storage on the node and contents are not preserved if + containers restarts + accessMode: + type: string + enum: + - RW + - RO + default: RW + description: Values are RW (read/write) and RO (read-only)l + sharingPolicy: + type: string + enum: + - EXCLUSIVE + - SHARED + default: EXCLUSIVE + description: Exclusive or Shared. If shared, then in case of multiple containers same volume + will be shared across the containers. + ProblemDetails: + type: object + properties: + title: + type: string + description: Summary of the problem + detail: + type: string + description: Specific detail of the issue + cause: + type: string + description: Fixed string indicating cause of the issue + invalidParams: + type: array + items: + $ref: '#/components/schemas/InvalidParam' + minItems: 0 + ResourceReservationDuration: + description: Time period for which resources are to be reserved starting from now + type: object + minProperties: 1 + properties: + numOfDays: + type: integer + format: int32 + description: Number of days to be reserved + numOfMonths: + type: integer + format: int32 + description: Number of months to be reserved + numOfYears: + type: integer + format: int32 + description: Number of years to be reserved + ServiceEndpoint: + type: object + required: + - port + anyOf: + - required: + - fqdn + - required: + - ipv4Addresses + - required: + - ipv6Addresses + properties: + port: + $ref: '#/components/schemas/Port' + fqdn: + $ref: '#/components/schemas/EdgeAppFQDN' + ipv4Addresses: + type: array + items: + $ref: '#/components/schemas/Ipv4Addr' + minItems: 1 + ipv6Addresses: + type: array + items: + $ref: '#/components/schemas/Ipv6Addr' + minItems: 1 + ZoneDetails: + type: object + required: + - zoneId + - geographyDetails + properties: + zoneId: + $ref: '#/components/schemas/ZoneIdentifier' + geolocation: + $ref: '#/components/schemas/GeoLocation' + geographyDetails: + type: string + description: Details about cities or state covered by the edge. Details about the type of locality + for eg rural, urban, industrial etc. This information is defined in human readable form. + ZoneRegistrationRequestData: + type: object + required: + - acceptedAvailabilityZones + properties: + acceptedAvailabilityZones: + type: array + items: + $ref: '#/components/schemas/ZoneIdentifier' + minItems: 1 + availZoneNotifLink: + $ref: '#/components/schemas/Uri' + ZoneRegistrationResponseData: + type: object + required: + - acceptedZoneResourceInfo + properties: + acceptedZoneResourceInfo: + type: array + items: + $ref: '#/components/schemas/ZoneRegisteredData' + minItems: 1 + ZoneRegisteredData: + type: object + required: + - zoneId + - reservedComputeResources + - computeResourceQuotaLimits + - flavoursSupported + properties: + zoneId: + $ref: '#/components/schemas/ZoneIdentifier' + reservedComputeResources: + description: Resources exclusively reserved for the originator OP. + type: array + items: + $ref: '#/components/schemas/ComputeResourceInfo' + minItems: 1 + computeResourceQuotaLimits: + description: Max quota on resources partner OP allows over reserved resources. + type: array + items: + $ref: '#/components/schemas/ComputeResourceInfo' + minItems: 1 + flavoursSupported: + type: array + items: + $ref: '#/components/schemas/Flavour' + minItems: 1 + networkResources: + type: object + required: + - egressBandWidth + - dedicatedNIC + - supportSriov + - supportDPDK + properties: + egressBandWidth: + type: integer + format: int32 + description: Max dl throughput that this edge can offer. It is defined in Mbps. + dedicatedNIC: + type: integer + format: int32 + description: Number of network interface cards which can be dedicatedly assigned to application + pods on isolated networks. This includes virtual as well physical NICs + supportSriov: + type: boolean + description: If this zone support SRIOV networks or not + supportDPDK: + type: boolean + description: If this zone supports DPDK based networking. + zoneServiceLevelObjsInfo: + type: object + description: It is a measure of the actual amount of data that is being sent over a network + per unit of time and indicates máximum supported value for a zone + required: + - latencyRanges + - jitterRanges + - throughputRanges + properties: + latencyRanges: + type: object + properties: + minLatency: + type: integer + format: int32 + minimum: 1 + description: The time for data/packet to reach from UC to edge application. It represent + mínimum latency in milli seconds that may exist between UCs and edge apps in this + zone but it can be higher in actual. + maxLatency: + type: integer + format: int32 + description: The maximum limit of latency between UC and Edge App in milli seconds. + jitterRanges: + type: object + properties: + minJitter: + type: integer + format: int32 + minimum: 1 + maxJitter: + type: integer + format: int32 + description: The maximum limit of network jitter between UC and Edge App in milli seconds. + throughputRanges: + type: object + properties: + minThroughput: + type: integer + format: int32 + minimum: 1 + description: The minimum limit of network throughput between UC and Edge App in Mega + bits per seconds (Mbps). + maxThroughput: + type: integer + format: int32 + description: The maximum limit of network throughput between UC and Edge App in Mega + bits per seconds (Mbps). + responses: + '400': + description: Bad request + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + '401': + description: Unauthorized + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + '404': + description: Not Found + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + '409': + description: Conflict + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + '412': + description: Precondition Failed + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + '422': + description: Unprocessable Entity + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + '500': + description: Internal Server Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + '501': + description: Not Implemented + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + '503': + description: Service Unavailable + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + '520': + description: Web Server Returned an Unknown Error + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + 400BadRequest: + description: Bad request + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + examples: + InvalidFedParameters: + description: Sufficient parameters must be specified to allow the partner OP to validate + federation request + value: + title: Insufficient parameters + details: Incorrect values received in federation request + cause: INVALID_FED_RQST_PARAMS + 404NotFound: + description: Resource Not Found + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ProblemDetails' + examples: + FederationContextNotFound: + description: Federation context does not exist + value: + title: Federation context Id not found + details: Partner OP does not recognize the federationContextId from Originating OP + cause: INVALID_FED_CTX_ID + FederationNotFound: + description: Federation terminated parmanently + value: + title: Federation context Id not found + details: Partner OP does not recognize the federationContextId from Originating OP + cause: FED_PERMANENTLY_TERMINAT + ZoneNotFound: + description: Zone Not Found + value: + title: Requested Zone Id not found + details: Requested zone by the Originating OP does not exist with Partner OP + cause: ZONE_ID_NOT_FOUND + AppNotFound: + description: Application Not Found + value: + title: Requested Application Id not found + details: Requested Application by the Originating OP does not exist with Partner OP + cause: APP_ID_NOT_FOUND + AppInstNotFound: + description: Application Instance Not Found + value: + title: Requested App instance Id not found + details: Requested application instance by the Originating OP does not exist with Partner + OP + cause: APP_INST_NOT_FOUND + default: + description: Generic Error +paths: + /federation-resources: + get: + summary: Retrieves REST APIs supported by an OP for federation services. + operationId: GetFederationAPIs + tags: + - FederationAPIManagement + responses: + '200': + description: Federation meta-info request accepted + content: + application/json: + schema: + type: object + required: + - federationSupportedAPIs + properties: + federationSupportedAPIs: + $ref: '#/components/schemas/FederationSupportedAPIs' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /partner: + post: + summary: Creates one direction federation with partner operator platform. + operationId: CreateFederation + tags: + - FederationManagement + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/FederationRequestData' + responses: + '200': + description: Federation meta-info request accepted + content: + application/json: + schema: + $ref: '#/components/schemas/FederationResponseData' + headers: + Location: + description: 'Contains the URI of the newly created resource, according to the structure: + {apiRoot}/operatorplatform/federation/v1/partner/{federationContextId}' + required: true + schema: + type: string + Accept-Encoding: + description: Accept-Encoding, described in IETF RFC 7694 + schema: + type: string + Content-Encoding: + description: Content-Encoding, described in IETF RFC 7231 + schema: + type: string + '400': + $ref: '#/components/responses/400BadRequest' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + callbacks: + onPartnerStatusEvent: + '{$request.body#/partnerStatusLink }': + post: + requestBody: + description: 'OP uses this callback api to notify partner OP about change in federation + status, federation metadata or offered zone details. Allowed combinations of objectType + and operationType are + + - FEDERATION - STATUS: Status specified by parameter ''federationStatus''. + + - ZONES - STATUS: Status specified by parameter ''zoneStatus''. + + - ZONES - ADD: Use parameter ''addZones'' to define add new zones + + - ZONES - REMOVE: Use parameter ''removeZones'' to define remove zones. + + - EDGE_DISCOVERY_SERVICE - UPDATE: Use parameter ''edgeDiscoverySvcEndPoint'' to specify + new endpoints + + - LCM_SERVICE - UPDATE: Use parameter ''lcmSvcEndPoint'' to specify new endpoints + + - MOBILE_NETWORK_CODES - ADD: Use parameter ''addMobileNetworkIds'' to define new mobile + network codes. + + - MOBILE_NETWORK_CODES - REMOVE: Use parameter ''removeMobileNetworkIds'' to remove + mobile network codes. + + - FIXED_NETWORK_CODES - ADD: Use parameter ''addFixedNetworkIds'' to define new fixed + network codes. + + - FIXED_NETWORK_CODES - REMOVE: Use parameter ''removeFixedNetworkIds'' to remove fixed + network codes. + + - SERVICE_APIS - ADD/REMOVE: Parameter Usage ''addServiceAPIs / removeServiceAPIs'' + to add or remove Service APIs support. + + ' + content: + application/json: + schema: + type: object + required: + - federationContextId + - objectType + - operationType + - modificationDate + properties: + federationContextId: + $ref: '#/components/schemas/FederationContextId' + objectType: + type: string + enum: + - FEDERATION + - ZONES + - EDGE_DISCOVERY_SERVICE + - LCM_SERVICE + - MOBILE_NETWORK_CODES + - FIXED_NETWORK_CODES + - SERVICE_APIS + operationType: + type: string + enum: + - STATUS + - UPDATE + - ADD + - REMOVE + edgeDiscoverySvcEndPoint: + $ref: '#/components/schemas/ServiceEndpoint' + lcmSvcEndPoint: + $ref: '#/components/schemas/ServiceEndpoint' + addMobileNetworkIds: + $ref: '#/components/schemas/MobileNetworkIds' + removeMobileNetworkIds: + $ref: '#/components/schemas/MobileNetworkIds' + addFixedNetworkIds: + $ref: '#/components/schemas/FixedNetworkIds' + removeFixedNetworkIds: + $ref: '#/components/schemas/FixedNetworkIds' + addZones: + type: array + items: + $ref: '#/components/schemas/ZoneDetails' + description: List of zones, which the operator platform wishes to make available + to developers/ISVs of requesting operator platform. + minItems: 1 + removeZones: + type: array + items: + $ref: '#/components/schemas/ZoneIdentifier' + description: List of zones, which the operator platform no longer wishes to + share. + minItems: 1 + addServiceAPIs: + $ref: '#/components/schemas/serviceAPINames' + removeServiceAPIs: + $ref: '#/components/schemas/serviceAPINames' + zoneStatus: + type: array + items: + type: object + required: + - zoneId + - status + properties: + zoneId: + $ref: '#/components/schemas/ZoneIdentifier' + status: + $ref: '#/components/schemas/Status' + minItems: 1 + federationStatus: + $ref: '#/components/schemas/Status' + modificationDate: + type: string + format: date-time + description: Date and time of the federation modification by the originating + partner OP + responses: + '204': + description: Expected response to a successful call back processing + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + security: + - notifClientCredentials: + - fed-mgmt-notif + /{federationContextId}/partner: + get: + summary: Retrieves details about the federation context with the partner OP. The response shall + provide info about the zones offered by the partner, partner OP network codes, information about + edge discovery and LCM service etc. + operationId: GetFederationDetails + tags: + - FederationManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + responses: + '200': + description: Federation meta-info request accepted + content: + application/json: + schema: + type: object + properties: + edgeDiscoveryServiceEndPoint: + $ref: '#/components/schemas/ServiceEndpoint' + lcmServiceEndPoint: + $ref: '#/components/schemas/ServiceEndpoint' + allowedMobileNetworkIds: + $ref: '#/components/schemas/MobileNetworkIds' + allowedFixedNetworkIds: + $ref: '#/components/schemas/FixedNetworkIds' + offeredAvailabilityZones: + type: array + items: + $ref: '#/components/schemas/ZoneDetails' + minItems: 1 + platformCaps: + $ref: '#/components/schemas/PlatformCaps' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + patch: + summary: API used by the Originating OP towards the partner OP, to update the parameters associated + to the existing federation + operationId: UpdateFederation + tags: + - FederationManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + requestBody: + required: true + description: Details about changes origination OP wished to apply + content: + application/json: + schema: + type: object + required: + - objectType + - operationType + - modificationDate + properties: + objectType: + type: string + enum: + - MOBILE_NETWORK_CODES + - FIXED_NETWORK_CODES + - OPS_POLICY + - APP_POLICY + operationType: + type: string + enum: + - ADD_CODES + - REMOVE_CODES + - UPDATE_CODES + - ADD_POLICY + - REMOVE_POLICY + - UPDATE_POLICY + addMobileNetworkIds: + $ref: '#/components/schemas/MobileNetworkIds' + removeMobileNetworkIds: + $ref: '#/components/schemas/MobileNetworkIds' + addFixedNetworkIds: + $ref: '#/components/schemas/FixedNetworkIds' + removeFixedNetworkIds: + $ref: '#/components/schemas/FixedNetworkIds' + assocAppPolicies: + $ref: '#/components/schemas/AssocApplPolicies' + assocOpsPolicies: + $ref: '#/components/schemas/AssocOpsPolicies' + modificationDate: + type: string + format: date-time + description: Date and time of the federation modification by the originating partner + OP + responses: + '200': + description: Federation meta-info request accepted + content: + application/json: + schema: + type: object + properties: + edgeDiscoveryServiceEndPoint: + $ref: '#/components/schemas/ServiceEndpoint' + lcmServiceEndPoint: + $ref: '#/components/schemas/ServiceEndpoint' + allowedMobileNetworkIds: + $ref: '#/components/schemas/MobileNetworkIds' + allowedFixedNetworkIds: + $ref: '#/components/schemas/FixedNetworkIds' + offeredAvailabilityZones: + type: array + items: + $ref: '#/components/schemas/ZoneDetails' + minItems: 1 + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + delete: + summary: Remove existing federation with the partner OP + operationId: DeleteFederationDetails + tags: + - FederationManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + responses: + '200': + description: Federation removed successfully + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /fed-context-id: + get: + summary: Retrieves the existing federationContextId with partner operator platform. + operationId: GetFederationContextId + tags: + - FederationManagement + responses: + '200': + description: Federation context identifier retrieval request accepted + content: + application/json: + schema: + type: object + required: + - FederationContextId + properties: + FederationContextId: + $ref: '#/components/schemas/FederationContextId' + headers: + Location: + description: 'Contains the URI of the existing resource, according to the structure: {apiRoot}/operatorplatform/federation/v1/partner/{federationContextId}' + required: true + schema: + type: string + Accept-Encoding: + description: Accept-Encoding, described in IETF RFC 7694 + schema: + type: string + Content-Encoding: + description: Content-Encoding, described in IETF RFC 7231 + schema: + type: string + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/health: + get: + summary: Retrieves health status of the federation context with the Partner OP. + operationId: GetFederationHealth + tags: + - FederationManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + responses: + '200': + description: Federation health status information object + content: + application/json: + schema: + type: object + required: + - federationHealthStatus + properties: + federationHealthStatus: + $ref: '#/components/schemas/FederationHealthInfo' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/renew: + post: + summary: API used by the Originating OP to renew the existing federation + operationId: RenewFederation + tags: + - FederationManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + responses: + '200': + description: Federation renewal request accepted + content: + application/json: + schema: + type: object + required: + - FederationContextId + - federationRenewalDate + - federationExpiryDate + properties: + FederationContextId: + $ref: '#/components/schemas/FederationContextId' + federationRenewalDate: + $ref: '#/components/schemas/dateAndTimeZoneObject' + federationExpiryDate: + $ref: '#/components/schemas/dateAndTimeZoneObject' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/platform-caps: + get: + summary: Retrieves details about OP capabilities of the federated partner. + operationId: GetPlatformCapabilities + tags: + - FederationManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: capType + in: query + required: false + schema: + $ref: '#/components/schemas/CapabilityID' + responses: + '200': + description: Federation meta-info request accepted + content: + application/json: + schema: + type: object + anyOf: + - required: + - deviceConnStatusChangeCap + - required: + - locationRetrievalCap + - required: + - userPlaneMgmtEvtCap + - required: + - dynamicQoSCap + properties: + deviceConnStatusChangeCap: + $ref: '#/components/schemas/DeviceConnStatusChangeCap' + locationRetrievalCap: + $ref: '#/components/schemas/LocationRetrievalCap' + userPlaneMgmtEvtCap: + $ref: '#/components/schemas/UserPlaneMgmtEvtCap' + dynamicQoSCap: + $ref: '#/components/schemas/DynamicQoSCap' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/partner/service/{serviceType}: + get: + summary: Retrieves the list of Service APIs and associated information that a partner OP supports + operationId: GetServiceAPIsDetails + tags: + - FederationManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: serviceType + in: path + required: true + schema: + $ref: '#/components/schemas/serviceType' + responses: + '200': + description: List of Service APIs names and associated configuration info as supported capabilities + content: + application/json: + schema: + type: object + required: + - ServiceType + - serviceCaps + - apiRoutingInfo + properties: + serviceCaps: + $ref: '#/components/schemas/serviceAPINames' + serviceType: + $ref: '#/components/schemas/serviceType' + apiRoutingInfo: + $ref: '#/components/schemas/serviceRoutingInfo' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/zones: + get: + summary: Retrieves details about the computation and network resources that partner OP has reserved + for this zone. + operationId: GetZoneData + tags: + - AvailabilityZoneInfoSynchronization + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: zoneId + in: query + required: false + schema: + $ref: '#/components/schemas/ZoneIdentifier' + responses: + '200': + description: Zone metadata + content: + application/json: + schema: + $ref: '#/components/schemas/ZoneRegisteredData' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + post: + summary: Originating OP informs partner OP that it is willing to access the specified zones and + partner OP shall reserve compute and network resources for these zones. + operationId: ZoneSubscribe + tags: + - AvailabilityZoneInfoSynchronization + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ZoneRegistrationRequestData' + required: true + responses: + '200': + description: Zone registered successfully + content: + application/json: + schema: + $ref: '#/components/schemas/ZoneRegistrationResponseData' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + callbacks: + onZoneResourceUpdateEvent: + '{$request.body#/availZoneNotifLink}': + post: + requestBody: + description: Notification about resource availability. + content: + application/json: + schema: + type: object + required: + - federationContextId + - zoneId + - zoneResUpdInfo + properties: + federationContextId: + $ref: '#/components/schemas/FederationIdentifier' + zoneId: + $ref: '#/components/schemas/ZoneIdentifier' + zoneResUpdInfo: + type: array + items: + type: object + minProperties: 1 + properties: + availableCompResources: + description: Resources exclusively reserved for the originator OP. + type: array + items: + $ref: '#/components/schemas/ComputeResourceInfo' + minItems: 1 + availableNetResources: + type: object + properties: + egressBandWidth: + type: integer + format: int32 + description: Max dl throughput that this edge can offer. It is defined + in Mbps. + dedicatedNIC: + type: integer + format: int32 + supportSriov: + type: boolean + description: If this zone support SRIOV networks or not + supportDPDK: + type: boolean + description: If this zone supports DPDK based networking + minProperties: 1 + responses: + '200': + description: Zone info notification acknowledged + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + security: + - notifClientCredentials: + - fed-mgmt-notif + /{federationContextId}/zones/{zoneId}: + delete: + summary: Assert usage of a partner OP zone. Originating OP informs partner OP that it will no longer + access the specified zone. + operationId: ZoneUnsubscribe + tags: + - AvailabilityZoneInfoSynchronization + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: zoneId + in: path + required: true + schema: + $ref: '#/components/schemas/ZoneIdentifier' + responses: + '200': + description: Zone deregistered successfully + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + get: + summary: Retrieves details about the computation and network resources that partner OP has reserved + for this zone. + operationId: GetZoneDetails + tags: + - AvailabilityZoneInfoSynchronization + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: zoneId + in: path + required: true + schema: + $ref: '#/components/schemas/ZoneIdentifier' + responses: + '200': + description: Zone metadata + content: + application/json: + schema: + $ref: '#/components/schemas/ZoneRegisteredData' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/artefact: + post: + summary: Uploads application artefact on partner OP. Artefact is a zip file containing scripts and/or + packaging files like Terraform or Helm which are required to create an instance of an application. + operationId: UploadArtefact + tags: + - ArtefactManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + requestBody: + description: An application can consist of multiple components. App providers are allowed to define + separate artefacts for each component or they could define a consolidated artefact at application + level. + content: + multipart/form-data: + schema: + type: object + required: + - artefactId + - appProviderId + - artefactName + - artefactVersionInfo + - artefactVirtType + - artefactDescriptorType + - componentSpec + properties: + artefactId: + $ref: '#/components/schemas/ArtefactId' + appProviderId: + $ref: '#/components/schemas/AppProviderId' + artefactName: + $ref: '#/components/schemas/ArtefactName' + artefactVersionInfo: + $ref: '#/components/schemas/ArtefactVersionInfo' + artefactDescription: + $ref: '#/components/schemas/ArtefactDescription' + artefactVirtType: + $ref: '#/components/schemas/ArtefactVirtType' + artefactFileName: + $ref: '#/components/schemas/ArtefactFileName' + artefactFileFormat: + $ref: '#/components/schemas/ArtefactFileFormat' + artefactDescriptorType: + $ref: '#/components/schemas/ArtefactDescriptorType' + repoType: + $ref: '#/components/schemas/RepoType' + artefactRepoLocation: + $ref: '#/components/schemas/ObjectRepoLocation' + artefactFile: + type: string + format: binary + description: Helm archive/Terraform archive/container spec file or Binary image associated + with an application component. + componentSpec: + type: array + items: + $ref: '#/components/schemas/ComponentSpec' + minItems: 1 + required: true + responses: + '200': + description: Artefact uploaded successfully + '202': + description: Artefact upload request accepted + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/artefact/{artefactId}: + get: + summary: Retrieves details about an artefact. + operationId: GetArtefact + tags: + - ArtefactManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: artefactId + in: path + required: true + schema: + $ref: '#/components/schemas/ArtefactId' + responses: + '200': + description: Artefact details + content: + application/json: + schema: + type: object + required: + - artefactId + - appProviderId + - artefactName + - artefactVersionInfo + - artefactVirtType + - artefactDescriptorType + properties: + artefactId: + $ref: '#/components/schemas/ArtefactId' + appProviderId: + $ref: '#/components/schemas/AppProviderId' + artefactName: + $ref: '#/components/schemas/ArtefactName' + artefactDescription: + $ref: '#/components/schemas/ArtefactDescription' + artefactVersionInfo: + $ref: '#/components/schemas/ArtefactVersionInfo' + artefactVirtType: + $ref: '#/components/schemas/ArtefactVirtType' + artefactFileName: + $ref: '#/components/schemas/ArtefactFileName' + artefactFileFormat: + $ref: '#/components/schemas/ArtefactFileFormat' + artefactDescriptorType: + $ref: '#/components/schemas/ArtefactDescriptorType' + repoType: + $ref: '#/components/schemas/RepoType' + artefactRepoLocation: + $ref: '#/components/schemas/ObjectRepoLocation' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + delete: + summary: Removes an artefact from partner OP. + operationId: RemoveArtefact + tags: + - ArtefactManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: artefactId + in: path + required: true + schema: + $ref: '#/components/schemas/ArtefactId' + responses: + '200': + description: Artefact deletion successful + '202': + description: Artefact deletion request accepted + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/files: + post: + summary: Uploads an image file. Originating OP uses this api to onboard an application image to + partner OP. + operationId: UploadFile + tags: + - ArtefactManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + requestBody: + content: + multipart/form-data: + schema: + type: object + required: + - fileId + - appProviderId + - fileName + - fileVersionInfo + - fileType + - imgOSType + - imgInsSetArch + properties: + fileId: + $ref: '#/components/schemas/FileId' + appProviderId: + $ref: '#/components/schemas/AppProviderId' + fileName: + $ref: '#/components/schemas/FileName' + fileDescription: + $ref: '#/components/schemas/FileDescription' + fileVersionInfo: + $ref: '#/components/schemas/FileVersionInfo' + fileType: + $ref: '#/components/schemas/VirtImageType' + checksum: + type: string + description: MD5 checksum for VM and file-based images, sha256 digest for containers + imgOSType: + $ref: '#/components/schemas/OSType' + imgInsSetArch: + $ref: '#/components/schemas/CPUArchType' + repoType: + $ref: '#/components/schemas/RepoType' + fileRepoLocation: + $ref: '#/components/schemas/ObjectRepoLocation' + file: + type: string + format: binary + description: Binary image associated with an application component. + required: true + responses: + '200': + description: File uploaded successfully + '202': + description: File upload request accepted + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/files/{fileId}: + delete: + summary: Removes an image file from partner OP. + operationId: RemoveFile + tags: + - ArtefactManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: fileId + in: path + required: true + schema: + $ref: '#/components/schemas/FileId' + responses: + '200': + description: Image deletion successful + '202': + description: Image deletion request accepted + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + get: + summary: View an image file from partner OP. + operationId: ViewFile + tags: + - ArtefactManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: fileId + in: path + required: true + schema: + $ref: '#/components/schemas/FileId' + responses: + '200': + description: Image details + content: + application/json: + schema: + type: object + required: + - fileId + - appProviderId + - fileName + - fileVersionInfo + - fileType + - imgOSType + - imgInsSetArch + properties: + fileId: + $ref: '#/components/schemas/FileId' + appProviderId: + $ref: '#/components/schemas/AppProviderId' + fileName: + $ref: '#/components/schemas/FileName' + fileDescription: + $ref: '#/components/schemas/FileDescription' + fileVersionInfo: + $ref: '#/components/schemas/FileVersionInfo' + fileType: + $ref: '#/components/schemas/VirtImageType' + checksum: + type: string + description: MD5 checksum for VM and file-based images, sha256 digest for containers + imgOSType: + $ref: '#/components/schemas/OSType' + imgInsSetArch: + $ref: '#/components/schemas/CPUArchType' + repoType: + $ref: '#/components/schemas/RepoType' + fileRepoLocation: + $ref: '#/components/schemas/ObjectRepoLocation' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/application/onboarding: + post: + summary: Submits an application details to a partner OP. Based on the details provided, partner + OP shall do bookkeeping, resource validation and other pre-deployment operations. + operationId: OnboardApplication + tags: + - ApplicationOnboardingManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + requestBody: + required: true + description: Details about application compute resource requirements, associated artefacts, QoS + profile and regions where application shall be made available etc. + content: + application/json: + schema: + type: object + required: + - appId + - appProviderId + - appMetaData + - appQoSProfile + - appComponentSpecs + properties: + appId: + $ref: '#/components/schemas/AppIdentifier' + appProviderId: + $ref: '#/components/schemas/AppProviderId' + appDeploymentZones: + description: Details about partner OP zones where the application should be made available; This + field when specified will instruct the OP to restrict application instantiation only + on the listed zones. + type: array + items: + $ref: '#/components/schemas/ZoneIdentifier' + minItems: 1 + appMetaData: + $ref: '#/components/schemas/AppMetaData' + appQoSProfile: + $ref: '#/components/schemas/AppQoSProfile' + appComponentSpecs: + $ref: '#/components/schemas/AppComponentSpecs' + appStatusCallbackLink: + $ref: '#/components/schemas/Uri' + edgeAppFQDN: + $ref: '#/components/schemas/EdgeAppFQDN' + responses: + '200': + description: Application onboarded successfully + '202': + description: Application onboarding request accepted + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + callbacks: + onApplicationOnboardStatusEvent: + '{$request.body#/appStatusCallbackLink}': + post: + requestBody: + description: Notification payload. + content: + application/json: + schema: + type: object + required: + - federationContextId + - appId + - statusInfo + properties: + federationContextId: + $ref: '#/components/schemas/FederationIdentifier' + appId: + $ref: '#/components/schemas/AppIdentifier' + statusInfo: + type: array + items: + type: object + required: + - zoneId + - onboardStatusInfo + properties: + zoneId: + $ref: '#/components/schemas/ZoneIdentifier' + onboardStatusInfo: + $ref: '#/components/schemas/OnboardStatusInfo' + minItems: 1 + responses: + '204': + description: Application status updated + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + security: + - notifClientCredentials: + - fed-mgmt-notif + /{federationContextId}/application/onboarding/app/{appId}: + delete: + summary: Deboards the application from all zones, if any, and deletes the App. + operationId: DeleteApp + tags: + - ApplicationOnboardingManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: appId + in: path + required: true + schema: + $ref: '#/components/schemas/AppIdentifier' + responses: + '200': + description: App deletion successful + '202': + description: App deletion request accepted + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + patch: + summary: Updates partner OP about changes in application compute resource requirements, QOS Profile, + associated descriptor or change in associated components + operationId: UpdateApplication + tags: + - ApplicationOnboardingManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: appId + in: path + required: true + schema: + $ref: '#/components/schemas/AppIdentifier' + requestBody: + required: true + description: Details about application compute resource requirements, associated artefact and + QOS profile that needs to be updated. + content: + application/json: + schema: + type: object + minProperties: 1 + properties: + appUpdQoSProfile: + description: Parameters corresponding to the performance constraints, tenancy details + etc. + type: object + anyOf: + - required: + - latencyConstraint + - required: + - bandwidthRequired + - required: + - mobilitySupport + - required: + - multiUserClients + - required: + - appProvisioning + properties: + latencyConstraints: + $ref: '#/components/schemas/LatencyConstraints' + bandwidthRequired: + $ref: '#/components/schemas/BandwidthRequired' + mobilitySupport: + $ref: '#/components/schemas/MobilitySupport' + multiUserClients: + $ref: '#/components/schemas/MultiUserClients' + noOfUsersPerAppInst: + $ref: '#/components/schemas/NoOfUsersPerAppInst' + appProvisioning: + $ref: '#/components/schemas/AppProvisioning' + appComponents: + $ref: '#/components/schemas/AppComponents' + responses: + '200': + description: Application update successful + '202': + description: Application update request accepted + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + get: + summary: Retrieves application details from partner OP + operationId: ViewApplication + tags: + - ApplicationOnboardingManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: appId + in: path + required: true + schema: + $ref: '#/components/schemas/AppIdentifier' + responses: + '200': + description: Application details + content: + application/json: + schema: + type: object + required: + - appId + - appProviderId + - appDeploymentZones + - appMetaData + - appQoSProfile + - appComponentSpecs + - onboardStatusInfo + properties: + appId: + $ref: '#/components/schemas/AppIdentifier' + appProviderId: + $ref: '#/components/schemas/AppProviderId' + appDeploymentZones: + description: Details about partner OP zones where the application should be made available; This + field when specified will instruct the OP to restrict application instantiation + only on the listed zones. + type: array + items: + type: object + required: + - countryCode + - zoneInfo + properties: + countryCode: + $ref: '#/components/schemas/CountryCode' + zoneInfo: + $ref: '#/components/schemas/ZoneIdentifier' + minItems: 1 + appMetaData: + $ref: '#/components/schemas/AppMetaData' + appQoSProfile: + $ref: '#/components/schemas/AppQoSProfile' + appComponentSpecs: + $ref: '#/components/schemas/AppComponentSpecs' + onboardStatusInfo: + $ref: '#/components/schemas/OnboardStatusInfo' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/application/onboarding/app/{appId}/zone/{zoneId}: + delete: + summary: Deboards an application from specific partner OP zones + operationId: DeboardApplication + tags: + - ApplicationOnboardingManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: appId + in: path + required: true + schema: + $ref: '#/components/schemas/AppIdentifier' + - name: zoneId + in: path + required: true + schema: + $ref: '#/components/schemas/ZoneIdentifier' + responses: + '200': + description: Application deboarded successfully + '202': + description: Application deboard request accepted + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/application/onboarding/app/{appId}/additionalZones: + post: + summary: Onboards an existing application to a new zone within partner OP. + operationId: OnboardExistingAppNewZones + tags: + - ApplicationOnboardingManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: appId + in: path + required: true + schema: + $ref: '#/components/schemas/AppIdentifier' + requestBody: + required: true + description: Details about new zones where application shall be made available + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/ZoneIdentifier' + minItems: 1 + responses: + '200': + description: Application onboarding succussful + '202': + description: Application onboarding request accepted + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/application/onboarding/app/{appId}/zoneForbid: + post: + summary: Forbid/allow application instantiation on a partner zone + operationId: LockUnlockApplicationZone + tags: + - ApplicationOnboardingManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: appId + in: path + required: true + schema: + $ref: '#/components/schemas/AppIdentifier' + requestBody: + required: true + content: + application/json: + schema: + type: array + items: + type: object + description: List of zones where application instantiation shall be forbidden or allowed. + required: + - zoneId + - forbid + properties: + zoneId: + $ref: '#/components/schemas/ZoneIdentifier' + forbid: + type: boolean + description: Value 'true' will forbid application instantiation on this zone. No + new instance of the application can be created on this zone. + minItems: 1 + responses: + '200': + description: Application forbid/permit request accepted + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/application/lcm: + post: + summary: Instantiates an application on a partner OP zone. + operationId: InstallApp + tags: + - ApplicationDeploymentManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: Idempotency-Key + in: header + required: true + schema: + $ref: '#/components/schemas/TransactionId' + requestBody: + description: Details about application and zones where application instance should be created. + It also definea call back URI which the partner OP shall use update home OP about a change in + instance status. + content: + application/json: + schema: + type: object + required: + - appId + - appProviderId + - appVersion + - zoneInfo + - appInstCallbackLink + properties: + appId: + $ref: '#/components/schemas/AppIdentifier' + appVersion: + type: string + description: Version info of the application + appProviderId: + $ref: '#/components/schemas/AppProviderId' + zoneInfo: + type: object + required: + - zoneId + - flavourId + properties: + zoneId: + $ref: '#/components/schemas/ZoneIdentifier' + flavourId: + $ref: '#/components/schemas/FlavourId' + resourceConsumption: + type: string + enum: + - RESERVED_RES_SHALL + - RESERVED_RES_PREFER + - RESERVED_RES_AVOID + - RESERVED_RES_FORBID + default: RESERVED_RES_AVOID + description: Specifies if the application can be instantiated using pre-reserved + resource or not. App provider can pre-reserve a pool of compute resource on each + zone. 'RESERVED_RES_SHALL' instruct OP to use only the pre-reserved resources. + 'RESERVED_RES_PREFER' instruct to first try using pre-reserved resource, if none + available go for non-reserved resources. 'RESERVED_RES_AVOID' instruct OP not + to use pre-reserved resource if possible, it is a choice depending upon circumstances + 'RESERVED_RES_FORBID' instruct OP not to use pre-reserved resources. + resPool: + type: string + pattern: ^[A-Za-z0-9][A-Za-z0-9_]{6,30}[A-Za-z0-9]$ + description: Resource pool to be used for application instantiation on this zone. Valid + only if IE 'resourceConsumption' is set to 'RESERVED_RES_SHALL' or 'RESERVED_RES_PREFER' + appInstCallbackLink: + $ref: '#/components/schemas/Uri' + required: true + responses: + '202': + description: Application instance creation request accepted. + content: + application/json: + schema: + type: object + required: + - zoneId + - appInstIdentifier + properties: + zoneId: + $ref: '#/components/schemas/ZoneIdentifier' + appInstIdentifier: + $ref: '#/components/schemas/InstanceIdentifier' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + callbacks: + onInstanceStatusEvent: + '{$request.body#/appInstCallbackLink}': + post: + requestBody: + description: Notification payload. + content: + application/json: + schema: + type: object + required: + - federationContextId + - appId + - appInstanceId + - zoneId + - appInstanceInfo + properties: + federationContextId: + $ref: '#/components/schemas/FederationIdentifier' + appId: + $ref: '#/components/schemas/AppIdentifier' + appInstanceId: + $ref: '#/components/schemas/InstanceIdentifier' + zoneId: + $ref: '#/components/schemas/ZoneIdentifier' + appInstanceInfo: + type: object + properties: + appInstanceState: + type: string + enum: + - PENDING + - READY + - FAILED + - TERMINATING + description: Running status of the application instance. + message: + type: string + description: Event information or failure message. + accesspointInfo: + description: Information about the IP and Port exposed by the OP. Application + clients shall use these access points to reach this application instance + type: array + items: + type: object + required: + - interfaceId + - accessPoints + properties: + interfaceId: + type: string + pattern: ^[A-Za-z0-9][A-Za-z0-9_]{6,30}[A-Za-z0-9]$ + description: This is the interface Identifier that app provider defines + when application is onboarded. + accessPoints: + $ref: '#/components/schemas/ServiceEndpoint' + minItems: 1 + minProperties: 1 + modificationDate: + type: string + format: date-time + description: Date and time of the instance state modification by partner OP. + responses: + '204': + description: Application instance state notification acknowledged + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + security: + - notifClientCredentials: + - fed-mgmt-notif + /{federationContextId}/application/lcm/app/{appId}/instance/{appInstanceId}/zone/{zoneId}: + get: + summary: Retrieves an application instance details from partner OP. + operationId: GetAppInstanceDetails + tags: + - ApplicationDeploymentManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: appId + in: path + required: true + schema: + $ref: '#/components/schemas/AppIdentifier' + - name: appInstanceId + in: path + required: true + schema: + $ref: '#/components/schemas/InstanceIdentifier' + - name: zoneId + in: path + required: true + schema: + $ref: '#/components/schemas/ZoneIdentifier' + responses: + '200': + description: Application instance details + content: + application/json: + schema: + type: object + properties: + appInstanceState: + $ref: '#/components/schemas/InstanceState' + accesspointInfo: + description: Information about the IP and Port exposed by the OP. Application clients + shall use these access points to reach this application instance + type: array + items: + type: object + required: + - interfaceId + - accessPoints + properties: + interfaceId: + type: string + pattern: ^[A-Za-z0-9][A-Za-z0-9_]{6,30}[A-Za-z0-9]$ + description: This is the interface identifier that app provider defines when + application is onboarded. + accessPoints: + $ref: '#/components/schemas/ServiceEndpoint' + minItems: 1 + minProperties: 1 + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + delete: + summary: Terminate an application instance on a partner OP zone. + operationId: RemoveApp + tags: + - ApplicationDeploymentManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: appId + in: path + required: true + schema: + $ref: '#/components/schemas/AppIdentifier' + - name: appInstanceId + in: path + required: true + schema: + $ref: '#/components/schemas/InstanceIdentifier' + - name: zoneId + in: path + required: true + schema: + $ref: '#/components/schemas/ZoneIdentifier' + responses: + '200': + description: Application instance termination request accepted + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/application/lcm/app/{appId}/appProvider/{appProviderId}: + get: + summary: Retrieves all application instance of partner OP + operationId: GetAllAppInstances + tags: + - ApplicationDeploymentManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: appId + in: path + required: true + schema: + $ref: '#/components/schemas/AppIdentifier' + - name: appProviderId + in: path + required: true + schema: + $ref: '#/components/schemas/AppProviderId' + responses: + '200': + description: Application Instance details + content: + application/json: + schema: + type: array + items: + type: object + required: + - zoneId + - appInstanceInfo + properties: + zoneId: + $ref: '#/components/schemas/ZoneIdentifier' + appInstanceInfo: + type: array + items: + type: object + required: + - appInstIdentifier + - appInstanceState + properties: + appInstIdentifier: + $ref: '#/components/schemas/InstanceIdentifier' + appInstanceState: + $ref: '#/components/schemas/InstanceState' + minItems: 1 + minItems: 1 + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/isv/resource/zone/{zoneId}/appProvider/{appProviderId}: + post: + summary: Reserves resources (compute, network and storage) on a partner OP zone. ISVs registered + with home OP reserves resources on a partner OP zone. + operationId: CreateResourcePools + tags: + - AppProviderResourceManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: zoneId + in: path + required: true + schema: + $ref: '#/components/schemas/ZoneIdentifier' + - name: appProviderId + in: path + required: true + schema: + $ref: '#/components/schemas/AppProviderId' + requestBody: + content: + application/json: + schema: + type: object + required: + - resRequest + - resourceReservationCallbackLink + properties: + resRequest: + description: Compute flavours to be reserved and their time duration + type: object + required: + - poolName + - flavours + - reserveDuration + properties: + poolName: + $ref: '#/components/schemas/PoolName' + flavours: + type: array + items: + type: object + required: + - flavourId + - numFlavour + properties: + flavourId: + $ref: '#/components/schemas/FlavourId' + numFlavour: + type: integer + format: int32 + description: Total number of flavours to be reserved + minNumOfFlavours: + type: integer + format: int32 + description: If specified, indicate the minimum numbers of flavours to be + reserved up to maximum as given in “count” member. If partner OP cannot + reserve the minimum number of flavours, then the request shall fail. + minItems: 1 + reserveDuration: + $ref: '#/components/schemas/ResourceReservationDuration' + resourceReservationCallbackLink: + $ref: '#/components/schemas/Uri' + responses: + '200': + description: ISV Resource reservation request accepted + content: + application/json: + schema: + type: object + required: + - poolId + - poolName + properties: + poolName: + $ref: '#/components/schemas/PoolName' + poolId: + $ref: '#/components/schemas/PoolId' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + callbacks: + onResourceStatusChangeEvent: + '{$request.body#/resourceReservationCallbackLink}': + post: + requestBody: + description: Notification payload. + content: + application/json: + schema: + type: object + required: + - federationContextId + - zoneId + - appProviderId + - poolId + - grantedFlavours + properties: + federationContextId: + $ref: '#/components/schemas/FederationIdentifier' + zoneId: + $ref: '#/components/schemas/ZoneIdentifier' + appProviderId: + $ref: '#/components/schemas/AppProviderId' + poolId: + $ref: '#/components/schemas/PoolId' + grantedFlavours: + type: array + items: + type: object + required: + - flavourId + - numFlavour + properties: + flavourId: + $ref: '#/components/schemas/FlavourId' + numFlavour: + type: integer + format: int32 + description: Count of flavour + minItems: 1 + responses: + '204': + description: Updated Resource reservation status updated + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + security: + - notifClientCredentials: + - fed-mgmt-notif + get: + summary: Retrieves the resource pool reserved by an ISV + operationId: ViewISVResPool + tags: + - AppProviderResourceManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: zoneId + in: path + required: true + schema: + $ref: '#/components/schemas/ZoneIdentifier' + - name: appProviderId + in: path + required: true + schema: + $ref: '#/components/schemas/AppProviderId' + responses: + '200': + description: Reserved Resources Details + content: + application/json: + schema: + type: array + items: + type: object + required: + - poolName + - reservedPoolId + - reservedFlavours + properties: + poolName: + $ref: '#/components/schemas/PoolName' + reservedPoolId: + $ref: '#/components/schemas/PoolId' + reservedFlavours: + type: array + items: + type: object + required: + - flavourId + - count + properties: + flavourId: + $ref: '#/components/schemas/FlavourId' + count: + type: integer + format: int32 + description: Total number of flavours reserved + minItems: 1 + reserveDuration: + $ref: '#/components/schemas/ResourceReservationDuration' + reservationTime: + type: string + format: date-time + description: Date and time when resources were reserved in UTC format + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/isv/resource/zone/{zoneId}/appProvider/{appProviderId}/pool/{poolId}: + patch: + summary: Updates resources reserved for a pool by an ISV + operationId: UpdateISVResPool + tags: + - AppProviderResourceManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: zoneId + in: path + required: true + schema: + $ref: '#/components/schemas/ZoneIdentifier' + - name: appProviderId + in: path + required: true + schema: + $ref: '#/components/schemas/AppProviderId' + - name: poolId + in: path + required: true + schema: + $ref: '#/components/schemas/PoolId' + requestBody: + content: + application/json: + schema: + type: array + items: + type: object + required: + - updateType + - flavourId + - count + properties: + updateType: + type: string + enum: + - ADD + - REMOVE + - DURATION + description: Specify if resource corresponding this flavour needs to added or removed. + Field 'count' gives the final total no of such flavours that should be reserved. count + 0 means remove all the resources. + flavourId: + $ref: '#/components/schemas/FlavourId' + count: + type: integer + format: int32 + description: Total number of flavours to be reserved + reserveDuration: + $ref: '#/components/schemas/ResourceReservationDuration' + responses: + '200': + description: Resource pool updated + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + delete: + summary: Deletes the resource pool reserved by an ISV + operationId: RemoveISVResPool + tags: + - AppProviderResourceManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: zoneId + in: path + required: true + schema: + $ref: '#/components/schemas/ZoneIdentifier' + - name: appProviderId + in: path + required: true + schema: + $ref: '#/components/schemas/AppProviderId' + - name: poolId + in: path + required: true + schema: + $ref: '#/components/schemas/PoolId' + responses: + '200': + description: Resource pool deleted + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/edgenodesharing/edgeDiscovery: + post: + summary: Edge discovery procedures towards partner OP over E/WBI. Originating OP request partner + OP to provide a list of candidate zones where an application instance can be created. Partner + OP applies a set of filtering criteria's to select candidate zones. + operationId: GetCandidateZones + tags: + - EdgeNodeSharing + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + requestBody: + content: + application/json: + schema: + type: object + required: + - appProviderId + - appId + properties: + appProviderId: + $ref: '#/components/schemas/AppProviderId' + appId: + $ref: '#/components/schemas/AppIdentifier' + edgeDiscoveryFilters: + type: object + minProperties: 1 + properties: + location: + $ref: '#/components/schemas/ClientLocation' + responses: + '200': + description: List of candidate zones + content: + application/json: + schema: + $ref: '#/components/schemas/nodeDiscoveryResponse' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + default: + $ref: '#/components/responses/default' + /{federationContextId}/apiservice/{serviceAPINameVal}: + post: + summary: Service API request forwarding to the Partner OP + operationId: APIForwarding + tags: + - ServiceAPIManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: serviceAPINameVal + in: path + required: true + schema: + $ref: '#/components/schemas/serviceAPINameVal' + requestBody: + content: + application/json: + schema: + type: object + required: + - apiServiceId + - customerID + - customerInfo + - txnIdentifier + - ServiceAPIBody + properties: + customerID: + $ref: '#/components/schemas/customerID' + txnIdentifier: + $ref: '#/components/schemas/txnIdentifier' + ServiceAPIBody: + $ref: '#/components/schemas/serviceAPIContent' + eventNotificationDest: + $ref: '#/components/schemas/Uri' + apiServiceId: + type: string + description: Named identifier of the API service, e.g. QualityOnDemand, DeviceStatus, + DeviceLocation (Table 201). + customerInfo: + type: string + description: Name identification information associated to the Application Provider + of the Leading OP (Table 201). + required: true + responses: + '200': + description: Service API request accepted + headers: + Location: + description: Contains the URI of the newly created Service API Context resource. + required: false + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/serviceAPIResponse' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + default: + $ref: '#/components/responses/default' + callbacks: + onServiceAPISessionEvent: + '{$request.body#/eventNotificationDest}': + post: + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: apiServiceId + in: path + required: true + schema: + $ref: '#/components/schemas/serviceAPINames' + requestBody: + description: Notification about network event. + content: + application/json: + schema: + type: object + required: + - txnIdentifier + - serviceAPIEvent + properties: + serviceAPIEvent: + $ref: '#/components/schemas/serviceAPINetworkEvent' + txnIdentifier: + $ref: '#/components/schemas/txnIdentifier' + responses: + '200': + description: Event info notification acknowledged + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + security: + - notifClientCredentials: + - fed-mgmt-notif + /{federationContextId}/apiservice/connid/{connectID}/custid/{customerID}: + delete: + summary: Remove the Service API Session earlier created with Service API forwarding request. + operationId: RemoveServiceAPISession + tags: + - ServiceAPIManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: connectID + in: path + required: true + schema: + $ref: '#/components/schemas/connectID' + - name: customerID + in: path + required: true + schema: + $ref: '#/components/schemas/customerID' + responses: + '200': + description: Service API Session removed successfully + content: + application/json: + schema: + type: object + required: + - expiryDuration + - connectID + properties: + expiryDuration: + $ref: '#/components/schemas/expiryInterval' + connectID: + $ref: '#/components/schemas/connectID' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + get: + summary: Retrieve the Service API context information of an existing API session identified by connectID, + customerID + operationId: GetServiceAPISessionInfo + tags: + - ServiceAPIManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: connectID + in: path + required: true + schema: + $ref: '#/components/schemas/connectID' + - name: customerID + in: path + required: true + schema: + $ref: '#/components/schemas/customerID' + responses: + '200': + description: Device Auth Token validated + content: + application/json: + schema: + type: object + required: + - expiryDuration + - connectID + properties: + expiryDuration: + $ref: '#/components/schemas/expiryInterval' + connectID: + $ref: '#/components/schemas/connectID' + ServiceAPIRespBody: + $ref: '#/components/schemas/serviceAPIContent' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + default: + $ref: '#/components/responses/default' + /{federationContextId}/monioring-subscriptions: + post: + summary: Originating OP subscribe for edge cloud resource monitoring info with partner OP. + operationId: SubscribeMonitoringInfo + tags: + - ConsumptionReportingManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: monType + in: query + required: true + schema: + $ref: '#/components/schemas/monitoringSubsType' + requestBody: + content: + application/json: + schema: + type: object + properties: + periodicity: + $ref: '#/components/schemas/periodicityInterval' + resMonNotificationListner: + $ref: '#/components/schemas/Uri' + responses: + '200': + description: Subscription for resource monitoring created successfully + content: + application/json: + schema: + $ref: '#/components/schemas/resourceSubscriptionInfo' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + callbacks: + onPeriodicMonitoringEvent: + '{$request.body#/resMonNotificationListner}': + post: + requestBody: + description: Periodic Notification about resource monitoring info. + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/edgeResUtilizeMetrics' + - $ref: '#/components/schemas/appsResUtilizeInfo' + responses: + '200': + description: Resource monitoring info notification acknowledged + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + security: + - notifClientCredentials: + - fed-mgmt-notif + /{federationContextId}/events: + post: + summary: Originating OP uses this procedure to request enabling event reporting with Partner OP. + operationId: CreateEventSubscription + tags: + - EventManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + requestBody: + content: + application/json: + schema: + type: object + properties: + eventSubscriptionConfig: + $ref: '#/components/schemas/EventSubscription' + responses: + '200': + description: Subscription for reporting of events created successfully + content: + application/json: + schema: + $ref: '#/components/schemas/EventSubscriptionInfo' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + callbacks: + onEventCriterionDetectionEvent: + '{$request.body#/eventListner}': + post: + requestBody: + description: Notification about event being detected as per event criterion. + content: + application/json: + schema: + $ref: '#/components/schemas/EventsList' + responses: + '200': + description: Event report acknowledged + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + security: + - notifClientCredentials: + - fed-mgmt-notif + /{federationContextId}/events/{event_subs_id}: + post: + summary: Originating OP uses this procedure to create an event criterion at Partner OP. + operationId: CreateEventCriterion + tags: + - EventManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: event_subs_id + in: path + required: true + schema: + $ref: '#/components/schemas/EventSubscriptionIdentifier' + requestBody: + content: + application/json: + schema: + type: object + properties: + eventCriterion: + $ref: '#/components/schemas/eventCriterion' + responses: + '200': + description: Subscription for resource monitoring created successfully + content: + application/json: + schema: + $ref: '#/components/schemas/eventInfo' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + get: + summary: Retrieves events list with the partner OP. + operationId: GetEventsList + tags: + - EventManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: event_subs_id + in: path + required: true + schema: + $ref: '#/components/schemas/EventSubscriptionIdentifier' + - name: event_type + in: query + required: false + schema: + type: string + enum: + - event_criterion + - event_id + responses: + '200': + description: Events criterion and detected events report request accepted + content: + application/json: + schema: + type: object + properties: + eventCriterionList: + $ref: '#/components/schemas/eventTypeList' + eventIdList: + $ref: '#/components/schemas/EventsList' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + delete: + summary: Remove existing event subscription with the partner OP + operationId: DeleteEventSubscription + tags: + - EventManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: event_subs_id + in: path + required: true + schema: + $ref: '#/components/schemas/EventSubscriptionIdentifier' + responses: + '200': + description: Event subscription removed successfully + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/events/{event_subs_id}/event-id/{eventId}: + delete: + summary: Remove existing event criterion with the partner OP + operationId: DeleteEventCriterion + tags: + - EventManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: event_subs_id + in: path + required: true + schema: + $ref: '#/components/schemas/EventSubscriptionIdentifier' + - name: eventId + in: path + required: true + schema: + $ref: '#/components/schemas/EventIdentifier' + responses: + '200': + description: Event criterion removed successfully + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/alarms: + post: + summary: Originating OP uses this procedure to request enabling alarm reporting with Partner OP. + operationId: CreateAlarmReportingSubscription + tags: + - AlarmManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + requestBody: + content: + application/json: + schema: + type: object + properties: + alarmListnerCallback: + $ref: '#/components/schemas/Uri' + responses: + '200': + description: Subscription for alarm reporting created successfully + content: + application/json: + schema: + $ref: '#/components/schemas/SubscriptionIdentifier' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + callbacks: + onAlarmStateReportEvent: + '{$request.body#/alarmListnerCallback}': + post: + requestBody: + description: Notification about alarm management events at Partner OP. + content: + application/json: + schema: + $ref: '#/components/schemas/AlarmObjectInfo' + responses: + '200': + description: Event report acknowledged + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + security: + - notifClientCredentials: + - fed-mgmt-notif + delete: + requestBody: + description: Alarm clear notification for an earlier alarm by Partner OP. + content: + application/json: + schema: + $ref: '#/components/schemas/AlarmObjectInfo' + responses: + '200': + description: Alarm clear event acknowledged + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + security: + - notifClientCredentials: + - fed-mgmt-notif + patch: + requestBody: + description: Notification about alarm management events at Partner OP. + content: + application/json: + schema: + $ref: '#/components/schemas/UpdatedAlarmParameters' + responses: + '200': + description: Alarm state update report acknowledged + content: + application/json: + schema: + type: object + properties: + updatedAlarmId: + $ref: '#/components/schemas/AlarmIdentifier' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + security: + - notifClientCredentials: + - fed-mgmt-notif + /{federationContextId}/events/{alarm_subs_id}: + get: + summary: Retrieves active alarms list with the partner OP. + operationId: GetAlarmsList + tags: + - AlarmManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: alarm_subs_id + in: path + required: true + schema: + $ref: '#/components/schemas/SubscriptionIdentifier' + - name: alarm_type + in: query + required: false + schema: + $ref: '#/components/schemas/AlarmType' + responses: + '200': + description: Active alarms report request accepted + content: + application/json: + schema: + type: object + properties: + activeAlarmsList: + $ref: '#/components/schemas/ActiveAlarmsList' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + delete: + summary: Remove existing alarm subscription with the partner OP + operationId: DeleteAlarmSubscription + tags: + - AlarmManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: alarm_subs_id + in: path + required: true + schema: + $ref: '#/components/schemas/SubscriptionIdentifier' + responses: + '200': + description: Alarm subscription removed successfully + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/network-caps-events: + post: + summary: Originating OP uses this procedure to request enabling network capabilities events reporting + by the Partner OP. + operationId: CreateNetworkCapsEventSubscription + tags: + - NetworkCapsEventManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + requestBody: + content: + application/json: + schema: + type: object + required: + - networkCapsEventSubscriptionConfig + properties: + networkCapsEventSubscriptionConfig: + $ref: '#/components/schemas/periodicNotifConfig' + responses: + '200': + description: Subscription for notification of network events created successfully + content: + application/json: + schema: + $ref: '#/components/schemas/periodicNotifConfig' + headers: + Location: + description: Contains the URI of the newly created resource + required: true + schema: + type: string + Accept-Encoding: + description: Accept-Encoding, described in IETF RFC 7694 + schema: + type: string + Content-Encoding: + description: Content-Encoding, described in IETF RFC 7231 + schema: + type: string + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + callbacks: + onNetwEventDetectionEvent: + '{$request.body#/notificationListner}': + post: + requestBody: + description: Notification about events being detected as per network capabilities are + applied by Partner OP. + content: + application/json: + schema: + $ref: '#/components/schemas/NetworkCapAppInfoList' + responses: + '200': + description: Network Events report acknowledged + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + security: + - notifClientCredentials: + - fed-mgmt-notif + /{federationContextId}/network-events/{nw-event-subs-id}: + post: + summary: Originating OP uses this procedure to add an intent to Partner OP to report network capability + applied by Partner OP. + operationId: CreateNetworkCapEvent + tags: + - NetworkCapsEventManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: nw-event-subs-id + in: path + required: true + schema: + $ref: '#/components/schemas/EventSubscriptionIdentifier' + - name: nw-cap-id + in: query + required: true + schema: + $ref: '#/components/schemas/CapabilityID' + requestBody: + content: + application/json: + schema: + type: object + required: + - appId + - appProviderId + properties: + appId: + $ref: '#/components/schemas/AppIdentifier' + appProviderId: + $ref: '#/components/schemas/AppProviderId' + txnIdentifier: + $ref: '#/components/schemas/txnIdentifier' + responses: + '200': + description: Subscription for network event created successfully + content: + application/json: + schema: + type: object + required: + - networkCapSubsInfo + - txnIdentifier + properties: + networkCapSubsInfo: + $ref: '#/components/schemas/NetworkCapSubsInfo' + txnIdentifier: + $ref: '#/components/schemas/txnIdentifier' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + delete: + summary: Remove existing network events notification subscription with the partner OP + operationId: DeleteNwEventNotifSubscription + tags: + - NetworkCapsEventManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: nw-event-subs-id + in: path + required: true + schema: + $ref: '#/components/schemas/EventSubscriptionIdentifier' + responses: + '200': + description: Network Event Notification subscription removed successfully + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/network-events/{nw-event-subs-id}/nw-caps: + get: + summary: Retrieves network capabilities subscribed list with the partner OP. + operationId: GetNetworkCapsSubscribedList + tags: + - NetworkCapsEventManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: nw-event-subs-id + in: path + required: true + schema: + $ref: '#/components/schemas/EventSubscriptionIdentifier' + - name: nw-event-type + in: query + required: true + schema: + type: string + responses: + '200': + description: Network capabilities subscription list returned successfully + content: + application/json: + schema: + type: object + properties: + subscribedNwCaps: + type: array + items: + $ref: '#/components/schemas/NetworkCapSubsInfo' + minItems: 1 + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + delete: + summary: Remove existing network event notification with the partner OP + operationId: DeleteNetworkCapSubscription + tags: + - NetworkCapsEventManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: nw-event-subs-id + in: path + required: true + schema: + $ref: '#/components/schemas/EventSubscriptionIdentifier' + - name: nw-event-id + in: query + required: true + schema: + type: string + responses: + '200': + description: Network Event subscription removed successfully + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/appl-event-notifications: + post: + summary: Originating OP uses this procedure to Subscribe for Application's Events Notifications. + operationId: CreateApplicationEventSubscription + tags: + - ApplicationsEventManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + requestBody: + content: + application/json: + schema: + type: object + required: + - applicationEventSubscriptionConfig + properties: + applEventSubscriptionConfig: + $ref: '#/components/schemas/periodicNotifConfig' + numEvtsPerNotif: + type: integer + description: The number of applications events that the Partner OP should include in + a notification + responses: + '200': + description: Subscription for notification of network events created successfully + content: + application/json: + schema: + type: object + properties: + appEventSubsId: + type: string + applEventSubscriptionConfig: + $ref: '#/components/schemas/periodicNotifConfig' + numEvtsPerNotif: + type: integer + description: The number of applications events that the Partner OP should include + in a notification + headers: + Location: + description: Contains the URI of the newly created resource + required: false + schema: + type: string + Accept-Encoding: + description: Accept-Encoding, described in IETF RFC 7694 + schema: + type: string + Content-Encoding: + description: Content-Encoding, described in IETF RFC 7231 + schema: + type: string + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + callbacks: + onApplEventDetectionEvent: + '{$request.body#/notificationListner}': + post: + requestBody: + description: Notification about applications LCM events being detected by Partner OP. + content: + application/json: + schema: + $ref: '#/components/schemas/AggrApplEventsList' + responses: + '200': + description: Applications events notification acknowledged + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + security: + - notifClientCredentials: + - fed-mgmt-notif + /{federationContextId}/appl-event-notifications/{app-notif-subs-id}: + post: + summary: Originating OP uses this procedure to add applications for reporting of application events + by Partner OP. + operationId: SubscribeApplsEvtNotif + tags: + - ApplicationsEventManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: app-notif-subs-id + in: path + required: true + schema: + $ref: '#/components/schemas/EventSubscriptionIdentifier' + - name: Idempotency-Key + in: header + required: true + schema: + $ref: '#/components/schemas/TransactionId' + requestBody: + content: + application/json: + schema: + type: object + required: + - addAppsForNotif + properties: + addAppsForNotif: + $ref: '#/components/schemas/AddAppsForNotif' + responses: + '200': + description: Subscription for network event created successfully + content: + application/json: + schema: + type: object + properties: + addAppsForNotif: + $ref: '#/components/schemas/AddAppsForNotif' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + delete: + summary: Remove existing application notification subscription with the partner OP + operationId: DeleteApplNotifSubscription + tags: + - ApplicationsEventManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: app-notif-subs-id + in: path + required: true + schema: + $ref: '#/components/schemas/EventSubscriptionIdentifier' + responses: + '200': + description: Application Event Notifications subscription removed successfully + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + patch: + summary: Modify existing application events notification subscription with the partner OP + operationId: ModifyApplEventNotifSubscription + tags: + - ApplicationsEventManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: app-notif-subs-id + in: path + required: true + schema: + $ref: '#/components/schemas/EventSubscriptionIdentifier' + requestBody: + content: + application/json: + schema: + type: object + properties: + applEventSubscriptionConfig: + $ref: '#/components/schemas/periodicNotifConfig' + numEvtsPerNotif: + type: integer + description: The number of applications events that the Partner OP should include in + a notification + responses: + '200': + description: Event Notification subscription modified successfully + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + get: + summary: Originating OP uses this procedure to retrieve subscription meta-information about application-level + notifications. + operationId: RetrieveApplSubsMetaInfo + tags: + - ApplicationsEventManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: app-notif-subs-id + in: path + required: true + schema: + $ref: '#/components/schemas/EventSubscriptionIdentifier' + - name: info-type + in: query + required: true + schema: + type: string + enum: + - subs-info + - apps-info + responses: + '200': + description: Application events Subscription information successful retrieval + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/ApplEventsSubsInfo' + - $ref: '#/components/schemas/ApplEventsSubsInfo' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/appl-event-notifications/{app-notif-subs-id}/cancel: + post: + summary: Remove applications from the reporting of application-level event notifications. + operationId: RemoveAppsEventSubscription + tags: + - ApplicationsEventManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: app-notif-subs-id + in: path + required: true + schema: + $ref: '#/components/schemas/EventSubscriptionIdentifier' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RemoveAppsForNotif' + responses: + '200': + description: Network capabilities subscription list returned successfully + content: + application/json: + schema: + $ref: '#/components/schemas/RemoveAppsForNotif' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/appl-event-notifications/{app-notif-subs-id}/app-events: + post: + summary: Remove applications from the reporting of application-level event notifications. + operationId: RetrieveAppsEventsInfo + tags: + - ApplicationsEventManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: app-notif-subs-id + in: path + required: true + schema: + $ref: '#/components/schemas/EventSubscriptionIdentifier' + requestBody: + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/AppsForNotif' + minItems: 1 + responses: + '200': + description: Network capabilities subscription list returned successfully + content: + application/json: + schema: + $ref: '#/components/schemas/AggrApplEventsList' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/app-policies-subscription: + post: + summary: Originating OP uses this procedure to Subscribe for Application's policy capability at + Partner OP. + operationId: CreateApplicationPolicySubscription + tags: + - ApplicationPolicyManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + responses: + '200': + description: Subscription for application policy management created successfully + content: + application/json: + schema: + type: object + properties: + applPolicySubscriptionId: + type: string + headers: + Location: + description: Contains the URI of the newly created resource + required: false + schema: + type: string + Accept-Encoding: + description: Accept-Encoding, described in IETF RFC 7694 + schema: + type: string + Content-Encoding: + description: Content-Encoding, described in IETF RFC 7231 + schema: + type: string + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/appl-policies-subscription/{appl-policy-subs-id}/app-policy-templates: + get: + summary: Originating OP uses this procedure to retrieve application policy templates from Partner + OP. + operationId: RetrieveAppPolicyTemplates + tags: + - ApplicationPolicyManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: appl-policy-subs-id + in: path + required: true + schema: + $ref: '#/components/schemas/EventSubscriptionIdentifier' + - name: appl-policy-type + in: query + required: false + schema: + $ref: '#/components/schemas/ApplPolicyType' + responses: + '200': + description: Successfully retrieved application policy templates + content: + application/json: + schema: + type: object + properties: + applPolicyTemplateList: + $ref: '#/components/schemas/ApplPolicyTemplateList' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/appl-policies-subscription/{appl-policy-subs-id}/app-policy-registration: + post: + summary: Register an application-level policy with the partner OP + operationId: RegisterApplicationPolicy + tags: + - ApplicationPolicyManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: appl-policy-subs-id + in: path + required: true + schema: + $ref: '#/components/schemas/EventSubscriptionIdentifier' + requestBody: + content: + application/json: + schema: + type: object + properties: + applConcretePolicy: + $ref: '#/components/schemas/ApplConcretePolicy' + responses: + '200': + description: Application policy registered successfully + content: + application/json: + schema: + type: object + required: + - pplConcretePolicy + - policyId + properties: + pplConcretePolicy: + $ref: '#/components/schemas/ApplConcretePolicy' + policyId: + type: string + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/app-policies-subscription/{appl-policy-subs-id}: + post: + summary: Origination OP uses this procedure to apply application-level policies to federated applications + at Partner OP. + operationId: ApplyApplicationPolicy + tags: + - ApplicationPolicyManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: appl-policy-subs-id + in: path + required: true + schema: + $ref: '#/components/schemas/EventSubscriptionIdentifier' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AssocApplPolicies' + responses: + '200': + description: Application Policy processed successfully + content: + application/json: + schema: + $ref: '#/components/schemas/AssocApplPolicies' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + get: + summary: Origination OP uses this procedure to retrieve application-level policies to federated + applications at Partner OP. + operationId: RetrieveApplicationPolicy + tags: + - ApplicationPolicyManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: appl-policy-subs-id + in: path + required: true + schema: + $ref: '#/components/schemas/EventSubscriptionIdentifier' + - name: policy-search-type + in: query + required: false + schema: + type: string + enum: + - app-prov-id + - app-id + - name: policy-search-value + in: query + required: false + schema: + type: string + description: Refers to either application provider identifier or the application identifier + responses: + '200': + description: Application Policy list retrieved successfully + content: + application/json: + schema: + $ref: '#/components/schemas/AssocApplPolicies' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + patch: + summary: Modify application-level policy associated with federated applications with the partner + OP + operationId: ModifyApplicationPolicy + tags: + - ApplicationPolicyManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: appl-policy-subs-id + in: path + required: true + schema: + $ref: '#/components/schemas/EventSubscriptionIdentifier' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AssocApplPolicies' + responses: + '200': + description: Application policies modified successfully + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/app-policies-subscription/{appl-policy-subs-id}/app-policy-cancel: + post: + summary: Remove applications from federated applications at Partner OP. + operationId: RemoveApplicationPolicies + tags: + - ApplicationPolicyManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: appl-policy-subs-id + in: path + required: true + schema: + $ref: '#/components/schemas/EventSubscriptionIdentifier' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AssocApplPolicies' + responses: + '200': + description: Successfully removed application policies + content: + application/json: + schema: + $ref: '#/components/schemas/AssocApplPolicies' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/ops-policies-subscription: + post: + summary: Originating OP uses this procedure to Subscribe for Operation's policy capability at Partner + OP. + operationId: CreateOperationPolicySubscription + tags: + - OperationPolicyManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + responses: + '200': + description: Subscription for operation's policy management created successfully + content: + application/json: + schema: + type: object + properties: + opslPolicySubscriptionId: + type: string + headers: + Location: + description: Contains the URI of the newly created resource + required: false + schema: + type: string + Accept-Encoding: + description: Accept-Encoding, described in IETF RFC 7694 + schema: + type: string + Content-Encoding: + description: Content-Encoding, described in IETF RFC 7231 + schema: + type: string + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/ops-policies-subscription/{ops-policy-subs-id}/ops-policy-templates: + get: + summary: Originating OP uses this procedure to retrieve operations policy templates from Partner + OP. + operationId: RetrieveOpsPolicyTemplates + tags: + - OperationPolicyManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: ops-policy-subs-id + in: path + required: true + schema: + $ref: '#/components/schemas/EventSubscriptionIdentifier' + - name: ops-policy-type + in: query + required: false + schema: + $ref: '#/components/schemas/OpsPolicyType' + responses: + '200': + description: Successfully retrieved operations policy templates + content: + application/json: + schema: + type: object + properties: + opsPolicyTemplateList: + $ref: '#/components/schemas/OpsPolicyTemplateList' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/ops-policies-subscription/{ops-policy-subs-id}/ops-policy-registration: + post: + summary: Register an operation-level policy with the partner OP + operationId: RegisterOperationPolicy + tags: + - OperationPolicyManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: ops-policy-subs-id + in: path + required: true + schema: + $ref: '#/components/schemas/EventSubscriptionIdentifier' + requestBody: + content: + application/json: + schema: + type: object + properties: + opsConcretePolicy: + $ref: '#/components/schemas/OpsConcretePolicy' + responses: + '200': + description: Operations policy registered successfully + content: + application/json: + schema: + type: object + required: + - opsConcretePolicy + - policyId + properties: + opsConcretePolicy: + $ref: '#/components/schemas/OpsConcretePolicy' + policyId: + type: string + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/ops-policies-subscription/{ops-policy-subs-id}/policy-association: + post: + summary: Origination OP uses this procedure to apply application-level policies to federated applications + at Partner OP. + operationId: ApplyOperationPolicy + tags: + - OperationPolicyManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: ops-policy-subs-id + in: path + required: true + schema: + $ref: '#/components/schemas/EventSubscriptionIdentifier' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AssocOpsPolicies' + responses: + '200': + description: Operation Policy processed successfully + content: + application/json: + schema: + $ref: '#/components/schemas/AssocOpsPolicies' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + get: + summary: Origination OP uses this procedure to retrieve application-level policies to federated + applications at Partner OP. + operationId: RetrieveOperationPolicy + tags: + - OperationPolicyManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: ops-policy-subs-id + in: path + required: true + schema: + $ref: '#/components/schemas/EventSubscriptionIdentifier' + - name: policy-search-type + in: query + required: false + schema: + type: string + enum: + - zone-id + - name: policy-search-value + in: query + required: false + schema: + type: string + description: Refers to availability zone identifier + responses: + '200': + description: Operations Policy list retrieved successfully + content: + application/json: + schema: + $ref: '#/components/schemas/AssocOpsPolicies' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + patch: + summary: Modify operation-level policy associated with federated applications with the Partner OP + operationId: ModifyOperationPolicy + tags: + - OperationPolicyManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: ops-policy-subs-id + in: path + required: true + schema: + $ref: '#/components/schemas/EventSubscriptionIdentifier' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AssocOpsPolicies' + responses: + '200': + description: Application policies modified successfully + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' + /{federationContextId}/ops-policies-subscription/{ops-policy-subs-id}/ops-policy-cancel: + post: + summary: Remove applications from federated applications at Partner OP. + operationId: RemoveOperationPolicies + tags: + - OperationPolicyManagement + parameters: + - name: federationContextId + in: path + required: true + schema: + $ref: '#/components/schemas/FederationContextId' + - name: ops-policy-subs-id + in: path + required: true + schema: + $ref: '#/components/schemas/EventSubscriptionIdentifier' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AssocOpsPolicies' + responses: + '200': + description: Successfully removed operation policies + content: + application/json: + schema: + $ref: '#/components/schemas/AssocOpsPolicies' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '404': + $ref: '#/components/responses/404NotFound' + '409': + $ref: '#/components/responses/409' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + '503': + $ref: '#/components/responses/503' + '520': + $ref: '#/components/responses/520' + default: + $ref: '#/components/responses/default' diff --git a/src/open_exposure_gateway/api/gsma/federation_manager/API_definitions/federation-manager.yaml b/src/open_exposure_gateway/api/gsma/federation_manager/API_definitions/federation-manager.yaml deleted file mode 100644 index 9991d08..0000000 --- a/src/open_exposure_gateway/api/gsma/federation_manager/API_definitions/federation-manager.yaml +++ /dev/null @@ -1,4609 +0,0 @@ -openapi: 3.0.3 -info: - title: Federation Management Service - description: | - # Introduction - --- - RESTful APIs that allow an OP to share the edge cloud resources and capabilities securely to other partner OPs over E/WBI. - - --- - # API Scope - - --- - APIs defined in this version of the implementation can be categorized into the following areas: - * __FederationManagement__ - Create and manage directed federation relationship with a partner OP - * __AvailabilityZoneInfoSynchronization__ - Management of resources of partner OP zones and status updates - * __ArtefactManagement__ - Upload, remove, retrieve and update application descriptors, charts and packages over E/WBI towards a partner OP - * __ApplicationOnboardingManagement__ - Register, retrieve, update and remove applications over E/WBI towards a partner OP - * __ApplicationDeploymentManagement__ - Create, update, retrieve and terminate application instances over E/WBI towards a partner OP - - --- - # Definitions - --- - This section provides definitions of terminologies commonly referred to throughout the API descriptions. - - * __Accepted Zones__ - List of partner OP zones, which the originating OP has confirmed to use for its edge applications. - * __Application Provider__ - An application developer, onboarding his/her edge application on a partner operator platform (MEC). - * __Artefact__ - Descriptor, charts or any other package associated with the application. - * __Availability Zone__ - Zones that partner OP can offer to share with originating OP. - * __Device__ - Refers to user equipment like mobile phone, tablet, IOT kit, AR/VR device etc. In context of MEC users use these devices to access edge applications. - * __Directed Federation__ - A Federation between two OP instances A and B, in which edge compute resources are shared by B to A, but not from A to B. - * __Edge Application__ - Application designed to run on MEC edge cloud. - * __E/WBI__ - East west bound interface. - * __Federation__ - Relationship among member OPs who agrees to offer services and capabilities to the application providers and end users of member OPs. - * __FederationContextId__ - Partner OP defined string identifier representing a certain federation relationship. - * __Federation Identifier__ - Identify an operator platform in federation context. - * __Flavour__ - A group of compute, network and storage resources that can be requested or granted as a single unit. - * __FlavourIdentifier__ - An OP defined string identifier representing a set of compute, storage and networking resources. - * __Home OP__ - Used in federation context to identify the OP with which the application developers or user clients are registered. - * __Instance__ - Application process running on an edge. - * __LCM Service__ - Partner OP service responsible for life cycle management of edge applications. LCM service is defined as HTTP based API endpoint identified by a well-defined FQDN or IP. - * __Offered Zones__ - Zones that partner OP offer to share to the Originating OP based on the prior agreement and local configuration. - * __Onboarding__ - Submitting an application to MEC platform. - * __OP__ - Operator platform. - * __OperatorIdentifier__ - String identifier representing the owner of MEC platform. Owner could be an enterprise, a TSP or some other organization. - * __Originating OP__ - The OP when initiating the federation creation request towards the partner OP is defined as the Originating OP. - * __Partner OP__ - Operator Platform which offers its Edge Cloud capabilities to the other Operator Platforms via E/WBI. - * __Resource__ - Compute, networking and storage resources. - * __ZoneIdentifier__ - An OP defined string identifier representing a certain geographical or logical area where edge resources and services are provided. - * __Zone Confirmation__ - Procedure via which originating OP acknowledges partner OP about the partner zones it wishes to use. - * __User Clients__ - Lightweight client applications used to access edge applications. Application users run these clients on their devices (UE, IOT device, AR/VR device etc). - - --- - # API Operations - --- - - __FederationManagement__ - * __CreateFederation__ - Creates a directed federation relationship with a partner OP. - * __GetFederationDetails__ - Retrieves details about the federation relationship with the partner OP. The response shall provide info about the zones offered by the partner, partner OP network codes, information about edge discovery and LCM service etc. - * __DeleteFederationDetails__ - Remove existing federation with the partner OP. - * __NotifyFederationUpdates__ - Call back notification used by partner OP to update originating OP about any change in existing federation relationship. - * __UpdateFederation__ - API used by the Originating OP towards the partner OP, to update the parameters associated to the existing federation. - * __QueryFederationContext__ - The Originating OP retrieves federationContextId from the partner OP. - - __AvailabilityZoneInfoSynchronization__ - * __ZoneSubscribe__ - Informs partner OP that originating OP is willing to access the specified zones and partner OP shall reserve compute and network resources for these zones. - * __ZoneUnsubscribe__ - Informs partner OP that originating OP will no longer access the specified partner OP zone. - * __GetZoneData__ - Retrieves details about the computation and network resources that partner OP has reserved for an partner OP zone. - * __Notify Zone Information__ - Call back notification used by partner OP to update originating OP about changes in the resources reserved on a partner zone. - - __ArtefactManagement__ - * __UploadArtefact__ - Uploads application artefact on partner operator platform. - * __RemoveArtefact__ - Removes an artefact from partner operator platform. - * __GetArtefact__ - Retrieves details about an artefact from partner operator platform. - - __ApplicationOnboardingManagement__ - * __OnboardApplication__ - Submits an application details to a partner OP. Based on the details provided, partner OP shall do bookkeeping, resource validation and other pre-deployment operations. - * __UpdateApplication__ - Updates partner OP about changes in application compute resource requirements, QOS Profile, associated descriptor or change in associated components. - * __DeboardApplication__ - Removes an application from partner OP. - * __ViewApplication__ - Retrieves application details from partner OP. - * __OnboardExistingAppNewZones__ - Make an application available on new additional zones. - * __LockUnlockApplicationZone__ - Forbid or permit instantiation of application on a zone. - - __Application Instance Lifecycle Management__ - * __InstallApp__ - Instantiates an application on a partner OP zone. - * __GetAppInstanceDetails__ - Retrieves an application instance details from partner OP. - * __RemoveApp__ - Terminate an application instance on a partner OP zone. - * __GetAllAppInstances__ - Retrieves details about all instances of the application running on partner OP zones. - - - © 2023 GSM Association. - All rights reserved. - version: 1.2.0 -externalDocs: - description: "GSMA, E/WBI APIs v1.3.1" - url: http://www.xxxx.com -servers: -- url: "/operatorplatform/federation/v1" -security: -- oAuth2ClientCredentials: - - fed-mgmt -paths: - /partner: - post: - tags: - - FederationManagement - summary: Creates one direction federation with partner operator platform. - operationId: create_federation - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/FederationRequestData' - required: true - responses: - "200": - description: Federation meta-info request accepted - headers: - Location: - description: "Contains the URI of the newly created resource, according\ - \ to the structure: {apiRoot}/operatorplatform/federation/v1/partner/{federationContextId}" - required: true - style: simple - explode: false - schema: - type: string - Accept-Encoding: - description: "Accept-Encoding, described in IETF RFC 7694" - style: simple - explode: false - schema: - type: string - Content-Encoding: - description: "Content-Encoding, described in IETF RFC 7231" - style: simple - explode: false - schema: - type: string - content: - application/json: - schema: - $ref: '#/components/schemas/FederationResponseData' - "400": - description: Bad request - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "401": - description: Unauthorized - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "404": - description: Not Found - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "409": - description: Conflict - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "422": - description: Unprocessable Entity - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "500": - description: Internal Server Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "503": - description: Service Unavailable - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "520": - description: Web Server Returned an Unknown Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - default: - description: Generic Error - callbacks: - onPartnerStatusEvent: - '{$request.body#/partnerStatusLink }': - post: - requestBody: - description: | - OP uses this callback api to notify partner OP about change in federation status, federation metadata or offered zone details. Allowed combinations of objectType and operationType are - - FEDERATION - STATUS: Status specified by parameter 'federationStatus'. - - ZONES - STATUS: Status specified by parameter 'zoneStatus'. - - ZONES - ADD: Use parameter 'addZones' to define add new zones - - ZONES - REMOVE: Use parameter 'removeZones' to define remove zones. - - EDGE_DISCOVERY_SERVICE - UPDATE: Use parameter 'edgeDiscoverySvcEndPoint' to specify new endpoints - - LCM_SERVICE - UPDATE: Use parameter 'lcmSvcEndPoint' to specify new endpoints - - MOBILE_NETWORK_CODES - ADD: Use parameter 'addMobileNetworkIds' to define new mobile network codes. - - MOBILE_NETWORK_CODES - REMOVE: Use parameter 'removeMobileNetworkIds' to remove mobile network codes. - - FIXED_NETWORK_CODES - ADD: Use parameter 'addFixedNetworkIds' to define new fixed network codes. - - FIXED_NETWORK_CODES - REMOVE: Use parameter 'removeFixedNetworkIds' to remove fixed network codes. - - SERVICE_APIS - ADD/REMOVE: Parameter Usage 'addServiceAPIs / removeServiceAPIs' to add or remove Service APIs support. - content: - application/json: - schema: - required: - - federationContextId - - modificationDate - - objectType - - operationType - type: object - properties: - federationContextId: - $ref: '#/components/schemas/FederationIdentifier' - objectType: - type: string - enum: - - FEDERATION - - ZONES - - EDGE_DISCOVERY_SERVICE - - LCM_SERVICE - - MOBILE_NETWORK_CODES - - FIXED_NETWORK_CODES - - SERVICE_APIS - operationType: - type: string - enum: - - STATUS - - UPDATE - - ADD - - REMOVE - edgeDiscoverySvcEndPoint: - $ref: '#/components/schemas/ServiceEndpoint' - lcmSvcEndPoint: - $ref: '#/components/schemas/ServiceEndpoint' - addMobileNetworkIds: - $ref: '#/components/schemas/MobileNetworkIds' - removeMobileNetworkIds: - $ref: '#/components/schemas/MobileNetworkIds' - addFixedNetworkIds: - $ref: '#/components/schemas/FixedNetworkIds' - removeFixedNetworkIds: - $ref: '#/components/schemas/FixedNetworkIds' - addZones: - minItems: 1 - type: array - description: "List of zones, which the operator platform\ - \ wishes to make available to developers/ISVs of requesting\ - \ operator platform." - items: - $ref: '#/components/schemas/ZoneDetails' - removeZones: - minItems: 1 - type: array - description: "List of zones, which the operator platform\ - \ no longer wishes to share." - items: - $ref: '#/components/schemas/ZoneIdentifier' - addServiceAPIs: - $ref: '#/components/schemas/serviceAPINames' - removeServiceAPIs: - $ref: '#/components/schemas/serviceAPINames' - zoneStatus: - minItems: 1 - type: array - items: - required: - - status - - zoneId - type: object - properties: - zoneId: - $ref: '#/components/schemas/ZoneIdentifier' - status: - $ref: '#/components/schemas/Status' - federationStatus: - $ref: '#/components/schemas/Status' - modificationDate: - type: string - description: Date and time of the federation modification - by the originating partner OP - format: date-time - responses: - "204": - description: Expected response to a successful call back processing - "400": - description: Bad request - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "401": - description: Unauthorized - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "404": - description: Not Found - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "409": - description: Conflict - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "422": - description: Unprocessable Entity - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "500": - description: Internal Server Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "503": - description: Service Unavailable - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "520": - description: Web Server Returned an Unknown Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - default: - description: Generic Error - x-openapi-router-controller: api.federation_management - /{federationContextId}/partner: - get: - tags: - - FederationManagement - summary: "Retrieves details about the federation context with the partner OP.\ - \ The response shall provide info about the zones offered by the partner,\ - \ partner OP network codes, information about edge discovery and LCM service\ - \ etc." - operationId: get_federation_details - parameters: - - name: federationContextId - in: path - required: true - style: simple - explode: false - schema: - $ref: '#/components/schemas/FederationContextId' - responses: - "200": - description: Federation meta-info request accepted - content: - application/json: - schema: - $ref: '#/components/schemas/inline_response_200_1' - "400": - description: Bad request - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "401": - description: Unauthorized - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "404": - description: Not Found - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "409": - description: Conflict - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "422": - description: Unprocessable Entity - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "500": - description: Internal Server Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "503": - description: Service Unavailable - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "520": - description: Web Server Returned an Unknown Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - default: - description: Generic Error - x-openapi-router-controller: api.federation_management - delete: - tags: - - FederationManagement - summary: Remove existing federation with the partner OP - operationId: delete_federation_details - parameters: - - name: federationContextId - in: path - required: true - style: simple - explode: false - schema: - $ref: '#/components/schemas/FederationContextId' - responses: - "200": - description: Federation removed successfully - "400": - description: Bad request - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "401": - description: Unauthorized - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "404": - description: Not Found - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "409": - description: Conflict - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "422": - description: Unprocessable Entity - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "500": - description: Internal Server Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "503": - description: Service Unavailable - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "520": - description: Web Server Returned an Unknown Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - default: - description: Generic Error - x-openapi-router-controller: api.federation_management - patch: - tags: - - FederationManagement - summary: "API used by the Originating OP towards the partner OP, to update the\ - \ parameters associated to the existing federation" - operationId: update_federation - parameters: - - name: federationContextId - in: path - required: true - style: simple - explode: false - schema: - $ref: '#/components/schemas/FederationContextId' - requestBody: - description: Details about changes origination OP wished to apply - content: - application/json: - schema: - $ref: '#/components/schemas/federationContextId_partner_body' - required: true - responses: - "200": - description: Federation meta-info request accepted - content: - application/json: - schema: - $ref: '#/components/schemas/inline_response_200_1' - "400": - description: Bad request - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "401": - description: Unauthorized - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "404": - description: Not Found - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "409": - description: Conflict - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "422": - description: Unprocessable Entity - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "500": - description: Internal Server Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "503": - description: Service Unavailable - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "520": - description: Web Server Returned an Unknown Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - default: - description: Generic Error - x-openapi-router-controller: api.federation_management - /fed-context-id: - get: - tags: - - FederationManagement - summary: Retrieves the existing federationContextId with partner operator platform. - operationId: get_federation_context_id - responses: - "200": - description: Federation context identifier retrieval request accepted - headers: - Location: - description: "Contains the URI of the existing resource, according to\ - \ the structure: {apiRoot}/operatorplatform/federation/v1/partner/{federationContextId}" - required: true - style: simple - explode: false - schema: - type: string - Accept-Encoding: - description: "Accept-Encoding, described in IETF RFC 7694" - style: simple - explode: false - schema: - type: string - Content-Encoding: - description: "Content-Encoding, described in IETF RFC 7231" - style: simple - explode: false - schema: - type: string - content: - application/json: - schema: - $ref: '#/components/schemas/inline_response_200_2' - "400": - description: Bad request - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "401": - description: Unauthorized - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "404": - description: Not Found - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "409": - description: Conflict - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "422": - description: Unprocessable Entity - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "500": - description: Internal Server Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "503": - description: Service Unavailable - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "520": - description: Web Server Returned an Unknown Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - default: - description: Generic Error - x-openapi-router-controller: api.federation_management - /{federationContextId}/zones: - post: - tags: - - AvailabilityZoneInfoSynchronization - summary: Originating OP informs partner OP that it is willing to access the - specified zones and partner OP shall reserve compute and network resources - for these zones. - operationId: zone_subscribe - parameters: - - name: federationContextId - in: path - required: true - style: simple - explode: false - schema: - $ref: '#/components/schemas/FederationContextId' - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ZoneRegistrationRequestData' - required: true - responses: - "200": - description: Zone registered successfully - content: - application/json: - schema: - $ref: '#/components/schemas/ZoneRegistrationResponseData' - "400": - description: Bad request - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "401": - description: Unauthorized - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "404": - description: Not Found - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "409": - description: Conflict - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "422": - description: Unprocessable Entity - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "500": - description: Internal Server Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "503": - description: Service Unavailable - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "520": - description: Web Server Returned an Unknown Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - default: - description: Generic Error - callbacks: - onZoneResourceUpdateEvent: - '{$request.body#/availZoneNotifLink}': - post: - requestBody: - description: Notification about resource availability. - content: - application/json: - schema: - required: - - federationContextId - - zoneId - - zoneResUpdInfo - type: object - properties: - federationContextId: - $ref: '#/components/schemas/FederationIdentifier' - zoneId: - $ref: '#/components/schemas/ZoneIdentifier' - zoneResUpdInfo: - type: array - items: - minProperties: 1 - type: object - properties: - availableCompResources: - minItems: 1 - type: array - description: Resources exclusively reserved for the - originator OP. - items: - $ref: '#/components/schemas/ComputeResourceInfo' - availableNetResources: - minProperties: 1 - type: object - properties: - egressBandWidth: - type: integer - description: Max dl throughput that this edge - can offer. It is defined in Mbps. - format: int32 - dedicatedNIC: - type: integer - format: int32 - supportSriov: - type: boolean - description: If this zone support SRIOV networks - or not - supportDPDK: - type: boolean - description: If this zone supports DPDK based - networking - responses: - "200": - description: Zone info notification acknowledged - "400": - description: Bad request - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "401": - description: Unauthorized - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "404": - description: Not Found - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "409": - description: Conflict - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "422": - description: Unprocessable Entity - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "500": - description: Internal Server Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "503": - description: Service Unavailable - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "520": - description: Web Server Returned an Unknown Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - default: - description: Generic Error - x-openapi-router-controller: api.availability_zone_info_synchronization - /{federationContextId}/zones/{zoneId}: - get: - tags: - - AvailabilityZoneInfoSynchronization - summary: Retrieves details about the computation and network resources that - partner OP has reserved for this zone. - operationId: get_zone_data - parameters: - - name: federationContextId - in: path - required: true - style: simple - explode: false - schema: - $ref: '#/components/schemas/FederationContextId' - - name: zoneId - in: path - required: true - style: simple - explode: false - schema: - $ref: '#/components/schemas/ZoneIdentifier' - responses: - "200": - description: Zone metadata - content: - application/json: - schema: - $ref: '#/components/schemas/ZoneRegisteredData' - "400": - description: Bad request - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "401": - description: Unauthorized - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "404": - description: Not Found - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "409": - description: Conflict - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "422": - description: Unprocessable Entity - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "500": - description: Internal Server Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "503": - description: Service Unavailable - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "520": - description: Web Server Returned an Unknown Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - default: - description: Generic Error - x-openapi-router-controller: api.availability_zone_info_synchronization - delete: - tags: - - AvailabilityZoneInfoSynchronization - summary: Assert usage of a partner OP zone. Originating OP informs partner OP - that it will no longer access the specified zone. - operationId: zone_unsubscribe - parameters: - - name: federationContextId - in: path - required: true - style: simple - explode: false - schema: - $ref: '#/components/schemas/FederationContextId' - - name: zoneId - in: path - required: true - style: simple - explode: false - schema: - $ref: '#/components/schemas/ZoneIdentifier' - responses: - "200": - description: Zone deregistered successfully - "400": - description: Bad request - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "401": - description: Unauthorized - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "404": - description: Not Found - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "409": - description: Conflict - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "422": - description: Unprocessable Entity - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "500": - description: Internal Server Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "503": - description: Service Unavailable - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "520": - description: Web Server Returned an Unknown Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - default: - description: Generic Error - x-openapi-router-controller: api.availability_zone_info_synchronization - /{federationContextId}/artefact: - post: - tags: - - ArtefactManagement - summary: Uploads application artefact on partner OP. Artefact is a zip file - containing scripts and/or packaging files like Terraform or Helm which are - required to create an instance of an application. - operationId: upload_artefact - parameters: - - name: federationContextId - in: path - required: true - style: simple - explode: false - schema: - $ref: '#/components/schemas/FederationContextId' - requestBody: - description: An application can consist of multiple components. App providers - are allowed to define separate artefacts for each component or they could - define a consolidated artefact at application level. - content: - application/json: - schema: - $ref: '#/components/schemas/federationContextId_artefact_body' - required: true - responses: - "200": - description: Artefact uploaded successfully - "400": - description: Bad request - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "401": - description: Unauthorized - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "404": - description: Not Found - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "409": - description: Conflict - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "422": - description: Unprocessable Entity - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "500": - description: Internal Server Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "503": - description: Service Unavailable - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "520": - description: Web Server Returned an Unknown Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - default: - description: Generic Error - x-openapi-router-controller: api.artefact_management - /{federationContextId}/artefact/{artefactId}: - get: - tags: - - ArtefactManagement - summary: Retrieves details about an artefact. - operationId: get_artefact - parameters: - - name: federationContextId - in: path - required: true - style: simple - explode: false - schema: - $ref: '#/components/schemas/FederationContextId' - - name: artefactId - in: path - required: true - style: simple - explode: false - schema: - $ref: '#/components/schemas/ArtefactId' - responses: - "200": - description: Artefact details - content: - application/json: - schema: - $ref: '#/components/schemas/inline_response_200_5' - "400": - description: Bad request - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "401": - description: Unauthorized - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "404": - description: Not Found - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "409": - description: Conflict - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "422": - description: Unprocessable Entity - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "500": - description: Internal Server Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "503": - description: Service Unavailable - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "520": - description: Web Server Returned an Unknown Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - default: - description: Generic Error - x-openapi-router-controller: api.artefact_management - delete: - tags: - - ArtefactManagement - summary: Removes an artefact from partner OP. - operationId: remove_artefact - parameters: - - name: federationContextId - in: path - required: true - style: simple - explode: false - schema: - $ref: '#/components/schemas/FederationContextId' - - name: artefactId - in: path - required: true - style: simple - explode: false - schema: - $ref: '#/components/schemas/ArtefactId' - responses: - "200": - description: Artefact deletion successful - "400": - description: Bad request - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "401": - description: Unauthorized - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "404": - description: Not Found - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "409": - description: Conflict - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "422": - description: Unprocessable Entity - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "500": - description: Internal Server Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "503": - description: Service Unavailable - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "520": - description: Web Server Returned an Unknown Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - default: - description: Generic Error - x-openapi-router-controller: api.artefact_management - /{federationContextId}/application/onboarding: - post: - tags: - - ApplicationOnboardingManagement - summary: "Submits an application details to a partner OP. Based on the details\ - \ provided, partner OP shall do bookkeeping, resource validation and other\ - \ pre-deployment operations." - operationId: onboard_application - parameters: - - name: federationContextId - in: path - required: true - style: simple - explode: false - schema: - $ref: '#/components/schemas/FederationContextId' - requestBody: - description: "Details about application compute resource requirements, associated\ - \ artefacts, QoS profile and regions where application shall be made available\ - \ etc." - content: - application/json: - schema: - $ref: '#/components/schemas/application_onboarding_body' - required: true - responses: - "202": - description: Application onboarded request accepted - "400": - description: Bad request - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "401": - description: Unauthorized - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "404": - description: Not Found - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "409": - description: Conflict - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "422": - description: Unprocessable Entity - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "500": - description: Internal Server Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "503": - description: Service Unavailable - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "520": - description: Web Server Returned an Unknown Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - default: - description: Generic Error - callbacks: - onApplicationOnboardStatusEvent: - '{$request.body#/appStatusCallbackLink}': - post: - requestBody: - description: Notification payload. - content: - application/json: - schema: - required: - - appId - - federationContextId - - statusInfo - type: object - properties: - federationContextId: - $ref: '#/components/schemas/FederationIdentifier' - appId: - $ref: '#/components/schemas/AppIdentifier' - statusInfo: - minItems: 1 - type: array - items: - required: - - onboardStatusInfo - - zoneId - type: object - properties: - zoneId: - $ref: '#/components/schemas/ZoneIdentifier' - onboardStatusInfo: - type: string - description: Defines change in application status. - This change could be related to application itself - or an application instance status - enum: - - PENDING - - ONBOARDED - - DEBOARDING - - REMOVED - - FAILED - responses: - "204": - description: Application status updated - "400": - description: Bad request - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "401": - description: Unauthorized - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "404": - description: Not Found - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "409": - description: Conflict - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "422": - description: Unprocessable Entity - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "500": - description: Internal Server Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "503": - description: Service Unavailable - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "520": - description: Web Server Returned an Unknown Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - default: - description: Generic Error - x-openapi-router-controller: api.application_onboarding_management - /{federationContextId}/application/onboarding/app/{appId}: - get: - tags: - - ApplicationOnboardingManagement - summary: Retrieves application details from partner OP - operationId: view_application - parameters: - - name: federationContextId - in: path - required: true - style: simple - explode: false - schema: - $ref: '#/components/schemas/FederationContextId' - - name: appId - in: path - required: true - style: simple - explode: false - schema: - $ref: '#/components/schemas/AppIdentifier' - responses: - "200": - description: Application details - content: - application/json: - schema: - $ref: '#/components/schemas/inline_response_200_7' - "400": - description: Bad request - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "401": - description: Unauthorized - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "404": - description: Not Found - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "409": - description: Conflict - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "422": - description: Unprocessable Entity - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "500": - description: Internal Server Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "503": - description: Service Unavailable - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "520": - description: Web Server Returned an Unknown Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - default: - description: Generic Error - x-openapi-router-controller: api.application_onboarding_management - delete: - tags: - - ApplicationOnboardingManagement - summary: "Deboards the application from any zones, if any, and deletes the App." - operationId: delete_app - parameters: - - name: federationContextId - in: path - required: true - style: simple - explode: false - schema: - $ref: '#/components/schemas/FederationContextId' - - name: appId - in: path - required: true - style: simple - explode: false - schema: - $ref: '#/components/schemas/AppIdentifier' - responses: - "200": - description: App deletion successful - "400": - description: Bad request - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "401": - description: Unauthorized - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "404": - description: Not Found - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "409": - description: Conflict - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "422": - description: Unprocessable Entity - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "500": - description: Internal Server Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "503": - description: Service Unavailable - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "520": - description: Web Server Returned an Unknown Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - default: - description: Generic Error - x-openapi-router-controller: api.application_onboarding_management - patch: - tags: - - ApplicationOnboardingManagement - summary: "Updates partner OP about changes in application compute resource requirements,\ - \ QOS Profile, associated descriptor or change in associated components" - operationId: update_application - parameters: - - name: federationContextId - in: path - required: true - style: simple - explode: false - schema: - $ref: '#/components/schemas/FederationContextId' - - name: appId - in: path - required: true - style: simple - explode: false - schema: - $ref: '#/components/schemas/AppIdentifier' - requestBody: - description: "Details about application compute resource requirements, associated\ - \ artefact and QOS profile that needs to be updated." - content: - application/json: - schema: - $ref: '#/components/schemas/app_appId_body' - required: true - responses: - "202": - description: Application update request accepted - "400": - description: Bad request - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "401": - description: Unauthorized - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "404": - description: Not Found - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "409": - description: Conflict - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "422": - description: Unprocessable Entity - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "500": - description: Internal Server Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "503": - description: Service Unavailable - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "520": - description: Web Server Returned an Unknown Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - default: - description: Generic Error - x-openapi-router-controller: api.application_onboarding_management - /{federationContextId}/application/lcm: - post: - tags: - - ApplicationDeploymentManagement - summary: Instantiates an application on a partner OP zone. - operationId: install_app - parameters: - - name: federationContextId - in: path - required: true - style: simple - explode: false - schema: - $ref: '#/components/schemas/FederationContextId' - requestBody: - description: Details about application and zones where application instance - should be created. It also definea call back URI which the partner OP shall - use update home OP about a change in instance status. - content: - application/json: - schema: - $ref: '#/components/schemas/application_lcm_body' - responses: - "202": - description: Application instance creation request accepted. - content: - application/json: - schema: - $ref: '#/components/schemas/inline_response_202' - "400": - description: Bad request - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "401": - description: Unauthorized - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "404": - description: Not Found - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "409": - description: Conflict - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "422": - description: Unprocessable Entity - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "500": - description: Internal Server Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "503": - description: Service Unavailable - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "520": - description: Web Server Returned an Unknown Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - default: - description: Generic Error - callbacks: - onInstanceStatusEvent: - '{$request.body#/appInstCallbackLink}': - post: - requestBody: - description: Notification payload. - content: - application/json: - schema: - required: - - appId - - appInstanceId - - appInstanceInfo - - federationContextId - - zoneId - type: object - properties: - federationContextId: - $ref: '#/components/schemas/FederationIdentifier' - appId: - $ref: '#/components/schemas/AppIdentifier' - appInstanceId: - $ref: '#/components/schemas/InstanceIdentifier' - zoneId: - $ref: '#/components/schemas/ZoneIdentifier' - appInstanceInfo: - minProperties: 1 - type: object - properties: - appInstanceState: - type: string - description: Running status of the application instance. - enum: - - PENDING - - READY - - FAILED - - TERMINATING - message: - type: string - description: Event information or failure message. - accesspointInfo: - minItems: 1 - type: array - description: Information about the IP and Port exposed - by the OP. Application clients shall use these access - points to reach this application instance - items: - required: - - accessPoints - - interfaceId - type: object - properties: - interfaceId: - pattern: "^[A-Za-z0-9][A-Za-z0-9_]{6,30}[A-Za-z0-9]$" - type: string - description: This is the interface Identifier - that app provider defines when application is - onboarded. - accessPoints: - $ref: '#/components/schemas/ServiceEndpoint' - modificationDate: - type: string - description: Date and time of the instance state modification - by partner OP. - format: date-time - responses: - "204": - description: Application instance state notification acknowledged - "400": - description: Bad request - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "401": - description: Unauthorized - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "404": - description: Not Found - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "409": - description: Conflict - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "422": - description: Unprocessable Entity - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "500": - description: Internal Server Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "503": - description: Service Unavailable - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "520": - description: Web Server Returned an Unknown Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - default: - description: Generic Error - x-openapi-router-controller: api.application_deployment_management - /{federationContextId}/application/lcm/app/{appId}/instance/{appInstanceId}/zone/{zoneId}: - get: - tags: - - ApplicationDeploymentManagement - summary: Retrieves an application instance details from partner OP. - operationId: get_app_instance_details - parameters: - - name: federationContextId - in: path - required: true - style: simple - explode: false - schema: - $ref: '#/components/schemas/FederationContextId' - - name: appId - in: path - required: true - style: simple - explode: false - schema: - $ref: '#/components/schemas/AppIdentifier' - - name: appInstanceId - in: path - required: true - style: simple - explode: false - schema: - $ref: '#/components/schemas/InstanceIdentifier' - - name: zoneId - in: path - required: true - style: simple - explode: false - schema: - $ref: '#/components/schemas/ZoneIdentifier' - responses: - "200": - description: Application instance details - content: - application/json: - schema: - $ref: '#/components/schemas/inline_response_200_8' - "400": - description: Bad request - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "401": - description: Unauthorized - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "404": - description: Not Found - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "409": - description: Conflict - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "422": - description: Unprocessable Entity - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "500": - description: Internal Server Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "503": - description: Service Unavailable - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "520": - description: Web Server Returned an Unknown Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - default: - description: Generic Error - x-openapi-router-controller: api.application_deployment_management - delete: - tags: - - ApplicationDeploymentManagement - summary: Terminate an application instance on a partner OP zone. - operationId: remove_app - parameters: - - name: federationContextId - in: path - required: true - style: simple - explode: false - schema: - $ref: '#/components/schemas/FederationContextId' - - name: appId - in: path - required: true - style: simple - explode: false - schema: - $ref: '#/components/schemas/AppIdentifier' - - name: appInstanceId - in: path - required: true - style: simple - explode: false - schema: - $ref: '#/components/schemas/InstanceIdentifier' - - name: zoneId - in: path - required: true - style: simple - explode: false - schema: - $ref: '#/components/schemas/ZoneIdentifier' - responses: - "200": - description: Application instance termination request accepted - "400": - description: Bad request - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "401": - description: Unauthorized - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "404": - description: Not Found - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "409": - description: Conflict - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "422": - description: Unprocessable Entity - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "500": - description: Internal Server Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "503": - description: Service Unavailable - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "520": - description: Web Server Returned an Unknown Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - default: - description: Generic Error - x-openapi-router-controller: api.application_deployment_management - /{federationContextId}/application/lcm/app/{appId}/appProvider/{appProviderId}: - get: - tags: - - ApplicationDeploymentManagement - summary: Retrieves all application instance of partner OP - operationId: get_all_app_instances - parameters: - - name: federationContextId - in: path - required: true - style: simple - explode: false - schema: - $ref: '#/components/schemas/FederationContextId' - - name: appId - in: path - required: true - style: simple - explode: false - schema: - $ref: '#/components/schemas/AppIdentifier' - - name: appProviderId - in: path - required: true - style: simple - explode: false - schema: - $ref: '#/components/schemas/AppProviderId' - responses: - "200": - description: Application Instance details - content: - application/json: - schema: - minItems: 1 - type: array - items: - $ref: '#/components/schemas/inline_response_200_9' - x-content-type: application/json - "400": - description: Bad request - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "401": - description: Unauthorized - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "404": - description: Not Found - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "409": - description: Conflict - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "422": - description: Unprocessable Entity - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "500": - description: Internal Server Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "503": - description: Service Unavailable - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "520": - description: Web Server Returned an Unknown Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - default: - description: Generic Error - x-openapi-router-controller: api.application_deployment_management - -components: - schemas: - AppIdentifier: - pattern: "^(?:[A-Za-z][A-Za-z0-9_]{7,63}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$" - type: string - description: Identifier used to refer to an application. - AppProviderId: - pattern: "^[A-Za-z][A-Za-z0-9_]{7,63}$" - type: string - description: UserId of the app provider. Identifier is relevant only in context - of this federation. - ArtefactId: - type: string - description: A globally unique identifier associated with the artefact. Originating - OP generates this identifier when artefact is submitted over NBI. - format: uuid - CountryCode: - pattern: "^[A-Z]{2}$" - type: string - description: ISO 3166-1 Alpha-2 code for the country of Partner operator - CPUArchType: - type: string - description: "CPU Instruction Set Architecture (ISA) E.g., Intel, Arm etc." - enum: - - ISA_X86 - - ISA_X86_64 - - ISA_ARM_64 - InstanceIdentifier: - #pattern: "^[A-Za-z0-9][A-Za-z0-9_]{6,62}[A-Za-z0-9]$" - type: string - description: Unique identifier generated by the partner OP to identify an instance - of the application on a specific zone. - InstanceState: - type: string - description: Running status of the application instance. - enum: - - PENDING - - READY - - FAILED - - TERMINATING - Ipv4Addr: - pattern: "^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$" - type: string - example: 198.51.100.1 - Ipv6Addr: - type: string - example: 2001:db8:85a3::8a2e:370:7334 - allOf: - - pattern: "^((:|(0?|([1-9a-f][0-9a-f]{0,3}))):)((0?|([1-9a-f][0-9a-f]{0,3})):){0,6}(:|(0?|([1-9a-f][0-9a-f]{0,3})))$" - - pattern: "^((([^:]+:){7}([^:]+))|((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?))$" - Fqdn: - type: string - FixedNetworkIds: - minItems: 1 - type: array - description: List of network identifier associated with the fixed line network - of the operator platform. - items: - type: string - FederationContextId: - pattern: "^[A-Za-z0-9][A-Za-z0-9-]*$" - type: string - description: This identifier shall be provided by the partner OP on successful - verification and validation of the federation create request and is used by - partner op to identify this newly created federation context. Originating - OP shall provide this identifier in any subsequent request towards the partner - op. - readOnly: true - FederationIdentifier: - pattern: "^[A-Za-z0-9][A-Za-z0-9-]*$" - type: string - description: Globally unique identifier allocated to an operator platform. This - is valid and used only in context of MEC federation interface. - FileId: - type: string - description: A globally unique identifier associated with the image file. Originating - OP generates this identifier when file is uploaded over NBI. - format: uuid - FlavourId: - type: string - description: An identifier to refer to a specific combination of compute resources - GeoLocation: - pattern: "^([-+]?)([\\d]{1,2})((((\\.)([\\d]{1,4}))?(,)))(([-+]?)([\\d]{1,3})((\\\ - .)([\\d]{1,4}))?)$" - type: string - description: "Latitude,Longitude as decimal fraction up to 4 digit precision" - Mcc: - pattern: "^\\d{3}$" - type: string - Mnc: - pattern: "^\\d{2,3}$" - type: string - Port: - minimum: 0 - type: integer - Status: - type: string - enum: - - FAILED - - TEMPORARY_FAILURE - - AVAILABLE - - LOCKED - - NOT_AVAILABLE - Uri: - type: string - Vcpu: - pattern: "^\\d+((\\.\\d{1,3})|(m))?$" - type: string - description: "Number of vcpus in whole, decimal up to millivcpu, or millivcpu\ - \ format." - example: "{\"whole\":{\"value\":2},\"decimal\":{\"value\":0.5},\"millivcpu\"\ - :{\"value\":\"500m\"}}" - Version: - pattern: "^(\\d{1,2}\\.)?(\\d{1,2}\\.)?(\\d{1,2})$" - type: string - description: Versioning info in the format major.minor.patch - VirtImageType: - type: string - description: "Indicate if the file is Container image or VM image (QCOW2, OVA)" - enum: - - QCOW2 - - DOCKER - - OVA - ZoneIdentifier: - pattern: "^[A-Za-z0-9][A-Za-z0-9-]*$" - type: string - description: Human readable name of the zone. - FederationHealthInfo: - required: - - federationStatus - - numOfAcceptedZones - type: object - properties: - federationStatus: - $ref: '#/components/schemas/State' - numOfAcceptedZones: - type: string - numOfActiveAlarms: - type: string - numOfApplications: - type: string - example: - numOfApplications: numOfApplications - federationStatus: - alarmState: RAISED - numOfActiveAlarms: numOfActiveAlarms - numOfAcceptedZones: numOfAcceptedZones - FederationSupportedAPIs: - required: - - artefactAPI - - availabilityZoneAPI - - edgeApplicationAPI - - federationBaseAPI - - fileAPI - type: object - properties: - federationBaseAPI: - $ref: '#/components/schemas/FederationAPIResources' - availabilityZoneAPI: - $ref: '#/components/schemas/FederationAPIResources' - edgeApplicationAPI: - $ref: '#/components/schemas/FederationAPIResources' - artefactAPI: - $ref: '#/components/schemas/FederationAPIResources' - fileAPI: - $ref: '#/components/schemas/FederationAPIResources' - serviceAPIFederation: - $ref: '#/components/schemas/FederationAPIResources' - resourceMonitoringAPI: - $ref: '#/components/schemas/FederationAPIResources' - faultManagementAPI: - $ref: '#/components/schemas/FederationAPIResources' - eventManagementAPI: - $ref: '#/components/schemas/FederationAPIResources' - example: - availabilityZoneAPI: null - artefactAPI: null - fileAPI: null - resourceMonitoringAPI: null - faultManagementAPI: null - federationBaseAPI: - name: FEDERATION - apiOperations: - - httpMethods: - - POST - - POST - href: href - - httpMethods: - - POST - - POST - href: href - serviceAPIFederation: null - eventManagementAPI: null - edgeApplicationAPI: null - FederationAPINames: - type: string - enum: - - FEDERATION - - AVAILZONE - - ARTEFACT - - FILE - - SVSAPEFED - - RESMONITOR - - EVENTMGMT - - FAULTMGMT - HttpMethods: - type: string - enum: - - POST - - PUT - - PATCH - - DELETE - - GET - HttpResources: - required: - - href - - httpMethods - type: object - properties: - href: - $ref: '#/components/schemas/Uri' - httpMethods: - type: array - description: List of HTTP Methods supported for the given API category - items: - $ref: '#/components/schemas/HttpMethods' - example: - httpMethods: - - POST - - POST - href: href - FederationAPIResources: - required: - - apiOperations - - name - type: object - properties: - name: - $ref: '#/components/schemas/FederationAPINames' - apiOperations: - type: array - description: List of HTTP Methods supported for the given API category - items: - $ref: '#/components/schemas/HttpResources' - example: - name: FEDERATION - apiOperations: - - httpMethods: - - POST - - POST - href: href - - httpMethods: - - POST - - POST - href: href - State: - required: - - alarmState - type: object - properties: - alarmState: - type: string - description: Defines the alarm state during its life cycle (raised | updated - | cleared). - enum: - - RAISED - - UPDATED - - CLEAR - example: - alarmState: RAISED - serviceType: - type: string - description: An identifier to refer to partner OP capabilities for application - providers. - enum: - - api_federation - serviceAPINames: - minItems: 1 - type: array - description: "List of Service API capability names an OP supports and offers\ - \ to other OPs \"quality_on_demand\", \"device_location\" etc." - items: - type: string - enum: - - QualityOnDemand - - DeviceLocation - - DeviceStatus - - SimSwap - - NumberVerification - - DeviceIdentifier - serviceAPINameVal: - type: string - enum: - - QualityOnDemand - - DeviceLocation - - DeviceStatus - - SimSwap - - NumberVerification - - DeviceIdentifier - description: Name of the Service API - serviceRoutingInfo: - minItems: 1 - type: array - description: List of public IP addresses MNO manages for UEs to connect with - public data networks - items: - pattern: "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\\ - /([0-9]|[1-2][0-9]|3[0-2]))?$" - type: string - AppComponentSpecs: - minItems: 1 - type: array - description: "An application may consist of more than one component. Each component\ - \ is associated with a descriptor and may exposes its services externally\ - \ or internally. App providers are required to provide details about all\ - \ these components, their associated descriptors and their DNS names." - items: - $ref: '#/components/schemas/AppComponentSpecs_inner' - AppMetaData: - required: - - accessToken - - appName - - version - type: object - properties: - appName: - pattern: "^[A-Za-z][A-Za-z0-9_]{7,31}$" - type: string - description: Name of the application. Application provider define a human - readable name for the application - version: - type: string - description: Version info of the application - appDescription: - maxLength: 256 - minLength: 16 - type: string - description: Brief application description provided by application provider - mobilitySupport: - type: boolean - description: Indicates if an application is sensitive to user mobility and - can be relocated. Default is “FALSE” - default: false - accessToken: - pattern: "^[A-Za-z][A-Za-z0-9_]{31,63}$" - type: string - description: "An application Access key, to be used with UNI interface to\ - \ authorize UCs Access to a given application" - category: - type: string - description: Possible categorization of the application - enum: - - IOT - - HEALTH_CARE - - GAMING - - VIRTUAL_REALITY - - SOCIALIZING - - SURVEILLANCE - - ENTERTAINMENT - - CONNECTIVITY - - PRODUCTIVITY - - SECURITY - - INDUSTRIAL - - EDUCATION - - OTHERS - description: Application metadata details - example: - appName: appName - mobilitySupport: false - appDescription: appDescription - accessToken: accessToken - category: IOT - version: version - AppQoSProfile: - required: - - latencyConstraints - type: object - properties: - latencyConstraints: - type: string - description: "Latency requirements for the application. Allowed values (non-standardized)\ - \ are none, low and ultra-low. Ultra-Low may corresponds to range 15 -\ - \ 30 msec, Low correspond to range 30 - 50 msec. None means 51 and above" - enum: - - NONE - - LOW - - ULTRALOW - bandwidthRequired: - minimum: 1 - type: integer - description: Data transfer bandwidth requirement (minimum limit) for the - application. It should in Mbits/sec - format: int32 - multiUserClients: - type: string - description: Single user type application are designed to serve just one - client. Multi user type application is designed to serve multiple clients - default: APP_TYPE_SINGLE_USER - enum: - - APP_TYPE_SINGLE_USER - - APP_TYPE_MULTI_USER - noOfUsersPerAppInst: - type: integer - description: Maximum no of clients that can connect to an instance of this - application. This parameter is relevant only for application of type multi - user - default: 1 - appProvisioning: - type: boolean - description: Define if application can be instantiated or not - default: true - description: "Parameters corresponding to the performance constraints, tenancy\ - \ details etc." - example: - bandwidthRequired: 1 - multiUserClients: APP_TYPE_SINGLE_USER - noOfUsersPerAppInst: 6 - latencyConstraints: NONE - appProvisioning: true - CallbackCredentials: - required: - - clientId - - clientSecret - - tokenUrl - type: object - properties: - tokenUrl: - $ref: '#/components/schemas/Uri' - clientId: - type: string - description: Client id for oauth2 client credentials flow. - clientSecret: - type: string - description: Client secret for oauth2 client credentials flow. - description: "Authentication credentials for callbacks. Callbacks use the same\ - \ security scheme, flows, and scopes as the forward path." - CompEnvParams: - required: - - envValueType - - envVarName - type: object - properties: - envVarName: - pattern: "^[A-Za-z0-9][A-Za-z0-9_]{6,30}[A-Za-z0-9]$" - type: string - description: Name of environment variable - envValueType: - type: string - enum: - - USER_DEFINED - - PLATFORM_DEFINED_DYNAMIC_PORT - - PLATFORM_DEFINED_DNS - - PLATFORM_DEFINED_IP - envVarValue: - pattern: "^[A-Za-z0-9][A-Za-z0-9_]{6,62}[A-Za-z0-9]$" - type: string - description: Value to be assigned to environment variable - envVarSrc: - type: string - description: "Full path of parameter from componentSpec that should be used\ - \ to generate the environment value. Eg. networkResourceProfile[1]. interfaceId." - description: Environment variables are key value pairs that should be injected - when component in instantiated - CommandLineParams: - required: - - command - type: object - properties: - command: - type: array - description: List of commands that application should invoke when an instance - is created. - items: - type: string - commandArgs: - type: array - description: List of arguments required by the command. - items: - type: string - description: List of commands and arguments that shall be invoked when the component - instance is created. This is valid only for container based deployment. - DeploymentConfig: - required: - - configType - - contents - type: object - properties: - configType: - type: string - description: Config type. - enum: - - DOCKER_COMPOSE - - KUBERNETES_MANIFEST - - CLOUD_INIT - - HELM_VALUES - contents: - type: string - description: Contents of the configuration. - description: "Configuration used when deploying a component. May override other\ - \ ComponentSpec parameters related to deployment like restart policy, command\ - \ line parameters, environment variables, etc." - ComponentSpec: - required: - - componentName - - computeResourceProfile - - images - - numOfInstances - - restartPolicy - type: object - properties: - componentName: - # pattern: "^[A-Za-z0-9][A-Za-z0-9_]{6,62}[A-Za-z0-9]$" - type: string - description: Must be a valid RFC 1035 label name. Component name must be - unique with an application - images: - minItems: 1 - type: array - description: List of all images associated with the component. Images are - specified using the file identifiers. Partner OP provides these images - using file upload api. - items: - $ref: '#/components/schemas/FileId' - numOfInstances: - type: integer - description: Number of component instances to be launched. - format: int32 - restartPolicy: - type: string - description: How the platform shall handle component failure - enum: - - RESTART_POLICY_ALWAYS - - RESTART_POLICY_NEVER - commandLineParams: - $ref: '#/components/schemas/CommandLineParams' - exposedInterfaces: - minItems: 1 - type: array - description: Each application component exposes some ports either for external - users or for inter component communication. Application provider is required - to specify which ports are to be exposed and the type of traffic that - will flow through these ports. - items: - $ref: '#/components/schemas/InterfaceDetails' - computeResourceProfile: - $ref: '#/components/schemas/ComputeResourceInfo' - compEnvParams: - type: array - items: - $ref: '#/components/schemas/CompEnvParams' - deploymentConfig: - $ref: '#/components/schemas/DeploymentConfig' - persistentVolumes: - minItems: 1 - type: array - description: The ephemeral volume a container process may need to temporary - store internal data - items: - $ref: '#/components/schemas/PersistentVolumeDetails' - description: "Details about compute, networking and storage requirements for\ - \ each component of the application. App provider should define all information\ - \ needed to instantiate the component. If artefact is being defined at component\ - \ level this section should have information just about the component. In\ - \ case the artefact is being defined at application level the section should\ - \ provide details about all the components." - ComputeResourceInfo: - required: - - cpuArchType - - memory - - numCPU - type: object - properties: - cpuArchType: - type: string - description: "CPU Instruction Set Architecture (ISA) E.g., Intel, Arm etc." - enum: - - ISA_X86_64 - - ISA_ARM_64 - numCPU: - $ref: '#/components/schemas/Vcpu' - memory: - type: integer - description: Amount of RAM in Mbytes - format: int64 - diskStorage: - type: integer - description: Amount of disk storage in Gbytes for a given ISA type - format: int32 - gpu: - type: array - items: - $ref: '#/components/schemas/GpuInfo' - vpu: - type: integer - description: Number of Intel VPUs available for a given ISA type - fpga: - type: integer - description: Number of FPGAs available for a given ISA type - hugepages: - type: array - items: - $ref: '#/components/schemas/HugePage' - cpuExclusivity: - type: boolean - description: Support for exclusive CPUs - example: - hugepages: - - number: 7 - pageSize: 2MB - - number: 7 - pageSize: 2MB - memory: 0 - fpga: 2 - cpuArchType: ISA_X86_64 - diskStorage: 6 - numCPU: "{\"whole\":{\"value\":2},\"decimal\":{\"value\":0.5},\"millivcpu\"\ - :{\"value\":\"500m\"}}" - vpu: 5 - cpuExclusivity: true - gpu: - - gpuMemory: 1 - gpuVendorType: Nvidia - gpuModeName: gpuModeName - numGPU: 5 - - gpuMemory: 1 - gpuVendorType: Nvidia - gpuModeName: gpuModeName - numGPU: 5 - FederationRequestData: - required: - - initialDate - - origOPFederationId - - partnerStatusLink - type: object - properties: - origOPFederationId: - $ref: '#/components/schemas/FederationIdentifier' - origOPCountryCode: - $ref: '#/components/schemas/CountryCode' - origOPMobileNetworkCodes: - $ref: '#/components/schemas/MobileNetworkIds' - origOPFixedNetworkCodes: - $ref: '#/components/schemas/FixedNetworkIds' - initialDate: - type: string - description: Time zone info of the federation initiated by the originating - OP - format: date-time - partnerStatusLink: - $ref: '#/components/schemas/Uri' - partnerCallbackCredentials: - $ref: '#/components/schemas/CallbackCredentials' - FederationResponseData: - required: - - federationContextId - - partnerOPFederationId - - platformCaps - type: object - properties: - partnerOPFederationId: - $ref: '#/components/schemas/FederationIdentifier' - partnerOPCountryCode: - $ref: '#/components/schemas/CountryCode' - federationContextId: - $ref: '#/components/schemas/FederationContextId' - edgeDiscoveryServiceEndPoint: - $ref: '#/components/schemas/ServiceEndpoint' - lcmServiceEndPoint: - $ref: '#/components/schemas/ServiceEndpoint' - partnerOPMobileNetworkCodes: - $ref: '#/components/schemas/MobileNetworkIds' - partnerOPFixedNetworkCodes: - $ref: '#/components/schemas/FixedNetworkIds' - offeredAvailabilityZones: - minItems: 1 - type: array - description: "List of zones, which the operator platform wishes to make\ - \ available to developers/ISVs of requesting operator platform." - items: - $ref: '#/components/schemas/ZoneDetails' - platformCaps: - type: array - items: - type: string - description: "Home routing - Operator platform is capable of routing edge\ - \ application data traffic from its edges to user device in their home\ - \ location. This is the case where user devices are served in their\ - \ home region (requesting platform region, non-roaming) but the corresponding\ - \ edge application are in operator platform edges. Anchoring - Operator\ - \ platform is capable of routing edge application traffic for roaming\ - \ user devices to edge application in user device home network. Service\ - \ APIs - Capability to handle Service APIs (e.g., CAMARA APIs) from\ - \ the Leading OP" - enum: - - homeRouting - - Anchoring - - serviceAPIs - - faultMgmt - - eventMgmt - - resourceMonitor - example: - offeredAvailabilityZones: - - geographyDetails: geographyDetails - zoneId: zoneId - geolocation: geolocation - - geographyDetails: geographyDetails - zoneId: zoneId - geolocation: geolocation - platformCaps: - - homeRouting - - homeRouting - partnerOPCountryCode: partnerOPCountryCode - federationContextId: federationContextId - lcmServiceEndPoint: null - partnerOPFederationId: partnerOPFederationId - edgeDiscoveryServiceEndPoint: - ipv4Addresses: - - 198.51.100.1 - - 198.51.100.1 - port: 0 - fqdn: fqdn - ipv6Addresses: - - 2001:db8:85a3::8a2e:370:7334 - - 2001:db8:85a3::8a2e:370:7334 - partnerOPMobileNetworkCodes: - mncs: - - mncs - - mncs - mcc: mcc - partnerOPFixedNetworkCodes: - - partnerOPFixedNetworkCodes - - partnerOPFixedNetworkCodes - Flavour: - required: - - cpuArchType - - flavourId - - memorySize - - numCPU - - storageSize - - supportedOSTypes - type: object - properties: - flavourId: - $ref: '#/components/schemas/FlavourId' - cpuArchType: - $ref: '#/components/schemas/CPUArchType' - supportedOSTypes: - minItems: 1 - type: array - description: "A list of operating systems which this flavour configuration\ - \ can support e.g., RHEL Linux, Ubuntu 18.04 LTS, MS Windows 2012 R2." - items: - $ref: '#/components/schemas/OSType' - numCPU: - type: integer - description: Number of available vCPUs - format: int32 - memorySize: - type: integer - description: Amount of RAM in Mbytes - format: int32 - storageSize: - type: integer - description: Amount of disk storage in Gbytes - format: int32 - gpu: - type: array - items: - $ref: '#/components/schemas/GpuInfo' - fpga: - type: integer - description: Number of FPGAs - format: int32 - vpu: - type: integer - description: Number of Intel VPUs available - hugepages: - type: array - items: - $ref: '#/components/schemas/HugePage' - cpuExclusivity: - type: boolean - description: Support for exclusive CPUs - example: - hugepages: - - null - - null - flavourId: flavourId - memorySize: 3 - fpga: 4 - cpuArchType: ISA_X86 - storageSize: 2 - numCPU: 9 - vpu: 7 - cpuExclusivity: true - supportedOSTypes: - - license: OS_LICENSE_TYPE_FREE - distribution: RHEL - version: OS_VERSION_UBUNTU_2204_LTS - architecture: x86_64 - - license: OS_LICENSE_TYPE_FREE - distribution: RHEL - version: OS_VERSION_UBUNTU_2204_LTS - architecture: x86_64 - gpu: - - null - - null - GpuInfo: - required: - - gpuMemory - - gpuModeName - - gpuVendorType - - numGPU - type: object - properties: - gpuVendorType: - type: string - description: "GPU vendor name e.g. NVIDIA, AMD etc." - example: Nvidia - enum: - - GPU_PROVIDER_NVIDIA - - GPU_PROVIDER_AMD - gpuModeName: - type: string - description: "Model name corresponding to vendorType may include info e.g.\ - \ for NVIDIA, model name could be “Tesla M60”, “Tesla V100” etc." - gpuMemory: - type: integer - description: GPU memory in Mbytes - numGPU: - type: integer - description: Number of GPUs - example: - gpuMemory: 1 - gpuVendorType: Nvidia - gpuModeName: gpuModeName - numGPU: 5 - HugePage: - required: - - number - - pageSize - type: object - properties: - pageSize: - type: string - description: Size of hugepage - enum: - - 2MB - - 4MB - - 1GB - number: - type: integer - description: Total number of huge pages - example: - number: 7 - pageSize: 2MB - InterfaceDetails: - required: - - commPort - - commProtocol - - interfaceId - - visibilityType - type: object - properties: - interfaceId: - pattern: "^[A-Za-z0-9][A-Za-z0-9_]{6,30}[A-Za-z0-9]$" - type: string - description: Each Port and corresponding traffic protocol exposed by the - component is identified by a name. Application client on user device requires - this to uniquely identify the interface. - commProtocol: - type: string - description: "Defines the IP transport communication protocol i.e., TCP,\ - \ UDP or HTTP" - enum: - - TCP - - UDP - - HTTP_HTTPS - commPort: - maximum: 65535 - minimum: 1 - type: integer - description: Port number exposed by the component. OP may generate a dynamic - port towards the UCs corresponding to this internal port and forward the - client traffic from dynamic port to container Port. - format: int32 - visibilityType: - type: string - description: "Defines whether the interface is exposed to outer world or\ - \ not i.e., external, or internal. If this is set to \"external\", then\ - \ it is exposed to external applications otherwise it is exposed internally\ - \ to edge application components within edge cloud. When exposed to external\ - \ world, an external dynamic port is assigned for UC traffic and mapped\ - \ to the internal container Port" - enum: - - VISIBILITY_EXTERNAL - - VISIBILITY_INTERNAL - network: - pattern: "^[A-Za-z][A-Za-z0-9_]{6,30}[A-Za-z0-9]$" - type: string - description: Name of the network. In case the application has to be associated - with more than 1 network then app provider must define the name of the - network on which this interface has to be exposed. This parameter is - required only if the port has to be exposed on a specific network other - than default. - InterfaceName: - pattern: "^[a-z][a-z0-9]{3}$" - type: string - description: Interface Name. Required only if application has to be attached - to a network other than default. - InvalidParam: - required: - - param - type: object - properties: - param: - type: string - reason: - type: string - MobileNetworkIds: - type: object - properties: - mcc: - $ref: '#/components/schemas/Mcc' - mncs: - minItems: 1 - type: array - items: - $ref: '#/components/schemas/Mnc' - example: - mncs: - - mncs - - mncs - mcc: mcc - ObjectRepoLocation: - type: object - properties: - repoURL: - $ref: '#/components/schemas/Uri' - userName: - type: string - description: Username to access the repository - password: - type: string - description: Password to access the repository - token: - type: string - description: Authorization token to access the repository - example: - repoURL: repoURL - password: password - userName: userName - token: token - OSType: - required: - - architecture - - distribution - - license - - version - type: object - properties: - architecture: - type: string - example: x86_64 - enum: - - x86_64 - - x86 - distribution: - type: string - enum: - - RHEL - - UBUNTU - - COREOS - - FEDORA - - WINDOWS - - OTHER - version: - type: string - enum: - - OS_VERSION_UBUNTU_2204_LTS - - OS_VERSION_RHEL_8 - - OS_VERSION_RHEL_7 - - OS_VERSION_DEBIAN_11 - - OS_VERSION_COREOS_STABLE - - OS_MS_WINDOWS_2012_R2 - - OTHER - license: - type: string - enum: - - OS_LICENSE_TYPE_FREE - - OS_LICENSE_TYPE_ON_DEMAND - - NOT_SPECIFIED - example: - license: OS_LICENSE_TYPE_FREE - distribution: RHEL - version: OS_VERSION_UBUNTU_2204_LTS - architecture: x86_64 - PersistentVolumeDetails: - required: - - volumeMountPath - - volumeName - - volumeSize - type: object - properties: - volumeSize: - type: string - description: "size of the volume given by user (10GB, 20GB, 50 GB or 100GB)" - enum: - - 10Gi - - 20Gi - - 50Gi - - 100Gi - volumeMountPath: - type: string - description: Defines the mount path of the volume - volumeName: - type: string - description: Human readable name for the volume - ephemeralType: - type: boolean - description: It indicates the ephemeral storage on the node and contents - are not preserved if containers restarts - default: false - accessMode: - type: string - description: Values are RW (read/write) and RO (read-only)l - default: RW - enum: - - RW - - RO - sharingPolicy: - type: string - description: "Exclusive or Shared. If shared, then in case of multiple containers\ - \ same volume will be shared across the containers." - default: EXCLUSIVE - enum: - - EXCLUSIVE - - SHARED - ProblemDetails: - type: object - properties: - title: - type: string - detail: - type: string - cause: - type: string - invalidParams: - minItems: 1 - type: array - items: - $ref: '#/components/schemas/InvalidParam' - ServiceEndpoint: - required: - - port - type: object - properties: - port: - $ref: '#/components/schemas/Port' - fqdn: - $ref: '#/components/schemas/Fqdn' - ipv4Addresses: - minItems: 1 - type: array - items: - $ref: '#/components/schemas/Ipv4Addr' - ipv6Addresses: - minItems: 1 - type: array - items: - $ref: '#/components/schemas/Ipv6Addr' - example: - ipv4Addresses: - - 198.51.100.1 - - 198.51.100.1 - port: 0 - fqdn: fqdn - ipv6Addresses: - - 2001:db8:85a3::8a2e:370:7334 - - 2001:db8:85a3::8a2e:370:7334 - anyOf: - - required: - - fqdn - - required: - - ipv4Addresses - - required: - - ipv6Addresses - ZoneDetails: - required: - - geographyDetails - - geolocation - - zoneId - type: object - properties: - zoneId: - $ref: '#/components/schemas/ZoneIdentifier' - geolocation: - $ref: '#/components/schemas/GeoLocation' - geographyDetails: - type: string - description: "Details about cities or state covered by the edge. Details\ - \ about the type of locality for eg rural, urban, industrial etc. This\ - \ information is defined in human readable form." - example: - geographyDetails: geographyDetails - zoneId: zoneId - geolocation: geolocation - ZoneRegistrationRequestData: - required: - - acceptedAvailabilityZones - - availZoneNotifLink - type: object - properties: - acceptedAvailabilityZones: - minItems: 1 - type: array - items: - $ref: '#/components/schemas/ZoneIdentifier' - availZoneNotifLink: - $ref: '#/components/schemas/Uri' - ZoneRegistrationResponseData: - required: - - acceptedZoneResourceInfo - type: object - properties: - acceptedZoneResourceInfo: - minItems: 1 - type: array - items: - $ref: '#/components/schemas/ZoneRegisteredData' - example: - acceptedZoneResourceInfo: - - networkResources: - supportDPDK: true - supportSriov: true - egressBandWidth: 1 - dedicatedNIC: 1 - reservedComputeResources: - - hugepages: - - number: 7 - pageSize: 2MB - - number: 7 - pageSize: 2MB - memory: 0 - fpga: 2 - cpuArchType: ISA_X86_64 - diskStorage: 6 - numCPU: "{\"whole\":{\"value\":2},\"decimal\":{\"value\":0.5},\"millivcpu\"\ - :{\"value\":\"500m\"}}" - vpu: 5 - cpuExclusivity: true - gpu: - - gpuMemory: 1 - gpuVendorType: Nvidia - gpuModeName: gpuModeName - numGPU: 5 - - gpuMemory: 1 - gpuVendorType: Nvidia - gpuModeName: gpuModeName - numGPU: 5 - - hugepages: - - number: 7 - pageSize: 2MB - - number: 7 - pageSize: 2MB - memory: 0 - fpga: 2 - cpuArchType: ISA_X86_64 - diskStorage: 6 - numCPU: "{\"whole\":{\"value\":2},\"decimal\":{\"value\":0.5},\"millivcpu\"\ - :{\"value\":\"500m\"}}" - vpu: 5 - cpuExclusivity: true - gpu: - - gpuMemory: 1 - gpuVendorType: Nvidia - gpuModeName: gpuModeName - numGPU: 5 - - gpuMemory: 1 - gpuVendorType: Nvidia - gpuModeName: gpuModeName - numGPU: 5 - zoneId: zoneId - flavoursSupported: - - hugepages: - - null - - null - flavourId: flavourId - memorySize: 3 - fpga: 4 - cpuArchType: ISA_X86 - storageSize: 2 - numCPU: 9 - vpu: 7 - cpuExclusivity: true - supportedOSTypes: - - license: OS_LICENSE_TYPE_FREE - distribution: RHEL - version: OS_VERSION_UBUNTU_2204_LTS - architecture: x86_64 - - license: OS_LICENSE_TYPE_FREE - distribution: RHEL - version: OS_VERSION_UBUNTU_2204_LTS - architecture: x86_64 - gpu: - - null - - null - - hugepages: - - null - - null - flavourId: flavourId - memorySize: 3 - fpga: 4 - cpuArchType: ISA_X86 - storageSize: 2 - numCPU: 9 - vpu: 7 - cpuExclusivity: true - supportedOSTypes: - - license: OS_LICENSE_TYPE_FREE - distribution: RHEL - version: OS_VERSION_UBUNTU_2204_LTS - architecture: x86_64 - - license: OS_LICENSE_TYPE_FREE - distribution: RHEL - version: OS_VERSION_UBUNTU_2204_LTS - architecture: x86_64 - gpu: - - null - - null - computeResourceQuotaLimits: - - null - - null - zoneServiceLevelObjsInfo: - latencyRanges: - minLatency: 1 - maxLatency: 6 - jitterRanges: - maxJitter: 1 - minJitter: 1 - throughputRanges: - minThroughput: 1 - maxThroughput: 5 - - networkResources: - supportDPDK: true - supportSriov: true - egressBandWidth: 1 - dedicatedNIC: 1 - reservedComputeResources: - - hugepages: - - number: 7 - pageSize: 2MB - - number: 7 - pageSize: 2MB - memory: 0 - fpga: 2 - cpuArchType: ISA_X86_64 - diskStorage: 6 - numCPU: "{\"whole\":{\"value\":2},\"decimal\":{\"value\":0.5},\"millivcpu\"\ - :{\"value\":\"500m\"}}" - vpu: 5 - cpuExclusivity: true - gpu: - - gpuMemory: 1 - gpuVendorType: Nvidia - gpuModeName: gpuModeName - numGPU: 5 - - gpuMemory: 1 - gpuVendorType: Nvidia - gpuModeName: gpuModeName - numGPU: 5 - - hugepages: - - number: 7 - pageSize: 2MB - - number: 7 - pageSize: 2MB - memory: 0 - fpga: 2 - cpuArchType: ISA_X86_64 - diskStorage: 6 - numCPU: "{\"whole\":{\"value\":2},\"decimal\":{\"value\":0.5},\"millivcpu\"\ - :{\"value\":\"500m\"}}" - vpu: 5 - cpuExclusivity: true - gpu: - - gpuMemory: 1 - gpuVendorType: Nvidia - gpuModeName: gpuModeName - numGPU: 5 - - gpuMemory: 1 - gpuVendorType: Nvidia - gpuModeName: gpuModeName - numGPU: 5 - zoneId: zoneId - flavoursSupported: - - hugepages: - - null - - null - flavourId: flavourId - memorySize: 3 - fpga: 4 - cpuArchType: ISA_X86 - storageSize: 2 - numCPU: 9 - vpu: 7 - cpuExclusivity: true - supportedOSTypes: - - license: OS_LICENSE_TYPE_FREE - distribution: RHEL - version: OS_VERSION_UBUNTU_2204_LTS - architecture: x86_64 - - license: OS_LICENSE_TYPE_FREE - distribution: RHEL - version: OS_VERSION_UBUNTU_2204_LTS - architecture: x86_64 - gpu: - - null - - null - - hugepages: - - null - - null - flavourId: flavourId - memorySize: 3 - fpga: 4 - cpuArchType: ISA_X86 - storageSize: 2 - numCPU: 9 - vpu: 7 - cpuExclusivity: true - supportedOSTypes: - - license: OS_LICENSE_TYPE_FREE - distribution: RHEL - version: OS_VERSION_UBUNTU_2204_LTS - architecture: x86_64 - - license: OS_LICENSE_TYPE_FREE - distribution: RHEL - version: OS_VERSION_UBUNTU_2204_LTS - architecture: x86_64 - gpu: - - null - - null - computeResourceQuotaLimits: - - null - - null - zoneServiceLevelObjsInfo: - latencyRanges: - minLatency: 1 - maxLatency: 6 - jitterRanges: - maxJitter: 1 - minJitter: 1 - throughputRanges: - minThroughput: 1 - maxThroughput: 5 - ZoneRegisteredData: - required: - - computeResourceQuotaLimits - - flavoursSupported - - reservedComputeResources - - zoneId - type: object - properties: - zoneId: - $ref: '#/components/schemas/ZoneIdentifier' - reservedComputeResources: - minItems: 1 - type: array - description: Resources exclusively reserved for the originator OP. - items: - $ref: '#/components/schemas/ComputeResourceInfo' - computeResourceQuotaLimits: - minItems: 1 - type: array - description: Max quota on resources partner OP allows over reserved resources. - items: - $ref: '#/components/schemas/ComputeResourceInfo' - flavoursSupported: - minItems: 1 - type: array - items: - $ref: '#/components/schemas/Flavour' - networkResources: - $ref: '#/components/schemas/ZoneRegisteredData_networkResources' - zoneServiceLevelObjsInfo: - $ref: '#/components/schemas/ZoneRegisteredData_zoneServiceLevelObjsInfo' - example: - networkResources: - supportDPDK: true - supportSriov: true - egressBandWidth: 1 - dedicatedNIC: 1 - reservedComputeResources: - - hugepages: - - number: 7 - pageSize: 2MB - - number: 7 - pageSize: 2MB - memory: 0 - fpga: 2 - cpuArchType: ISA_X86_64 - diskStorage: 6 - numCPU: "{\"whole\":{\"value\":2},\"decimal\":{\"value\":0.5},\"millivcpu\"\ - :{\"value\":\"500m\"}}" - vpu: 5 - cpuExclusivity: true - gpu: - - gpuMemory: 1 - gpuVendorType: Nvidia - gpuModeName: gpuModeName - numGPU: 5 - - gpuMemory: 1 - gpuVendorType: Nvidia - gpuModeName: gpuModeName - numGPU: 5 - - hugepages: - - number: 7 - pageSize: 2MB - - number: 7 - pageSize: 2MB - memory: 0 - fpga: 2 - cpuArchType: ISA_X86_64 - diskStorage: 6 - numCPU: "{\"whole\":{\"value\":2},\"decimal\":{\"value\":0.5},\"millivcpu\"\ - :{\"value\":\"500m\"}}" - vpu: 5 - cpuExclusivity: true - gpu: - - gpuMemory: 1 - gpuVendorType: Nvidia - gpuModeName: gpuModeName - numGPU: 5 - - gpuMemory: 1 - gpuVendorType: Nvidia - gpuModeName: gpuModeName - numGPU: 5 - zoneId: zoneId - flavoursSupported: - - hugepages: - - null - - null - flavourId: flavourId - memorySize: 3 - fpga: 4 - cpuArchType: ISA_X86 - storageSize: 2 - numCPU: 9 - vpu: 7 - cpuExclusivity: true - supportedOSTypes: - - license: OS_LICENSE_TYPE_FREE - distribution: RHEL - version: OS_VERSION_UBUNTU_2204_LTS - architecture: x86_64 - - license: OS_LICENSE_TYPE_FREE - distribution: RHEL - version: OS_VERSION_UBUNTU_2204_LTS - architecture: x86_64 - gpu: - - null - - null - - hugepages: - - null - - null - flavourId: flavourId - memorySize: 3 - fpga: 4 - cpuArchType: ISA_X86 - storageSize: 2 - numCPU: 9 - vpu: 7 - cpuExclusivity: true - supportedOSTypes: - - license: OS_LICENSE_TYPE_FREE - distribution: RHEL - version: OS_VERSION_UBUNTU_2204_LTS - architecture: x86_64 - - license: OS_LICENSE_TYPE_FREE - distribution: RHEL - version: OS_VERSION_UBUNTU_2204_LTS - architecture: x86_64 - gpu: - - null - - null - computeResourceQuotaLimits: - - null - - null - zoneServiceLevelObjsInfo: - latencyRanges: - minLatency: 1 - maxLatency: 6 - jitterRanges: - maxJitter: 1 - minJitter: 1 - throughputRanges: - minThroughput: 1 - maxThroughput: 5 - inline_response_200: - required: - - federationSupportedAPIs - type: object - properties: - federationSupportedAPIs: - $ref: '#/components/schemas/FederationSupportedAPIs' - example: - federationSupportedAPIs: - availabilityZoneAPI: null - artefactAPI: null - fileAPI: null - resourceMonitoringAPI: null - faultManagementAPI: null - federationBaseAPI: - name: FEDERATION - apiOperations: - - httpMethods: - - POST - - POST - href: href - - httpMethods: - - POST - - POST - href: href - serviceAPIFederation: null - eventManagementAPI: null - edgeApplicationAPI: null - inline_response_200_1: - required: - - edgeDiscoveryServiceEndPoint - - lcmServiceEndPoint - type: object - properties: - edgeDiscoveryServiceEndPoint: - $ref: '#/components/schemas/ServiceEndpoint' - lcmServiceEndPoint: - $ref: '#/components/schemas/ServiceEndpoint' - allowedMobileNetworkIds: - $ref: '#/components/schemas/MobileNetworkIds' - allowedFixedNetworkIds: - $ref: '#/components/schemas/FixedNetworkIds' - offeredAvailabilityZones: - minItems: 1 - type: array - items: - $ref: '#/components/schemas/ZoneDetails' - example: - allowedFixedNetworkIds: - - allowedFixedNetworkIds - - allowedFixedNetworkIds - offeredAvailabilityZones: - - geographyDetails: geographyDetails - zoneId: zoneId - geolocation: geolocation - - geographyDetails: geographyDetails - zoneId: zoneId - geolocation: geolocation - lcmServiceEndPoint: null - allowedMobileNetworkIds: - mncs: - - mncs - - mncs - mcc: mcc - edgeDiscoveryServiceEndPoint: - ipv4Addresses: - - 198.51.100.1 - - 198.51.100.1 - port: 0 - fqdn: fqdn - ipv6Addresses: - - 2001:db8:85a3::8a2e:370:7334 - - 2001:db8:85a3::8a2e:370:7334 - federationContextId_partner_body: - required: - - modificationDate - - objectType - - operationType - type: object - properties: - objectType: - type: string - enum: - - MOBILE_NETWORK_CODES - - FIXED_NETWORK_CODES - operationType: - type: string - enum: - - ADD_CODES - - REMOVE_CODES - - UPDATE_CODES - addMobileNetworkIds: - $ref: '#/components/schemas/MobileNetworkIds' - removeMobileNetworkIds: - $ref: '#/components/schemas/MobileNetworkIds' - addFixedNetworkIds: - $ref: '#/components/schemas/FixedNetworkIds' - removeFixedNetworkIds: - $ref: '#/components/schemas/FixedNetworkIds' - modificationDate: - type: string - description: Date and time of the federation modification by the originating - partner OP - format: date-time - inline_response_200_2: - required: - - FederationContextId - type: object - properties: - FederationContextId: - $ref: '#/components/schemas/FederationContextId' - example: - FederationContextId: FederationContextId - inline_response_200_3: - required: - - federationHealthStatus - type: object - properties: - federationHealthStatus: - $ref: '#/components/schemas/FederationHealthInfo' - example: - federationHealthStatus: - numOfApplications: numOfApplications - federationStatus: - alarmState: RAISED - numOfActiveAlarms: numOfActiveAlarms - numOfAcceptedZones: numOfAcceptedZones - inline_response_200_4: - required: - - ServiceType - - apiRoutingInfo - - serviceCaps - type: object - properties: - serviceCaps: - $ref: '#/components/schemas/serviceAPINames' - serviceType: - $ref: '#/components/schemas/serviceType' - apiRoutingInfo: - $ref: '#/components/schemas/serviceRoutingInfo' - example: - serviceType: api_federation - serviceCaps: - - QualityOnDemand - - QualityOnDemand - apiRoutingInfo: - - apiRoutingInfo - - apiRoutingInfo - federationContextId_artefact_body: - required: - - appProviderId - - artefactDescriptorType - - artefactId - - artefactName - - artefactVersionInfo - - artefactVirtType - - componentSpec - type: object - properties: - artefactId: - $ref: '#/components/schemas/ArtefactId' - appProviderId: - $ref: '#/components/schemas/AppProviderId' - artefactName: - # pattern: "^[A-Za-z][A-Za-z0-9_]{7,31}$" - type: string - description: Name of the artefact. - artefactVersionInfo: - type: string - description: Artefact version information - artefactDescription: - maxLength: 256 - type: string - description: Brief description of the artefact by the application provider - artefactVirtType: - type: string - enum: - - VM_TYPE - - CONTAINER_TYPE - artefactFileName: - maxLength: 32 - minLength: 8 - type: string - description: Name of the file. - artefactFileFormat: - type: string - description: Artefacts like Helm charts or Terraform scripts may need compressed - format. - enum: - - WINZIP - - TAR - - TEXT - - TARGZ - artefactDescriptorType: - type: string - description: Type of descriptor present in the artefact. App provider can - either define either a Helm chart or a Terraform script or container spec. - enum: - - HELM - - TERRAFORM - - ANSIBLE - - SHELL - - COMPONENTSPEC - repoType: - type: string - description: "Artefact or file repository location. PUBLICREPO is used of\ - \ public URLs like GitHub, Helm repo, docker registry etc., PRIVATEREPO\ - \ is used for private repo managed by the application developer, UPLOAD\ - \ is for the case when artefact/file is uploaded from MEC web portal.\ - \ OP should pull the image from ‘repoUrl' immediately after receiving\ - \ the request and then send back the response. In case the repoURL corresponds\ - \ to a docker registry, use docker v2 http api to do the pull." - enum: - - PRIVATEREPO - - PUBLICREPO - - UPLOAD - artefactRepoLocation: - $ref: '#/components/schemas/ObjectRepoLocation' - artefactFile: - type: string - description: Helm archive/Terraform archive/container spec file or Binary - image associated with an application component. - format: binary - componentSpec: - minItems: 1 - type: array - description: "Details about compute, networking and storage requirements\ - \ for each component of the application. App provider should define all\ - \ information needed to instantiate the component. If artefact is being\ - \ defined at component level this section should have information just\ - \ about the component. In case the artefact is being defined at application\ - \ level the section should provide details about all the components." - items: - $ref: '#/components/schemas/ComponentSpec' - inline_response_200_5: - required: - - appProviderId - - artefactDescriptorType - - artefactId - - artefactName - - artefactVersionInfo - - artefactVirtType - type: object - properties: - artefactId: - $ref: '#/components/schemas/ArtefactId' - appProviderId: - $ref: '#/components/schemas/AppProviderId' - artefactName: - # pattern: "^[A-Za-z][A-Za-z0-9_]{7,31}$" - type: string - description: Name of the artefact. - artefactDescription: - maxLength: 256 - type: string - description: Brief description of the artefact by the application provider - artefactVersionInfo: - type: string - description: Artefact version information - artefactVirtType: - type: string - enum: - - VM_TYPE - - CONTAINER_TYPE - artefactFileName: - maxLength: 32 - minLength: 8 - type: string - description: Name of the file. - artefactFileFormat: - type: string - description: Artefacts like Helm charts or Terraform scripts may need compressed - format. - enum: - - WINZIP - - TAR - - TEXT - - TARGZ - artefactDescriptorType: - type: string - description: Type of descriptor present in the artefact. App provider can - either define either a Helm chart or a Terraform script or container spec. - enum: - - HELM - - TERRAFORM - - ANSIBLE - - SHELL - - COMPONENTSPEC - repoType: - type: string - description: "Artefact or file repository location. PUBLICREPO is used of\ - \ public URLs like GitHub, Helm repo, docker registry etc., PRIVATEREPO\ - \ is used for private repo managed by the application developer, UPLOAD\ - \ is for the case when artefact/file is uploaded from MEC web portal.\ - \ OP should pull the image from ‘repoUrl' immediately after receiving\ - \ the request and then send back the response. In case the repoURL corresponds\ - \ to a docker registry, use docker v2 http api to do the pull." - enum: - - PRIVATEREPO - - PUBLICREPO - - UPLOAD - artefactRepoLocation: - $ref: '#/components/schemas/ObjectRepoLocation' - example: - artefactName: artefactName - artefactDescriptorType: HELM - artefactFileName: artefactFileName - repoType: PRIVATEREPO - artefactDescription: artefactDescription - appProviderId: appProviderId - artefactId: 046b6c7f-0b8a-43b9-b35d-6489e6daee91 - artefactVirtType: VM_TYPE - artefactVersionInfo: artefactVersionInfo - artefactRepoLocation: - repoURL: repoURL - password: password - userName: userName - token: token - artefactFileFormat: WINZIP - federationContextId_files_body: - required: - - appProviderId - - fileId - - fileName - - fileType - - fileVersionInfo - - imgInsSetArch - - imgOSType - type: object - properties: - fileId: - $ref: '#/components/schemas/FileId' - appProviderId: - $ref: '#/components/schemas/AppProviderId' - fileName: - pattern: "^[A-Za-z][A-Za-z0-9_]{7,31}$" - type: string - description: Name of the image file. App provides specifies this name - when image is uploaded on originating OP over NBI. - fileDescription: - maxLength: 128 - minLength: 8 - type: string - description: Brief description about the image file. - fileVersionInfo: - type: string - description: File version information - fileType: - $ref: '#/components/schemas/VirtImageType' - checksum: - type: string - description: "MD5 checksum for VM and file-based images, sha256 digest for\ - \ containers" - imgOSType: - $ref: '#/components/schemas/OSType' - imgInsSetArch: - $ref: '#/components/schemas/CPUArchType' - repoType: - type: string - description: "Artefact or file repository location. PUBLICREPO is used of\ - \ public URLs like GitHub, Helm repo, docker registry etc., PRIVATEREPO\ - \ is used for private repo managed by the application developer, UPLOAD\ - \ is for the case when artefact/file is uploaded from MEC web portal.\ - \ OP should pull the image from ‘repoUrl' immediately after receiving\ - \ the request and then send back the response. In case the repoURL corresponds\ - \ to a docker registry, use docker v2 http api to do the pull." - enum: - - PRIVATEREPO - - PUBLICREPO - - UPLOAD - fileRepoLocation: - $ref: '#/components/schemas/ObjectRepoLocation' - file: - type: string - description: Binary image associated with an application component. - format: binary - inline_response_200_6: - required: - - appProviderId - - fileId - - fileName - - fileType - - fileVersionInfo - - imgInsSetArch - - imgOSType - type: object - properties: - fileId: - $ref: '#/components/schemas/FileId' - appProviderId: - $ref: '#/components/schemas/AppProviderId' - fileName: - pattern: "^[A-Za-z][A-Za-z0-9_]{7,31}$" - type: string - description: Name of the image file. App provides specifies this name - when image is uploaded on originating OP over NBI. - fileDescription: - maxLength: 128 - minLength: 8 - type: string - description: Brief description about the image file. - fileVersionInfo: - type: string - description: File version information - fileType: - $ref: '#/components/schemas/VirtImageType' - checksum: - type: string - description: "MD5 checksum for VM and file-based images, sha256 digest for\ - \ containers" - imgOSType: - $ref: '#/components/schemas/OSType' - imgInsSetArch: - $ref: '#/components/schemas/CPUArchType' - repoType: - type: string - description: "Artefact or file repository location. PUBLICREPO is used of\ - \ public URLs like GitHub, Helm repo, docker registry etc., PRIVATEREPO\ - \ is used for private repo managed by the application developer, UPLOAD\ - \ is for the case when artefact/file is uploaded from MEC web portal.\ - \ OP should pull the image from ‘repoUrl' immediately after receiving\ - \ the request and then send back the response. In case the repoURL corresponds\ - \ to a docker registry, use docker v2 http api to do the pull." - enum: - - PRIVATEREPO - - PUBLICREPO - - UPLOAD - fileRepoLocation: - $ref: '#/components/schemas/ObjectRepoLocation' - example: - fileDescription: fileDescription - fileName: fileName - fileVersionInfo: fileVersionInfo - repoType: PRIVATEREPO - appProviderId: appProviderId - checksum: checksum - imgInsSetArch: ISA_X86 - imgOSType: - license: OS_LICENSE_TYPE_FREE - distribution: RHEL - version: OS_VERSION_UBUNTU_2204_LTS - architecture: x86_64 - fileRepoLocation: - repoURL: repoURL - password: password - userName: userName - token: token - fileType: QCOW2 - fileId: 046b6c7f-0b8a-43b9-b35d-6489e6daee91 - application_onboarding_body: - required: - - appComponentSpecs - - appId - - appMetaData - - appProviderId - - appQoSProfile - - appStatusCallbackLink - type: object - properties: - appId: - $ref: '#/components/schemas/AppIdentifier' - appProviderId: - $ref: '#/components/schemas/AppProviderId' - appDeploymentZones: - minItems: 1 - type: array - description: Details about partner OP zones where the application should - be made available; This field when specified will instruct the OP to - restrict application instantiation only on the listed zones. - items: - $ref: '#/components/schemas/ZoneIdentifier' - appMetaData: - $ref: '#/components/schemas/AppMetaData' - appQoSProfile: - $ref: '#/components/schemas/AppQoSProfile' - appComponentSpecs: - $ref: '#/components/schemas/AppComponentSpecs' - appStatusCallbackLink: - $ref: '#/components/schemas/Uri' - inline_response_200_7: - required: - - appComponentSpecs - - appDeploymentZones - - appId - - appMetaData - - appProviderId - - appQoSProfile - type: object - properties: - appId: - $ref: '#/components/schemas/AppIdentifier' - appProviderId: - $ref: '#/components/schemas/AppProviderId' - appDeploymentZones: - minItems: 1 - type: array - description: Details about partner OP zones where the application should - be made available; This field when specified will instruct the OP to - restrict application instantiation only on the listed zones. - items: - $ref: '#/components/schemas/inline_response_200_7_appDeploymentZones' - appMetaData: - $ref: '#/components/schemas/AppMetaData' - appQoSProfile: - $ref: '#/components/schemas/AppQoSProfile' - appComponentSpecs: - $ref: '#/components/schemas/AppComponentSpecs' - example: - appMetaData: - appName: appName - mobilitySupport: false - appDescription: appDescription - accessToken: accessToken - category: IOT - version: version - appProviderId: appProviderId - appId: appId - appQoSProfile: - bandwidthRequired: 1 - multiUserClients: APP_TYPE_SINGLE_USER - noOfUsersPerAppInst: 6 - latencyConstraints: NONE - appProvisioning: true - appDeploymentZones: - - zoneInfo: zoneInfo - countryCode: countryCode - - zoneInfo: zoneInfo - countryCode: countryCode - appComponentSpecs: - - serviceNameEW: serviceNameEW - serviceNameNB: serviceNameNB - artefactId: 046b6c7f-0b8a-43b9-b35d-6489e6daee91 - componentName: componentName - - serviceNameEW: serviceNameEW - serviceNameNB: serviceNameNB - artefactId: 046b6c7f-0b8a-43b9-b35d-6489e6daee91 - componentName: componentName - federationContextIdapplicationonboardingappappId_appUpdQoSProfile: - type: object - properties: - latencyConstraints: - type: string - description: "Latency requirements for the application.Allowed values (non-standardized)\ - \ are none, low and ultra-low. Ultra-Low may corresponds to range 15 -\ - \ 30 msec, Low correspond to range 30 - 50 msec. None means 51 and above" - enum: - - NONE - - LOW - - ULTRALOW - bandwidthRequired: - minimum: 1 - type: integer - description: Data transfer bandwidth requirement (minimum limit) for the - application. It should in Mbits/sec - format: int32 - mobilitySupport: - type: boolean - description: Indicates if an application is sensitive to user mobility and - can be relocated. Default is “FALSE” - default: false - multiUserClients: - type: string - description: Single user type application are designed to serve just one - client. Multi user type application is designed to serve multiple clients - enum: - - APP_TYPE_SINGLE_USER - - APP_TYPE_MULTI_USER - noOfUsersPerAppInst: - type: integer - description: Maximum no of clients that can connect to an instance of this - application. This parameter is relevant only for application of type multi - user - default: 1 - appProvisioning: - type: boolean - description: Define if application can be instantiated or not - default: true - description: "Parameters corresponding to the performance constraints, tenancy\ - \ details etc." - federationContextIdapplicationonboardingappappId_appComponentSpecs: - required: - - artefactId - type: object - properties: - serviceNameNB: - pattern: "^[A-Za-z0-9][A-Za-z0-9_]{6,62}[A-Za-z0-9]$" - type: string - description: Must be a valid RFC 1035 label name. This defines the DNS - name via which the component can be accessed over NBI. Access via serviceNameNB - is restricted on specific ports. Platform shall expose component access - externally via this DNS name - serviceNameEW: - pattern: "^[A-Za-z0-9][A-Za-z0-9_]{6,62}[A-Za-z0-9]$" - type: string - description: Must be a valid RFC 1035 label name. This defines the DNS - name via which the component can be accessed via peer components. Access - via serviceNameEW is open on all ports. Platform shall not expose serviceNameEW - externally outside edge. - componentName: - pattern: "^[A-Za-z0-9][A-Za-z0-9_]{6,62}[A-Za-z0-9]$" - type: string - description: Must be a valid RFC 1035 label name. Component name must be - unique with an application - artefactId: - $ref: '#/components/schemas/ArtefactId' - app_appId_body: - minProperties: 1 - type: object - properties: - appUpdQoSProfile: - $ref: '#/components/schemas/federationContextIdapplicationonboardingappappId_appUpdQoSProfile' - appComponentSpecs: - $ref: '#/components/schemas/AppComponentSpecs' - appId_zoneForbid_body: - minItems: 1 - required: - - forbid - - zoneId - type: array - properties: - zoneId: - $ref: '#/components/schemas/ZoneIdentifier' - forbid: - type: boolean - description: Value 'true' will forbid application instantiation on this - zone. No new instance of the application can be created on this zone. - items: - type: object - description: List of zones where application instantiation shall be forbidden - or allowed. - federationContextIdapplicationlcm_zoneInfo: - required: - - flavourId - #- zoneId - type: object - properties: - zoneId: - type: string - #$ref: '#/components/schemas/ZoneIdentifier' - flavourId: - $ref: '#/components/schemas/FlavourId' - resourceConsumption: - type: string - description: "Specifies if the application can be instantiated using pre-reserved\ - \ resource or not. App provider can pre-reserve a pool of compute resource\ - \ on each zone. 'RESERVED_RES_SHALL' instruct OP to use only the pre-reserved\ - \ resources. 'RESERVED_RES_PREFER' instruct to first try using pre-reserved\ - \ resource, if none available go for non-reserved resources. 'RESERVED_RES_AVOID'\ - \ instruct OP not to use pre-reserved resource if possible, it is a choice\ - \ depending upon circumstances 'RESERVED_RES_FORBID' instruct OP not to\ - \ use pre-reserved resources." - default: RESERVED_RES_AVOID - enum: - - RESERVED_RES_SHALL - - RESERVED_RES_PREFER - - RESERVED_RES_AVOID - - RESERVED_RES_FORBID - resPool: - pattern: "^[A-Za-z0-9][A-Za-z0-9_]{6,30}[A-Za-z0-9]$" - type: string - description: Resource pool to be used for application instantiation on this - zone. Valid only if IE 'resourceConsumption' is set to 'RESERVED_RES_SHALL' - or 'RESERVED_RES_PREFER' - application_lcm_body: - required: - - appId - - appInstCallbackLink - - appProviderId - - appVersion - - zoneInfo - type: object - properties: - appId: - $ref: '#/components/schemas/AppIdentifier' - appVersion: - type: string - description: Version info of the application - appProviderId: - $ref: '#/components/schemas/AppProviderId' - zoneInfo: - $ref: '#/components/schemas/federationContextIdapplicationlcm_zoneInfo' - appInstCallbackLink: - $ref: '#/components/schemas/Uri' - inline_response_202: - required: - - appInstIdentifier - - zoneId - type: object - properties: - zoneId: - $ref: '#/components/schemas/ZoneIdentifier' - appInstIdentifier: - $ref: '#/components/schemas/InstanceIdentifier' - example: - appInstIdentifier: appInstIdentifier - zoneId: zoneId - inline_response_200_8: - minProperties: 1 - type: object - properties: - appInstanceState: - $ref: '#/components/schemas/InstanceState' - accesspointInfo: - minItems: 1 - type: array - description: Information about the IP and Port exposed by the OP. Application - clients shall use these access points to reach this application instance - items: - $ref: '#/components/schemas/inline_response_200_8_accesspointInfo' - example: - appInstanceState: PENDING - accesspointInfo: - - interfaceId: interfaceId - accessPoints: - ipv4Addresses: - - 198.51.100.1 - - 198.51.100.1 - port: 0 - fqdn: fqdn - ipv6Addresses: - - 2001:db8:85a3::8a2e:370:7334 - - 2001:db8:85a3::8a2e:370:7334 - - interfaceId: interfaceId - accessPoints: - ipv4Addresses: - - 198.51.100.1 - - 198.51.100.1 - port: 0 - fqdn: fqdn - ipv6Addresses: - - 2001:db8:85a3::8a2e:370:7334 - - 2001:db8:85a3::8a2e:370:7334 - federationContextIdapplicationlcmappappIdappProviderappProviderId_appInstanceInfo: - required: - - appInstIdentifier - - appInstanceState - type: object - properties: - appInstIdentifier: - $ref: '#/components/schemas/InstanceIdentifier' - appInstanceState: - $ref: '#/components/schemas/InstanceState' - example: - appInstIdentifier: appInstIdentifier - appInstanceState: PENDING - inline_response_200_9: - required: - - appInstanceInfo - - zoneId - type: object - properties: - zoneId: - $ref: '#/components/schemas/ZoneIdentifier' - appInstanceInfo: - minItems: 1 - type: array - items: - $ref: '#/components/schemas/federationContextIdapplicationlcmappappIdappProviderappProviderId_appInstanceInfo' - example: - appInstanceInfo: - - appInstIdentifier: appInstIdentifier - appInstanceState: PENDING - - appInstIdentifier: appInstIdentifier - appInstanceState: PENDING - zoneId: zoneId - AppComponentSpecs_inner: - required: - - artefactId - type: object - properties: - serviceNameNB: - pattern: "^[A-Za-z0-9][A-Za-z0-9_]{6,62}[A-Za-z0-9]$" - type: string - description: Must be a valid RFC 1035 label name. This defines the DNS name - via which the component can be accessed over NBI. Access via serviceNameNB - is restricted on specific ports. Platform shall expose component access - externally via this DNS name - serviceNameEW: - pattern: "^[A-Za-z0-9][A-Za-z0-9_]{6,62}[A-Za-z0-9]$" - type: string - description: Must be a valid RFC 1035 label name. This defines the DNS name - via which the component can be accessed via peer components. Access via - serviceNameEW is open on all ports. Platform shall not expose serviceNameEW - externally outside edge. - componentName: - pattern: "^[A-Za-z0-9][A-Za-z0-9_]{6,62}[A-Za-z0-9]$" - type: string - description: Must be a valid RFC 1035 label name. Component name must be - unique with an application - artefactId: - $ref: '#/components/schemas/ArtefactId' - example: - serviceNameEW: serviceNameEW - serviceNameNB: serviceNameNB - artefactId: 046b6c7f-0b8a-43b9-b35d-6489e6daee91 - componentName: componentName - ZoneRegisteredData_networkResources: - required: - - dedicatedNIC - - egressBandWidth - - supportDPDK - - supportSriov - type: object - properties: - egressBandWidth: - type: integer - description: Max dl throughput that this edge can offer. It is defined in - Mbps. - format: int32 - dedicatedNIC: - type: integer - description: Number of network interface cards which can be dedicatedly - assigned to application pods on isolated networks. This includes virtual - as well physical NICs - format: int32 - supportSriov: - type: boolean - description: If this zone support SRIOV networks or not - supportDPDK: - type: boolean - description: If this zone supports DPDK based networking. - example: - supportDPDK: true - supportSriov: true - egressBandWidth: 1 - dedicatedNIC: 1 - ZoneRegisteredData_zoneServiceLevelObjsInfo_latencyRanges: - type: object - properties: - minLatency: - minimum: 1 - type: integer - description: The time for data/packet to reach from UC to edge application. - It represent mínimum latency in milli seconds that may exist between UCs - and edge apps in this zone but it can be higher in actual. - format: int32 - maxLatency: - type: integer - description: The maximum limit of latency between UC and Edge App in milli - seconds. - format: int32 - example: - minLatency: 1 - maxLatency: 6 - ZoneRegisteredData_zoneServiceLevelObjsInfo_jitterRanges: - type: object - properties: - minJitter: - minimum: 1 - type: integer - format: int32 - maxJitter: - type: integer - description: The maximum limit of network jitter between UC and Edge App - in milli seconds. - format: int32 - example: - maxJitter: 1 - minJitter: 1 - ZoneRegisteredData_zoneServiceLevelObjsInfo_throughputRanges: - type: object - properties: - minThroughput: - minimum: 1 - type: integer - description: The minimum limit of network throughput between UC and Edge - App in Mega bits per seconds (Mbps). - format: int32 - maxThroughput: - type: integer - description: The maximum limit of network throughput between UC and Edge - App in Mega bits per seconds (Mbps). - format: int32 - example: - minThroughput: 1 - maxThroughput: 5 - ZoneRegisteredData_zoneServiceLevelObjsInfo: - required: - - jitterRanges - - latencyRanges - - throughputRanges - type: object - properties: - latencyRanges: - $ref: '#/components/schemas/ZoneRegisteredData_zoneServiceLevelObjsInfo_latencyRanges' - jitterRanges: - $ref: '#/components/schemas/ZoneRegisteredData_zoneServiceLevelObjsInfo_jitterRanges' - throughputRanges: - $ref: '#/components/schemas/ZoneRegisteredData_zoneServiceLevelObjsInfo_throughputRanges' - description: It is a measure of the actual amount of data that is being sent - over a network per unit of time and indicates máximum supported value for - a zone - example: - latencyRanges: - minLatency: 1 - maxLatency: 6 - jitterRanges: - maxJitter: 1 - minJitter: 1 - throughputRanges: - minThroughput: 1 - maxThroughput: 5 - inline_response_200_7_appDeploymentZones: - required: - - countryCode - - zoneInfo - type: object - properties: - countryCode: - $ref: '#/components/schemas/CountryCode' - zoneInfo: - $ref: '#/components/schemas/ZoneIdentifier' - example: - zoneInfo: zoneInfo - countryCode: countryCode - inline_response_200_8_accesspointInfo: - required: - - accessPoints - - interfaceId - type: object - properties: - interfaceId: - pattern: "^[A-Za-z0-9][A-Za-z0-9_]{6,30}[A-Za-z0-9]$" - type: string - description: This is the interface identifier that app provider defines - when application is onboarded. - accessPoints: - $ref: '#/components/schemas/ServiceEndpoint' - example: - interfaceId: interfaceId - accessPoints: - ipv4Addresses: - - 198.51.100.1 - - 198.51.100.1 - port: 0 - fqdn: fqdn - ipv6Addresses: - - 2001:db8:85a3::8a2e:370:7334 - - 2001:db8:85a3::8a2e:370:7334 - responses: - "400": - description: Bad request - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "401": - description: Unauthorized - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "404": - description: Not Found - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "409": - description: Conflict - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "412": - description: Precondition Failed - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "422": - description: Unprocessable Entity - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "500": - description: Internal Server Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "501": - description: Not Implemented - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "503": - description: Service Unavailable - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "520": - description: Web Server Returned an Unknown Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - default: - description: Generic Error - securitySchemes: - oAuth2ClientCredentials: - type: oauth2 - flows: - clientCredentials: - tokenUrl: http://127.0.0.1:8080/realms/federation/protocol/openid-connect/token - scopes: - fed-mgmt: Access to the federation APIs - x-tokenInfoFunc: api.authorization.check_oAuth2ClientCredentials - x-scopeValidateFunc: api.authorization.validate_scope_oAuth2ClientCredentials diff --git a/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/router.py b/src/open_exposure_gateway/api/gsma/federation_manager/v1_4_0/router.py similarity index 62% rename from src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/router.py rename to src/open_exposure_gateway/api/gsma/federation_manager/v1_4_0/router.py index 2868387..e78965a 100644 --- a/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/router.py +++ b/src/open_exposure_gateway/api/gsma/federation_manager/v1_4_0/router.py @@ -1,37 +1,45 @@ -"""FastAPI routes for the GSMA Federation Manager API (EWBI OPG v1.2.0). - -Endpoints defined by ``API_definitions/federation-manager.yaml``. Every handler is a -stateless synchronous relay to FM (ADR-0046, ADR-0048): the raw request body is -forwarded to FM's matching internal endpoint unaltered, and FM's response body and -status are relayed back unaltered. OEG does not reshape the request on this path -- -the two POST bodies (``FederationRequestData``, ``ZoneRegistrationRequestData``) are -validated for shape before being forwarded, but the *validated* object is only used -as a gate; the original raw bytes are what's actually sent to FM, so a field OEG's -model doesn't happen to cover is still forwarded unchanged rather than dropped. The -remaining schemas in ``schemas.py`` are referenced here only to document the -response contract in the OpenAPI document (via ``response_model``); FM's response is -never parsed against them. +"""FastAPI routes for the platform-namespace federation-lifecycle relay (ADR-0046, ADR-0048). + +Bodies are raw GSMA (OPG.04 v6.0 / artifact v1.4.0), forwarded unaltered, but paths +are OEG's own platform namespace rather than the GSMA EWBI paths: GSMA addresses the +callee operator through the URL (operator A calls B's FM directly), which only works +because there is no intermediate hop. Here the call chain is Portal -> OEG -> FM-A, +with FM-A only then making the real EWBI call to FM-B, so the partner has to be named +explicitly -- as ``partnerOpId``, our own registered id for the partner -- on every +route. FM uses it to look up B's token URL, client id and secret from B's +registration, and to reject a ``federationContextId`` that belongs to a different +partner. Every handler is otherwise a stateless synchronous relay to FM: the raw +request body (and query string) is forwarded to FM's matching ``/internal`` endpoint +unaltered, and FM's response body and status are relayed back unaltered. The two POST +bodies (``FederationRequestData``, ``ZoneRegistrationRequestData``) are validated for +shape before being forwarded, but the *validated* object is only used as a gate; the +original raw bytes are what's actually sent to FM, so a field OEG's model doesn't +happen to cover is still forwarded unchanged rather than dropped. The remaining +schemas in ``schemas.py`` are referenced here only to document the response contract +in the OpenAPI document (via ``response_model``); FM's response is never parsed +against them. This module exposes the ``FederationManagement`` tag plus ``zone_subscribe``, -``get_zone_data`` and ``zone_unsubscribe`` from +``get_zone_data``, ``get_zone_details`` and ``zone_unsubscribe`` from ``AvailabilityZoneInfoSynchronization``. ``update_federation`` -(``PATCH /{federationContextId}/partner``) is out of scope. +(``UpdateFederation``) is out of scope. """ import json from typing import Annotated, Any -from fastapi import APIRouter, Depends, Request, Response +from fastapi import APIRouter, Depends, Query, Request, Response from pydantic import BaseModel, ValidationError from open_exposure_gateway.adapters.http.fm_client import FmClient, FmUnavailableError from open_exposure_gateway.api.camara.common import XCorrelatorHeader -from open_exposure_gateway.api.gsma.federation_manager.v1_2_0.schemas import ( +from open_exposure_gateway.api.gsma.federation_manager.v1_4_0.schemas import ( FederationContextId, FederationContextIdResponse, FederationDetails, FederationRequestData, FederationResponseData, + PartnerOpId, ProblemDetails, ZoneIdentifier, ZoneRegisteredData, @@ -40,16 +48,19 @@ from open_exposure_gateway.api.gsma.federation_manager.v1_2_0.schemas import ( ) from open_exposure_gateway.dependencies import get_fm_client -# GSMA OPG serves the Federation Management API at {apiRoot}/operatorplatform/federation/v1. -BASE_PATH = "/operatorplatform/federation/v1" +# OEG's own platform namespace, mirrored 1:1 at FM's `/internal` (FmClient does a +# prefix swap, nothing else -- see fm_client.py). +BASE_PATH = "/platform/v1/federation" + +PARTNER_PREFIX = "/partners/{partnerOpId}/federations" # Tags are set per route (not on the router) so each endpoint carries only its own -# federation-manager.yaml tag. +# GSMA operation's tag. router = APIRouter(prefix=BASE_PATH) FmClientDep = Annotated[FmClient, Depends(get_fm_client)] -# Every Federation Manager error response is an RFC 7807 ProblemDetails (federation-manager.yaml). +# Every Federation Manager error response is an RFC 7807 ProblemDetails. _ERROR_RESPONSES: dict[int | str, dict[str, Any]] = { 400: {"model": ProblemDetails, "description": "Bad request"}, 401: {"model": ProblemDetails, "description": "Unauthorized"}, @@ -94,8 +105,10 @@ async def _relay( ) -> Response: """Forward one federation-lifecycle operation to FM and relay its answer unaltered. - ``path`` is the operator-facing suffix after ``BASE_PATH`` (e.g. ``/partner``), - which ``FmClient`` maps onto FM's internal endpoint. A body that isn't even + ``path`` is the operator-facing suffix after ``BASE_PATH`` (e.g. + ``/partners/{partnerOpId}/federations``), which ``FmClient`` maps onto FM's + matching internal endpoint. The request's query string is forwarded as-is + (e.g. ``GetZoneData``'s ``zoneId`` filter). A body that isn't even syntactically JSON can't reach FM meaningfully, so that's rejected here (ADR-0047: OEG-authored 400); the mirror case on the way back -- FM answering with a body it labelled JSON that isn't actually parseable -- is ADR-0047's 502. @@ -130,6 +143,7 @@ async def _relay( content=body or None, content_type=request.headers.get("content-type"), x_correlator=x_correlator, + params=tuple(request.query_params.multi_items()), ) except FmUnavailableError as exc: return _problem_response(503, "Federation Manager unavailable", str(exc)) @@ -149,7 +163,7 @@ async def _relay( @router.post( - "/partner", + PARTNER_PREFIX, tags=["Federation Manager"], summary="Create a one-direction federation with a partner operator platform", operation_id="create_federation", @@ -157,15 +171,42 @@ async def _relay( responses=_responses(400, 401, 404, 409, 422, 500, 502, 503, 520), ) async def create_federation( - request: Request, fm_client: FmClientDep, x_correlator: XCorrelatorHeader = None + partnerOpId: PartnerOpId, + request: Request, + fm_client: FmClientDep, + x_correlator: XCorrelatorHeader = None, ) -> Response: return await _relay( - fm_client, "POST", "/partner", request, x_correlator, request_schema=FederationRequestData + fm_client, + "POST", + f"/partners/{partnerOpId}/federations", + request, + x_correlator, + request_schema=FederationRequestData, ) @router.get( - "/{federationContextId}/partner", + PARTNER_PREFIX, + tags=["Federation Manager"], + summary="Retrieve the existing federationContextId with the partner operator platform", + operation_id="get_federation_context_id", + response_model=FederationContextIdResponse, + responses=_responses(400, 401, 404, 409, 422, 500, 502, 503, 520), +) +async def get_federation_context_id( + partnerOpId: PartnerOpId, + request: Request, + fm_client: FmClientDep, + x_correlator: XCorrelatorHeader = None, +) -> Response: + return await _relay( + fm_client, "GET", f"/partners/{partnerOpId}/federations", request, x_correlator + ) + + +@router.get( + f"{PARTNER_PREFIX}/{{federationContextId}}", tags=["Federation Manager"], summary="Retrieve details about the federation context with the partner OP", operation_id="get_federation_details", @@ -173,16 +214,23 @@ async def create_federation( responses=_responses(400, 401, 404, 409, 422, 500, 502, 503, 520), ) async def get_federation_details( + partnerOpId: PartnerOpId, federationContextId: FederationContextId, request: Request, fm_client: FmClientDep, x_correlator: XCorrelatorHeader = None, ) -> Response: - return await _relay(fm_client, "GET", f"/{federationContextId}/partner", request, x_correlator) + return await _relay( + fm_client, + "GET", + f"/partners/{partnerOpId}/federations/{federationContextId}", + request, + x_correlator, + ) @router.delete( - "/{federationContextId}/partner", + f"{PARTNER_PREFIX}/{{federationContextId}}", tags=["Federation Manager"], summary="Remove an existing federation with the partner OP", operation_id="delete_federation_details", @@ -190,32 +238,48 @@ async def get_federation_details( responses=_responses(400, 401, 404, 409, 422, 500, 502, 503, 520), ) async def delete_federation_details( + partnerOpId: PartnerOpId, federationContextId: FederationContextId, request: Request, fm_client: FmClientDep, x_correlator: XCorrelatorHeader = None, ) -> Response: return await _relay( - fm_client, "DELETE", f"/{federationContextId}/partner", request, x_correlator + fm_client, + "DELETE", + f"/partners/{partnerOpId}/federations/{federationContextId}", + request, + x_correlator, ) @router.get( - "/fed-context-id", - tags=["Federation Manager"], - summary="Retrieve the existing federationContextId with the partner operator platform", - operation_id="get_federation_context_id", - response_model=FederationContextIdResponse, + f"{PARTNER_PREFIX}/{{federationContextId}}/zones", + tags=["Availability Zone Info Synchronization"], + summary="List the zones the partner OP offers, optionally filtered to one zone", + operation_id="get_zone_data", + response_model=ZoneRegisteredData, responses=_responses(400, 401, 404, 409, 422, 500, 502, 503, 520), ) -async def get_federation_context_id( - request: Request, fm_client: FmClientDep, x_correlator: XCorrelatorHeader = None +async def get_zone_data( + partnerOpId: PartnerOpId, + federationContextId: FederationContextId, + request: Request, + fm_client: FmClientDep, + x_correlator: XCorrelatorHeader = None, + zoneId: Annotated[ZoneIdentifier | None, Query()] = None, ) -> Response: - return await _relay(fm_client, "GET", "/fed-context-id", request, x_correlator) + return await _relay( + fm_client, + "GET", + f"/partners/{partnerOpId}/federations/{federationContextId}/zones", + request, + x_correlator, + ) @router.post( - "/{federationContextId}/zones", + f"{PARTNER_PREFIX}/{{federationContextId}}/zones", tags=["Availability Zone Info Synchronization"], summary="Subscribe to partner OP availability zones and reserve zone resources", operation_id="zone_subscribe", @@ -223,6 +287,7 @@ async def get_federation_context_id( responses=_responses(400, 401, 404, 409, 422, 500, 502, 503, 520), ) async def zone_subscribe( + partnerOpId: PartnerOpId, federationContextId: FederationContextId, request: Request, fm_client: FmClientDep, @@ -231,7 +296,7 @@ async def zone_subscribe( return await _relay( fm_client, "POST", - f"/{federationContextId}/zones", + f"/partners/{partnerOpId}/federations/{federationContextId}/zones", request, x_correlator, request_schema=ZoneRegistrationRequestData, @@ -239,17 +304,18 @@ async def zone_subscribe( @router.get( - "/{federationContextId}/zones/{zoneId}", + f"{PARTNER_PREFIX}/{{federationContextId}}/zones/{{zoneId}}", tags=["Availability Zone Info Synchronization"], summary=( "Retrieves details about the computation and network resources that partner " "OP has reserved for this zone" ), - operation_id="get_zone_data", + operation_id="get_zone_details", response_model=ZoneRegisteredData, responses=_responses(400, 401, 404, 409, 422, 500, 502, 503, 520), ) -async def get_zone_data( +async def get_zone_details( + partnerOpId: PartnerOpId, federationContextId: FederationContextId, zoneId: ZoneIdentifier, request: Request, @@ -257,12 +323,16 @@ async def get_zone_data( x_correlator: XCorrelatorHeader = None, ) -> Response: return await _relay( - fm_client, "GET", f"/{federationContextId}/zones/{zoneId}", request, x_correlator + fm_client, + "GET", + f"/partners/{partnerOpId}/federations/{federationContextId}/zones/{zoneId}", + request, + x_correlator, ) @router.delete( - "/{federationContextId}/zones/{zoneId}", + f"{PARTNER_PREFIX}/{{federationContextId}}/zones/{{zoneId}}", tags=["Availability Zone Info Synchronization"], summary=( "Assert usage of a partner OP zone. Originating OP informs partner OP that " @@ -273,6 +343,7 @@ async def get_zone_data( responses=_responses(400, 401, 404, 409, 422, 500, 502, 503, 520), ) async def zone_unsubscribe( + partnerOpId: PartnerOpId, federationContextId: FederationContextId, zoneId: ZoneIdentifier, request: Request, @@ -280,5 +351,9 @@ async def zone_unsubscribe( x_correlator: XCorrelatorHeader = None, ) -> Response: return await _relay( - fm_client, "DELETE", f"/{federationContextId}/zones/{zoneId}", request, x_correlator + fm_client, + "DELETE", + f"/partners/{partnerOpId}/federations/{federationContextId}/zones/{zoneId}", + request, + x_correlator, ) diff --git a/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/schemas.py b/src/open_exposure_gateway/api/gsma/federation_manager/v1_4_0/schemas.py similarity index 82% rename from src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/schemas.py rename to src/open_exposure_gateway/api/gsma/federation_manager/v1_4_0/schemas.py index 70f8dab..f956c94 100644 --- a/src/open_exposure_gateway/api/gsma/federation_manager/v1_2_0/schemas.py +++ b/src/open_exposure_gateway/api/gsma/federation_manager/v1_4_0/schemas.py @@ -1,14 +1,15 @@ -"""Pydantic models for the GSMA Federation Manager API (EWBI OPG v1.2.0). - -Request/response schemas derived from -``API_definitions/federation-manager.yaml``. Only the ``FederationManagement`` -tag is modelled here; the other tags (zones, artefacts, application onboarding -and LCM) are added as they are implemented. - -Schema names follow the OpenAPI ``operationId`` intent rather than the generated -``inline_response_*`` / ``*_body`` names: ``FederationDetails`` is the spec's -``inline_response_200_1`` and ``FederationContextIdResponse`` is -``inline_response_200_2``. +"""Pydantic models for the GSMA Federation Manager API (OPG.04 v6.0 / artifact v1.4.0). + +Request/response schemas derived from FM's profiled copy of the GSMA artifact, +``API_definitions/OPG.04-v6.0-EWBI-Federation-API-v1.4.0-oop-profile.yaml``. +Only the ``FederationManagement`` and ``AvailabilityZoneInfoSynchronization`` +tags are modelled here; the other tags (zones onboarding, artefacts, +application onboarding and LCM) are added as they are implemented. + +Schema names follow the OpenAPI ``operationId`` intent rather than the spec's +inline response names: ``FederationDetails`` is the ``GetFederationDetails``/ +``UpdateFederation`` response body and ``FederationContextIdResponse`` is +``GetFederationContextId``'s. """ from __future__ import annotations @@ -34,6 +35,11 @@ FederationIdentifier = Annotated[str, StringConstraints(pattern=_ID_PATTERN)] ZoneIdentifier = Annotated[str, StringConstraints(pattern=_ID_PATTERN)] +PartnerOpId = Annotated[str, StringConstraints(pattern=_ID_PATTERN)] +"""Our own registered id for the partner operator platform (not part of GSMA -- this +is the platform-namespace path param that says which partner an EWBI call is for, +since the GSMA body itself never names the callee).""" + CountryCode = Annotated[str, StringConstraints(pattern=r"^[A-Z]{2}$")] """ISO 3166-1 Alpha-2 country code of the partner operator.""" @@ -95,16 +101,6 @@ class MobileNetworkIds(BaseModel): mncs: Optional[Annotated[list[Mnc], Field(min_length=1)]] = None -class CallbackCredentials(BaseModel): - """OAuth2 client-credentials used by the partner OP to authenticate callbacks.""" - - model_config = ConfigDict(extra="forbid") - - tokenUrl: Uri - clientId: str - clientSecret: str - - class ServiceEndpoint(BaseModel): """Reachability information for the edge-discovery or LCM service of an OP. @@ -147,38 +143,40 @@ class ProblemDetails(BaseModel): class FederationRequestData(BaseModel): - """Body of ``POST /partner`` -- the Originating OP's federation create request.""" + """Body of ``CreateFederation`` -- the Originating OP's federation create request. + + v1.4.0 requires only ``initialDate`` and ``partnerStatusLink``; + ``partnerCallbackCredentials`` no longer exists as a field. + """ model_config = ConfigDict(extra="forbid") - origOPFederationId: FederationIdentifier initialDate: datetime partnerStatusLink: Uri + origOPFederationId: Optional[FederationIdentifier] = None origOPCountryCode: Optional[CountryCode] = None origOPMobileNetworkCodes: Optional[MobileNetworkIds] = None origOPFixedNetworkCodes: Optional[FixedNetworkIds] = None - partnerCallbackCredentials: Optional[CallbackCredentials] = None class FederationResponseData(BaseModel): - """``200`` body of ``POST /partner`` -- the partner OP's federation context.""" + """``200`` body of ``CreateFederation`` -- the partner OP's federation context.""" - partnerOPFederationId: FederationIdentifier federationContextId: FederationContextId platformCaps: list[PlatformCapability] + partnerOPFederationId: Optional[FederationIdentifier] = None partnerOPCountryCode: Optional[CountryCode] = None edgeDiscoveryServiceEndPoint: Optional[ServiceEndpoint] = None lcmServiceEndPoint: Optional[ServiceEndpoint] = None partnerOPMobileNetworkCodes: Optional[MobileNetworkIds] = None partnerOPFixedNetworkCodes: Optional[FixedNetworkIds] = None offeredAvailabilityZones: Optional[Annotated[list[ZoneDetails], Field(min_length=1)]] = None + federationExpiryDate: Optional[datetime] = None + federationRenewalDate: Optional[datetime] = None class FederationDetails(BaseModel): - """``200`` body of ``GET`` / ``PATCH`` ``/{federationContextId}/partner``. - - The spec's ``inline_response_200_1``. - """ + """``200`` body of ``GetFederationDetails`` / ``UpdateFederation``.""" edgeDiscoveryServiceEndPoint: ServiceEndpoint lcmServiceEndPoint: ServiceEndpoint @@ -188,7 +186,7 @@ class FederationDetails(BaseModel): class FederationContextIdResponse(BaseModel): - """``200`` body of ``GET /fed-context-id``. The spec's ``inline_response_200_2``. + """``200`` body of ``GetFederationContextId``. The wire field name is ``FederationContextId`` (capitalised) per the spec. """ @@ -198,9 +196,10 @@ class FederationContextIdResponse(BaseModel): # --- AvailabilityZoneInfoSynchronization -------------------------------------- # -# Schemas for ``POST /{federationContextId}/zones`` (``zone_subscribe``): the -# Originating OP subscribes to a set of the partner OP's availability zones and -# the partner OP reserves compute/network resources for them. +# Schemas for ``ZoneSubscribe``: the Originating OP subscribes to a set of the +# partner OP's availability zones and the partner OP reserves compute/network +# resources for them. ``ZoneRegisteredData`` is also the response of +# ``GetZoneData`` (list) and ``GetZoneDetails`` (single zone). FlavourId = str Vcpu = Annotated[str, StringConstraints(pattern=r"^\d+((\.\d{1,3})|(m))?$")] @@ -350,7 +349,7 @@ class ZoneRegisteredData(BaseModel): class ZoneRegistrationRequestData(BaseModel): - """Body of ``POST /{federationContextId}/zones``.""" + """Body of ``ZoneSubscribe``.""" model_config = ConfigDict(extra="forbid") @@ -359,6 +358,6 @@ class ZoneRegistrationRequestData(BaseModel): class ZoneRegistrationResponseData(BaseModel): - """``200`` body of ``POST /{federationContextId}/zones``.""" + """``200`` body of ``ZoneSubscribe``.""" acceptedZoneResourceInfo: Annotated[list[ZoneRegisteredData], Field(min_length=1)] diff --git a/src/open_exposure_gateway/main.py b/src/open_exposure_gateway/main.py index 1348433..e23c994 100644 --- a/src/open_exposure_gateway/main.py +++ b/src/open_exposure_gateway/main.py @@ -45,7 +45,7 @@ from open_exposure_gateway.api.error_handlers import ( register_exception_handlers, x_correlator_header, ) -from open_exposure_gateway.api.gsma.federation_manager.v1_2_0.router import ( +from open_exposure_gateway.api.gsma.federation_manager.v1_4_0.router import ( router as federation_manager_router, ) from open_exposure_gateway.api.platform.health import router as health_router diff --git a/tests/unit/test_federation_manager_endpoints.py b/tests/unit/test_federation_manager_endpoints.py index ed5530c..960d2ee 100644 --- a/tests/unit/test_federation_manager_endpoints.py +++ b/tests/unit/test_federation_manager_endpoints.py @@ -14,12 +14,14 @@ import pytest from fastapi.testclient import TestClient from open_exposure_gateway.adapters.http.fm_client import FmUnavailableError -from open_exposure_gateway.api.gsma.federation_manager.v1_2_0.router import BASE_PATH +from open_exposure_gateway.api.gsma.federation_manager.v1_4_0.router import BASE_PATH from open_exposure_gateway.dependencies import get_fm_client from open_exposure_gateway.main import app +_PARTNER = "partner-op-1" _CTX = "fed-ctx-1" _ZONE = "zone-a" +_FEDERATIONS = f"/partners/{_PARTNER}/federations" _VALID_CREATE_BODY = ( b'{"origOPFederationId": "orig-op-1", "initialDate": "2026-09-04T12:00:00Z", ' @@ -48,6 +50,7 @@ class _FakeFmClient: content: bytes | None, content_type: str | None, x_correlator: str | None, + params: Any = None, ) -> httpx.Response: self.calls.append( { @@ -56,6 +59,7 @@ class _FakeFmClient: "content": content, "content_type": content_type, "x_correlator": x_correlator, + "params": list(params) if params else [], } ) if self.raise_unavailable: @@ -77,22 +81,41 @@ def client() -> TestClient: _ENDPOINTS = [ - ("post", f"{BASE_PATH}/partner", "POST", "/partner", _VALID_CREATE_BODY), - ("get", f"{BASE_PATH}/{_CTX}/partner", "GET", f"/{_CTX}/partner", None), - ("delete", f"{BASE_PATH}/{_CTX}/partner", "DELETE", f"/{_CTX}/partner", None), - ("get", f"{BASE_PATH}/fed-context-id", "GET", "/fed-context-id", None), - ("post", f"{BASE_PATH}/{_CTX}/zones", "POST", f"/{_CTX}/zones", _VALID_ZONE_SUBSCRIBE_BODY), - ("get", f"{BASE_PATH}/{_CTX}/zones/{_ZONE}", "GET", f"/{_CTX}/zones/{_ZONE}", None), - ("delete", f"{BASE_PATH}/{_CTX}/zones/{_ZONE}", "DELETE", f"/{_CTX}/zones/{_ZONE}", None), + ("post", f"{BASE_PATH}{_FEDERATIONS}", "POST", _FEDERATIONS, _VALID_CREATE_BODY), + ("get", f"{BASE_PATH}{_FEDERATIONS}", "GET", _FEDERATIONS, None), + ("get", f"{BASE_PATH}{_FEDERATIONS}/{_CTX}", "GET", f"{_FEDERATIONS}/{_CTX}", None), + ("delete", f"{BASE_PATH}{_FEDERATIONS}/{_CTX}", "DELETE", f"{_FEDERATIONS}/{_CTX}", None), + ( + "post", + f"{BASE_PATH}{_FEDERATIONS}/{_CTX}/zones", + "POST", + f"{_FEDERATIONS}/{_CTX}/zones", + _VALID_ZONE_SUBSCRIBE_BODY, + ), + ( + "get", + f"{BASE_PATH}{_FEDERATIONS}/{_CTX}/zones/{_ZONE}", + "GET", + f"{_FEDERATIONS}/{_CTX}/zones/{_ZONE}", + None, + ), + ( + "delete", + f"{BASE_PATH}{_FEDERATIONS}/{_CTX}/zones/{_ZONE}", + "DELETE", + f"{_FEDERATIONS}/{_CTX}/zones/{_ZONE}", + None, + ), ] _OPERATION_IDS = { "create_federation", + "get_federation_context_id", "get_federation_details", "delete_federation_details", - "get_federation_context_id", "zone_subscribe", "get_zone_data", + "get_zone_details", "zone_unsubscribe", } @@ -122,6 +145,17 @@ def test_endpoint_relays_to_fm_unaltered( assert call["x_correlator"] == "corr-1" +def test_get_zone_data_forwards_zone_id_query_string( + client: TestClient, fake_fm_client: _FakeFmClient +) -> None: + """GetZoneData takes ``zoneId`` as a query param -- it must reach FM, not be dropped.""" + response = client.get(f"{BASE_PATH}{_FEDERATIONS}/{_CTX}/zones", params={"zoneId": _ZONE}) + + assert response.status_code == 200 + assert fake_fm_client.calls[0]["path"] == f"{_FEDERATIONS}/{_CTX}/zones" + assert ("zoneId", _ZONE) in fake_fm_client.calls[0]["params"] + + def test_fm_error_response_is_relayed_unaltered( client: TestClient, fake_fm_client: _FakeFmClient ) -> None: @@ -131,7 +165,7 @@ def test_fm_error_response_is_relayed_unaltered( headers={"content-type": "application/problem+json"}, ) - response = client.get(f"{BASE_PATH}/{_CTX}/partner") + response = client.get(f"{BASE_PATH}{_FEDERATIONS}/{_CTX}") assert response.status_code == 409 assert response.headers["content-type"] == "application/problem+json" @@ -143,7 +177,7 @@ def test_fm_unavailable_returns_problem_details_503( ) -> None: fake_fm_client.raise_unavailable = True - response = client.get(f"{BASE_PATH}/fed-context-id") + response = client.get(f"{BASE_PATH}{_FEDERATIONS}") assert response.status_code == 503 assert response.headers["content-type"] == "application/problem+json" @@ -154,7 +188,7 @@ def test_malformed_request_body_returns_problem_details_400( client: TestClient, fake_fm_client: _FakeFmClient ) -> None: response = client.post( - f"{BASE_PATH}/partner", + f"{BASE_PATH}{_FEDERATIONS}", content=b"{not valid json", headers={"content-type": "application/json"}, ) @@ -170,7 +204,7 @@ def test_wrong_shape_request_body_returns_problem_details_400( ) -> None: """Valid JSON, but missing FederationRequestData's required fields.""" response = client.post( - f"{BASE_PATH}/partner", + f"{BASE_PATH}{_FEDERATIONS}", content=b'{"a": 1}', headers={"content-type": "application/json"}, ) @@ -186,7 +220,7 @@ def test_wrong_shape_zone_subscribe_body_returns_problem_details_400( ) -> None: """acceptedAvailabilityZones must be non-empty.""" response = client.post( - f"{BASE_PATH}/{_CTX}/zones", + f"{BASE_PATH}{_FEDERATIONS}/{_CTX}/zones", content=b'{"acceptedAvailabilityZones": [], "availZoneNotifLink": "https://x.example.com"}', headers={"content-type": "application/json"}, ) @@ -200,7 +234,7 @@ def test_valid_shape_request_body_is_still_forwarded_as_raw_bytes( ) -> None: """Shape validation is a gate, not a reshape -- FM gets the original bytes.""" response = client.post( - f"{BASE_PATH}/partner", + f"{BASE_PATH}{_FEDERATIONS}", content=_VALID_CREATE_BODY, headers={"content-type": "application/json"}, ) @@ -216,7 +250,7 @@ def test_unparseable_fm_response_returns_problem_details_502( 200, content=b"{not valid json", headers={"content-type": "application/json"} ) - response = client.get(f"{BASE_PATH}/fed-context-id") + response = client.get(f"{BASE_PATH}{_FEDERATIONS}") assert response.status_code == 502 assert response.headers["content-type"] == "application/problem+json" diff --git a/tests/unit/test_fm_client.py b/tests/unit/test_fm_client.py index f404827..5067a81 100644 --- a/tests/unit/test_fm_client.py +++ b/tests/unit/test_fm_client.py @@ -48,14 +48,14 @@ async def test_relay_forwards_method_url_body_and_correlator( client = _client(monkeypatch, handler) response = await client.relay( "POST", - "/partner", + "/partners/partner-op-1/federations", content=b'{"origOPFederationId": "op-1"}', content_type="application/json", x_correlator="corr-1", ) assert seen["method"] == "POST" - assert seen["url"] == "http://fm:8082/internal/federation/partner" + assert seen["url"] == "http://fm:8082/internal/partners/partner-op-1/federations" assert seen["content"] == b'{"origOPFederationId": "op-1"}' assert seen["content_type"] == "application/json" assert seen["x_correlator"] == "corr-1" @@ -63,6 +63,28 @@ async def test_relay_forwards_method_url_body_and_correlator( assert response.content == b'{"federationContextId": "ctx-1"}' +async def test_relay_forwards_query_string(monkeypatch: pytest.MonkeyPatch) -> None: + seen: dict[str, Any] = {} + + def handler(request: httpx.Request) -> httpx.Response: + seen["url"] = str(request.url) + return httpx.Response(200, content=b"{}") + + client = _client(monkeypatch, handler) + await client.relay( + "GET", + "/partners/partner-op-1/federations/ctx-1/zones", + content=None, + content_type=None, + x_correlator=None, + params=(("zoneId", "zone-a"),), + ) + + assert seen["url"] == ( + "http://fm:8082/internal/partners/partner-op-1/federations/ctx-1/zones?zoneId=zone-a" + ) + + async def test_relay_returns_fm_error_response_untouched(monkeypatch: pytest.MonkeyPatch) -> None: client = _client( monkeypatch, -- GitLab