140 lines
2.8 KiB
Go
140 lines
2.8 KiB
Go
|
package router
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"etrismartfarmpoc/containermgmt"
|
||
|
"fmt"
|
||
|
"io"
|
||
|
"log"
|
||
|
"net/http"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
func GetServices(w http.ResponseWriter, r *http.Request) {
|
||
|
w.Header().Set("Access-Control-Allow-Origin", "*")
|
||
|
w.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
|
||
|
|
||
|
sname := r.Header.Get("sname")
|
||
|
|
||
|
if len(sname) != 0 {
|
||
|
sid, err := db.GetSID(sname)
|
||
|
if err != nil {
|
||
|
w.WriteHeader(http.StatusBadRequest)
|
||
|
return
|
||
|
}
|
||
|
w.Write([]byte(sid))
|
||
|
return
|
||
|
}
|
||
|
|
||
|
l, err := db.GetServices()
|
||
|
if err != nil {
|
||
|
w.WriteHeader(http.StatusBadRequest)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
err = json.NewEncoder(w).Encode(l)
|
||
|
if err != nil {
|
||
|
w.WriteHeader(http.StatusBadRequest)
|
||
|
return
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func PutServices(w http.ResponseWriter, r *http.Request) {
|
||
|
var obj = map[string]string{}
|
||
|
|
||
|
decoder := json.NewDecoder(r.Body)
|
||
|
err := decoder.Decode(&obj)
|
||
|
|
||
|
if err != nil {
|
||
|
w.WriteHeader(http.StatusBadRequest)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
s, err := db.UpdateService(obj["name"], obj["addr"])
|
||
|
if err != nil {
|
||
|
w.WriteHeader(http.StatusBadRequest)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
sendNotification(&Notification{Msg: "Update Service"})
|
||
|
err = json.NewEncoder(w).Encode(s)
|
||
|
if err != nil {
|
||
|
w.WriteHeader(http.StatusBadRequest)
|
||
|
return
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// func GetServiceList(w http.ResponseWriter, r *http.Request) {
|
||
|
// result := containermgmt.GetContainers(context.Background())
|
||
|
// b := result.Value(containermgmt.ReturnKey).([]byte)
|
||
|
// w.Write(b)
|
||
|
// }
|
||
|
|
||
|
func PostService(w http.ResponseWriter, r *http.Request) {
|
||
|
|
||
|
var obj = map[string]string{}
|
||
|
decoder := json.NewDecoder(r.Body)
|
||
|
err := decoder.Decode(&obj)
|
||
|
|
||
|
db.IsExistService(obj["name"])
|
||
|
if err != nil {
|
||
|
w.WriteHeader(http.StatusBadRequest)
|
||
|
w.Write([]byte(err.Error()))
|
||
|
return
|
||
|
}
|
||
|
|
||
|
err = containermgmt.CreateContainer(obj["name"])
|
||
|
if err != nil {
|
||
|
w.WriteHeader(http.StatusBadRequest)
|
||
|
w.Write([]byte(err.Error()))
|
||
|
return
|
||
|
}
|
||
|
|
||
|
w.WriteHeader(http.StatusCreated)
|
||
|
}
|
||
|
|
||
|
func RouteRequestToService(w http.ResponseWriter, r *http.Request) {
|
||
|
l := len([]rune("/services/"))
|
||
|
var id string
|
||
|
var url string
|
||
|
idx := strings.Index(r.RequestURI[l:], "/")
|
||
|
if idx == -1 {
|
||
|
id = r.RequestURI[l:]
|
||
|
url = "/"
|
||
|
} else {
|
||
|
id = r.RequestURI[l : l+idx]
|
||
|
if len([]rune(r.RequestURI)) <= l+idx {
|
||
|
url = "/"
|
||
|
} else {
|
||
|
url = r.RequestURI[l+idx:]
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// w.Write([]byte(vars["url"]))
|
||
|
host, err := db.GetAddr(id)
|
||
|
if err != nil {
|
||
|
w.WriteHeader(http.StatusNotFound)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
log.Println("Route to", host+url)
|
||
|
req, err := http.NewRequest(r.Method, "http://"+host+url, r.Body)
|
||
|
if err != nil {
|
||
|
// 잘못된 메시지 포맷이 전달된 경우
|
||
|
w.WriteHeader(http.StatusBadRequest)
|
||
|
fmt.Fprint(w, err)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
resp, err := http.DefaultClient.Do(req)
|
||
|
|
||
|
if err != nil {
|
||
|
// 잘못된 메시지 포맷이 전달된 경우
|
||
|
w.WriteHeader(http.StatusBadRequest)
|
||
|
fmt.Fprint(w, err)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
io.Copy(w, resp.Body)
|
||
|
}
|