Posted in: Orbit

GVOrbit Alarm REST API

openapi: 3.0.1
info:
  title: GV Orbit AlarmAPI
  description: >
    The AlarmAPI provides access to the GV Orbit monitoring data via REST. 

    The monitoring 
    data is presented using the Common Data Model for Alarms (CDMA) model. This model provides the current state of all Grass Valley equipment, including IQ modular, Densite, Multi-Viewers etc. 

    This document defines the endpoints used to access this data, including input and output data types.

    This is an OpenAPI 3.0 document and as such can be used to auto generate HTML documentation 
    along with client and service side APIs. The normative form of this document is the YAML file.

    All calls are currently unencrypted using HTTP and as such usage of the API should be considered 
    during the architecture of the system. The AlarmAPI service has an option to switch off inbound 
    alarms, essentially providing a read-only access to the data. 

    The API supports:
        * Querying of alarms
        * Alarm notifications using push or pull
        * Creation, update and deletion of alarms
        * Automatic removal of obsolete alarms where a publisher is inactive

    Within a GV Orbit system, alarms are grouped into collections based around a device (sometimes 
    called a Unit). Devices may be physical, such as a modular card, or virtual such as a categorized 
    alarm. To obtain a list of all devices use the /devices endpoint. Devices are identified by a path, 
    which may be a virtual Linux style file system path (typical on Densite/iControl equipment) or a 
    RollCall address of the form NNNN:UU:PP. The RollCall address has a logical path built in and 
    therefore can be resolved to a path in a network tree. 

    This method of identification is under review and may change to standardize the RollCall/Densite 
    identifiers.

    Each device is likely to have multiple alarms. Once the path of the devices are known, alarms can be 
    obtained using the /alarms endpoint and passing the device path. 

    Notifications are supported using either "push" or "pull". In either case a subscription needs to be 
    created by the client, with an optional filter, and the server will push events to a URL 
    provided by the client, or a client may pull changes from the server. The server in both cases keeps 
    track of changes for each subscription so avoids delivering the same data multiple times. Once a 
    client is finished with a subscription, they should delete it to avoid consuming server resources. 
    However to protect against non-graceful cleanup of a client, the server will automatically delete a 
    subscription if it has been inactive for 60 seconds, so the requirement to call delete is not strict. 

    Where no data is flowing (perhaps a filter is in place), and "push" is configured, the server will send 
    an empty array of events to the client at least within 60 seconds to test its validity before deleting 
    the subscription. If the connection fails, it will be re-attempted up to 3 times before the 
    subscription is automatically deleted. To further ensure that subscriptions are not deleted without 
    the client being aware, the client should test the subscription is valid using the 
    GET /subscriptions endpoint. This prevents the server losing contact with the client, removing 
    the push subscription without the client being aware of it. 

    Alarms may be created in the system via the POST /alarms endpoint.  Before an alarm can be 
    created however, the client will first need to register a publication id in the form of a GUID which 
    should then be injected into the 'origin' field for each alarm. The server will reject any attempt to 
    create an alarm without a valid publication id. An advantage of this approach is it facilitates a fire-
    and-forget approach where a client can publish alarms and be assured the GV Monitoring System 
    will detect when that client disappears, thus cleaning up and marking that device as lost.

    Note: Clients do not need to create devices as a separate stage, simply creating one alarm is enough 
    to have that device automatically created.

  version: 1.0.0
servers:
  - url: 'http://gv-orbit-server:9099/alarmapi/v1/'
paths:
  /ping:
    get:
      summary: >-
        Returns a http status code indicating whether the service is alive or
        not.
      description: >
        Obtains an http status code indicating whether the service REST API is
        alive and running.
      operationId: ping
      responses:
        '204':
          description: OK
          content: {}
      x-swagger-router-controller: Default
  /devices:
    get:
      summary: Gets a list of device paths.
      description: >
        Returns a list of all devices paths in the Monitoring System. The path
        can then be used in subsequent requests to obtain alarms for a specific
        device. A single device would typically have multiple alarms associated
        with it. Devices may be virtual or physical.
      operationId: getDevices
      responses:
        '200':
          description: An array of device paths
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string
                  example: 'A000:01:01'
        '401':
          description: Unauthenticated.
          content: {}
      x-swagger-router-controller: Default
  /alarms:
    get:
      summary: Gets a list of the alarms for a given device.
      description: >
        Returns alarms for a given device. The device paths can be obtained
        using the /devices endpoint. If multiple device alarms are required, multiple calls
        need to be made for each device. 

        An alternative is to subscribe to alarm changes. When using this approach all alarms
        will be delivered initially, and then subsequent updates.
      operationId: getAlarms
      parameters:
        - name: path
          in: query
          description: >-
            The path identifying the device for which the alarms should be obtained.
          required: true
          schema:
            type: string
        - name: name
          in: query
          description: >-
            The name of an alarm to obtain. This field may be empty, contain a * character or  
            a single character wildcard ?. I.e. to return all CPU_N_TEMP alarms use CPU_*_TEMP
          required: false
          schema:
            type: string
      responses:
        '200':
          description: An array of alarm objects with a snapshot of the current alarms.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Alarm'
        '400':
          description: Bad input parameter.
          content: {}
        '401':
          description: Unauthenticated.
          content: {}
      x-swagger-router-controller: Default
    post:
      summary: Adds or updates alarms
      description: >
        Adds or updates (an array of) alarms in the monitoring system. 

        The path and name uniquely identify the alarm and must be unused by existing alarms, or
        the publication id specified in the 'origin' field must match the
        existing alarm in which case it will be updated.

        Alarms are added with a publication id. This should have first been
        registered using the publications endpoint. 

        The client should populate the 'origin' field with the publication id before adding the alarms.  
      operationId: setAlarms
      requestBody:
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/Alarm'
        required: false
      responses:
        '201':
          description: Alarm(s) created or updated.
          content: {}
        '400':
          description: 'Invalid input, request has been rejected.'
          content: {}
        '403':
          description: 'Write access is disabled on the server.'
          content: {}
        '401':
          description: Unauthenticated.
          content: {}
        '409':
          description: >-
            An existing item already exists and cannot be modified. Check the
            origin is set to a valid publication id.
          content: {}
      x-swagger-router-controller: Default
      x-codegen-request-body-name: alarms
  /alarms/deletions:
    post:
      summary: Removes alarms from the monitoring system
      description: >
        Removes alarms from the monitoring system. The client should provide a list of alarms which should be removed. 

        A single * character may be used in the name field, in which case all alarms will be removed. The path field, identifying the device, must be specified in full.
      operationId: removeAlarms
      parameters:
        - name: publicationId
          in: query
          description: The publication id of the publisher to delete
          required: true
          schema:
            type: string
      requestBody:
        description: An array of alarm Ids to delete.
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/Id'
        required: false
      responses:
        '204':
          description: Alarm(s) deleted ok.
          content: {}
        '400':
          description: 'invalid input, object invalid'
          content: {}
        '403':
          description: 'Write access is disabled on the server.'
          content: {}
        '401':
          description: Unauthenticated.
          content: {}
        '409':
          description: >-
            An existing item already exists and cannot be modified. Check the
            publicationId is valid for the alarms you are attempting to delete.
          content: {}
      x-swagger-router-controller: Default
      x-codegen-request-body-name: alarms
  /publishers:
    put:
      summary: |
        Creates an alarm publisher. 
      description: >
        A publisher is a resource which identifies anyone creating alarms within
        the GV Orbit Monitoring system using this API. When a publisher is
        created this allows the publisher to publish alarms. The client must
        ensure the id sent in creating the publisher matches the 'origin' field
        of the CDMA alarms. This is validated by the server before the alarms
        are added to the monitoring system.

        It is up to the client to choose a publication Id (origin) value. A guid
        is a sensible choice. If an existing ID is already present in the system, 
        the name is compared and if it differs, the system will return an error. 
        If the name matches it will return 201. 

        The server prevents alarm updates unless the alarm being updated has the
        same publication id as the new update.

        Finally, the server keeps track of publication ids for usage in order to
        detect dead clients. Clients have a responsibilty for keeping
        publications alive, either by publishing a change or calling the
        keepalive endpoint. After {60} seconds, of having not seen a publication
        id, the server will remove the alarms it created and mark any devices as
        "Unit Lost".   

      operationId: createPublisher
      requestBody:
        description: >
          Two fields which uniquely idenfity this publisher. The origin should
          be a GUID, and the name is just some opaque information that is used
          as a secondary verification to the GUID.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Publication'
        required: false
      responses:
        '201':
          description: The publication was created.
          content: {}
        '403':
          description: 'Write access is disabled on the server.'
          content: {}
        '400':
          description: Bad request - missing body.
          content:
            application/json:
              schema:
                type: string
                example: >-
                  The request was missing the publication information from the
                  body.
        '401':
          description: Unauthenticated.
          content: {}
      x-swagger-router-controller: Default
      x-codegen-request-body-name: publication
    get:
      summary: Informs the server that this publisher is still valid.
      description: >
        Keeps the publication id alive on the server and returns status
        information regarding its validity to the client. This acts as a
        keep-alive for alarms created with a given publication id. Alarms are
        also kept alive by any alarm updates with that publication id.  
      operationId: getPublisher
      parameters:
        - name: publicationId
          in: query
          description: The publication id obtained when the publisher was created.
          required: true
          schema:
            type: string
      responses:
        '200':
          description: The publication id is valid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Publication'
        '401':
          description: Unauthenticated.
          content: {}
        '404':
          description: The subscription id was not found/invalid.
          content: {}
      x-swagger-router-controller: Default
    delete:
      summary: Deletes an alarm publisher.
      description: >
        Removes a publication from the server and delete all alarms created with
        that publication id.  
      operationId: deletePublisher
      parameters:
        - name: publicationId
          in: query
          description: The publication id of the publisher to delete
          required: true
          schema:
            type: string
      responses:
        '204':
          description: The publication was deleted successfully.
          content: {}
        '403':
          description: 'Write access is disabled on the server.'
          content: {}
        '404':
          description: The publication was not found.
          content: {}
      x-swagger-router-controller: Default
  /subscribers:
    put:
      summary: |
        Creates a subscription for events. 
      description: >
        Creates a subscription for alarm events. This endpoint returns a session
        id which can then be used to request changes.

        This operation returns a subscription id (a 64 character GUID) which
        should be used in subsequent subscription operations, such as pull,
        delete or verify.
      operationId: createSubscriber
      requestBody:
        description: >
          An array of device ids (paths) for which the client is interested. 
          If this array is empty, the subscriber will be delivered everything.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Subscription'
        required: false
      responses:
        '200':
          description: A subscription id. This should be used in subsequent requests.
          content:
            application/json:
              schema:
                type: string
                format: uuid
                example: 7ce05a50-e8ec-4c1d-adfe-4677f8d22965
      x-swagger-router-controller: Default
      x-codegen-request-body-name: subscription
    get:
      summary: Tests a subscription id for validity.
      description: >
        Given a subscription id, returns http 200 if this is valid, http 404
        otherwise. This may be used by the client to periodically detect whether
        a subscription has been lost (i.e. automatically deleted), or server
        restarted. If this occurs, the subscription will need to be re-created
        by the client.
      operationId: getSubscriber
      parameters:
        - name: subscriptionId
          in: query
          description: The subscription id obtained from the call to subscribe.
          required: true
          schema:
            type: string
      responses:
        '200':
          description: The subscription id is valid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Subscription'
        '401':
          description: Unauthenticated.
          content: {}
        '404':
          description: The subscription id was not found/invalid.
          content: {}
      x-swagger-router-controller: Default
    delete:
      summary: Deletes a subscriber.
      description: >
        Removes a subscription for alarm events. The server will no longer track
        changes for this subscription id. 
      operationId: deleteSubscriber
      parameters:
        - name: subscriptionId
          in: query
          description: The subscription id of the subscriber to delete
          required: true
          schema:
            type: string
      responses:
        '204':
          description: The subscription was deleted successfully.
        '401':
          description: Unauthenticated.
          content: {}
        '403':
          description: 'Write access is disabled on the server.'
          content: {}
        '404':
          description: The subscription id was not found.
          content: {}
      x-swagger-router-controller: Default
  /alarms/changes:
    get:
      summary: Gets all alarm changes for a subscription since the last poll.
      description: >

        Given a subscription id, returns a list of all the alarm changes.
        Additions, deletions and update, in order, since the last request. 

        The server will keep track of all changes for each
        subscription, so will only deliver changes that the client has not
        seen before. 

        Likewise, if the client is not polling (perhaps processing
        items) the server will track changes and deliver them immediately on the
        next call to poll.

        This method uses long polling technique and will block for up to 30 seconds if there is no data after which it will return http 201. 

        The client should then immediately re-connect for further updates. 

        Note: An alternative to long polling which may be more responsive is to
        configure a push notification url where the server will send changes. 
      operationId: getAlarmChanges
      parameters:
        - name: subscriptionId
          in: query
          description: The subscription id obtained from the call to subscribe.
          required: true
          schema:
            type: string
      responses:
        '200':
          description: An array of alarm objects with a snapshot of the current alarms.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Events'
        '204':
          description: >-
            No events occurred during this poll. No data. Client may continue to
            poll for new data.
          content: {}
        '401':
          description: Unauthenticated.
          content: {}
        '404':
          description: The subscription id was not found.
          content: {}
      x-swagger-router-controller: Default
components:
  schemas:
    Id:
      required:
        - name
        - path
      type: object
      properties:
        path:
          type: string
          description: >
            Unique identifier for the device containing an alarm. For IQ devices
            this will be a RollCall address. For Densite alarms this will be a
            virtual Linux style folder path. Third-parties may use with either
            approach. The path is used to group multiple alarms under a common
            folder and is used within Orbit to show items in the network tree.
          example: '11704080'
        name:
          type: string
          description: |
            The name of the alarm. 
            Note: The path + the name forms a unique key for the alarm.
          example: POWER_USAGE
      description: The unique identifier for an alarm
      example:
        path: '11704080'
        name: POWER_USAGE
    Filter:
      required:
        - path
      type: object
      properties:
        path:
          type: string
          description: >
            Unique identifier for the device containing an alarm. For IQ devices
            this will be a RollCall address. For Densite alarms this will be a
            virtual Linux style folder path. Third-parties may use with either
            approach. The path is used to group multiple alarms under a common
            folder and is used within Orbit to show items in the network tree.
          example: '11704080'
      description: The unique identifier for a device
      example:
        path: '11704080'
        name: POWER_USAGE
    Alarm:
      required:
        - id
        - state
      type: object
      properties:
        id:
          $ref: '#/components/schemas/Id'
        origin:
          type: string
          description: >
            Used as a parent identifier for an alarm. Physical alarms take the
            serial number of the originating device. Virtual alarms would not
            use this field. 
          example: S00000102
        state:
          $ref: '#/components/schemas/State'
      description: >
        The alarm object provides the state of an alarm within the monitoring
        system. Alarms are contained within devices (sometimes called units)
        which may be virtual, or may represent physical equipment. Alarms can be
        used for indicating errors, but also for logging information about
        equipment. Virtual alarms may be derived from other alarms.
      example:
        origin: S00000102
        id:
          path: '11704080'
          name: POWER_USAGE
        state:
          acked: false
          ackedBy: ''
          unmaskedState: ok
          ackedTimestamp: ''
          state: ok
          masked: false
          latchedState: ok
          value: 84.5 LU
          inverted: false
          timestamp: 2020-01-28T09:12:33.001Z
    State:
      required:
        - state
        - timestamp
      type: object
      properties:
        state:
          type: string
          enum: ["nostate", "ok", "warn", "caution", "fail", "text"]
          description: >
            The current state of the alarm. 

            Valid values are: "nostate", "ok", "warn", "caution", "fail" where
            fail  is the most severe.
          example: ok
        latchedState:
          type: string
          description: >
            The worst state that this alarm has been in since a user has reset
            latches. This allows glitches to be detected where an alarm briefly
            errors before going green again.
          example: ok
        unmaskedState:
          type: string
          description: >
            The current unmasked state of the alarm. If an alarm is masked, its
            state is suppressed and the state field will go to "nostate". This
            field will capture what the state would be, if the mask was not
            applied.
          example: ok
        timestamp:
          type: string
          description: The timestamp when the alarm occurred.
          format: date-time
          example: 2020-01-28T09:12:33.001Z
        value:
          type: string
          description: The value (or text) content of the alarm.
          example: 84.5 LU
        masked:
          type: boolean
          description: >
            This flag indicates that the alarm is masked and therefore the alarm
            state is suppressed. 
          example: false
        inverted:
          type: boolean
          description: >
            This flag indicates that the alarm is inverted. When an alarm is
            inverted, ok is as fail and warn, caution and ffail states are shown
            as ok.
          example: false
        acked:
          type: boolean
          description: |
            True if the alarm has been acknowleged by a user.
          example: false
        ackedTimestamp:
          type: string
          description: The timestamp when the alarm was acknowleged.
          format: date-time
        ackedBy:
          type: string
          description: The name of the user (or host machine) who acknowleged the alarm.
          example: ''
      description: |
        Captures the current state of an alarm.
      example:
        acked: false
        ackedBy: ''
        unmaskedState: ok
        ackedTimestamp: ''
        state: ok
        masked: false
        latchedState: ok
        value: 84.5 LU
        inverted: false
        timestamp: 2020-01-28T09:12:33.001Z
    Events:
      type: object
      properties:
        items:
          type: array
          description: |
            Provides a list of event items.
          items:
            $ref: '#/components/schemas/EventItem'
      description: >
        The events object is used when subscribing to alarm notifications. This
        object list of all the events items occurring since the last read or
        push. This allows multiple events to be gathered together into a single
        packet.
      example:
        items:
          - update:
              origin: S00000102
              id:
                path: '11704080'
                name: POWER_USAGE
              state:
                acked: false
                ackedBy: ''
                unmaskedState: ok
                ackedTimestamp: ''
                state: ok
                masked: false
                latchedState: ok
                value: 84.5 LU
                inverted: false
                timestamp: 2020-01-28T09:12:33.001Z
            delete:
              id:
                path: '11704080'
                name: POWER_USAGE
          - update:
              origin: S00000102
              id:
                path: '11704080'
                name: POWER_USAGE
              state:
                acked: false
                ackedBy: ''
                unmaskedState: ok
                ackedTimestamp: ''
                state: ok
                masked: false
                latchedState: ok
                value: 84.5 LU
                inverted: false
                timestamp: 2020-01-28T09:12:33.001Z
            delete:
              id: 
                path: '11704080'
                name: POWER_USAGE
    EventItem:
      type: object
      properties:
        update:
          $ref: '#/components/schemas/Alarm'
        delete:
          required:
            - id
          type: object
          properties: 
            id:
              $ref: '#/components/schemas/Id'
      description: >
        Wraps either an alarm or an alarm id depending on whether this is an
        update or delete event. Event Items will be delivered in the order they
        occur within the system.
      example:
        update:
          origin: S00000102
          id:
            path: '11704080'
            name: POWER_USAGE
          state:
            acked: false
            ackedBy: ''
            unmaskedState: ok
            ackedTimestamp: ''
            state: ok
            masked: false
            latchedState: ok
            value: 84.5 LU
            inverted: false
            timestamp: 2020-01-28T09:12:33.001Z
        delete:
          id:
            path: '11704080'
            name: POWER_USAGE
    Subscription:
      required:
        - type
      type: object
      properties:
        type:
          type: string
          description: >-
            May be "push" or "pull" depending on how the client would like to
            recieve notifications.
          example: push
        url:
          type: string
          description: >
            The call-back url where the server should send events. This is used
            when type is set to "push" and not required for "pull", in which
            case the client is responsible for pulling changes via the
            notifications/pull endpoint. The data sent to this url will be an
            Events object, which then contains a list of Event Items. 
          example: 'http://192.168.15.2/my_app/alarm_handler'
        filter:
          type: array
          description: >
            An array of alarms to be used as a filter by the server when delivering
            changes to the client. An empty array will deliver everything.
          items:
            $ref: '#/components/schemas/Filter'
      description: |
        Provides details about a new subscription. 
      example:
        filter:
          - path: 'A000:01:02'
          - path: 'A000:02:03'
        type: push
        url: 'http://192.168.15.2/my_app/alarm_handler'
    Publication:
      required:
        - name
      type: object
      properties:
        origin:
          type: string
          description: UUID of the publisher
          example: 123e4567-e89b-12d3-a456-426614174000
        name:
          type: string
          description: Some name which identifies the publisher.
          example: Blaze Video Processing
      description: |
        Provides details about a publication. 
      example:
        origin: 123e4567-e89b-12d3-a456-426614174000
        name: Blaze Video Processing
Back to Top