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

Reply via email to