datasource as cfg: basic implementation
This commit is contained in:
@@ -16,7 +16,6 @@ import (
|
||||
|
||||
"github.com/grafana/grafana/pkg/metrics"
|
||||
"github.com/grafana/grafana/pkg/models"
|
||||
"github.com/grafana/grafana/pkg/services/sqlstore"
|
||||
"github.com/grafana/grafana/pkg/setting"
|
||||
|
||||
_ "github.com/grafana/grafana/pkg/services/alerting/conditions"
|
||||
@@ -88,11 +87,6 @@ func main() {
|
||||
server.Start()
|
||||
}
|
||||
|
||||
func initSql() {
|
||||
sqlstore.NewEngine()
|
||||
sqlstore.EnsureAdminUser()
|
||||
}
|
||||
|
||||
func listenToSystemSignals(server models.GrafanaServer) {
|
||||
signalChan := make(chan os.Signal, 1)
|
||||
ignoreChan := make(chan os.Signal, 1)
|
||||
|
||||
@@ -21,7 +21,9 @@ import (
|
||||
"github.com/grafana/grafana/pkg/services/cleanup"
|
||||
"github.com/grafana/grafana/pkg/services/notifications"
|
||||
"github.com/grafana/grafana/pkg/services/search"
|
||||
"github.com/grafana/grafana/pkg/services/sqlstore"
|
||||
"github.com/grafana/grafana/pkg/setting"
|
||||
dsSettings "github.com/grafana/grafana/pkg/setting/datasources"
|
||||
"github.com/grafana/grafana/pkg/social"
|
||||
"github.com/grafana/grafana/pkg/tracing"
|
||||
)
|
||||
@@ -54,6 +56,12 @@ func (g *GrafanaServerImpl) Start() {
|
||||
g.writePIDFile()
|
||||
|
||||
initSql()
|
||||
err, _ := dsSettings.Init(filepath.Join(setting.HomePath, "conf/datasources.yaml"))
|
||||
if err != nil {
|
||||
g.log.Error("Failed to load datasources from config", "error", err)
|
||||
g.Shutdown(1, "Startup failed")
|
||||
return
|
||||
}
|
||||
metrics.Init(setting.Cfg)
|
||||
search.Init()
|
||||
login.Init()
|
||||
@@ -87,6 +95,11 @@ func (g *GrafanaServerImpl) Start() {
|
||||
g.startHttpServer()
|
||||
}
|
||||
|
||||
func initSql() {
|
||||
sqlstore.NewEngine()
|
||||
sqlstore.EnsureAdminUser()
|
||||
}
|
||||
|
||||
func (g *GrafanaServerImpl) initLogging() {
|
||||
err := setting.NewConfigContext(&setting.CommandLineArgs{
|
||||
Config: *configFile,
|
||||
|
||||
@@ -0,0 +1,114 @@
|
||||
package datasources
|
||||
|
||||
import (
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/grafana/grafana/pkg/bus"
|
||||
"github.com/grafana/grafana/pkg/log"
|
||||
|
||||
"github.com/grafana/grafana/pkg/models"
|
||||
yaml "gopkg.in/yaml.v2"
|
||||
)
|
||||
|
||||
var (
|
||||
logger log.Logger
|
||||
)
|
||||
|
||||
// TODO: secure jsonData
|
||||
// TODO: auto reload on file changes
|
||||
|
||||
func Init(configPath string) (error, io.Closer) {
|
||||
logger = log.New("setting.datasource")
|
||||
|
||||
datasources, err := readDatasources(configPath)
|
||||
if err != nil {
|
||||
return err, ioutil.NopCloser(nil)
|
||||
}
|
||||
|
||||
for _, ds := range datasources {
|
||||
query := &models.GetDataSourceByNameQuery{Name: ds.Name}
|
||||
err := bus.Dispatch(query)
|
||||
if err != nil && err != models.ErrDataSourceNotFound {
|
||||
return err, ioutil.NopCloser(nil)
|
||||
}
|
||||
|
||||
if ds.OrgId == 0 {
|
||||
ds.OrgId = 1
|
||||
}
|
||||
|
||||
if query.Result == nil {
|
||||
logger.Info("inserting ", "name", ds.Name)
|
||||
insertCmd := insertCommand(ds)
|
||||
if err := bus.Dispatch(insertCmd); err != nil {
|
||||
return err, ioutil.NopCloser(nil)
|
||||
}
|
||||
} else {
|
||||
logger.Info("updating", "name", ds.Name)
|
||||
updateCmd := updateCommand(ds, query.Result.Id)
|
||||
if err := bus.Dispatch(updateCmd); err != nil {
|
||||
return err, ioutil.NopCloser(nil)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil, ioutil.NopCloser(nil)
|
||||
}
|
||||
|
||||
func readDatasources(path string) ([]models.DataSource, error) {
|
||||
filename, _ := filepath.Abs(path)
|
||||
yamlFile, err := ioutil.ReadFile(filename)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var datasources []models.DataSource
|
||||
|
||||
err = yaml.Unmarshal(yamlFile, &datasources)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return datasources, nil
|
||||
}
|
||||
|
||||
func insertCommand(ds models.DataSource) *models.AddDataSourceCommand {
|
||||
return &models.AddDataSourceCommand{
|
||||
OrgId: ds.OrgId,
|
||||
Name: ds.Name,
|
||||
Type: ds.Type,
|
||||
Access: ds.Access,
|
||||
Url: ds.Url,
|
||||
Password: ds.Password,
|
||||
User: ds.User,
|
||||
Database: ds.Database,
|
||||
BasicAuth: ds.BasicAuth,
|
||||
BasicAuthUser: ds.BasicAuthUser,
|
||||
BasicAuthPassword: ds.BasicAuthPassword,
|
||||
WithCredentials: ds.WithCredentials,
|
||||
IsDefault: ds.IsDefault,
|
||||
JsonData: ds.JsonData,
|
||||
}
|
||||
}
|
||||
|
||||
func updateCommand(ds models.DataSource, id int64) *models.UpdateDataSourceCommand {
|
||||
return &models.UpdateDataSourceCommand{
|
||||
Id: id,
|
||||
OrgId: ds.OrgId,
|
||||
Name: ds.Name,
|
||||
Type: ds.Type,
|
||||
Access: ds.Access,
|
||||
Url: ds.Url,
|
||||
Password: ds.Password,
|
||||
User: ds.User,
|
||||
Database: ds.Database,
|
||||
BasicAuth: ds.BasicAuth,
|
||||
BasicAuthUser: ds.BasicAuthUser,
|
||||
BasicAuthPassword: ds.BasicAuthPassword,
|
||||
WithCredentials: ds.WithCredentials,
|
||||
IsDefault: ds.IsDefault,
|
||||
JsonData: ds.JsonData,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user