diff --git a/main.go b/main.go index 7b3aa59083d..0a71f8681de 100644 --- a/main.go +++ b/main.go @@ -33,7 +33,7 @@ func main() { app.Version = version app.Commands = []cli.Command{cmd.Web, cmd.ImportJson, cmd.ListAccounts, cmd.CreateAccount, cmd.DeleteAccount, - cmd.ListDataSources} + cmd.ListDataSources, cmd.DescribeDataSource} app.Flags = append(app.Flags, []cli.Flag{ cli.StringFlag{ Name: "config", diff --git a/pkg/cmd/datasource.go b/pkg/cmd/datasource.go index 2bab7785434..324b36e53c1 100644 --- a/pkg/cmd/datasource.go +++ b/pkg/cmd/datasource.go @@ -12,12 +12,20 @@ import ( "text/tabwriter" ) -var ListDataSources = cli.Command{ - Name: "datasource", - Usage: "list datasources", - Description: "Lists the datasources in the system", - Action: listDatasources, -} +var ( + ListDataSources = cli.Command{ + Name: "datasource", + Usage: "list datasources", + Description: "Lists the datasources in the system", + Action: listDatasources, + } + DescribeDataSource = cli.Command{ + Name: "datasource:info", + Usage: "describe the details of a datasource", + Description: "Describes the details of a datasource", + Action: describeDataSource, + } +) func listDatasources(c *cli.Context) { setting.NewConfigContext() @@ -50,3 +58,46 @@ func listDatasources(c *cli.Context) { } w.Flush() } + +func describeDataSource(c *cli.Context) { + setting.NewConfigContext() + sqlstore.NewEngine() + sqlstore.EnsureAdminUser() + + if len(c.Args()) != 2 { + log.ConsoleFatal("Account and datasource name args are required") + } + + name := c.Args().First() + ds := c.Args()[1] + + accountQuery := m.GetAccountByNameQuery{Name: name} + if err := bus.Dispatch(&accountQuery); err != nil { + log.ConsoleFatalf("Failed to find account: %s", err) + } + + accountId := accountQuery.Result.Id + + query := m.GetDataSourceByNameQuery{AccountId: accountId, Name: ds} + if err := bus.Dispatch(&query); err != nil { + log.ConsoleFatalf("Failed to find accounts: %s", err) + } + datasource := query.Result + + w := tabwriter.NewWriter(os.Stdout, 20, 1, 4, ' ', 0) + fmt.Fprintf(w, "NAME\t%s\n", datasource.Name) + fmt.Fprintf(w, "URL\t%s\n", datasource.Url) + fmt.Fprintf(w, "DEFAULT\t%t\n", datasource.IsDefault) + fmt.Fprintf(w, "ACCESS\t%s\n", datasource.Access) + fmt.Fprintf(w, "TYPE\t%s\n", datasource.Type) + + switch datasource.Type { + case m.DS_INFLUXDB: + fmt.Fprintf(w, "DATABASE\t%s\n", datasource.Database) + fmt.Fprintf(w, "DB USER\t%s\n", datasource.User) + fmt.Fprintf(w, "DB PASSWORD\t%s\n", datasource.Password) + case m.DS_ES: + fmt.Fprintf(w, "INDEX\t%s\n", datasource.Database) + } + w.Flush() +} diff --git a/pkg/models/datasource.go b/pkg/models/datasource.go index cd43f8d66f2..d8aeee27021 100644 --- a/pkg/models/datasource.go +++ b/pkg/models/datasource.go @@ -93,6 +93,12 @@ type GetDataSourceByIdQuery struct { Result DataSource } +type GetDataSourceByNameQuery struct { + Name string + AccountId int64 + Result DataSource +} + // --------------------- // EVENTS type DataSourceCreatedEvent struct { diff --git a/pkg/services/sqlstore/datasource.go b/pkg/services/sqlstore/datasource.go index 842b2bfb1c6..12ea001c559 100644 --- a/pkg/services/sqlstore/datasource.go +++ b/pkg/services/sqlstore/datasource.go @@ -15,6 +15,7 @@ func init() { bus.AddHandler("sql", DeleteDataSource) bus.AddHandler("sql", UpdateDataSource) bus.AddHandler("sql", GetDataSourceById) + bus.AddHandler("sql", GetDataSourceByName) } func GetDataSourceById(query *m.GetDataSourceByIdQuery) error { @@ -27,6 +28,16 @@ func GetDataSourceById(query *m.GetDataSourceByIdQuery) error { return err } +func GetDataSourceByName(query *m.GetDataSourceByNameQuery) error { + sess := x.Limit(100, 0).Where("account_id=? AND name=?", query.AccountId, query.Name) + has, err := sess.Get(&query.Result) + + if !has { + return m.ErrDataSourceNotFound + } + return err +} + func GetDataSources(query *m.GetDataSourcesQuery) error { sess := x.Limit(100, 0).Where("account_id=?", query.AccountId).Asc("name")