mirror of https://github.com/grafana/grafana
Basic import of json dashboards is working, needs more work to handle updates, and continous watching, #22
parent
1d6413bfae
commit
d95c5e6674
@ -0,0 +1,120 @@ |
||||
package cmd |
||||
|
||||
import ( |
||||
"encoding/json" |
||||
"os" |
||||
"path/filepath" |
||||
"strings" |
||||
|
||||
"github.com/codegangsta/cli" |
||||
"github.com/torkelo/grafana-pro/pkg/bus" |
||||
"github.com/torkelo/grafana-pro/pkg/log" |
||||
m "github.com/torkelo/grafana-pro/pkg/models" |
||||
"github.com/torkelo/grafana-pro/pkg/services/sqlstore" |
||||
"github.com/torkelo/grafana-pro/pkg/setting" |
||||
) |
||||
|
||||
var CmdImportJson = cli.Command{ |
||||
Name: "import-json", |
||||
Usage: "grafana import", |
||||
Description: "Starts Grafana import process", |
||||
Action: runImport, |
||||
Flags: []cli.Flag{ |
||||
cli.StringFlag{ |
||||
Name: "dir", |
||||
Usage: "path to folder containing json dashboards", |
||||
}, |
||||
cli.StringFlag{ |
||||
Name: "account", |
||||
Usage: "Account name to save dashboards under", |
||||
}, |
||||
cli.StringFlag{ |
||||
Name: "config", |
||||
Value: "grafana.ini", |
||||
Usage: "path to config file", |
||||
}, |
||||
}, |
||||
} |
||||
|
||||
func runImport(c *cli.Context) { |
||||
dir := c.String("dir") |
||||
if len(dir) == 0 { |
||||
log.Error(3, "Missing command flag --dir") |
||||
return |
||||
} |
||||
|
||||
file, err := os.Stat(dir) |
||||
if os.IsNotExist(err) { |
||||
log.Error(3, "Directory does not exist: %v", dir) |
||||
return |
||||
} |
||||
|
||||
if !file.IsDir() { |
||||
log.Error(3, "%v is not a directory", dir) |
||||
return |
||||
} |
||||
|
||||
accountName := c.String("account") |
||||
if len(accountName) == 0 { |
||||
log.Error(3, "Missing command flag --account") |
||||
return |
||||
} |
||||
|
||||
setting.NewConfigContext() |
||||
sqlstore.NewEngine() |
||||
sqlstore.EnsureAdminUser() |
||||
|
||||
accountQuery := m.GetAccountByNameQuery{Name: accountName} |
||||
if err := bus.Dispatch(&accountQuery); err != nil { |
||||
log.Error(3, "Failed to find account", err) |
||||
return |
||||
} |
||||
|
||||
accountId := accountQuery.Result.Id |
||||
|
||||
visitor := func(path string, f os.FileInfo, err error) error { |
||||
if err != nil { |
||||
return err |
||||
} |
||||
if f.IsDir() { |
||||
return nil |
||||
} |
||||
if strings.HasSuffix(f.Name(), ".json") { |
||||
if err := importDashboard(path, accountId); err != nil { |
||||
log.Error(3, "Failed to import dashboard file: %v, err: %v", path, err) |
||||
} |
||||
} |
||||
return nil |
||||
} |
||||
|
||||
if err := filepath.Walk(dir, visitor); err != nil { |
||||
log.Error(3, "failed to scan dir for json files: %v", err) |
||||
} |
||||
} |
||||
|
||||
func importDashboard(path string, accountId int64) error { |
||||
log.Info("Importing %v", path) |
||||
|
||||
reader, err := os.Open(path) |
||||
if err != nil { |
||||
return err |
||||
} |
||||
|
||||
dash := m.NewDashboard("temp") |
||||
jsonParser := json.NewDecoder(reader) |
||||
|
||||
if err := jsonParser.Decode(&dash.Data); err != nil { |
||||
return err |
||||
} |
||||
|
||||
cmd := m.SaveDashboardCommand{ |
||||
AccountId: accountId, |
||||
Dashboard: dash.Data, |
||||
} |
||||
|
||||
if err := bus.Dispatch(&cmd); err != nil { |
||||
return err |
||||
} |
||||
|
||||
return nil |
||||
} |
Loading…
Reference in new issue