diff --git a/gograph/gograph.go b/gograph/gograph.go index 48693d3ec3..caec3bffa2 100644 --- a/gograph/gograph.go +++ b/gograph/gograph.go @@ -250,7 +250,7 @@ func (db *Database) Delete(name string) error { return err } - if _, err := db.conn.Exec("DELETE FROM edge WHERE parent_id = ? AND name LIKE ?;", parent.id, n+"%"); err != nil { + if _, err := db.conn.Exec("DELETE FROM edge WHERE parent_id = ? AND name = ?;", parent.id, n); err != nil { return err } return nil @@ -306,7 +306,7 @@ func (db *Database) Rename(currentName, newName string) error { return err } - rows, err := db.conn.Exec("UPDATE edge SET name = ? WHERE parent_id = ? AND name LIKE ?;", newEdgeName, parent.id, name+"%") + rows, err := db.conn.Exec("UPDATE edge SET name = ? WHERE parent_id = ? AND name = ?;", newEdgeName, parent.id, name) if err != nil { return err } @@ -383,7 +383,7 @@ func (db *Database) children(name string, depth int) <-chan WalkMeta { // Return the entity based on the parent path and name func (db *Database) child(parent *Entity, name string) *Entity { var id string - if err := db.conn.QueryRow("SELECT entity_id FROM edge WHERE parent_id = ? AND name LIKE ?;", parent.id, name+"%").Scan(&id); err != nil { + if err := db.conn.QueryRow("SELECT entity_id FROM edge WHERE parent_id = ? AND name = ?;", parent.id, name).Scan(&id); err != nil { return nil } return &Entity{id} diff --git a/server.go b/server.go index 31b351fcc6..d1bbe1bfe3 100644 --- a/server.go +++ b/server.go @@ -979,34 +979,39 @@ func (srv *Server) ContainerRestart(name string, t int) error { } func (srv *Server) ContainerDestroy(name string, removeVolume, removeLink bool) error { + container := srv.runtime.Get(name) + if removeLink { - p := name - if p[0] != '/' { - p = "/" + p - } - parent, n := path.Split(p) - l := len(parent) - if parent[l-1] == '/' { - parent = parent[:l-1] + if container == nil { + return fmt.Errorf("No such link: %s", name) } + name = srv.runtime.getFullName(name) + + parent, n := path.Split(name) pe := srv.runtime.containerGraph.Get(parent) - parentContainer := srv.runtime.Get(pe.ID()) + if pe != nil { + parentContainer := srv.runtime.Get(pe.ID()) - if parentContainer != nil && parentContainer.activeLinks != nil { - if link, exists := parentContainer.activeLinks[n]; exists { - link.Disable() - } else { - utils.Debugf("Could not find active link for %s", name) + if parentContainer != nil && parentContainer.activeLinks != nil { + if link, exists := parentContainer.activeLinks[n]; exists { + link.Disable() + } else { + utils.Debugf("Could not find active link for %s", name) + } } } + if name[1:] == container.ID { + return fmt.Errorf("Conflict, cannot remove default link %s", name) + } + if err := srv.runtime.containerGraph.Delete(name); err != nil { return err } return nil } - if container := srv.runtime.Get(name); container != nil { + if container != nil { if container.State.Running { return fmt.Errorf("Impossible to remove a running container, please stop it first") }