diff --git a/main.go b/main.go index da29a2cad..865c64ecf 100644 --- a/main.go +++ b/main.go @@ -1,4 +1,7 @@ package main +import "github.com/minio-io/minio/pkg/server" + func main() { + server.Start() } diff --git a/pkg/httpserver/httpserver.go b/pkg/httpserver/httpserver.go new file mode 100644 index 000000000..8dacc413b --- /dev/null +++ b/pkg/httpserver/httpserver.go @@ -0,0 +1,19 @@ +package httpserver + +import ( + "log" + "net/http" +) + +func Start(handler http.Handler) (chan<- string, <-chan error) { + ctrlChannel := make(chan string) + errorChannel := make(chan error) + go start(ctrlChannel, errorChannel, handler) + return ctrlChannel, errorChannel +} + +func start(ctrlChannel <-chan string, errorChannel chan<- error, router http.Handler) { + log.Println("Starting HTTP Server") + err := http.ListenAndServe(":8080", router) + errorChannel <- err +} diff --git a/pkg/server/server.go b/pkg/server/server.go new file mode 100644 index 000000000..4387acafa --- /dev/null +++ b/pkg/server/server.go @@ -0,0 +1,54 @@ +package server + +import ( + "log" + "reflect" + + "github.com/minio-io/minio/pkg/httpserver" + "github.com/minio-io/minio/pkg/storage" +) + +func Start() { + ctrlChans := make([]chan<- string, 0) + statusChans := make([]<-chan error, 0) + + ctrlChan, statusChan := storage.Start() + ctrlChans = append(ctrlChans, ctrlChan) + statusChans = append(statusChans, statusChan) + + ctrlChan, statusChan = httpserver.Start(storage.GetHttpHandler()) + ctrlChans = append(ctrlChans, ctrlChan) + statusChans = append(statusChans, statusChan) + + cases := createSelectCases(statusChans) + + for { + chosen, value, recvOk := reflect.Select(cases) + if recvOk == true { + // Status Message Received + log.Println(chosen, value.Interface(), recvOk) + } else { + // Channel closed, remove from list + aliveStatusChans := make([]<-chan error, 0) + for i, ch := range statusChans { + if i != chosen { + aliveStatusChans = append(aliveStatusChans, ch) + } + } + statusChans = aliveStatusChans + cases = createSelectCases(statusChans) + } + // create new select case + } +} + +func createSelectCases(channels []<-chan error) []reflect.SelectCase { + cases := make([]reflect.SelectCase, len(channels)) + for i, ch := range channels { + cases[i] = reflect.SelectCase{ + Dir: reflect.SelectRecv, + Chan: reflect.ValueOf(ch), + } + } + return cases +} diff --git a/pkg/storage/storage.go b/pkg/storage/storage.go index 82be0547e..27b8da36e 100644 --- a/pkg/storage/storage.go +++ b/pkg/storage/storage.go @@ -1 +1,33 @@ package storage + +import ( + "errors" + "io" + "net/http" + + "github.com/gorilla/mux" +) + +func GetHttpHandler() http.Handler { + mux := mux.NewRouter() + mux.HandleFunc("/", storageHandler) + return mux +} + +func storageHandler(w http.ResponseWriter, req *http.Request) { + io.WriteString(w, "MINIO") +} + +func Start() (chan<- string, <-chan error) { + ctrlChannel := make(chan string) + errorChannel := make(chan error) + go start(ctrlChannel, errorChannel) + return ctrlChannel, errorChannel +} + +func start(ctrlChannel <-chan string, errorChannel chan<- error) { + errorChannel <- errors.New("STORAGE MSG") + errorChannel <- errors.New("STORAGE MSG") + errorChannel <- errors.New("STORAGE MSG") + close(errorChannel) +}