#%RAML 0.8
baseUri: http://server/api/{version}
title: Kubernetes
version: v1beta1
mediaType: application/json
documentation:
 - title: Overview
   content: |
     The Kubernetes API currently manages 3 main resources: `pods`,
     `replicationControllers`, and `services`. Pods correspond to
     colocated groups of [Docker containers](http://docker.io) with
     shared volumes, as supported by [Google Cloud Platform's
     container-vm
     images](https://developers.google.com/compute/docs/containers).
     Singleton pods can be created directly via the `/pods`
     endpoint. Sets of pods may created, maintained, and scaled using
     replicationControllers.  Services create load-balanced targets
     for sets of pods.

 - title: Resource identifiers
   content: |
     Each resource has a string `id` and list of key-value
     `labels`. The `id` is generated by the system and is guaranteed
     to be unique in space and time across all resources.  `labels`
     is a map of string (key) to string (value). Each resource may
     have at most one label with a particular key. Individual labels
     are used to specify identifying metadata that can be used to
     define sets of resources by specifying required labels. Examples
     of typical pod label keys include `stage`, `service`, `name`,
     `tier`, `partition`, and `track`, but you are free to develop
     your own conventions.

 - title: Creation semantics
   content: |
     Creation is currently not idempotent. We plan to add a
     modification token to each resource. A unique value for the token
     should be provided by the user during creation. If the user
     specifies a duplicate token at creation time, the system should
     return an error with a pointer to the existing resource with that
     token. In this way a user can deterministically recover from a
     dropped connection during a resource creation request.

 - title: Update semantics
   content: |
     Custom verbs are minimized and are used only for 'edge triggered'
     actions such as a reboot. Resource descriptions are generally set
     up with `desiredState` for the user provided parameters and
     `currentState` for the actual system state. While consistent
     terminology is used across these two stanzas they do not match
     member for member.

     When a new version of a resource is PUT the `desiredState` is
     updated and available immediately. Over time the system will work
     to bring the `currentState` into line with the `desiredState`. The
     system will drive toward the most recent `desiredState` regardless
     of previous versions of that stanza. In other words, if a value
     is changed from 2 to 5 in one PUT and then back down to 3 in
     another PUT the system isn't required to 'touch base' at 5 before
     making 3 the `currentState`.

     When doing an update, we assume that the entire `desiredState`
     stanza is specified. If a field is omitted it is assumed that the
     user is looking to delete that field. It is viable for a user to
     GET the resource, modify what they like in the `desiredState` or
     labels stanzas and then PUT it back. If the `currentState` is
     included in the PUT it will be silently ignored.

     While currently unspecified, it is intended that concurrent
     modification should be accomplished with optimistic locking of
     resources. We plan to add a modification token to each resource. If
     this is included with the PUT operation the system will verify
     that there haven't been other successful mutations to the
     resource during a read/modify/write cycle. The correct client
     action at this point is to GET the resource again, apply the
     changes afresh and try submitting again.

     Note that updates currently only work for replicationControllers
     and services, but not for pods. Label updates have not yet been
     implemented, either.

/pods:
  get:
    description: List all pods on this cluster
    responses:
      200:
        body:
          example: !include examples/pod-list.json
  post:
    description: Create a new pod. currentState is ignored if present.
    body:
      schema: !include doc/pod-schema.json
      example: !include examples/pod.json
  
  /{podId}:
    get:
      description: Get a specific pod
      responses:
        200:
          body:
            example: !include examples/pod.json
    put:
      description: Update a pod
      body:
        schema: !include doc/pod-schema.json
        example: !include examples/pod.json
    delete:
      description: Delete a specific pod
      responses:
        200:
          body:
            example: |
              { 
                "success": true
              }

/replicationControllers:
  get:
    description: List all replicationControllers on this cluster
    responses:
      200:
        body:
          example: !include examples/controller-list.json
  post:
    description: Create a new controller. currentState is ignored if present.
    body:
      schema: !include doc/controller-schema.json
      example: !include examples/controller.json
  
  /{controllerId}:
    get:
      description: Get a specific controller
      responses:
        200:
          body:
            example: !include examples/controller.json
    put:
      description: Update a controller
      body:
        schema: !include doc/controller-schema.json
        example: !include examples/controller.json
    delete:
      description: Delete a specific controller
      responses:
        200:
          body:
            example: |
              { 
                "success": true
              }

/services:
  get:
    description: List all services on this cluster
    responses:
      200:
        body:
          example: !include examples/service-list.json
  post:
    description: Create a new service
    body:
      schema: !include doc/service-schema.json
      example: !include examples/service.json
  
  /{serviceId}:
    get:
      description: Get a specific service
      responses:
        200:
          body:
            example: !include examples/service.json
    put:
      description: Update a service
      body:
        schema: !include doc/service-schema.json
        example: !include examples/service.json
    delete:
      description: Delete a specific service
      responses:
        200:
          body:
            example: |
              { 
                "success": true
              }

