Przeglądaj źródła

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

Victor Vieux 11 lat temu
rodzic
commit
516cf54843
2 zmienionych plików z 23 dodań i 18 usunięć
  1. 3 3
      gograph/gograph.go
  2. 20 15
      server.go

+ 3 - 3
gograph/gograph.go

@@ -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}

+ 20 - 15
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 {
 func (srv *Server) ContainerDestroy(name string, removeVolume, removeLink bool) error {
+	container := srv.runtime.Get(name)
+
 	if removeLink {
 	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)
 		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 {
 		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")
 		}
 		}