From 6c418bb32386004c464a1288cfb91fb5b195ee24 Mon Sep 17 00:00:00 2001 From: Jade McGough Date: Thu, 23 Mar 2017 01:04:35 -0700 Subject: [PATCH] drop db API --- chronograf.go | 1 + influx/databases.go | 10 ++++++++++ server/databases.go | 39 +++++++++++++++++++++++++++++++++++++++ server/mux.go | 14 +++++++------- 4 files changed, 57 insertions(+), 7 deletions(-) diff --git a/chronograf.go b/chronograf.go index b8e2e09b48..b6cb5dc903 100644 --- a/chronograf.go +++ b/chronograf.go @@ -306,6 +306,7 @@ type Databases interface { AllDB(context.Context) ([]Database, error) Connect(context.Context, *Source) error CreateDB(context.Context, *Database) (*Database, error) + DropDB(context.Context, string) error } // DashboardID is the dashboard ID diff --git a/influx/databases.go b/influx/databases.go index e3b29a1946..7be081f63c 100644 --- a/influx/databases.go +++ b/influx/databases.go @@ -30,6 +30,16 @@ func (c *Client) CreateDB(ctx context.Context, db *chronograf.Database) (*chrono return res, nil } +func (c *Client) DropDB(ctx context.Context, name string) error { + _, err := c.Query(ctx, chronograf.Query{ + Command: fmt.Sprintf(`DROP DATABASE "%s"`, name), + }) + if err != nil { + return err + } + return 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 af707de07f..83539267eb 100644 --- a/server/databases.go +++ b/server/databases.go @@ -5,6 +5,7 @@ import ( "net/http" "encoding/json" + "github.com/bouk/httprouter" "github.com/influxdata/chronograf" ) @@ -113,6 +114,44 @@ func (h *Service) NewDatabase(w http.ResponseWriter, r *http.Request) { encodeJSON(w, http.StatusCreated, res, h.Logger) } +func (h *Service) DropDatabase(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 + } + + dbID := httprouter.GetParamFromContext(ctx, "dbid") + if err != nil { + Error(w, http.StatusUnprocessableEntity, err.Error(), h.Logger) + return + } + + dropErr := db.DropDB(ctx, dbID) + if dropErr != nil { + Error(w, http.StatusBadRequest, dropErr.Error(), h.Logger) + return + } + + w.WriteHeader(http.StatusNoContent) +} + func ValidDatabaseRequest(d *chronograf.Database) error { if len(d.Name) == 0 { return fmt.Errorf("name is required") diff --git a/server/mux.go b/server/mux.go index bb788459cf..5c7ea3f26a 100644 --- a/server/mux.go +++ b/server/mux.go @@ -134,15 +134,15 @@ 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.DELETE("/chronograf/v1/sources/:id/dbs/:did", service.DropDatabase) - // + + router.DELETE("/chronograf/v1/sources/:id/dbs/:dbid", service.DropDatabase) + // // Retention Policies - // router.GET("/chronograf/v1/sources/:id/dbs/:did/rps", service.RetentionPolicies) - // router.POST("/chronograf/v1/sources/:id/dbs/:did/rps", service.NewRetentionPolicy) + // router.GET("/chronograf/v1/sources/:id/dbs/:dbid/rps", service.RetentionPolicies) + // router.POST("/chronograf/v1/sources/:id/dbs/:dbid/rps", service.NewRetentionPolicy) // - // router.PATCH("/chronograf/v1/sources/:id/dbs/:did/rps/:rpid", service.UpdateRetentionPolicy) - // router.DELETE("/chronograf/v1/sources/:id/dbs/:did/rps/:rpid", service.DropRetentionPolicy) + // router.PATCH("/chronograf/v1/sources/:id/dbs/:dbid/rps/:rpid", service.UpdateRetentionPolicy) + // router.DELETE("/chronograf/v1/sources/:id/dbs/:dbid/rps/:rpid", service.DropRetentionPolicy) var authRoutes AuthRoutes