initial checking of provisioning container
diff --git a/provisioner/handlers.go b/provisioner/handlers.go
new file mode 100644
index 0000000..b915674
--- /dev/null
+++ b/provisioner/handlers.go
@@ -0,0 +1,105 @@
+package main
+
+import (
+	"bufio"
+	"encoding/json"
+	"github.com/gorilla/mux"
+	"log"
+	"net/http"
+	"strings"
+)
+
+type RequestInfo struct {
+	Id   string
+	Name string
+	Ip   string
+	Mac  string
+}
+
+func (c *Context) GetRole(info *RequestInfo) (string, error) {
+	if c.config.RoleSelectorURL == "" {
+		return c.config.DefaultRole, nil
+	}
+	r, err := http.Get(c.config.RoleSelectorURL)
+	if err != nil {
+		return "", err
+	}
+
+	s := bufio.NewScanner(r.Body)
+	defer r.Body.Close()
+	role := strings.TrimSpace(s.Text())
+	if role == "" {
+		return c.config.DefaultRole, nil
+	}
+	return role, nil
+}
+
+func (c *Context) validateData(info *RequestInfo) bool {
+	if strings.TrimSpace(info.Id) == "" ||
+		strings.TrimSpace(info.Name) == "" ||
+		strings.TrimSpace(info.Ip) == "" ||
+		strings.TrimSpace(info.Mac) == "" {
+		return false
+	}
+	return true
+}
+
+func (c *Context) ProvisionRequestHandler(w http.ResponseWriter, r *http.Request) {
+	var info RequestInfo
+	decoder := json.NewDecoder(r.Body)
+	defer r.Body.Close()
+	if err := decoder.Decode(&info); err != nil || !c.validateData(&info) {
+		log.Printf("ERROR: %v", err)
+		w.WriteHeader(http.StatusBadRequest)
+		return
+	}
+
+	log.Printf("GOT: %v", info)
+
+	role, err := c.GetRole(&info)
+	if err != nil {
+		http.Error(w, err.Error(), http.StatusInternalServerError)
+		return
+	}
+	err = c.dispatcher.Dispatch(&info, role)
+	if err != nil {
+		http.Error(w, err.Error(), http.StatusInternalServerError)
+		return
+	}
+
+	w.WriteHeader(http.StatusAccepted)
+}
+
+func (c *Context) ListRequestsHandler(w http.ResponseWriter, r *http.Request) {
+	list, err := c.storage.List()
+	bytes, err := json.Marshal(list)
+	if err != nil {
+		http.Error(w, err.Error(), http.StatusInternalServerError)
+		return
+	}
+	w.Write(bytes)
+}
+
+func (c *Context) QueryStatusHandler(w http.ResponseWriter, r *http.Request) {
+	vars := mux.Vars(r)
+	id, ok := vars["nodeid"]
+	if !ok || strings.TrimSpace(id) == "" {
+		w.WriteHeader(http.StatusBadRequest)
+		return
+	}
+	s, err := c.storage.Get(id)
+	if err != nil {
+		http.Error(w, err.Error(), http.StatusInternalServerError)
+		return
+	}
+	if s == nil {
+		w.WriteHeader(http.StatusNotFound)
+		return
+	}
+	bytes, err := json.Marshal(s)
+	if err != nil {
+		http.Error(w, err.Error(), http.StatusInternalServerError)
+		return
+	}
+	w.Write(bytes)
+}