Files
grafana/pkg/services/provisioning/stubs.go
Mustafa Sencer Özcan e2cbf8abf1 fix: handle empty provisioning folder gracefully in stub provisioning (#114273)
fix: provisioning folder empty case
2025-11-21 09:04:04 +01:00

74 lines
2.0 KiB
Go

package provisioning
import (
"os"
"path/filepath"
"github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/services/provisioning/dashboards"
"github.com/grafana/grafana/pkg/setting"
)
type StubProvisioningService interface {
GetDashboardProvisionerResolvedPath(name string) string
GetAllowUIUpdatesFromConfig(name string) bool
}
func ProvideStubProvisioningService(cfg *setting.Cfg) (StubProvisioningService, error) {
return NewStubProvisioning(cfg.ProvisioningPath)
}
func NewStubProvisioning(path string) (StubProvisioningService, error) {
logger := log.New("provisioning.stub")
stub := &stubProvisioning{
path: make(map[string]string),
allowUIUpdates: make(map[string]bool),
log: logger,
}
cfgs, err := dashboards.ReadDashboardConfig(filepath.Join(path, "dashboards"))
if err != nil {
logger.Warn("can't read dashboard provisioning files from directory", "path", filepath.Join(path, "dashboards"), "error", err)
return stub, nil
}
for _, cfg := range cfgs {
stub.path[cfg.Name] = cfg.Options["path"].(string)
stub.allowUIUpdates[cfg.Name] = cfg.AllowUIUpdates
}
return stub, nil
}
type stubProvisioning struct {
path map[string]string // name > options.path
allowUIUpdates map[string]bool
log log.Logger
}
func (s *stubProvisioning) GetAllowUIUpdatesFromConfig(name string) bool {
return s.allowUIUpdates[name]
}
func (s *stubProvisioning) GetDashboardProvisionerResolvedPath(name string) string {
path := s.path[name]
if _, err := os.Stat(path); os.IsNotExist(err) {
s.log.Warn("Cannot read directory", "error", err)
}
path, err := filepath.Abs(path)
if err != nil {
s.log.Warn("Could not create absolute path", "path", path, "error", err)
}
path, err = filepath.EvalSymlinks(path)
if err != nil {
s.log.Warn("Failed to read content of symlinked path", "path", path, "error", err)
}
if path == "" {
path = s.path[name]
s.log.Info("falling back to original path due to EvalSymlink/Abs failure")
}
return path
}