Browse Source

Merge pull request #12007 from bergquist/provisioning_symlinked_folders

Add support for symlinked folders in dashboard provisioning
Carl Bergquist 7 years ago
parent
commit
7214ee9024

+ 13 - 3
pkg/services/provisioning/dashboards/file_reader.go

@@ -47,15 +47,25 @@ func NewDashboardFileReader(cfg *DashboardsAsConfig, log log.Logger) (*fileReade
 		log.Error("Cannot read directory", "error", err)
 	}
 
-	absPath, err := filepath.Abs(path)
+	copy := path
+	path, err := filepath.Abs(path)
 	if err != nil {
 		log.Error("Could not create absolute path ", "path", path)
-		absPath = path //if .Abs return an error we fallback to path
+	}
+
+	path, err = filepath.EvalSymlinks(path)
+	if err != nil {
+		log.Error("Failed to read content of symlinked path: %s", path)
+	}
+
+	if path == "" {
+		path = copy
+		log.Info("falling back to original path due to EvalSymlink/Abs failure")
 	}
 
 	return &fileReader{
 		Cfg:              cfg,
-		Path:             absPath,
+		Path:             path,
 		log:              log,
 		dashboardService: dashboards.NewProvisioningService(),
 	}, nil

+ 39 - 0
pkg/services/provisioning/dashboards/file_reader_linux_test.go

@@ -0,0 +1,39 @@
+// +build linux
+
+package dashboards
+
+import (
+	"path/filepath"
+	"testing"
+
+	"github.com/grafana/grafana/pkg/log"
+)
+
+var (
+	symlinkedFolder = "testdata/test-dashboards/symlink"
+)
+
+func TestProvsionedSymlinkedFolder(t *testing.T) {
+	cfg := &DashboardsAsConfig{
+		Name:    "Default",
+		Type:    "file",
+		OrgId:   1,
+		Folder:  "",
+		Options: map[string]interface{}{"path": symlinkedFolder},
+	}
+
+	reader, err := NewDashboardFileReader(cfg, log.New("test-logger"))
+	if err != nil {
+		t.Error("expected err to be nil")
+	}
+
+	want, err := filepath.Abs(containingId)
+
+	if err != nil {
+		t.Errorf("expected err to be nill")
+	}
+
+	if reader.Path != want {
+		t.Errorf("got %s want %s", reader.Path, want)
+	}
+}

+ 7 - 4
pkg/services/provisioning/dashboards/file_reader_test.go

@@ -49,13 +49,16 @@ func TestCreatingNewDashboardFileReader(t *testing.T) {
 		})
 
 		Convey("using full path", func() {
-			cfg.Options["folder"] = "/var/lib/grafana/dashboards"
+			fullPath := "/var/lib/grafana/dashboards"
+			if runtime.GOOS == "windows" {
+				fullPath = `c:\var\lib\grafana`
+			}
+
+			cfg.Options["folder"] = fullPath
 			reader, err := NewDashboardFileReader(cfg, log.New("test-logger"))
 			So(err, ShouldBeNil)
 
-			if runtime.GOOS != "windows" {
-				So(reader.Path, ShouldEqual, "/var/lib/grafana/dashboards")
-			}
+			So(reader.Path, ShouldEqual, fullPath)
 			So(filepath.IsAbs(reader.Path), ShouldBeTrue)
 		})
 

+ 1 - 0
pkg/services/provisioning/dashboards/testdata/test-dashboards/symlink

@@ -0,0 +1 @@
+containing-id/