diff --git a/pkg/registry/apis/provisioning/local.go b/pkg/registry/apis/provisioning/local.go index 4b9b686f7f1..659557caeac 100644 --- a/pkg/registry/apis/provisioning/local.go +++ b/pkg/registry/apis/provisioning/local.go @@ -16,6 +16,9 @@ import ( type LocalFolderResolver struct { // Local path to data directory ProvisioningPath string + + // Path to development environment + DevenvPath string } func (r *LocalFolderResolver) LocalPath(path string) string { @@ -24,7 +27,7 @@ func (r *LocalFolderResolver) LocalPath(path string) string { return "" } - parts := strings.SplitN(path, "/", 1) + parts := strings.SplitN(path, "/", 2) if len(parts) != 2 { return "" } @@ -35,9 +38,11 @@ func (r *LocalFolderResolver) LocalPath(path string) string { } return filepath.Join(r.ProvisioningPath, parts[1]) - // Can we support pointing to files in devenv case "devenv": - return "" + if r.DevenvPath == "" { + return "" // not allowed + } + return filepath.Join(r.DevenvPath, parts[1]) } return "" } diff --git a/pkg/registry/apis/provisioning/register.go b/pkg/registry/apis/provisioning/register.go index 5b3a21c3226..86695dc21d0 100644 --- a/pkg/registry/apis/provisioning/register.go +++ b/pkg/registry/apis/provisioning/register.go @@ -3,6 +3,7 @@ package provisioning import ( "context" "fmt" + "path/filepath" "slices" "github.com/prometheus/client_golang/prometheus" @@ -54,6 +55,7 @@ func RegisterAPIService( } builder := NewProvisioningAPIBuilder(&LocalFolderResolver{ ProvisioningPath: cfg.ProvisioningPath, + DevenvPath: filepath.Join(cfg.HomePath, "devenv"), }) apiregistration.RegisterAPI(builder) return builder @@ -155,7 +157,7 @@ func (b *ProvisioningAPIBuilder) Validate(ctx context.Context, a admission.Attri return nil // This is normal for sub-resource } - repo, err := b.asRepository(a.GetObject()) + repo, err := b.asRepository(obj) if err != nil { return err } diff --git a/pkg/tests/apis/provisioning/provisioning_test.go b/pkg/tests/apis/provisioning/provisioning_test.go index 1930651d5f5..6c40141aefb 100644 --- a/pkg/tests/apis/provisioning/provisioning_test.go +++ b/pkg/tests/apis/provisioning/provisioning_test.go @@ -119,6 +119,18 @@ func TestIntegrationProvisioning(t *testing.T) { // Load the samples _, err := client.Resource.Create(ctx, + helper.LoadYAMLOrJSONFile("testdata/local-conf-provisioning-sample.yaml"), + createOptions, + ) + require.NoError(t, err) + + _, err = client.Resource.Create(ctx, + helper.LoadYAMLOrJSONFile("testdata/local-devenv.yaml"), + createOptions, + ) + require.NoError(t, err) + + _, err = client.Resource.Create(ctx, helper.LoadYAMLOrJSONFile("testdata/github-example.yaml"), createOptions, ) @@ -153,6 +165,22 @@ func TestIntegrationProvisioning(t *testing.T) { "title": "Github Example", "type": "github" }, + "local-conf-provisioning-sample": { + "description": "load resources from https://github.com/grafana/grafana/tree/main/conf/provisioning/sample", + "local": { + "path": "provisioning/sample" + }, + "title": "Config provisioning files", + "type": "local" + }, + "local-devenv": { + "description": "load https://github.com/grafana/grafana/tree/main/devenv/dev-dashboards", + "local": { + "path": "devenv/dev-dashboards" + }, + "title": "Load devenv dashboards", + "type": "local" + }, "s3-example": { "description": "load resources from an S3 bucket", "s3": { diff --git a/pkg/tests/apis/provisioning/testdata/local-devenv.yaml b/pkg/tests/apis/provisioning/testdata/local-devenv.yaml new file mode 100644 index 00000000000..60416bf309b --- /dev/null +++ b/pkg/tests/apis/provisioning/testdata/local-devenv.yaml @@ -0,0 +1,10 @@ +apiVersion: provisioning.grafana.app/v0alpha1 +kind: Repository +metadata: + name: local-devenv +spec: + title: Load devenv dashboards + description: load https://github.com/grafana/grafana/tree/main/devenv/dev-dashboards + type: local + local: + path: devenv/dev-dashboards