Scopes Provisioning Script
This script generates Scopes, ScopeNodes, and ScopeNavigations for Grafana development environments.
Usage
Create resources
# From devenv directory
./setup.sh scopes
# Or run directly
cd scopes
go run scopes.go
Delete all gdev-prefixed resources
# From devenv directory
./setup.sh undev
# Or run directly
cd scopes
go run scopes.go -clean
Note about caching: The /find/scope_navigations endpoint used by the UI caches ScopeNavigation results for 15 minutes. After running cleanup, deleted resources may still appear in the UI until the cache expires. The resources are actually deleted (you can verify by checking the /scopenavigations list endpoint), but the UI will refresh after ~15 minutes or after restarting Grafana.
Doing an Empty Cache and Hard Reload will also help.
Configuration
The script reads from scopes-config.yaml by default. You can specify a different config file:
go run scopes.go -config=my-config.yaml
Configuration Format
The configuration file uses YAML format with a natural tree structure. The indentation itself represents the hierarchy:
- scopes: Map of scope definitions (key is the scope name)
- tree: Tree structure of scope nodes where the YAML structure defines parent-child relationships
- navigations: Map of scope navigations linking URLs to scopes (key is the navigation name)
Example:
scopes:
app1:
title: Application 1
filters:
- key: app
operator: equals
value: app1
tree:
environments:
title: Environments
nodeType: container
children:
production:
title: Production
nodeType: container
children:
app1-prod:
title: Application 1
nodeType: leaf
linkId: app1
linkType: scope
navigations:
# Link to a dashboard
app1-nav:
url: /d/86Js1xRmk
scope: app1
# Link to another dashboard
app2-nav:
url: /d/GlAqcPgmz
scope: app2
# Custom URLs
explore-nav:
url: /explore
scope: app1
Tree Structure
The tree structure uses YAML's natural indentation to represent hierarchy:
- Key: Unique identifier for the node (will be prefixed with "gdev-")
- title: Display title
- nodeType: Either "container" (can have children) or "leaf" (selectable scope)
- linkId: References a scope name (if nodeType is "leaf")
- linkType: Usually "scope"
- children: Map of child nodes (nested structure follows YAML indentation)
Node Types
- container: A category/grouping node that can contain other nodes
- leaf: A selectable node that links to a scope
Navigations
Navigations link URLs to scopes. The url field should contain the full URL path (e.g., /d/abc123 for dashboards or /explore for other pages).
To find dashboard UIDs from gdev dashboards:
# Find UIDs of all gdev dashboards
find devenv/dev-dashboards -name "*.json" -exec sh -c 'echo "{}:" && jq -r ".uid // .dashboard.uid // \"NO_UID\"" {}' \;
# Or for a specific dashboard
jq -r ".uid // .dashboard.uid" devenv/dev-dashboards/all-panels.json
Environment Variables
GRAFANA_URL: Grafana URL (default: http://localhost:3000)GRAFANA_NAMESPACE: Namespace (default: default)GRAFANA_USER: Grafana username (default: admin)GRAFANA_PASSWORD: Grafana password (default: admin)
Command Line Flags
-url: Grafana URL-namespace: Namespace-config: Config file path (default: scopes-config.yaml)-user: Grafana username-password: Grafana password-clean: Delete all gdev-prefixed resources
Prefix
All resources are automatically prefixed with "gdev-" to avoid conflicts with production data.