66884 Commits

Author SHA1 Message Date
Hugo Häggmark
159ffd19ee DataSourcePicker: Deleted datasources are not shown in dropdown (#120188)
DataSourcePicker: deleted datasources are not shown
2026-03-13 06:51:26 +01:00
grafana-pr-automation[bot]
88843106cb I18n: Download translations from Crowdin (#120248)
New Crowdin translations by GitHub Action

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-03-13 00:34:26 +00:00
Galen Kistler
917eede0fd Annotations: Clustering feature toggle (#120240)
chore: add clustering flag
2026-03-12 19:05:24 -04:00
Stephanie Hingtgen
a6ba751dc4 Roles: Update openapi spec (#120243) 2026-03-12 17:57:44 -05:00
Stephanie Hingtgen
bd95975ce5 Plugins: Remove broken test for now (#120239) 2026-03-12 22:11:56 +00:00
Stephanie Hingtgen
09911e720d Skip flaky test for now (#120238) 2026-03-12 17:02:50 -05:00
Paul Marbach
d3bb2ae991 Gauge: Fix regression for single series w/ displayName (#120231) 2026-03-12 17:16:43 -04:00
Marc M.
5395511c8f DynamicDashboards: Make dock/undock more intuitive (#119931) 2026-03-12 20:38:31 +01:00
Rodrigo Vasconcelos de Barros
dfff68dbb5 Alerting: Alerting List Dashboard Panel Improvements (#119448)
* Refactor alert list panel component

- Added clickable link in stat mode that navigates to /alerting/list with matching filters
- Added threshould based coloring in stat mode
- Added value mappings in stat mode
- Added datasource reference by UID instead of name string (with migration for backward compatibility)

* Update translations

* Address code review comments

- Removed dead code related to component migration
- Guard getActiveThreshould call against empty steps in utils.ts and add color assertion in tests
- Remove redundant early return in buildAlertingListUrl

* Fix test

* Use Link instead of a for alerting list url
2026-03-12 14:55:15 -04:00
Adela Almasan
3d59cd4fff Stat: Add presets (#119892) 2026-03-12 18:43:59 +00:00
Drew Slobodnjak
bf18e9f21a Suggestions: Hide scrollbar in viz suggestion card (#120132)
Suggestions: Prevent Table from showing scrollbar
2026-03-12 11:13:10 -07:00
alerting-team[bot]
8cb7e6d93d Alerting: Update alerting module to 6fc4227d9c4cf83e0042fdff70676864ae310142 (#120222)
[create-pull-request] automated change

Co-authored-by: stevesg <78375245+stevesg@users.noreply.github.com>
2026-03-12 18:05:13 +00:00
Alexa Vargas
c5759e5d36 Suggested Dashboards: Fix community dashboard section tracking it was missing featureVariant (#120217)
* Suggested Dashboards: Fix community dashboard section tracking

* replaced in loaded as well
2026-03-12 18:59:50 +01:00
Steve Simpson
7406fd55c1 Alerting: Add namespace UID annotation to alert payloads (#120126)
Alerting: Add namespace UID annotation to alert payloads.

This is required for notification history to be able to log what folder owns the
alert rule in order to filter for user visibility of alert rules.
2026-03-12 17:52:16 +00:00
Mustafa Sencer Özcan
fe4c007f4d fix: add metric and extend logs for dual writer (#120146)
* fix: add metric and log

* fix: resource and method

* fix: registration

* fix: init with 0
2026-03-12 18:48:11 +01:00
Yunwen Zheng
25cb656e19 Provisioning: Delete action preview banner (#119995)
* Provisioning: Delete action preview banner
2026-03-12 13:36:50 -04:00
Ashley Harrison
077449c560 Alert: Make more responsive when buttons are present (#119971)
wrap buttons when content is smaller than 50% of alert
2026-03-12 17:29:51 +00:00
Yunwen Zheng
d01df5e876 Provisioning: replace frontend isFreeTierLicense checks with backend quota data (#119881)
* Provisioning: replace frontend isFreeTierLicense checks with backend quota data
2026-03-12 17:29:24 +00:00
Gilles De Mey
d69abe2c16 alerting: temporarily skip failing MultiplePoliciesView test (#120208)
The test 'Should render MultiplePoliciesView when alertingMultiplePolicies
feature flag is enabled' is failing with a 404 page instead of rendering
the expected am-root-route-container element.

Skipping until the root cause is investigated and fixed.

Ref: https://github.com/grafana/grafana-enterprise/actions/runs/23009165147/job/66815001544
2026-03-12 18:04:30 +01:00
Kevin Yu
08bdf00c50 Plugins: Forward AWS SDK credential chain env vars to external AWS plugins (#119772)
Plugins: Forward AWS SDK credential chain env vars to external plugins

Fixes broken AWS authentication (assume role, SigV4) for external plugins
(Redshift, Athena, Amazon Prometheus, OpenSearch) in Grafana 12.4.0.

In v12.4.0, commit f041563df3 changed plugin env var handling so external
plugins no longer receive host environment variables by default. This breaks
the AWS SDK credential chain in container environments (EKS IRSA, ECS Fargate)
which rely on vars like AWS_ROLE_ARN, AWS_WEB_IDENTITY_TOKEN_FILE, and
AWS_CONTAINER_CREDENTIALS_RELATIVE_URI.

Forward 8 critical AWS SDK credential chain env vars from the host to plugins
already in [aws] forward_settings_to_plugins. This is scoped to trusted AWS
plugins only, more targeted than PR #118870's global approach.

Includes test coverage for forwarding, non-forwarding, and selective env var
filtering.

Fixes #119235, #119603, opensearch-datasource#1012
2026-03-12 09:34:08 -07:00
Alexa Vargas
8ae909fa0a Suggested Dashboards: create new suggestedDashboardsAssistantButton ff (#120204)
Suggested Dashboards: create new dashboardTemplatesAssistantButton ff
2026-03-12 17:18:10 +01:00
Gonzalo Trigueros Manzanas
40b0b2e2b9 Provisioning: export jobs wired with folder metadata creation (#119588)
* feat: provisioning export jobs wired with folder metadata creation

* feat: add metadata files to export jobs

write instead of create for metadata file
use options for flag management

* feat: simplify metadata creation in export jobs

* chore: undo comments changes not needed

* chore: move integration test to the right folder

* feat: add dir exitance checks in integration tests

* feat: avoid .keep file creation if metadata is added

* feat: fix unit test expectations

* feat: add integration tests for .keep export

* chore: fix lint in tests
2026-03-12 16:41:58 +01:00
Andres Martinez Gotor
52e01b2519 Add advisorDatasourceIntegration feature toggle (#120181) 2026-03-12 15:27:11 +00:00
Victor Marin
beebd49b50 DateMath: Limit numeric parsing per token instead of per entire math str (#120184)
* Revert "Dashboards: Fix liveNow not working for panels with time shift (#115902)"

This reverts commit 00b89b0d29.

* Reapply "Dashboards: Fix liveNow not working for panels with time shift (#115902)"

This reverts commit 00b92cbc56.

* DateMath: should limit parsing per token

* more tests + token limit 5
2026-03-12 17:04:35 +02:00
Dominik Prokop
91a0b312ed Add faceted labels filter for time series legend (#119918)
* Add faceted labels extraction and filtering utilities

- Add extractFacetedLabels to collect unique label values per key
- Add resolveFacetedFilterNames for OR-within/AND-across filtering
- Add FIELD_NAME_FACET_KEY constant for synthetic name facet
- Extend SeriesVisibilityChangeMode with SetExactly
- Widen onToggleSeriesVisibility signature to accept string[] | null

Made-with: Cursor

* Implement faceted labels filter UI and legend integration

- Add FacetedLabelsFilter component with "By name" and "By labels" sections,
  select/deselect all, expand/collapse, and dimmed state indicator
- Integrate filter into PlotLegend with popover and docked sidebar modes
- Add filterAction prop to VizLegend, VizLegendList, and VizLegendTable
- Add dismissOnScroll prop to Toggletip for scroll-aware popover dismissal
- Enable faceted filter in the TimeSeries panel
- Widen onToggleSeriesVisibility signature in PanelStateWrapper and ExploreGraph
- Update @grafana/scenes to canary with SetExactly support
- Add FacetedLabelsFilter component tests
- Add dev dashboard for faceted labels scenarios

Made-with: Cursor

* Add enableFacetedFilter as timeseries legend option

- Define TimeSeriesLegendOptions extending VizLegendOptions with
  enableFacetedFilter field (defaults to true)
- Add toggle in timeseries panel editor under Legend category
- Remove hardcoded enableFacetedFilter from TimeSeries component,
  let it flow via legend options spread
- Explicitly disable faceted filter in Explore graph
- Update dev dashboard with enableFacetedFilter in legend options
- Regenerate locale files

Made-with: Cursor

* Fix docked filter buttons hidden behind dimmed overlay

- Add zIndex to filterDockedActions so Clear all and Unpin
  buttons render above the dimmed FacetedLabelsFilter

Made-with: Cursor

* Guard faceted labels filter behind feature toggle

- Add vizLegendFacetedFilter experimental toggle in registry.go
- Gate panel editor option in module.tsx behind the toggle
- Gate rendering in TimeSeries.tsx behind the toggle
- Use TimeSeriesLegendOptions type for legend prop

Made-with: Cursor

* Consolidate FacetedLabelsFilter tests

Made-with: Cursor

* Restore limit support in bottom-placement legend

- Revert to InlineList for bottom placement to preserve
  the series limit feature (useLimit + "show all" button)
- filterAction is prepended before InlineList

Made-with: Cursor

* Add test for toggleAllForKey to fix coverage

- Cover Select all / Deselect all button in FacetedLabelsFilter
- Fixes Functions coverage regression for @grafana/dataviz-squad

Made-with: Cursor

* Update dev dashboard file count in search test

- Account for new timeseries-faceted-labels.json dashboard

Made-with: Cursor

* Update search test snapshot for new dev dashboard

- Add timeseries-faceted-labels to t00-all.json snapshot
- Update totalHits from 16 to 17

Made-with: Cursor

* Update search test snapshots for changed BM25 scores

- Adding a dashboard changes maxDocs which shifts IDF values
- Updated scores in all affected snapshot files

Made-with: Cursor

* Add E2E tests for faceted labels filter

- Test filter toggle, popover sections, name selection
- Test select all, clear all, pin to sidebar
- Test dimmed state when legend click conflicts with filter
- Add data-testid attributes to filter toggle and container

Made-with: Cursor

* Use gf-pin icon and move filter to left of name column

- Replace link icon with gf-pin for Pin to sidebar button
- Move filter toggle to left of name column header in table legend

Made-with: Cursor

* Bump @grafana/scenes to 7.1.5

- Replace canary version with stable 7.1.5 release

Made-with: Cursor

* Exclude node_modules from i18n extraction

- Nested node_modules under packages/ can contain .d.ts files
  that fail to parse, causing extraction to exit with error

Made-with: Cursor

* Add unit tests for PlotLegend faceted filter

- Test filter toggle visibility when enabled/disabled
- Test popover interaction and onToggleSeriesVisibility callback
- Test docked mode with clear all and unpin

Made-with: Cursor
2026-03-12 15:57:58 +01:00
Gonzalo Trigueros Manzanas
aae6b52020 Provisioning: move repository integration tests to its own package (#120183)
* chore: move provisioning repository integ test own package

* chore: fix mixing variable in test
2026-03-12 15:33:56 +01:00
Mihai Turdean
941eeda602 Authz: reduce reconciler memory by streaming diff computation (#120115)
* Authz: reduce reconciler memory by streaming diff computation

Replace the naive approach of loading all current tuples into memory
with a streaming page-by-page diff against the expected tuple map.
Build the expected map directly during CRD translation instead of
creating an intermediate slice. Fix tupleKey() to use field
concatenation instead of protobuf String() which incorrectly
included Condition fields.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Authz: fix condition-change detection in streaming reconciler diff

The streaming diff keyed on (User, Relation, Object) only, so if a
tuple's condition changed the reconciler treated it as "in sync" and
never updated it. Now compare conditions with proto.Equal when a key
matches — mismatches trigger a delete+re-add.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Authz: add configurable read page size and streaming diff tests

Make the Zanzana read page size configurable via zanzana_read_page_size
setting (default 1000). Add comprehensive tests for computeDiffStreaming
covering sync, add, delete, condition change, empty states, and
multi-page scenarios.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 13:59:24 +00:00
Ashley Harrison
4b86fcfb1b Storybook: Add gate step for storybook a11y tests (#120164)
add gate step for storybook a11y tests
2026-03-12 13:43:26 +00:00
Roberto Jiménez Sánchez
6638c09e30 Provisioning: Add job operation metrics (#120147)
* Provisioning: Add job metrics for warnings, file ops, and resource ops

Introduce three new Prometheus metrics to the provisioning jobs package:
- `grafana_provisioning_jobs_warnings` (histogram): distribution of warning
  counts per sync by action and reason
- `grafana_provisioning_jobs_file_operations_total` (counter): file operations
  by action, operation, and reason
- `grafana_provisioning_jobs_resource_operations_total` (counter): resource
  operations by action, operation, reason, group, and kind

Wire the warnings histogram into the pull job via the progress recorder's
new WarningCounts() method, which counts warnings per reason as they are
recorded. The sync worker emits the histogram after each sync using the
actual job action, keeping the metrics generic across job types.

Also add the FolderMetadataConflict error type and warning reason as
plumbing for future conflict detection.

Made-with: Cursor

* Provisioning: Move metrics to driver, add errors histogram, add tests

- Pass *JobMetrics through driver constructors instead of
  SetWarningRecorder on the interface, so every job gets warning/error
  recording automatically without workers opting in.
- Add grafana_provisioning_jobs_errors histogram to track resource error
  count distribution per job run.
- Update metric descriptions to be generic for all job types.
- Add unit tests for FolderMetadataConflict, NewFolderManifest, and
  MissingFolderMetadata error formatting.

Made-with: Cursor

* Provisioning: Switch resource warnings/errors to counters, add resource prefix

- Rename metrics to grafana_provisioning_jobs_resource_warnings_total
  and grafana_provisioning_jobs_resource_errors_total.
- Change from histograms to counters since distribution per job run
  is not needed right now.
- Rename fields and methods to include Resource prefix for clarity.

Made-with: Cursor

* Provisioning: Restore worker_test.go to main (no changes needed)

Made-with: Cursor

* Provisioning: Fix gofmt formatting

Made-with: Cursor

* Provisioning: Emit resource metrics per-Record, remove file_operations metric

Move metric emission from Complete() snapshots to per-Record() Inc() calls,
simplifying the recording API and removing the need for snapshot/nil-guard
logic. Also remove the unused file_operations_total metric and WarningCounts
method.

Made-with: Cursor

* Provisioning: Consolidate resource metrics into single counter

Replace four separate metrics (resource_success_total, resource_warnings_total,
resource_errors_total, resource_operations_total) with a single unified
grafana_provisioning_jobs_resource_operations_total counter using an outcome
label to distinguish success/warning/error.

Made-with: Cursor

* Provisioning: Add typed constants for resource operation and outcome

Move ResourceOutcome and ResourceOperation types from metrics.go to
job_resource_result.go alongside other result types. Add OperationReplaced
constant and fileActionToOperation helper for mapping FileAction values.

Made-with: Cursor

* Provisioning: Use typed JobAction in RecordResourceOperation signature

Accept provisioning.JobAction instead of string for the action parameter.
Add OperationReplaced constant. Use existing provisioning constants in tests.

Made-with: Cursor

* Provisioning: Revert warningCounts back to resultReasons set

With per-Record metric emission we no longer need counts per reason.
Restore the original resultReasons map[string]struct{} from main.

Made-with: Cursor

* Provisioning: Remove trailing newline in progress_test.go

Made-with: Cursor

* Provisioning: Simplify RecordResourceOperation to accept JobResourceResult

Move outcome/operation/reason derivation into RecordResourceOperation so
callers just pass the action and result. Remove emitMetrics helper and
inline the call. Add OperationRenamed constant.

Made-with: Cursor

* Provisioning: Rename OperationNoop to OperationIgnored

Made-with: Cursor
2026-03-12 12:56:36 +00:00
Paul Marbach
8f2f558b88 Datagrid: remove flag and backend code (#119555)
* Datagrid: remove flag and backend code

* make these backend changes

* restore some frontend tests
2026-03-12 08:47:21 -04:00
Rafael Bortolon Paulovic
abe7f7c702 Notifier: fix channelNotifier emitting events out of RV order (#120171)
* Storage: fix channelNotifier emitting events out of RV order

The Watch goroutine reads events from the raw channel one at a time
via select. When the ticker fires, Go's select randomly picks between
the raw channel and the ticker — so a tick can fire while events with
lower RVs are still unread in the channel. This causes partial batches
to be sorted and emitted, producing globally out-of-order output.

Fix by draining all pending events from the raw channel into the buffer
when the ticker fires, before sorting and emitting.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Use for-loop style for drain

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 13:44:12 +01:00
Misi
e0dbb966fc IAM: Add users filtering and improved RBAC mapper for users API (#119100)
* IAM: Add hidden users filtering and improved RBAC mapper for users API

- Add StoreWrapper for user resource that filters hidden users on Get/List
- Wire up StoreWrapper in the users API group registration
- Expand RBAC verb mapping for users to use explicit action translations
- Add integration tests for hidden users filtering behavior

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* IAM: Fix duplicate user validation and storewrapper context propagation

The storewrapper replaced the request context with a service identity
(OrgID=0) before invoking createValidation/updateValidation callbacks.
Since these callbacks wrap k8s admission webhooks (including the
duplicate email/login checks), the validation ran with OrgID=0 causing
SearchOrgUsers to return no results, silently passing duplicates through
to the DB which then returned a 500 instead of 409.

Fix 1 (storewrapper): Add validationWithUserContext and
updateValidationWithUserContext helpers that rebind validation callbacks
to the original user context before passing them to the inner store.

Fix 2 (legacy store): Add toUserConflictError as defense-in-depth that
converts SQLite UNIQUE constraint failures on user.email/user.login into
proper 409 Conflict API errors in CreateUser and UpdateUser.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Regen

* Use configprovider.ConfigProvider instead of setting.Cfg

* Enforce hidden-users restrictions on write operations

BeforeCreate, BeforeUpdate, and BeforeDelete in the user StoreWrapper
now return HTTP 403 when the target user's login is in the hidden-users
list, returning a generic "operation not permitted" message to callers
and logging the hidden-user detail server-side via a structured logger.

Integration tests are updated to create the user before marking it
hidden (so BeforeCreate does not block setup), then verify all four
guarded paths (get→404, list filtered, update→403, delete→403) and
add a dedicated sub-test that confirms create is blocked once a login
is in the hidden list.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* IAM: Add WithPreserveIdentity option to storewrapper

Introduces a WithPreserveIdentity() functional option on storewrapper.New()
so the users storage path passes the original caller identity through to the
inner store instead of replacing it with a service identity. This ensures
admission validation (e.g. duplicate email/login checks) runs with the correct
OrgID. Adds unit tests for the new option.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Address feedback

* Fix some minor issues

* Update pkg/registry/apis/iam/register.go

Co-authored-by: Gabriel MABILLE <gamab@users.noreply.github.com>

* Address feedback

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Gabriel MABILLE <gamab@users.noreply.github.com>
2026-03-12 13:42:22 +01:00
Kristina Demeshchik
01379bae32 Exclude type only imports circular dependencies check (#120075)
* exclude types

* codeowners
2026-03-12 08:37:48 -04:00
Marc M.
1a2c6a834d DynamicDashboards: DRY sidebar lists + enable drop list item on list header (#119754) 2026-03-12 12:37:14 +00:00
Rafael Bortolon Paulovic
eadeeabd1e Unified: stops serving GRPC on server shutdown (#118254) 2026-03-12 13:31:21 +01:00
Marc M.
ebd84e44b0 DynamicDashboards: Fix auto-focus variable name input on creation (#120094) 2026-03-12 13:13:58 +01:00
Adam Yeats
b3038d3b5b Elasticsearch: Fix variable queries broken by empty meta object (#120169)
Elasticsearch: fix variable queries broken by empty meta object
2026-03-12 12:13:56 +00:00
Georges Chaudy
03b4e06128 IAM" Add accesscontrol in TeamSearch (#119107)
* add access to team

* add access to team

* fmt

* yarn gen api

* gen

* yarn generate
2026-03-12 13:11:35 +01:00
Paul Marbach
616f5aafc5 Chore: Remove deprecated DataGrid panel from frontend code (#119152)
* Datagrid: Remove from frontend

* fix mismatch

* toggle doc

* try adding these backend tests back

* these tessts are inherently tied to the frontend it seems

* remove references in CODEOWNERS and auto-triager

* update some more go tests which enforce core plugin stuff

* make gen-jsonnet
2026-03-12 08:05:20 -04:00
Hugo Häggmark
219e4b3907 Security: Upgrade @grafana/llm to 1.0.3 to fix CVE-2026-25536 (#120154) 2026-03-12 12:59:03 +01:00
Rafael Bortolon Paulovic
56756f9167 Broadcaster: fix flaky TestBroadcasterUnsubscribe race (#120167)
* Broadcaster: drain pending subscribes before unsubscribe to fix race

When Subscribe and Unsubscribe are called sequentially, both messages
are buffered in separate channels. Go's select can pick the unsubscribe
before the subscribe, making it a no-op and leaving the subscriber
channel unclosed forever. This caused TestBroadcasterUnsubscribe to
hang for 30 minutes in CI.

Fix by draining all pending subscribe messages before processing an
unsubscribe, since the subscribe is guaranteed to be buffered first.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Restore original comment and simplify drain comment

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 11:46:48 +00:00
Gábor Farkas
5745c0678c Datasources: Disable deprecated numeric id using APIs by default (#119930)
datasources: disable deprecated APIs by default
2026-03-12 12:40:48 +01:00
Gilles De Mey
31a811d873 Alerting: Fix flakey test assertion in notification policies (#120166) 2026-03-12 11:25:49 +00:00
Tom Ratcliffe
ee6e93c8d4 Teams: Conditionally call IAM app platform APIs (#120070) 2026-03-12 11:13:17 +00:00
Sven Grossmann
65f1c3f443 QueryActionAssistantButton: Catch errors from getQueryDisplayText (#120165) 2026-03-12 12:02:58 +01:00
Kevin Minehart Tenorio
83b8d2e49c chore: enable release-build pro dispatch (#120163)
enable release-build pro dispatch
2026-03-12 10:51:52 +00:00
Sergej-Vlasov
3aa5f82cc4 SceneSoloPage: Extract matched scenes solo panel (#120161)
* adjust SoloPanelPage to allow for children and matched panels

* fix: prevent duplicate panel accumulation in SoloPanelContext matchedPanels

Add includes() guard before pushing to matchedPanels array to prevent
the same panel being added multiple times across React re-renders.

---------

Co-authored-by: Ivan Ortega <ivanortegaalba@gmail.com>
2026-03-12 12:37:50 +02:00
Sergej-Vlasov
bdbaa0db31 FeatureToggles: Add sceneCsvExport feature toggles (#120159)
* add sceneCsvExport feature toggle

* lint

* fix autogen files
2026-03-12 12:37:12 +02:00
Hugo Häggmark
7c9c49bcdc e2e: wait for network idle in sandbox tests (#120158) 2026-03-12 11:35:33 +01:00
Kevin Minehart Tenorio
1dd2434f39 chore: add commit sha overrides from env variables in the Makefile (#120155)
Add commit sha overrides from env variables in the Makefile
2026-03-12 11:06:33 +01:00