added docs and moved to api version 1.2

This commit is contained in:
Victor Vieux 2013-06-03 12:09:16 +00:00
Родитель 62c78696cd
Коммит 3dd1e4d58c
3 изменённых файлов: 102 добавлений и 17 удалений

75
api.go
Просмотреть файл

@ -13,7 +13,7 @@ import (
"strings"
)
const API_VERSION = 1.1
const API_VERSION = 1.2
func hijackServer(w http.ResponseWriter) (io.ReadCloser, io.Writer, error) {
conn, _, err := w.(http.Hijacker).Hijack()
@ -68,15 +68,55 @@ func getBoolParam(value string) (bool, error) {
return false, fmt.Errorf("Bad parameter")
}
func postAuth(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
authConfig := &auth.AuthConfig{}
if err := json.NewDecoder(r.Body).Decode(authConfig); err != nil {
return err
func getAuth(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
if version > 1.1 {
w.WriteHeader(http.StatusNotFound)
return nil
}
status, err := auth.Login(authConfig)
authConfig, err := auth.LoadConfig(srv.runtime.root)
if err != nil {
if err != auth.ErrConfigFileMissing {
return err
}
authConfig = &auth.AuthConfig{}
}
b, err := json.Marshal(&auth.AuthConfig{Username: authConfig.Username, Email: authConfig.Email})
if err != nil {
return err
}
writeJson(w, b)
return nil
}
func postAuth(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
authConfig := &auth.AuthConfig{}
err := json.NewDecoder(r.Body).Decode(authConfig)
if err != nil {
return err
}
status := ""
if version > 1.1 {
status, err = auth.Login(authConfig, false)
if err != nil {
return err
}
} else {
localAuthConfig, err := auth.LoadConfig(srv.runtime.root)
if err != nil {
if err != auth.ErrConfigFileMissing {
return err
}
}
if authConfig.Username == localAuthConfig.Username {
authConfig.Password = localAuthConfig.Password
}
newAuthConfig := auth.NewAuthConfig(authConfig.Username, authConfig.Password, authConfig.Email, srv.runtime.root)
status, err = auth.Login(newAuthConfig, true)
if err != nil {
return err
}
}
if status != "" {
b, err := json.Marshal(&ApiAuth{Status: status})
if err != nil {
@ -288,7 +328,15 @@ func postImagesCreate(srv *Server, version float64, w http.ResponseWriter, r *ht
if image != "" { //pull
registry := r.Form.Get("registry")
authConfig := &auth.AuthConfig{}
json.NewDecoder(r.Body).Decode(authConfig)
if version > 1.1 {
json.NewDecoder(r.Body).Decode(authConfig)
} else {
localAuthConfig, err := auth.LoadConfig(srv.runtime.root)
if err != nil && err != auth.ErrConfigFileMissing {
return err
}
authConfig = localAuthConfig
}
if err := srv.ImagePull(image, tag, registry, w, sf, authConfig); err != nil {
if sf.Used() {
w.Write(sf.FormatError(err))
@ -358,8 +406,16 @@ func postImagesInsert(srv *Server, version float64, w http.ResponseWriter, r *ht
func postImagesPush(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
authConfig := &auth.AuthConfig{}
if err := json.NewDecoder(r.Body).Decode(authConfig); err != nil {
return err
if version > 1.1 {
if err := json.NewDecoder(r.Body).Decode(authConfig); err != nil {
return err
}
} else {
localAuthConfig, err := auth.LoadConfig(srv.runtime.root)
if err != nil && err != auth.ErrConfigFileMissing {
return err
}
authConfig = localAuthConfig
}
if err := parseForm(r); err != nil {
return err
@ -682,6 +738,7 @@ func ListenAndServe(addr string, srv *Server, logging bool) error {
m := map[string]map[string]func(*Server, float64, http.ResponseWriter, *http.Request, map[string]string) error{
"GET": {
"/auth": getAuth,
"/version": getVersion,
"/info": getInfo,
"/images/json": getImagesJson,

Просмотреть файл

@ -120,7 +120,8 @@ func SaveConfig(authConfig *AuthConfig) error {
}
// try to register/login to the registry server
func Login(authConfig *AuthConfig) (string, error) {
func Login(authConfig *AuthConfig, store bool) (string, error) {
storeConfig := false
client := &http.Client{}
reqStatusCode := 0
var status string
@ -146,6 +147,7 @@ func Login(authConfig *AuthConfig) (string, error) {
if reqStatusCode == 201 {
status = "Account created. Please use the confirmation link we sent" +
" to your e-mail to activate it.\n"
storeConfig = true
} else if reqStatusCode == 403 {
return "", fmt.Errorf("Login: Your account hasn't been activated. " +
"Please check your e-mail for a confirmation link.")
@ -164,7 +166,13 @@ func Login(authConfig *AuthConfig) (string, error) {
}
if resp.StatusCode == 200 {
status = "Login Succeeded\n"
storeConfig = true
} else if resp.StatusCode == 401 {
if store {
if err := SaveConfig(authConfig); err != nil {
return "", err
}
}
return "", fmt.Errorf("Wrong login/password, please try again")
} else {
return "", fmt.Errorf("Login: %s (Code: %d; Headers: %s)", body,
@ -176,5 +184,10 @@ func Login(authConfig *AuthConfig) (string, error) {
} else {
return "", fmt.Errorf("Unexpected status code [%d] : %s", reqStatusCode, reqBody)
}
if storeConfig && store {
if err := SaveConfig(authConfig); err != nil {
return "", err
}
}
return status, nil
}

Просмотреть файл

@ -14,12 +14,13 @@ Docker Remote API
- The Remote API is replacing rcli
- Default port in the docker deamon is 4243
- The API tends to be REST, but for some complex commands, like attach or pull, the HTTP connection is hijacked to transport stdout stdin and stderr
- Since API version 1.2, the auth configuration is now handled client side, so the client has to send the authConfig as POST in /images/create and /images/<name>/pull
2. Version
==========
The current verson of the API is 1.1
Calling /images/<name>/insert is the same as calling /v1.1/images/<name>/insert
The current verson of the API is 1.2
Calling /images/<name>/insert is the same as calling /v1.2/images/<name>/insert
You can still call an old version of the api using /v1.0/images/<name>/insert
3. Endpoints
@ -550,12 +551,19 @@ Create an image
Create an image, either by pull it from the registry or by importing it
**Example request**:
**Example request v1.0**:
.. sourcecode:: http
POST /images/create?fromImage=base HTTP/1.1
**Example request v1.2**:
.. sourcecode:: http
POST /images/create?fromImage=base HTTP/1.1
{{ authConfig }}
**Example response v1.1**:
.. sourcecode:: http
@ -720,12 +728,19 @@ Push an image on the registry
Push the image ``name`` on the registry
**Example request**:
**Example request v1.0**:
.. sourcecode:: http
POST /images/test/push HTTP/1.1
**Example request v1.2**:
.. sourcecode:: http
POST /images/test/push HTTP/1.1
{{ authConfig }}
**Example response v1.1**:
.. sourcecode:: http
@ -875,7 +890,7 @@ Build an image from Dockerfile via stdin
:statuscode 500: server error
Get default username and email
Get default username and email <deprecated with 1.2>
******************************
.. http:get:: /auth
@ -904,8 +919,8 @@ Get default username and email
:statuscode 500: server error
Set auth configuration
**********************
Check auth configuration (and store if if api < 1.2)
****************************************************
.. http:post:: /auth