Initial with working ls and get
This commit is contained in:
commit
a141ddfcb3
40
main.go
Normal file
40
main.go
Normal file
@ -0,0 +1,40 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"github.com/Difrex/zoorest/rest"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var (
|
||||
zk string
|
||||
listen string
|
||||
path string
|
||||
)
|
||||
|
||||
// init ...
|
||||
func init() {
|
||||
flag.StringVar(&zk, "zk", "127.0.0.1:2181", "Zk servers. Comma separated")
|
||||
flag.StringVar(&listen, "listen", "127.0.0.1:8889", "Address to listen")
|
||||
flag.StringVar(&path, "path", "/", "Zk root path")
|
||||
flag.Parse()
|
||||
}
|
||||
|
||||
// main ...
|
||||
func main() {
|
||||
var z rest.Zk
|
||||
hosts := strings.Split(zk, ",")
|
||||
z.Hosts = hosts
|
||||
conn, err := z.InitConnection()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
zoo := rest.ZooNode{
|
||||
path,
|
||||
conn,
|
||||
z,
|
||||
}
|
||||
|
||||
rest.Serve(listen, zoo)
|
||||
}
|
83
rest/api.go
Normal file
83
rest/api.go
Normal file
@ -0,0 +1,83 @@
|
||||
package rest
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"github.com/gorilla/mux"
|
||||
"log"
|
||||
"net/http"
|
||||
"time"
|
||||
)
|
||||
|
||||
// Ls ...
|
||||
type Ls struct {
|
||||
Childrens []string `json:"childrens"`
|
||||
Path string `json:"path"`
|
||||
State string `json:"state"`
|
||||
Error error `json:"error"`
|
||||
}
|
||||
|
||||
// Get ...
|
||||
type Get struct {
|
||||
Path string `json:"path"`
|
||||
State string `json:"state"`
|
||||
Error error `json:"error"`
|
||||
Data []byte `json:"data"`
|
||||
}
|
||||
|
||||
// LS ...
|
||||
func (zk ZooNode) LS(w http.ResponseWriter, r *http.Request) {
|
||||
vars := mux.Vars(r)
|
||||
path := vars["path"]
|
||||
|
||||
ch := make(chan Ls)
|
||||
|
||||
go func() { ch <- zk.GetChildrens(path) }()
|
||||
|
||||
childrens := <-ch
|
||||
|
||||
data, err := json.Marshal(childrens)
|
||||
if err != nil {
|
||||
w.WriteHeader(500)
|
||||
}
|
||||
w.WriteHeader(200)
|
||||
w.Write(data)
|
||||
}
|
||||
|
||||
// GET ...
|
||||
func (zk ZooNode) GET(w http.ResponseWriter, r *http.Request) {
|
||||
vars := mux.Vars(r)
|
||||
path := vars["path"]
|
||||
|
||||
ch := make(chan Get)
|
||||
|
||||
go func() { ch <- zk.GetNode(path) }()
|
||||
|
||||
childrens := <-ch
|
||||
|
||||
data, err := json.Marshal(childrens)
|
||||
if err != nil {
|
||||
w.WriteHeader(500)
|
||||
}
|
||||
w.WriteHeader(200)
|
||||
w.Write(data)
|
||||
}
|
||||
|
||||
// Serve ...
|
||||
func Serve(listen string, zk ZooNode) {
|
||||
r := mux.NewRouter()
|
||||
|
||||
r.HandleFunc("/v1/ls{path:[a-z0-9-_/.:]+}", zk.LS)
|
||||
r.HandleFunc("/v1/get{path:[a-z0-9-_/.:]+}", zk.GET)
|
||||
|
||||
http.Handle("/", r)
|
||||
|
||||
srv := http.Server{
|
||||
Handler: r,
|
||||
Addr: listen,
|
||||
WriteTimeout: 15 * time.Second,
|
||||
ReadTimeout: 15 * time.Second,
|
||||
}
|
||||
|
||||
log.Print("Listening API on ", listen)
|
||||
log.Fatal(srv.ListenAndServe())
|
||||
}
|
94
rest/zoo.go
Normal file
94
rest/zoo.go
Normal file
@ -0,0 +1,94 @@
|
||||
package rest
|
||||
|
||||
import (
|
||||
"github.com/samuel/go-zookeeper/zk"
|
||||
"log"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
//ZooNode zookeeper node
|
||||
type ZooNode struct {
|
||||
Path string
|
||||
Conn *zk.Conn
|
||||
Zoo Zk
|
||||
}
|
||||
|
||||
//Zk Zookeeper connection settings
|
||||
type Zk struct {
|
||||
Hosts []string
|
||||
Path string
|
||||
Tick int
|
||||
}
|
||||
|
||||
//InitConnection Initialize Zookeeper connection
|
||||
func (conf Zk) InitConnection() (*zk.Conn, error) {
|
||||
conn, _, err := zk.Connect(conf.Hosts, time.Second)
|
||||
if err != nil {
|
||||
log.Panic("[ERROR] ", err)
|
||||
}
|
||||
|
||||
return conn, err
|
||||
}
|
||||
|
||||
// GetChildrens ...
|
||||
func (z ZooNode) GetChildrens(path string) Ls {
|
||||
var lsPath string
|
||||
lsPath = strings.Join([]string{z.Path, path}, "")
|
||||
if path == "/" {
|
||||
lsPath = z.Path
|
||||
}
|
||||
|
||||
if strings.Contains(lsPath, "//") {
|
||||
lsPath = strings.Replace(lsPath, "//", "/", 1)
|
||||
}
|
||||
|
||||
log.Print("ls: ", lsPath)
|
||||
|
||||
var l Ls
|
||||
l.State = "OK"
|
||||
|
||||
childrens, _, err := z.Conn.Children(lsPath)
|
||||
if err != nil {
|
||||
l.State = "ERROR"
|
||||
l.Error = err
|
||||
return l
|
||||
}
|
||||
|
||||
l.Error = nil
|
||||
l.Childrens = childrens
|
||||
l.Path = lsPath
|
||||
|
||||
return l
|
||||
}
|
||||
|
||||
// GetNode ...
|
||||
func (z ZooNode) GetNode(path string) Get {
|
||||
var getPath string
|
||||
getPath = strings.Join([]string{z.Path, path}, "")
|
||||
if path == "/" {
|
||||
getPath = z.Path
|
||||
}
|
||||
|
||||
if strings.Contains(getPath, "//") {
|
||||
getPath = strings.Replace(getPath, "//", "/", 1)
|
||||
}
|
||||
|
||||
log.Print("ls: ", getPath)
|
||||
|
||||
var g Get
|
||||
g.State = "OK"
|
||||
|
||||
data, _, err := z.Conn.Get(getPath)
|
||||
if err != nil {
|
||||
g.State = "ERROR"
|
||||
g.Error = err
|
||||
return g
|
||||
}
|
||||
|
||||
g.Error = nil
|
||||
g.Data = data
|
||||
g.Path = getPath
|
||||
|
||||
return g
|
||||
}
|
Loading…
Reference in New Issue
Block a user