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  }