github.com/ghodss/etcd@v0.3.1-0.20140417172404-cc329bfa55cb/mod/lock/v2/release_handler.go (about) 1 package v2 2 3 import ( 4 "net/http" 5 "path" 6 7 etcdErr "github.com/coreos/etcd/error" 8 "github.com/coreos/etcd/third_party/github.com/gorilla/mux" 9 ) 10 11 // releaseLockHandler deletes the lock. 12 func (h *handler) releaseLockHandler(w http.ResponseWriter, req *http.Request) error { 13 h.client.SyncCluster() 14 15 vars := mux.Vars(req) 16 keypath := path.Join(prefix, vars["key"]) 17 18 // Read index and value parameters. 19 index := req.FormValue("index") 20 value := req.FormValue("value") 21 if len(index) == 0 && len(value) == 0 { 22 return etcdErr.NewError(etcdErr.EcodeIndexOrValueRequired, "Release", 0) 23 } else if len(index) != 0 && len(value) != 0 { 24 return etcdErr.NewError(etcdErr.EcodeIndexValueMutex, "Release", 0) 25 } 26 27 // Look up index by value if index is missing. 28 if len(index) == 0 { 29 resp, err := h.client.Get(keypath, true, true) 30 if err != nil { 31 return err 32 } 33 nodes := lockNodes{resp.Node.Nodes} 34 node, _ := nodes.FindByValue(value) 35 if node == nil { 36 return etcdErr.NewError(etcdErr.EcodeKeyNotFound, "Release", 0) 37 } 38 index = path.Base(node.Key) 39 } 40 41 // Delete the lock. 42 if _, err := h.client.Delete(path.Join(keypath, index), false); err != nil { 43 return err 44 } 45 46 return nil 47 }