diff --git a/chronograf.go b/chronograf.go index cbf128eac..63cf80dde 100644 --- a/chronograf.go +++ b/chronograf.go @@ -305,6 +305,7 @@ type Databases interface { // All lists all databases AllDB(context.Context) ([]Database, error) Connect(context.Context, *Source) error + CreateDB(context.Context, db *chronograf.Database) (*chronograf.Database, error) } // DashboardID is the dashboard ID diff --git a/influx/databases.go b/influx/databases.go index d33863249..e3b29a194 100644 --- a/influx/databases.go +++ b/influx/databases.go @@ -3,6 +3,7 @@ package influx import ( "encoding/json" "context" + "fmt" "github.com/influxdata/chronograf" ) @@ -16,6 +17,19 @@ func (c *Client) AllDB(ctx context.Context) ([]chronograf.Database, error) { return databases, nil } +func (c *Client) CreateDB(ctx context.Context, db *chronograf.Database) (*chronograf.Database, error) { + _, err := c.Query(ctx, chronograf.Query{ + Command: fmt.Sprintf(`CREATE DATABASE "%s"`, db.Name), + }) + if err != nil { + return nil, err + } + + res := &chronograf.Database{Name: db.Name} + + return res, nil +} + func (c *Client) showDatabases(ctx context.Context) ([]chronograf.Database, error) { res, err := c.Query(ctx, chronograf.Query{ Command: `SHOW DATABASES`, diff --git a/server/databases.go b/server/databases.go index 1c51aa93f..3346acaf6 100644 --- a/server/databases.go +++ b/server/databases.go @@ -65,3 +65,37 @@ func (h *Service) GetDatabases(w http.ResponseWriter, r *http.Request) { encodeJSON(w, http.StatusOK, res, h.Logger) } + +func (h *Service) NewDatabase(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + srcID, err := paramID("id", r) + if err != nil { + Error(w, http.StatusUnprocessableEntity, err.Error(), h.Logger) + return + } + + src, err := h.SourcesStore.Get(ctx, srcID) + if err != nil { + notFound(w, srcID, h.Logger) + return + } + + db := h.Databases + + if err = db.Connect(ctx, &src); err != nil { + msg := fmt.Sprintf("Unable to connect to source %d: %v", srcID, err) + Error(w, http.StatusBadRequest, msg, h.Logger) + return + } + + // need to pass database object from POST + database, err := db.CreateDB(ctx, ) + if err != nil { + Error(w, http.StatusBadRequest, err.Error(), h.Logger) + return + } + + res := dbResponse{Name: database.Name} + encodeJSON(w, http.StatusOK, res, h.Logger) +} diff --git a/server/mux.go b/server/mux.go index d50368b90..bb788459c 100644 --- a/server/mux.go +++ b/server/mux.go @@ -133,7 +133,7 @@ func NewMux(opts MuxOpts, service Service) http.Handler { // Databases router.GET("/chronograf/v1/sources/:id/dbs", service.GetDatabases) - // router.POST("/chronograf/v1/sources/:id/dbs", service.NewDatabase) + router.POST("/chronograf/v1/sources/:id/dbs", service.NewDatabase) // // router.DELETE("/chronograf/v1/sources/:id/dbs/:did", service.DropDatabase) //