initial checking of provisioning container
diff --git a/provisioner/provisioner.go b/provisioner/provisioner.go
new file mode 100644
index 0000000..aeb237a
--- /dev/null
+++ b/provisioner/provisioner.go
@@ -0,0 +1,54 @@
+package main
+
+import (
+	"fmt"
+	"github.com/gorilla/mux"
+	"github.com/kelseyhightower/envconfig"
+	"log"
+	"net/http"
+)
+
+type Config struct {
+	Port            int    `default:"4243"`
+	Listen          string `default:"0.0.0.0"`
+	RoleSelectorURL string `default:"" envconfig:"role_selector_url"`
+	DefaultRole     string `default:"compute-node" envconfig:"default_role"`
+	Script          string `default:"do-ansible"`
+}
+
+type Context struct {
+	config     Config
+	storage    Storage
+	workers    []Worker
+	dispatcher *Dispatcher
+}
+
+func main() {
+	context := &Context{}
+
+	err := envconfig.Process("PROVISION", &(context.config))
+	if err != nil {
+		log.Fatalf("[error] Unable to parse configuration options : %s", err)
+	}
+
+	log.Printf(`Configuration:
+	    Listen:          %s
+	    Port:            %d
+	    RoleSelectorURL: %s
+	    DefaultRole:     %s`,
+		context.config.Listen, context.config.Port, context.config.RoleSelectorURL, context.config.DefaultRole)
+
+	context.storage = NewMemoryStorage()
+
+	router := mux.NewRouter()
+	router.HandleFunc("/provision/", context.ProvisionRequestHandler).Methods("POST")
+	router.HandleFunc("/provision/", context.ListRequestsHandler).Methods("GET")
+	router.HandleFunc("/provision/{nodeid}", context.QueryStatusHandler).Methods("GET")
+	http.Handle("/", router)
+
+	// Start the dispatcher and workers
+	context.dispatcher = NewDispatcher(5, context.storage)
+	context.dispatcher.Start()
+
+	http.ListenAndServe(fmt.Sprintf("%s:%d", context.config.Listen, context.config.Port), nil)
+}