GSMA Camara Project Application Endpoint Discovery API

The Application Discovery API extends beyond the capabilities of the Simple Edge Discovery API by not only locating the nearest Edge Cloud Zone but also directly linking to the application endpoints within those Edge Cloud Zones.

OpenAPI Specification

application-endpoint-discovery-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Global System for Mobile Communications GSMA Camara Project Application Endpoint Discovery API
  version: 0.1.0-wip
  description: >-
    The Application Discovery API extends beyond the capabilities of the Simple
    Edge Discovery API by not only locating the nearest Edge Cloud Zone but also
    directly linking to the application endpoints within those Edge Cloud Zones.
  contact:
    email: [email protected]
  license:
    name: Apache 2.0
    url: https://www.apache.org/licenses/LICENSE-2.0.html
externalDocs:
  description: Product documentation at CAMARA.
  url: https://github.com/camaraproject/EdgeCloud
servers:
  - url: '{apiRoot}/{basePath}'
    variables:
      apiRoot:
        default: https://localhost:443
        description: API root.
      basePath:
        default: application-endpoint-discovery/vwip
        description: Base path for the Application Endpoint Discovery.
tags:
  - name: Discovery
paths:
  /app-endpoints:
    get:
      security:
        - openId:
            - application-endpoint-discovery:app-endpoints:read
      operationId: getAppEndpoints
      parameters:
        - name: filter
          in: query
          required: true
          description: |
            Filter the Edge Cloud Zones according to the parameter value.
            For this API the only supported value is `closest`.
          schema:
            type: string
            enum:
              - closest
        - name: IPv4-Address
          in: header
          required: false
          description: The public IPv4 address allocated to the device.
          example: 84.125.93.10
          schema:
            $ref: '#/components/schemas/SingleIpv4Addr'
        - name: IPv6-Address
          in: header
          required: false
          description: The public IPv6 address allocated to the device.
          example: 2001:db8:85a3:8d3:1319:8a2e:370:7348
          schema:
            $ref: '#/components/schemas/DeviceIpv6Address'
        - name: Network-Access-Identifier
          in: header
          description: |
            3GPP network access identifier for the subscription
            being used by the device.
          example: [email protected]
          required: false
          schema:
            $ref: '#/components/schemas/NetworkAccessIdentifier'
        - name: Phone-Number
          in: header
          example: '+441234567890'
          required: true
          description: |
            MSISDN in E.164 format (starting with country code) of
            the mobile subscription being used by the device. Optionally
            prefixed with '+'.
          schema:
            $ref: '#/components/schemas/PhoneNumber'
        - name: AppId
          in: header
          required: true
          description: |
            A globally unique identifier associated with the application.
            OP generates this identifier when the application is submitted over
            NBI.
          schema:
            $ref: '#/components/schemas/AppId'
        - name: X-Correlator
          in: header
          required: false
          description: |
            When the API Consumer includes the "X-Correlator" header in the
            request, the API provider must include it in the response with
            the same value that was used in the request. Otherwise, it is
            optional to include the "X-Correlator" header in the response with
             any valid value. Recommendation is to use UUID for values.
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: |
            Successful response, returning the closest App Instance Endpoint
            Zone to the user device identified in the request header.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AccessEndpoints'
        '400':
          $ref: '#/components/responses/400BadRequest'
        '401':
          $ref: '#/components/responses/401Unauthorized'
        '403':
          $ref: '#/components/responses/403Forbidden'
        '404':
          $ref: '#/components/responses/404NotFound'
        '405':
          $ref: '#/components/responses/405MethodNotAllowed'
        '406':
          $ref: '#/components/responses/406Unacceptable'
        '429':
          $ref: '#/components/responses/429TooManyRequests'
        '500':
          $ref: '#/components/responses/500InternalServerError'
        '502':
          $ref: '#/components/responses/502BadGateway'
        '503':
          $ref: '#/components/responses/503ServiceUnavailable'
        '504':
          $ref: '#/components/responses/504GatewayTimeout'
      tags:
        - Discovery
      summary: |-
        Global System for Mobile Communications Returns the Endpoint of the closest App Instance to user device
        identified in the request.
      description: |
        On receiving this request, the network will return the name
        of the App Instance with the shortest network path to the end user
        device identified in the request.
components:
  securitySchemes:
    openId:
      description: OpenID Provider Configuration Information.
      type: openIdConnect
      openIdConnectUrl: .well-known/openid-configuration
  headers:
    X-Correlator:
      description: |
        When the API Consumer includes the "X-Correlator" header in the request,
         the API provider must include it in the response with the same value t
         hat was used in the request. Otherwise, it is optional to include the
         "X-Correlator" header in the response with any valid value.
         Recommendation is to use UUID for values.
      required: false
      schema:
        type: string
        format: uuid
  schemas:
    AppId:
      type: string
      format: uuid
      description: >-
        A globally unique identifier associated with the application. This GUID
        will have been previously provided by the Edge Cloud Zone provider.
    AccessEndpoints:
      type: object
      description: |
        Application Endpoint for an especific instance that is
        running in an specific Edge Cloud Zone.
      required:
        - port
      anyOf:
        - required:
            - fqdn
        - required:
            - ipv4Addresses
        - required:
            - ipv6Addresses
      properties:
        port:
          $ref: '#/components/schemas/Port'
        fqdn:
          $ref: '#/components/schemas/Fqdn'
        ipv4Addresses:
          description: IP version 4 of an application instance.
          type: array
          items:
            $ref: '#/components/schemas/Ipv4Addr'
          minItems: 1
        ipv6Addresses:
          description: IP version 6 of an application instance.
          type: array
          items:
            $ref: '#/components/schemas/Ipv6Addr'
          minItems: 1
    ErrorResponse:
      description: Error code and human-readable description.
      type: object
      properties:
        code:
          type: string
          description: A short, human-readable summary of the problem type.
        status:
          type: integer
          description: The HTTP status code.
        message:
          type: string
          description: |
            This parameter appears when there is an error.
            A human readable explanation specific to this occurrence of the
            problem.
    Fqdn:
      type: string
      description: Fully Qualified Domain Name.
    Ipv4Addr:
      type: string
      description: |
        IP of the device. A single IPv4 address may be specified in
        dotted-quad form 1.2.3.4. Only this exact IP number will match the flow
        control rule.
      example: 198.51.100.1
    Ipv6Addr:
      type: string
      description: |
        IP of the device. A single IPv6 address, following IETF 5952
        format, may be specified like 2001:db8:85a3:8d3:1319:8a2e:370:7344
      example: 2001:db8:85a3::8a2e:370:7334
    Port:
      type: integer
      description: Port to stablish the connection
      minimum: 0
    PhoneNumber:
      description: |
        A public identifier addressing a telephone subscription.
        In mobile networks it corresponds to the MSISDN (Mobile Station
        International Subscriber Directory Number). In order to be globally
        unique it has to be formatted in international format, according
        to E.164 standard, prefixed with '+'.
      type: string
      pattern: ^\+[1-9][0-9]{4,14}$
      example: '+123456789'
    NetworkAccessIdentifier:
      description: |
        A public identifier addressing a subscription in a mobile
        network. In 3GPP terminology, it corresponds to the GPSI formatted with
        the External Identifier ({Local Identifier}@{Domain Identifier}). Unlike
        the telephone number, the network access identifier is not subjected to
        portability ruling in force, and is individually managed by each
        operator.
      type: string
      example: [email protected]
    SingleIpv4Addr:
      description: |
        A single IPv4 address with no subnet mask
      type: string
      format: ipv4
      example: 84.125.93.10
    DeviceIpv6Address:
      description: |
        The device should be identified by the observed IPv6 address, or by any
        single IPv6 address from within the subnet allocated to the device
        (e.g. adding ::0 to the /64 prefix).
      type: string
      format: ipv6
      example: 2001:db8:85a3:8d3:1319:8a2e:370:7344
  responses:
    400BadRequest:
      description: Bad Request
      headers:
        X-Correlator:
          $ref: '#/components/headers/X-Correlator'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            InsufficientParameters:
              description: |
                Sufficient parameters must be specified to allow the
                target UE to be identified.
              value:
                code: INVALID_ARGUMENT
                status: 400
                message: >-
                  Insufficient parameters: At least one of
                  Network-Access-Identifier, Phone-Number or IP-Address must be
                  specified, or, the API must be called by a client on a
                  network-attached device (hence passing the source IP in the
                  request header).
            InvalidExternalId:
              value:
                code: INVALID_ARGUMENT
                status: 400
                message: 'Invalid Header Format: Network-Access-Identifier'
            InvalidMSISDN:
              value:
                code: INVALID_ARGUMENT
                status: 400
                message: 'Invalid Header Format: Phone-Number'
            InvalidIP:
              description: |
                This error will be returned if the IP address does
                not have a valid format, or if the IP address is a private IPv4
                address.
              value:
                code: INVALID_ARGUMENT
                status: 400
                message: 'Invalid Header Format: IP-Address'
    401Unauthorized:
      description: Unauthorized
      headers:
        X-Correlator:
          $ref: '#/components/headers/X-Correlator'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            InvalidCredentials:
              value:
                code: UNAUTHENTICATED
                status: 401
                message: >-
                  Request not authenticated due to missing, invalid, or expired
                  credentials
    403Forbidden:
      description: Forbidden
      headers:
        X-Correlator:
          $ref: '#/components/headers/X-Correlator'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            InsufficientPermissions:
              value:
                code: PERMISSION_DENIED
                status: 403
                message: >-
                  Client does not have sufficient permissions to perform this
                  action
    404NotFound:
      description: Not Found
      headers:
        X-Correlator:
          $ref: '#/components/headers/X-Correlator'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            SubscriberNotFound:
              description: |
                No device found for the specified parameters,
                meaning the closest Edge Cloud Zone cannot be determined.
              value:
                code: NOT_FOUND
                status: 404
                message: No device found for the specified parameters
            EndpointNotFound:
              description: |
                No endpoint instance found for the specified parameters,
                meaning the closest Edge Cloud Zone cannot be determined.
              value:
                code: NOT_FOUND
                status: 404
                message: No endpoint instance found for the specified parameters
    405MethodNotAllowed:
      description: Method Not Allowed
      headers:
        X-Correlator:
          $ref: '#/components/headers/X-Correlator'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            MethodNotAllowed:
              description: |
                An HTTP verb other than GET has been used to try
                and access the resource.
              value:
                code: METHOD_NOT_ALLOWED
                status: 405
                message: The request method is not supported by this resource
    406Unacceptable:
      description: Not Acceptable
      headers:
        X-Correlator:
          $ref: '#/components/headers/X-Correlator'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            NotAcceptable:
              description: A response format other than JSON has been requested
              value:
                code: NOT_ACCEPTABLE
                status: 406
                message: >-
                  The server cannot produce a response matching the content
                  requested by the client through Accept-* headers
    429TooManyRequests:
      description: Too Many Requests
      headers:
        X-Correlator:
          $ref: '#/components/headers/X-Correlator'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            TooManyRequests:
              description: |
                Access to the API has been temporarily blocked due
                to quota or spike arrest limits being reached.
              value:
                code: TOO_MANY_REQUESTS
                status: 429
                message: Either out of resource quota or reaching rate limiting
    500InternalServerError:
      description: Internal Server Error
      headers:
        X-Correlator:
          $ref: '#/components/headers/X-Correlator'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            code: INTERNAL
            status: 500
            message: The service is currently not available
    502BadGateway:
      description: Bad Gateway
      headers:
        X-Correlator:
          $ref: '#/components/headers/X-Correlator'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            code: BAD_GATEWAY
            status: 502
            message: The service is currently not available
    503ServiceUnavailable:
      description: Service Unavailable
      headers:
        X-Correlator:
          $ref: '#/components/headers/X-Correlator'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            code: UNAVAILABLE
            status: 503
            message: The service is currently not available
    504GatewayTimeout:
      description: Gateway Time-Out
      headers:
        X-Correlator:
          $ref: '#/components/headers/X-Correlator'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            code: TIMEOUT
            status: 504
            message: The service is currently not available