openapi: 3.0.3
info:
  title: Perimeter Resolver API
  description: |
    <a href="/openapi/wcg/perimeter-resolver-openapi.yaml" target="_blank" download="perimeter-resolver-openapi.yaml"><button>Download OpenAPI Specification</button></a>

    A **Perimeter Resolver** is a microservice responsible to supply resources to the Witboost Computational Governance. 

    When a policy or metric is being run from Witboost, the Perimeter Resolver gets invoked to get a list of resources of the policy/metric declared resource type together with additional filters.

    Perimeter Resolver fetches resources for which is responsible to from an underlying storage or catalog. The resources are filtered based on the environment and the resource type.

    # Register a Perimeter Resolver

    Once you develop a microservice that implements the Perimeter Resolver API, you can register it with the Witboost Computational Governance API. 
    The registration process requires an HTTP call to this [API](/api/#tag/GovernancePlatform/operation/upsertResourceType).
  version: "0.3.0"
tags:
  - name: PerimeterResolver
paths:
  /v2/resources:
    get:
      tags:
        - PerimeterResolver
      summary: Retrieve resources to be evaluated by policies or metrics defined in Witboost Computational Governance
      operationId: getResources
      parameters:
        - name: environment
          in: query
          description: Environment where to look for resources
          required: true
          schema:
            type: string
            example: development
        - name: resource-types
          in: query
          required: false
          description: Comma-separated list of resource types to filter on. Ignored if the perimeter resolver doesn't provide more than one resource type
          example: type1,type2,type3
          schema:
            type: string
            example: system
        - name: id
          in: query
          description: A resource id to retrieve
          required: false
          schema:
            type: string
            example: rf2e-3f2f-3f2f-3f2f
        - name: offset
          in: query
          description: Number of resources to skip before retrieving data. Used for pagination.
          required: false
          schema:
            type: integer
            default: 0
            example: 0
        - name: limit
          in: query
          description: Maximum number of resources to retrieve. Used for pagination.
          required: false
          schema:
            type: integer
            default: 5
            maximum: 50
            example: 5
      responses:
        200:
          description: Resource(s) found under the given environment and resource type(s)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PerimeterResolverResourcesResponse'
              examples:
                resources:
                  value:
                    resources:
                      - id: "system-my-namespace-my-system"
                        displayName: "My System"
                        version: "1.0.0"
                        content: |
                          apiVersion: v1
                          kind: System
                          metadata:
                            name: my-system
                            namespace: my-namespace
                            labels:
                              app: my-app
                          spec:
                            owner: team-a
                            description: Core backend system
                      - id: "system-my-namespace-my-system-2"
                        displayName: "My System 2"
                        version: "2.1.3"
                        content: |
                          apiVersion: v1
                          kind: System
                          metadata:
                            name: my-system-2
                            namespace: my-namespace
                            labels:
                              app: my-app-2
                          spec:
                            owner: team-b
                            description: Payments processing system
                      - id: "system-my-namespace-my-system-3"
                        displayName: "My System 3"
                        version: "3"
                        content: |
                          apiVersion: v1
                          kind: System
                          metadata:
                            name: my-system-3
                            namespace: my-namespace
                            labels:
                              app: my-app-3
                          spec:
                            owner: team-c
                            description: Analytics pipeline
                    page:
                      offset: 0
                      limit: 5
                      count: 3
        404:
          description: No resources found
        400:
          description: Invalid Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                invalidRequest:
                  value:
                    error: "Invalid request. The resource type 'system' is not supported."
        500:
          description: Internal Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                internalError:
                  value:
                    error: "Internal error. Please try again later."
  /v1/resolve:
    get:
      tags:
        - PerimeterResolver
      summary: Retrieve resources
      operationId: resolve
      parameters:
        - name: environment
          in: query
          description: Environment where to look for resources
          required: true
          schema:
            type: string
            example: development
        - name: resource-types
          in: query
          required: false
          description: Comma-separated list of resource types to filter on. Ignored if the perimeter resolver doesn't provide more than one resource type
          example: type1,type2,type3
          schema:
            type: string
            example: system
        - name: id
          in: query
          description: A resource id to retrieve
          required: false
          schema:
            type: string
            example: rf2e-3f2f-3f2f-3f2f
        - name: offset
          in: query
          description: Number of resources to skip before retrieving data. Used for pagination.
          required: false
          schema:
            type: integer
            default: 0
            example: 0
        - name: limit
          in: query
          description: Maximum number of resources to retrieve. Used for pagination.
          required: false
          schema:
            type: integer
            default: 5
            maximum: 50
            example: 5
      responses:
        200:
          description: Resource(s) found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PerimeterResource'
              examples:
                resources:
                  value:
                    content:
                      - "apiVersion: v1\nkind: System\nmetadata:\n  name: my-system\n  namespace: my-namespace\n  labels:\n    app: my-app"
                      - "apiVersion: v1\nkind: System\nmetadata:\n  name: my-system-2\n  namespace: my-namespace\n  labels:\n    app: my-app"
                      - "apiVersion: v1\nkind: System\nmetadata:\n  name: my-system-3\n  namespace: my-namespace\n  labels:\n    app: my-app"
                    page:
                      offset: 0
                      limit: 5
                      count: 3
        404:
          description: No resources found
        400:
          description: Invalid Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                invalidRequest:
                  value:
                    error: "Invalid request. The resource type 'system' is not supported."
        500:
          description: Internal Error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
              examples:
                internalError:
                  value:
                    error: "Internal error. Please try again later."
components:
  schemas:
    PerimeterResolverResourcesResponse:
      required:
        - resources
      type: object
      properties:
        resources:
          type: array
          description: List of resources found
          items:
            type: object
            $ref: "#/components/schemas/PerimeterResolverResourceResponse"
        page:
          $ref: "#/components/schemas/PaginationModel"
    PerimeterResolverResourceResponse:
      required:
        - id
        - content
      type: object
      properties:
        id:
          type: string
          minLength: 1
          description: Unique identifier of the resource
          example: my-k8s-configuration-1
        displayName:
          type: string
          minLength: 1
          description: Human friendly name of the resource
          example: My K8s Configuration
        version:
          type: string
          minLength: 1
          description: Version of the resource
          example: 1
        content:
          type: string
          minLength: 1
          description: The YAML content of the resource
          example: "apiVersion: v1\nkind: System\nmetadata:\n  name: my-system\n  namespace: my-namespace\n  labels:\n    app: my-app"

    PerimeterResource:
      required:
        - content
      type: object
      properties:
        content:
          type: array
          description: List of resources found. The resources are always returned as strings i.e. for a JSON object, the string representation is returned.
          items:
            type: string
        page:
          $ref: "#/components/schemas/PaginationModel"
    Error:
      required:
        - error
      type: object
      properties:
        error:
          type: string
    PaginationModel:
      type: object
      description: Pagination information
      required:
        - offset
      properties:
        offset:
          type: integer
          description: Number of resources to skip before retrieving data.
        limit:
          type: integer
          description: Maximum number of resources to retrieve.
        count:
          type: integer
          description: Total number of resources found.
