datasource.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. package cmd
  2. import (
  3. "fmt"
  4. "github.com/codegangsta/cli"
  5. "github.com/grafana/grafana/pkg/bus"
  6. "github.com/grafana/grafana/pkg/log"
  7. m "github.com/grafana/grafana/pkg/models"
  8. "github.com/grafana/grafana/pkg/services/sqlstore"
  9. "github.com/grafana/grafana/pkg/setting"
  10. "os"
  11. "text/tabwriter"
  12. )
  13. var (
  14. ListDataSources = cli.Command{
  15. Name: "datasource",
  16. Usage: "list datasources",
  17. Description: "Lists the datasources in the system",
  18. Action: listDatasources,
  19. }
  20. CreateDataSource = cli.Command{
  21. Name: "datasource:create",
  22. Usage: "creates a new datasource",
  23. Description: "Creates a new datasource",
  24. Action: createDataSource,
  25. Flags: []cli.Flag{
  26. cli.StringFlag{
  27. Name: "type",
  28. Value: "graphite",
  29. Usage: fmt.Sprintf("Datasource type [%s,%s,%s,%s]",
  30. m.DS_GRAPHITE, m.DS_INFLUXDB, m.DS_ES, m.DS_OPENTSDB),
  31. },
  32. cli.StringFlag{
  33. Name: "access",
  34. Value: "proxy",
  35. Usage: "Datasource access [proxy,direct]",
  36. },
  37. cli.BoolFlag{
  38. Name: "default",
  39. Usage: "Make this the default datasource",
  40. },
  41. cli.StringFlag{
  42. Name: "db",
  43. Usage: "InfluxDB DB",
  44. },
  45. cli.StringFlag{
  46. Name: "user",
  47. Usage: "InfluxDB username",
  48. },
  49. cli.StringFlag{
  50. Name: "password",
  51. Usage: "InfluxDB password",
  52. },
  53. },
  54. }
  55. DescribeDataSource = cli.Command{
  56. Name: "datasource:info",
  57. Usage: "describe the details of a datasource",
  58. Description: "Describes the details of a datasource",
  59. Action: describeDataSource,
  60. }
  61. DeleteDataSource = cli.Command{
  62. Name: "datasource:delete",
  63. Usage: "Deletes a datasource",
  64. Description: "Deletes a datasource",
  65. Action: deleteDataSource,
  66. }
  67. )
  68. func createDataSource(c *cli.Context) {
  69. setting.NewConfigContext()
  70. sqlstore.NewEngine()
  71. sqlstore.EnsureAdminUser()
  72. if len(c.Args()) != 3 {
  73. log.ConsoleFatal("Missing required arguments")
  74. }
  75. name := c.Args().First()
  76. ds := c.Args()[1]
  77. url := c.Args()[2]
  78. dsType := c.String("type")
  79. dsAccess := c.String("access")
  80. dsDefault := c.Bool("default")
  81. accountQuery := m.GetAccountByNameQuery{Name: name}
  82. if err := bus.Dispatch(&accountQuery); err != nil {
  83. log.ConsoleFatalf("Failed to find account: %s", err)
  84. }
  85. accountId := accountQuery.Result.Id
  86. query := m.GetDataSourceByNameQuery{AccountId: accountId, Name: ds}
  87. if err := bus.Dispatch(&query); err != nil {
  88. if err != m.ErrDataSourceNotFound {
  89. log.ConsoleFatalf("Failed to query for existing datasource: %s", err)
  90. }
  91. }
  92. if query.Result.Id > 0 {
  93. log.ConsoleFatalf("DataSource %s already exists", ds)
  94. }
  95. cmd := m.AddDataSourceCommand{
  96. AccountId: accountId,
  97. Name: ds,
  98. Url: url,
  99. Type: m.DsType(dsType),
  100. Access: m.DsAccess(dsAccess),
  101. IsDefault: dsDefault,
  102. }
  103. switch dsType {
  104. case m.DS_INFLUXDB:
  105. db := c.String("db")
  106. if db == "" {
  107. log.ConsoleFatal("db name is required for influxdb datasources")
  108. }
  109. cmd.Database = db
  110. cmd.User = c.String("user")
  111. cmd.Password = c.String("password")
  112. }
  113. if err := bus.Dispatch(&cmd); err != nil {
  114. log.ConsoleFatalf("Failed to create datasource: %s", err)
  115. }
  116. datasource := cmd.Result
  117. log.ConsoleInfof("Datasource %s created", datasource.Name)
  118. }
  119. func listDatasources(c *cli.Context) {
  120. setting.NewConfigContext()
  121. sqlstore.NewEngine()
  122. sqlstore.EnsureAdminUser()
  123. if !c.Args().Present() {
  124. log.ConsoleFatal("Account name arg is required")
  125. }
  126. name := c.Args().First()
  127. accountQuery := m.GetAccountByNameQuery{Name: name}
  128. if err := bus.Dispatch(&accountQuery); err != nil {
  129. log.ConsoleFatalf("Failed to find account: %s", err)
  130. }
  131. accountId := accountQuery.Result.Id
  132. query := m.GetDataSourcesQuery{AccountId: accountId}
  133. if err := bus.Dispatch(&query); err != nil {
  134. log.ConsoleFatalf("Failed to find datasources: %s", err)
  135. }
  136. w := tabwriter.NewWriter(os.Stdout, 8, 1, 4, ' ', 0)
  137. fmt.Fprintf(w, "ID\tNAME\tURL\tTYPE\tACCESS\tDEFAULT\n")
  138. for _, ds := range query.Result {
  139. fmt.Fprintf(w, "%d\t%s\t%s\t%s\t%s\t%t\n", ds.Id, ds.Name, ds.Url, ds.Type,
  140. ds.Access, ds.IsDefault)
  141. }
  142. w.Flush()
  143. }
  144. func describeDataSource(c *cli.Context) {
  145. setting.NewConfigContext()
  146. sqlstore.NewEngine()
  147. sqlstore.EnsureAdminUser()
  148. if len(c.Args()) != 2 {
  149. log.ConsoleFatal("Account and datasource name args are required")
  150. }
  151. name := c.Args().First()
  152. ds := c.Args()[1]
  153. accountQuery := m.GetAccountByNameQuery{Name: name}
  154. if err := bus.Dispatch(&accountQuery); err != nil {
  155. log.ConsoleFatalf("Failed to find account: %s", err)
  156. }
  157. accountId := accountQuery.Result.Id
  158. query := m.GetDataSourceByNameQuery{AccountId: accountId, Name: ds}
  159. if err := bus.Dispatch(&query); err != nil {
  160. log.ConsoleFatalf("Failed to find datasource: %s", err)
  161. }
  162. datasource := query.Result
  163. w := tabwriter.NewWriter(os.Stdout, 8, 1, 4, ' ', 0)
  164. fmt.Fprintf(w, "NAME\t%s\n", datasource.Name)
  165. fmt.Fprintf(w, "URL\t%s\n", datasource.Url)
  166. fmt.Fprintf(w, "DEFAULT\t%t\n", datasource.IsDefault)
  167. fmt.Fprintf(w, "ACCESS\t%s\n", datasource.Access)
  168. fmt.Fprintf(w, "TYPE\t%s\n", datasource.Type)
  169. switch datasource.Type {
  170. case m.DS_INFLUXDB:
  171. fmt.Fprintf(w, "DATABASE\t%s\n", datasource.Database)
  172. fmt.Fprintf(w, "DB USER\t%s\n", datasource.User)
  173. fmt.Fprintf(w, "DB PASSWORD\t%s\n", datasource.Password)
  174. case m.DS_ES:
  175. fmt.Fprintf(w, "INDEX\t%s\n", datasource.Database)
  176. }
  177. w.Flush()
  178. }
  179. func deleteDataSource(c *cli.Context) {
  180. setting.NewConfigContext()
  181. sqlstore.NewEngine()
  182. sqlstore.EnsureAdminUser()
  183. if len(c.Args()) != 2 {
  184. log.ConsoleFatal("Account and datasource name args are required")
  185. }
  186. name := c.Args().First()
  187. ds := c.Args()[1]
  188. accountQuery := m.GetAccountByNameQuery{Name: name}
  189. if err := bus.Dispatch(&accountQuery); err != nil {
  190. log.ConsoleFatalf("Failed to find account: %s", err)
  191. }
  192. accountId := accountQuery.Result.Id
  193. query := m.GetDataSourceByNameQuery{AccountId: accountId, Name: ds}
  194. if err := bus.Dispatch(&query); err != nil {
  195. log.ConsoleFatalf("Failed to find datasource: %s", err)
  196. }
  197. datasource := query.Result
  198. cmd := m.DeleteDataSourceCommand{AccountId: accountId, Id: datasource.Id}
  199. if err := bus.Dispatch(&cmd); err != nil {
  200. log.ConsoleFatalf("Failed to delete datasource: %s", err)
  201. }
  202. log.ConsoleInfof("DataSource %s deleted", ds)
  203. }