The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/2350
This e-mail was sent by the LXC bot, direct replies will not reach the author unless they happen to be subscribed to this list. === Description (from pull-request) ===
From 16f8e3e2b45f14260ae85d3787cdaf5b41244291 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Wed, 7 Sep 2016 17:15:48 -0400 Subject: [PATCH 1/2] doc: Spacing cleanup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- doc/rest-api.md | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/doc/rest-api.md b/doc/rest-api.md index b92dc09..4e0752e 100644 --- a/doc/rest-api.md +++ b/doc/rest-api.md @@ -135,7 +135,6 @@ Code | Meaning 400 | Failure 401 | Cancelled - # Recursion To optimize queries of large lists, recursion is implemented for collections. A "recursion" argument can be passed to a GET query against a collection. @@ -460,7 +459,6 @@ Input (using a public remote image): "alias": "ubuntu/devel"}, # Name of the alias } - Input (using a private remote image after having obtained a secret for that image): { @@ -519,7 +517,6 @@ Input (using a local container): "source": "my-old-container"} # Name of the source container } - ## /1.0/containers/\<name\> ### GET * Description: Container information @@ -571,7 +568,6 @@ Output: "status_code": 103 } - ### PUT (ETag supported) * Description: replaces container configuration or restore snapshot * Authentication: trusted @@ -599,7 +595,6 @@ Input (update container configuration): ] } - Takes the same structure as that returned by GET but doesn't allow name changes (see POST below) or changes to the status sub-dict (since that's read-only). @@ -630,7 +625,6 @@ Input: "ephemeral": true } - ### POST * Description: used to rename/migrate the container * Authentication: trusted @@ -824,7 +818,6 @@ Output: } } - ### PUT * Description: change the container state * Authentication: trusted @@ -1046,7 +1039,6 @@ Return (with wait-for-websocket=true and interactive=true): } } - When the exec command finishes, its exit status is available from the operation's metadata: @@ -1124,7 +1116,6 @@ This never returns. Each notification is sent as a separate JSON dict: } } - ## /1.0/images ### GET * Description: list of images (public or private) @@ -1209,7 +1200,6 @@ In the remote image URL case, the following dict must be used: } } - After the input is received by LXD, a background operation is started which will add the image to the store and possibly do some backend filesystem-specific optimizations. @@ -1318,7 +1308,6 @@ client will POST to /1.0/images/\<fingerprint\>/export to get a secret token which it'll then pass to the target LXD. That target LXD will then GET the image as a guest, passing the secret token. - ## /1.0/images/\<fingerprint\>/secret ### POST * Description: Generate a random token and tell LXD to expect it be used by a guest @@ -1413,7 +1402,6 @@ Input: "description": "New description" } - ### POST * Description: rename an alias * Authentication: trusted @@ -1557,7 +1545,6 @@ Return: "/1.0/profiles/default" ] - ### POST * Description: define a new profile * Authentication: trusted @@ -1660,13 +1647,11 @@ Input (rename a profile): "name": "new-name" } - HTTP return value must be 204 (No content) and Location must point to the renamed resource. Renaming to an existing name must return the 409 (Conflict) HTTP code. - ### DELETE * Description: remove a profile * Authentication: trusted From 06d8fec90b5028148f70ddd1addb82586dd4f016 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Wed, 7 Sep 2016 17:20:08 -0400 Subject: [PATCH 2/2] Consistently handle name conflicts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit All of those were documented as returning a 409 and clearly weren't :) Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- lxd/container_post.go | 6 ++++++ lxd/container_snapshot.go | 14 +++++++++++--- lxd/images.go | 6 ++++++ lxd/profiles.go | 6 ++++++ 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/lxd/container_post.go b/lxd/container_post.go index 58ebf07..5603f29 100644 --- a/lxd/container_post.go +++ b/lxd/container_post.go @@ -47,6 +47,12 @@ func containerPost(d *Daemon, r *http.Request) Response { return OperationResponse(op) } + // Check that the name isn't already in use + id, _ := dbContainerId(d.db, body.Name) + if id != 0 { + return Conflict + } + run := func(*operation) error { return c.Rename(body.Name) } diff --git a/lxd/container_snapshot.go b/lxd/container_snapshot.go index 7d5e409..0bcea8b 100644 --- a/lxd/container_snapshot.go +++ b/lxd/container_snapshot.go @@ -174,7 +174,7 @@ func snapshotHandler(d *Daemon, r *http.Request) Response { case "GET": return snapshotGet(sc, snapshotName) case "POST": - return snapshotPost(r, sc, containerName) + return snapshotPost(d, r, sc, containerName) case "DELETE": return snapshotDelete(sc, snapshotName) default: @@ -191,7 +191,7 @@ func snapshotGet(sc container, name string) Response { return SyncResponse(true, render.(*shared.SnapshotInfo)) } -func snapshotPost(r *http.Request, sc container, containerName string) Response { +func snapshotPost(d *Daemon, r *http.Request, sc container, containerName string) Response { raw := shared.Jmap{} if err := json.NewDecoder(r.Body).Decode(&raw); err != nil { return BadRequest(err) @@ -220,8 +220,16 @@ func snapshotPost(r *http.Request, sc container, containerName string) Response return BadRequest(err) } + fullName := containerName + shared.SnapshotDelimiter + newName + + // Check that the name isn't already in use + id, _ := dbContainerId(d.db, fullName) + if id != 0 { + return Conflict + } + rename := func(op *operation) error { - return sc.Rename(containerName + shared.SnapshotDelimiter + newName) + return sc.Rename(fullName) } resources := map[string][]string{} diff --git a/lxd/images.go b/lxd/images.go index 5600936..dba16ca 100644 --- a/lxd/images.go +++ b/lxd/images.go @@ -1343,6 +1343,12 @@ func aliasPost(d *Daemon, r *http.Request) Response { return BadRequest(err) } + // Check that the name isn't already in use + id, _, _ := dbImageAliasGet(d.db, req.Name, true) + if id != 0 { + return Conflict + } + id, _, err := dbImageAliasGet(d.db, name, true) if err != nil { return SmartError(err) diff --git a/lxd/profiles.go b/lxd/profiles.go index 8daca31..2e95915 100644 --- a/lxd/profiles.go +++ b/lxd/profiles.go @@ -339,6 +339,12 @@ func profilePost(d *Daemon, r *http.Request) Response { return BadRequest(fmt.Errorf("No name provided")) } + // Check that the name isn't already in use + id, _, _ := dbProfileGet(d.db, req.Name) + if id != 0 { + return Conflict + } + if strings.Contains(req.Name, "/") { return BadRequest(fmt.Errorf("Profile names may not contain slashes")) }
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel