prevent default name to be deleted and return an error on invalid link

This commit is contained in:
Victor Vieux 2013-10-25 16:49:49 -07:00
parent 356af1540f
commit 516cf54843
2 changed files with 23 additions and 18 deletions

View File

@ -250,7 +250,7 @@ func (db *Database) Delete(name string) error {
return err 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 err
} }
return nil return nil
@ -306,7 +306,7 @@ func (db *Database) Rename(currentName, newName string) error {
return err 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 { if err != nil {
return err 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 // Return the entity based on the parent path and name
func (db *Database) child(parent *Entity, name string) *Entity { func (db *Database) child(parent *Entity, name string) *Entity {
var id string 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 nil
} }
return &Entity{id} return &Entity{id}

View File

@ -979,34 +979,39 @@ func (srv *Server) ContainerRestart(name string, t int) error {
} }
func (srv *Server) ContainerDestroy(name string, removeVolume, removeLink bool) error { func (srv *Server) ContainerDestroy(name string, removeVolume, removeLink bool) error {
container := srv.runtime.Get(name)
if removeLink { if removeLink {
p := name if container == nil {
if p[0] != '/' { return fmt.Errorf("No such link: %s", name)
p = "/" + p
}
parent, n := path.Split(p)
l := len(parent)
if parent[l-1] == '/' {
parent = parent[:l-1]
} }
name = srv.runtime.getFullName(name)
parent, n := path.Split(name)
pe := srv.runtime.containerGraph.Get(parent) 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 parentContainer != nil && parentContainer.activeLinks != nil {
if link, exists := parentContainer.activeLinks[n]; exists { if link, exists := parentContainer.activeLinks[n]; exists {
link.Disable() link.Disable()
} else { } else {
utils.Debugf("Could not find active link for %s", name) 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 { if err := srv.runtime.containerGraph.Delete(name); err != nil {
return err return err
} }
return nil return nil
} }
if container := srv.runtime.Get(name); container != nil { if container != nil {
if container.State.Running { if container.State.Running {
return fmt.Errorf("Impossible to remove a running container, please stop it first") return fmt.Errorf("Impossible to remove a running container, please stop it first")
} }