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 0000000000000000000000000000000000000000..3ce84915d5912e1abe085f6455c671f2e9258ff8 --- /dev/null +++ b/src/open_exposure_gateway/adapters/http/fm_client.py @@ -0,0 +1,65 @@ +import httpx +import structlog + +from open_exposure_gateway.core.config import get_settings + +logger = structlog.get_logger(__name__) + +# 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): + """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, + params: tuple[tuple[str, str], ...] | None = None, + ) -> httpx.Response: + """Forward one federation-lifecycle operation to FM, unaltered. + + `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 + 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, + params=params, + ) + 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/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 0000000000000000000000000000000000000000..a792d8a7a7ff13f0f543437ce2fb945d72e32315 --- /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/v1_4_0/router.py b/src/open_exposure_gateway/api/gsma/federation_manager/v1_4_0/router.py new file mode 100644 index 0000000000000000000000000000000000000000..e78965a10523b8738d1eec9df1241e4ba9e23a8f --- /dev/null +++ b/src/open_exposure_gateway/api/gsma/federation_manager/v1_4_0/router.py @@ -0,0 +1,359 @@ +"""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``, ``get_zone_details`` and ``zone_unsubscribe`` from +``AvailabilityZoneInfoSynchronization``. ``update_federation`` +(``UpdateFederation``) is out of scope. +""" + +import json +from typing import Annotated, Any + +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_4_0.schemas import ( + FederationContextId, + FederationContextIdResponse, + FederationDetails, + FederationRequestData, + FederationResponseData, + PartnerOpId, + ProblemDetails, + ZoneIdentifier, + ZoneRegisteredData, + ZoneRegistrationRequestData, + ZoneRegistrationResponseData, +) +from open_exposure_gateway.dependencies import get_fm_client + +# 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 +# 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. +_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"}, + 502: {"model": ProblemDetails, "description": "Bad gateway"}, + 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} + + +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. + ``/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. + + 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, + path, + 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)) + + 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( + content=fm_response.content, + status_code=fm_response.status_code, + media_type=fm_response.headers.get("content-type"), + ) + + +@router.post( + PARTNER_PREFIX, + tags=["Federation Manager"], + 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, 502, 503, 520), +) +async def create_federation( + partnerOpId: PartnerOpId, + request: Request, + fm_client: FmClientDep, + x_correlator: XCorrelatorHeader = None, +) -> Response: + return await _relay( + fm_client, + "POST", + f"/partners/{partnerOpId}/federations", + request, + x_correlator, + request_schema=FederationRequestData, + ) + + +@router.get( + 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", + response_model=FederationDetails, + 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"/partners/{partnerOpId}/federations/{federationContextId}", + request, + x_correlator, + ) + + +@router.delete( + f"{PARTNER_PREFIX}/{{federationContextId}}", + tags=["Federation Manager"], + 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, 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"/partners/{partnerOpId}/federations/{federationContextId}", + request, + x_correlator, + ) + + +@router.get( + 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_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", + f"/partners/{partnerOpId}/federations/{federationContextId}/zones", + request, + x_correlator, + ) + + +@router.post( + 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", + response_model=ZoneRegistrationResponseData, + responses=_responses(400, 401, 404, 409, 422, 500, 502, 503, 520), +) +async def zone_subscribe( + partnerOpId: PartnerOpId, + federationContextId: FederationContextId, + request: Request, + fm_client: FmClientDep, + x_correlator: XCorrelatorHeader = None, +) -> Response: + return await _relay( + fm_client, + "POST", + f"/partners/{partnerOpId}/federations/{federationContextId}/zones", + request, + x_correlator, + request_schema=ZoneRegistrationRequestData, + ) + + +@router.get( + 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_details", + response_model=ZoneRegisteredData, + responses=_responses(400, 401, 404, 409, 422, 500, 502, 503, 520), +) +async def get_zone_details( + partnerOpId: PartnerOpId, + federationContextId: FederationContextId, + zoneId: ZoneIdentifier, + request: Request, + fm_client: FmClientDep, + x_correlator: XCorrelatorHeader = None, +) -> Response: + return await _relay( + fm_client, + "GET", + f"/partners/{partnerOpId}/federations/{federationContextId}/zones/{zoneId}", + request, + x_correlator, + ) + + +@router.delete( + 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 " + "it will no longer access the specified zone" + ), + operation_id="zone_unsubscribe", + status_code=200, + responses=_responses(400, 401, 404, 409, 422, 500, 502, 503, 520), +) +async def zone_unsubscribe( + partnerOpId: PartnerOpId, + federationContextId: FederationContextId, + zoneId: ZoneIdentifier, + request: Request, + fm_client: FmClientDep, + x_correlator: XCorrelatorHeader = None, +) -> Response: + return await _relay( + 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_4_0/schemas.py b/src/open_exposure_gateway/api/gsma/federation_manager/v1_4_0/schemas.py new file mode 100644 index 0000000000000000000000000000000000000000..f956c943d7b91a0ec7265eb1b1e6fda22b2d4a16 --- /dev/null +++ b/src/open_exposure_gateway/api/gsma/federation_manager/v1_4_0/schemas.py @@ -0,0 +1,363 @@ +"""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 + +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)] + +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.""" + +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" + + +# --- 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 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 ``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") + + initialDate: datetime + partnerStatusLink: Uri + origOPFederationId: Optional[FederationIdentifier] = None + origOPCountryCode: Optional[CountryCode] = None + origOPMobileNetworkCodes: Optional[MobileNetworkIds] = None + origOPFixedNetworkCodes: Optional[FixedNetworkIds] = None + + +class FederationResponseData(BaseModel): + """``200`` body of ``CreateFederation`` -- the partner OP's federation context.""" + + 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 ``GetFederationDetails`` / ``UpdateFederation``.""" + + 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 ``GetFederationContextId``. + + The wire field name is ``FederationContextId`` (capitalised) per the spec. + """ + + FederationContextId: FederationContextId + + +# --- AvailabilityZoneInfoSynchronization -------------------------------------- +# +# 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))?$")] +"""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 ``ZoneSubscribe``.""" + + model_config = ConfigDict(extra="forbid") + + acceptedAvailabilityZones: Annotated[list[ZoneIdentifier], Field(min_length=1)] + availZoneNotifLink: Uri + + +class ZoneRegistrationResponseData(BaseModel): + """``200`` body of ``ZoneSubscribe``.""" + + acceptedZoneResourceInfo: Annotated[list[ZoneRegisteredData], Field(min_length=1)] diff --git a/src/open_exposure_gateway/core/config.py b/src/open_exposure_gateway/core/config.py index e898f9c1719091de6ef5192b8ae0dad9a397dd29..9152f614e86c19e404fd3a4f9f097ccdb92569f3 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): + base_url: HttpUrl = HttpUrl("http://localhost:8082") + timeout: 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 diff --git a/src/open_exposure_gateway/core/state.py b/src/open_exposure_gateway/core/state.py index 8af4926ba281bba5114a50f92b00907230db63a7..919e777f2f3ccca8407e9dab219f885291de230e 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 afe4e08cb6761a6fed91c7cad8f3889a95e18183..97fae3b26a162ac6bb18f1f2be94200f2a91044e 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 13b4b9443c08c1fba63e0d717daff3b867f49227..e23c994ffbaf1c87b29236317b605cc0ea94185b 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 ( @@ -44,6 +45,9 @@ from open_exposure_gateway.api.error_handlers import ( register_exception_handlers, x_correlator_header, ) +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 from open_exposure_gateway.application.services.edge_application_management_service import ( EdgeApplicationManagementService, @@ -159,6 +163,14 @@ 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": "Availability Zone Info Synchronization", + "description": "GSMA OPG availability-zone subscription and resource reservation", + }, { "name": "Platform", "description": "Platform-specific endpoints (health, readiness probes)", @@ -228,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) @@ -267,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 @@ -309,6 +323,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 0000000000000000000000000000000000000000..960d2ee8cae89c422c761f51aefe49e3b822a957 --- /dev/null +++ b/tests/unit/test_federation_manager_endpoints.py @@ -0,0 +1,268 @@ +"""GSMA Federation Manager -- stateless relay to FM (ADR-0046, ADR-0048). + +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 collections.abc import Generator +from typing import Any + +import httpx +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_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", ' + 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: + 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, + params: Any = None, + ) -> httpx.Response: + self.calls.append( + { + "method": method, + "path": path, + "content": content, + "content_type": content_type, + "x_correlator": x_correlator, + "params": list(params) if params else [], + } + ) + 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}{_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", + "zone_subscribe", + "get_zone_data", + "get_zone_details", + "zone_unsubscribe", +} + + +@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_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: + 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}{_FEDERATIONS}/{_CTX}") + + 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}{_FEDERATIONS}") + + assert response.status_code == 503 + assert response.headers["content-type"] == "application/problem+json" + 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}{_FEDERATIONS}", + 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}{_FEDERATIONS}", + 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}{_FEDERATIONS}/{_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}{_FEDERATIONS}", + 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}{_FEDERATIONS}") + + 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 = { + op["operationId"] + for methods in paths.values() + for op in methods.values() + if isinstance(op, dict) and "operationId" in op + } + assert _OPERATION_IDS <= seen diff --git a/tests/unit/test_fm_client.py b/tests/unit/test_fm_client.py new file mode 100644 index 0000000000000000000000000000000000000000..5067a81f55494509e7d5a51bdd74635ec5cf25d4 --- /dev/null +++ b/tests/unit/test_fm_client.py @@ -0,0 +1,143 @@ +"""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", + "/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/partners/partner-op-1/federations" + 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_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, + 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 + )