datasource.go 5.7 KB

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