From edb331dc0047ad51a2ee40ab01155d28a582f620 Mon Sep 17 00:00:00 2001 From: Will Assis <35489495+gassiss@users.noreply.github.com> Date: Wed, 12 Mar 2025 17:00:22 -0300 Subject: [PATCH 001/117] fix(unified-storage): Fix legacysearch returning mismatched cell/column count in response (#102044) Fix legacysearch returning less cells than column count in search response --- pkg/registry/apis/dashboard/legacysearcher/search_client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/registry/apis/dashboard/legacysearcher/search_client.go b/pkg/registry/apis/dashboard/legacysearcher/search_client.go index c80919971c6..c494f547427 100644 --- a/pkg/registry/apis/dashboard/legacysearcher/search_client.go +++ b/pkg/registry/apis/dashboard/legacysearcher/search_client.go @@ -253,7 +253,7 @@ func (c *DashboardSearchClient) Search(ctx context.Context, req *resource.Resour Key: getResourceKey(&dashboards.DashboardSearchProjection{ UID: dashboard.UID, }, req.Options.Key.Namespace), - Cells: [][]byte{[]byte(dashboard.Title), []byte(dashboard.FolderUID), {}, {}}, + Cells: [][]byte{[]byte(dashboard.Title), []byte(dashboard.FolderUID), []byte(strconv.FormatInt(dashboard.ID, 10)), {}, {}}, }) } From 3e1513a6df3945cd573beb19480791904184256f Mon Sep 17 00:00:00 2001 From: Pepe Cano <825430+ppcano@users.noreply.github.com> Date: Wed, 12 Mar 2025 21:51:39 +0100 Subject: [PATCH 002/117] docs(alerting): alert instance state resets when rule changes (#102038) * docs(alerting): alert instance state resets when rule changes * specify that annotations updates are not affected * enumerate exception fields --- .../fundamentals/alert-rule-evaluation/state-and-health.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/sources/alerting/fundamentals/alert-rule-evaluation/state-and-health.md b/docs/sources/alerting/fundamentals/alert-rule-evaluation/state-and-health.md index 4c871e2d6e7..5438c8c377b 100644 --- a/docs/sources/alerting/fundamentals/alert-rule-evaluation/state-and-health.md +++ b/docs/sources/alerting/fundamentals/alert-rule-evaluation/state-and-health.md @@ -52,14 +52,16 @@ An alert instance can be in either of the following states: | **No Data\*** | The state of an alert whose query returns no data or all values are null.
An alert in this state generates a new [DatasourceNoData alert](#no-data-and-error-alerts). You can [modify the default behavior of the no data state](#modify-the-no-data-or-error-state). | | **Error\*** | The state of an alert when an error or timeout occurred evaluating the alert rule.
An alert in this state generates a new [DatasourceError alert](#no-data-and-error-alerts). You can [modify the default behavior of the error state](#modify-the-no-data-or-error-state). | +If an alert rule changes (except for updates to annotations, the evaluation interval, or other internal fields), its alert instances reset to the `Normal` state. The alert instance state then updates accordingly during the next evaluation. + +{{< figure src="/media/docs/alerting/alert-instance-states-v3.png" caption="Alert instance state diagram" alt="A diagram of the distinct alert instance states and transitions." max-width="750px" >}} + {{< admonition type="note" >}} `No Data` and `Error` states are supported only for Grafana-managed alert rules. {{< /admonition >}} -{{< figure src="/media/docs/alerting/alert-instance-states-v3.png" caption="Alert instance state diagram" alt="A diagram of the distinct alert instance states and transitions." max-width="750px" >}} - ### Notification routing Alert instances will be routed for [notifications](ref:notifications) when they are in the `Alerting` state or have been `Resolved`, transitioning from `Alerting` to `Normal` state. From 64b65ffc72c65bd595a12f5d1db17d84c04386e3 Mon Sep 17 00:00:00 2001 From: Pepe Cano <825430+ppcano@users.noreply.github.com> Date: Wed, 12 Mar 2025 22:04:26 +0100 Subject: [PATCH 003/117] docs(alerting): minor enhancements to intro concepts and example (#102023) * docs(alerting): minor enhancements to intro concepts and example * Update docs/sources/alerting/fundamentals/alert-rules/annotation-label.md Co-authored-by: Johnny Kartheiser <140559259+JohnnyK-Grafana@users.noreply.github.com> --------- Co-authored-by: Johnny Kartheiser <140559259+JohnnyK-Grafana@users.noreply.github.com> --- .../alerting-rules/templates/_index.md | 2 +- .../alert-rules/annotation-label.md | 2 ++ .../alerting/fundamentals/templates.md | 19 +++++++++---------- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/docs/sources/alerting/alerting-rules/templates/_index.md b/docs/sources/alerting/alerting-rules/templates/_index.md index f6da85e1977..cb12bf47513 100644 --- a/docs/sources/alerting/alerting-rules/templates/_index.md +++ b/docs/sources/alerting/alerting-rules/templates/_index.md @@ -176,7 +176,7 @@ Template labels when the labels returned by your queries are insufficient. For i Here’s an example of templating a `severity` label based on the query value. -``` +```go {{ if (gt $values.A.Value 90.0) -}} critical {{ else if (gt $values.A.Value 80.0) -}} diff --git a/docs/sources/alerting/fundamentals/alert-rules/annotation-label.md b/docs/sources/alerting/fundamentals/alert-rules/annotation-label.md index 41d3c4c0220..ade6b016049 100644 --- a/docs/sources/alerting/fundamentals/alert-rules/annotation-label.md +++ b/docs/sources/alerting/fundamentals/alert-rules/annotation-label.md @@ -136,6 +136,8 @@ If multiple label keys are sanitized to the same value, the duplicates have a sh Annotations add additional information to alert instances, helping responders identify and address potential issues. +Create clear and self-explanatory annotations so that first responders can investigate without needing deeper knowledge of the alert setup. + Annotations are displayed in Grafana and are included by default in notifications. Grafana provides several optional annotations that you can edit: - `summary`: A short summary of what the alert has detected and why. diff --git a/docs/sources/alerting/fundamentals/templates.md b/docs/sources/alerting/fundamentals/templates.md index 3b2fa4de8c5..4e4243aee9c 100644 --- a/docs/sources/alerting/fundamentals/templates.md +++ b/docs/sources/alerting/fundamentals/templates.md @@ -63,6 +63,7 @@ In Grafana, you have various options to template your alert notification message - Labels are used to differentiate an alert instance from all other alert instances. - Template labels to add an additional label based on a query value, or when the labels from the query are incomplete or not descriptive enough. + - Avoid displaying query values in labels as this can create numerous alert instances—use annotations instead. 1. [Notification templates](#template-notifications) - Notification templates are used by contact points for consistent messaging in notification titles and descriptions. @@ -124,18 +125,16 @@ You can also template labels based on query results. This is helpful if the labe - Add a new label to change how alerts are identified and grouped into different alert groups. - Add a new label used by notification policies or silences to manage how the alert is handled. -Here’s an example of templating a `severity` label based on the query value: +Here’s an example of templating a new `env` label based on the value of a query label: ```go -{{ if (gt $values.A.Value 90.0) -}} -critical -{{ else if (gt $values.A.Value 80.0) -}} -high -{{ else if (gt $values.A.Value 60.0) -}} -medium -{{ else -}} -low -{{- end }} +{{- if eq $labels.instance "prod-server-1" -}} +production +{{- else if eq $labels.instance "staging-server-1" -}} +staging +{{- else -}} +development +{{- end -}} ``` For more details on how to template labels, refer to [Template annotations and labels](ref:templating-labels-annotations). From 56293d801943454ac7fcd1e6c7d85bf5884e8d76 Mon Sep 17 00:00:00 2001 From: owensmallwood Date: Wed, 12 Mar 2025 18:08:56 -0600 Subject: [PATCH 004/117] Revert "Revert "Unified Storage: Use match all query instead of wildcard for not-in requirement query"" (#102074) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Revert "Revert "Unified Storage: Use match all query instead of wildcard for …" This reverts commit 4d9bcc6c440acf82dfdd95ea27948f3c8180a700. --- pkg/storage/unified/search/bleve.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/storage/unified/search/bleve.go b/pkg/storage/unified/search/bleve.go index 630c9832315..322abff0516 100644 --- a/pkg/storage/unified/search/bleve.go +++ b/pkg/storage/unified/search/bleve.go @@ -803,7 +803,7 @@ func requirementQuery(req *resource.Requirement, prefix string) (query.Query, *r boolQuery.AddMustNot(mustNotQueries...) // must still have a value - notEmptyQuery := bleve.NewWildcardQuery("*") + notEmptyQuery := bleve.NewMatchAllQuery() boolQuery.AddMust(notEmptyQuery) return boolQuery, nil From 2dca2503b992a89a57b61b0e09de088bee9dfca7 Mon Sep 17 00:00:00 2001 From: "grafana-pr-automation[bot]" <140550294+grafana-pr-automation[bot]@users.noreply.github.com> Date: Thu, 13 Mar 2025 02:31:13 +0200 Subject: [PATCH 005/117] I18n: Download translations from Crowdin (#102076) New Crowdin translations by GitHub Action Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- public/locales/cs-CZ/grafana.json | 3 +++ public/locales/de-DE/grafana.json | 3 +++ public/locales/es-ES/grafana.json | 3 +++ public/locales/fr-FR/grafana.json | 3 +++ public/locales/hu-HU/grafana.json | 3 +++ public/locales/id-ID/grafana.json | 3 +++ public/locales/it-IT/grafana.json | 3 +++ public/locales/ja-JP/grafana.json | 3 +++ public/locales/ko-KR/grafana.json | 3 +++ public/locales/nl-NL/grafana.json | 3 +++ public/locales/pl-PL/grafana.json | 3 +++ public/locales/pt-BR/grafana.json | 3 +++ public/locales/pt-PT/grafana.json | 3 +++ public/locales/ru-RU/grafana.json | 3 +++ public/locales/sv-SE/grafana.json | 3 +++ public/locales/tr-TR/grafana.json | 3 +++ public/locales/zh-Hans/grafana.json | 3 +++ public/locales/zh-Hant/grafana.json | 3 +++ 18 files changed, 54 insertions(+) diff --git a/public/locales/cs-CZ/grafana.json b/public/locales/cs-CZ/grafana.json index eda5329aff4..59e3cfc998b 100644 --- a/public/locales/cs-CZ/grafana.json +++ b/public/locales/cs-CZ/grafana.json @@ -1025,6 +1025,9 @@ } }, "dashboard": { + "actions": { + "open-settings": "" + }, "add-menu": { "import": "", "paste-panel": "", diff --git a/public/locales/de-DE/grafana.json b/public/locales/de-DE/grafana.json index dac2fef8922..cf03a0f966e 100644 --- a/public/locales/de-DE/grafana.json +++ b/public/locales/de-DE/grafana.json @@ -1007,6 +1007,9 @@ } }, "dashboard": { + "actions": { + "open-settings": "" + }, "add-menu": { "import": "Aus Bibliothek importieren", "paste-panel": "Panel einfügen", diff --git a/public/locales/es-ES/grafana.json b/public/locales/es-ES/grafana.json index dee14dc57cc..8f66fa81185 100644 --- a/public/locales/es-ES/grafana.json +++ b/public/locales/es-ES/grafana.json @@ -1007,6 +1007,9 @@ } }, "dashboard": { + "actions": { + "open-settings": "" + }, "add-menu": { "import": "Importar de la biblioteca", "paste-panel": "Pegar panel", diff --git a/public/locales/fr-FR/grafana.json b/public/locales/fr-FR/grafana.json index f7e3ce2684b..35687ea4242 100644 --- a/public/locales/fr-FR/grafana.json +++ b/public/locales/fr-FR/grafana.json @@ -1007,6 +1007,9 @@ } }, "dashboard": { + "actions": { + "open-settings": "" + }, "add-menu": { "import": "Importer depuis la bibliothèque", "paste-panel": "Coller le panneau", diff --git a/public/locales/hu-HU/grafana.json b/public/locales/hu-HU/grafana.json index 19430667f64..1d5359a25d1 100644 --- a/public/locales/hu-HU/grafana.json +++ b/public/locales/hu-HU/grafana.json @@ -1007,6 +1007,9 @@ } }, "dashboard": { + "actions": { + "open-settings": "" + }, "add-menu": { "import": "", "paste-panel": "", diff --git a/public/locales/id-ID/grafana.json b/public/locales/id-ID/grafana.json index 7821be91c18..e8239d9d29c 100644 --- a/public/locales/id-ID/grafana.json +++ b/public/locales/id-ID/grafana.json @@ -998,6 +998,9 @@ } }, "dashboard": { + "actions": { + "open-settings": "" + }, "add-menu": { "import": "", "paste-panel": "", diff --git a/public/locales/it-IT/grafana.json b/public/locales/it-IT/grafana.json index 19430667f64..1d5359a25d1 100644 --- a/public/locales/it-IT/grafana.json +++ b/public/locales/it-IT/grafana.json @@ -1007,6 +1007,9 @@ } }, "dashboard": { + "actions": { + "open-settings": "" + }, "add-menu": { "import": "", "paste-panel": "", diff --git a/public/locales/ja-JP/grafana.json b/public/locales/ja-JP/grafana.json index 7821be91c18..e8239d9d29c 100644 --- a/public/locales/ja-JP/grafana.json +++ b/public/locales/ja-JP/grafana.json @@ -998,6 +998,9 @@ } }, "dashboard": { + "actions": { + "open-settings": "" + }, "add-menu": { "import": "", "paste-panel": "", diff --git a/public/locales/ko-KR/grafana.json b/public/locales/ko-KR/grafana.json index 7821be91c18..e8239d9d29c 100644 --- a/public/locales/ko-KR/grafana.json +++ b/public/locales/ko-KR/grafana.json @@ -998,6 +998,9 @@ } }, "dashboard": { + "actions": { + "open-settings": "" + }, "add-menu": { "import": "", "paste-panel": "", diff --git a/public/locales/nl-NL/grafana.json b/public/locales/nl-NL/grafana.json index 19430667f64..1d5359a25d1 100644 --- a/public/locales/nl-NL/grafana.json +++ b/public/locales/nl-NL/grafana.json @@ -1007,6 +1007,9 @@ } }, "dashboard": { + "actions": { + "open-settings": "" + }, "add-menu": { "import": "", "paste-panel": "", diff --git a/public/locales/pl-PL/grafana.json b/public/locales/pl-PL/grafana.json index eda5329aff4..59e3cfc998b 100644 --- a/public/locales/pl-PL/grafana.json +++ b/public/locales/pl-PL/grafana.json @@ -1025,6 +1025,9 @@ } }, "dashboard": { + "actions": { + "open-settings": "" + }, "add-menu": { "import": "", "paste-panel": "", diff --git a/public/locales/pt-BR/grafana.json b/public/locales/pt-BR/grafana.json index 5a281c2145e..5b9c466b56e 100644 --- a/public/locales/pt-BR/grafana.json +++ b/public/locales/pt-BR/grafana.json @@ -1007,6 +1007,9 @@ } }, "dashboard": { + "actions": { + "open-settings": "" + }, "add-menu": { "import": "Importar da biblioteca", "paste-panel": "Colar painel", diff --git a/public/locales/pt-PT/grafana.json b/public/locales/pt-PT/grafana.json index 19430667f64..1d5359a25d1 100644 --- a/public/locales/pt-PT/grafana.json +++ b/public/locales/pt-PT/grafana.json @@ -1007,6 +1007,9 @@ } }, "dashboard": { + "actions": { + "open-settings": "" + }, "add-menu": { "import": "", "paste-panel": "", diff --git a/public/locales/ru-RU/grafana.json b/public/locales/ru-RU/grafana.json index eda5329aff4..59e3cfc998b 100644 --- a/public/locales/ru-RU/grafana.json +++ b/public/locales/ru-RU/grafana.json @@ -1025,6 +1025,9 @@ } }, "dashboard": { + "actions": { + "open-settings": "" + }, "add-menu": { "import": "", "paste-panel": "", diff --git a/public/locales/sv-SE/grafana.json b/public/locales/sv-SE/grafana.json index 19430667f64..1d5359a25d1 100644 --- a/public/locales/sv-SE/grafana.json +++ b/public/locales/sv-SE/grafana.json @@ -1007,6 +1007,9 @@ } }, "dashboard": { + "actions": { + "open-settings": "" + }, "add-menu": { "import": "", "paste-panel": "", diff --git a/public/locales/tr-TR/grafana.json b/public/locales/tr-TR/grafana.json index 19430667f64..1d5359a25d1 100644 --- a/public/locales/tr-TR/grafana.json +++ b/public/locales/tr-TR/grafana.json @@ -1007,6 +1007,9 @@ } }, "dashboard": { + "actions": { + "open-settings": "" + }, "add-menu": { "import": "", "paste-panel": "", diff --git a/public/locales/zh-Hans/grafana.json b/public/locales/zh-Hans/grafana.json index bf7cbd6980c..e86e0e71840 100644 --- a/public/locales/zh-Hans/grafana.json +++ b/public/locales/zh-Hans/grafana.json @@ -998,6 +998,9 @@ } }, "dashboard": { + "actions": { + "open-settings": "" + }, "add-menu": { "import": "从库导入", "paste-panel": "粘贴面板", diff --git a/public/locales/zh-Hant/grafana.json b/public/locales/zh-Hant/grafana.json index 7821be91c18..e8239d9d29c 100644 --- a/public/locales/zh-Hant/grafana.json +++ b/public/locales/zh-Hant/grafana.json @@ -998,6 +998,9 @@ } }, "dashboard": { + "actions": { + "open-settings": "" + }, "add-menu": { "import": "", "paste-panel": "", From 0f45f2696ec3a6558492ebb87bc9881fec623837 Mon Sep 17 00:00:00 2001 From: Bogdan Matei Date: Thu, 13 Mar 2025 09:25:55 +0200 Subject: [PATCH 006/117] Dashboards: Add conditional rendering (#100330) * Dashboards: Add conditional rendering * Updates * Fixes * Code improvements * Code improvements * limit condition choices, add delete and clean up ui * add basic variable condition * add conditional rendering based on time range interval * adjust failing test * remove deprecated pseudo locale file * extract conditional rendering from behaviour to state property * clean up behaviour initialisation * clean up ts errors * adjust data condition to account for RowItem * Fix subscribes * notify change when deleting condition * fix hidden row item error * address comments * subscribe to panel data change in data condition * Remove loop labels --------- Co-authored-by: Sergej-Vlasov Co-authored-by: oscarkilhed --- .../ElementSelectionContext.tsx | 12 +- packages/grafana-ui/src/components/index.ts | 1 + .../src/themes/GlobalStyles/dashboardGrid.ts | 8 + .../conditional-rendering/ConditionHeader.tsx | 20 +++ .../ConditionalRendering.tsx | 45 +++++ .../ConditionalRenderingBase.tsx | 61 +++++++ .../ConditionalRenderingData.tsx | 139 +++++++++++++++ .../ConditionalRenderingEditor.tsx | 24 +++ .../ConditionalRenderingGroup.tsx | 159 ++++++++++++++++++ .../ConditionalRenderingInterval.tsx | 83 +++++++++ .../ConditionalRenderingVariable.tsx | 126 ++++++++++++++ .../conditional-rendering/shared.ts | 25 +++ .../edit-pane/DashboardEditPane.tsx | 1 + .../DefaultGridLayoutManager.tsx | 4 +- .../row-actions/RowActionsRenderer.tsx | 6 +- .../ResponsiveGridItem.tsx | 12 +- .../ResponsiveGridItemEditor.tsx | 51 +----- .../ResponsiveGridItemRenderer.tsx | 16 +- .../scene/layout-rows/RowItem.tsx | 17 +- .../scene/layout-rows/RowItemEditor.tsx | 23 ++- .../scene/layout-rows/RowItemRenderer.tsx | 47 ++++-- .../features/dashboard-scene/utils/clone.ts | 11 ++ .../features/dashboard-scene/utils/utils.ts | 45 ++++- public/locales/en-US/grafana.json | 50 ++++-- 24 files changed, 894 insertions(+), 92 deletions(-) create mode 100644 public/app/features/dashboard-scene/conditional-rendering/ConditionHeader.tsx create mode 100644 public/app/features/dashboard-scene/conditional-rendering/ConditionalRendering.tsx create mode 100644 public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingBase.tsx create mode 100644 public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingData.tsx create mode 100644 public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingEditor.tsx create mode 100644 public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingGroup.tsx create mode 100644 public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingInterval.tsx create mode 100644 public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingVariable.tsx create mode 100644 public/app/features/dashboard-scene/conditional-rendering/shared.ts diff --git a/packages/grafana-ui/src/components/ElementSelectionContext/ElementSelectionContext.tsx b/packages/grafana-ui/src/components/ElementSelectionContext/ElementSelectionContext.tsx index 2e6b1b9fd46..8ba48a7eeda 100644 --- a/packages/grafana-ui/src/components/ElementSelectionContext/ElementSelectionContext.tsx +++ b/packages/grafana-ui/src/components/ElementSelectionContext/ElementSelectionContext.tsx @@ -9,6 +9,7 @@ export interface ElementSelectionContextState { /** List of currently selected elements */ selected: ElementSelectionContextItem[]; onSelect: (item: ElementSelectionContextItem, multi?: boolean) => void; + onClear: () => void; } export interface ElementSelectionContextItem { @@ -21,6 +22,7 @@ export interface UseElementSelectionResult { isSelected?: boolean; isSelectable?: boolean; onSelect?: (evt: React.PointerEvent) => void; + onClear?: () => void; } export function useElementSelection(id: string | undefined): UseElementSelectionResult { @@ -48,5 +50,13 @@ export function useElementSelection(id: string | undefined): UseElementSelection [context, id] ); - return { isSelected, onSelect, isSelectable: context.enabled }; + const onClear = useCallback(() => { + if (!context.enabled) { + return; + } + + context.onClear(); + }, [context]); + + return { isSelected, onSelect, onClear, isSelectable: context.enabled }; } diff --git a/packages/grafana-ui/src/components/index.ts b/packages/grafana-ui/src/components/index.ts index cdfe02e32b6..af030e6a0fb 100644 --- a/packages/grafana-ui/src/components/index.ts +++ b/packages/grafana-ui/src/components/index.ts @@ -336,4 +336,5 @@ export { useElementSelection, type ElementSelectionContextState, type ElementSelectionContextItem, + type UseElementSelectionResult, } from './ElementSelectionContext/ElementSelectionContext'; diff --git a/packages/grafana-ui/src/themes/GlobalStyles/dashboardGrid.ts b/packages/grafana-ui/src/themes/GlobalStyles/dashboardGrid.ts index 6a87fad092c..144dbfa3b79 100644 --- a/packages/grafana-ui/src/themes/GlobalStyles/dashboardGrid.ts +++ b/packages/grafana-ui/src/themes/GlobalStyles/dashboardGrid.ts @@ -82,5 +82,13 @@ export function getDashboardGridStyles(theme: GrafanaTheme2) { backgroundColor: theme.colors.emphasize(theme.colors.background.canvas, 0.08), }, }, + + '.dashboard-visible-hidden-element': { + opacity: 0.6, + + '&:hover': { + opacity: 1, + }, + }, }); } diff --git a/public/app/features/dashboard-scene/conditional-rendering/ConditionHeader.tsx b/public/app/features/dashboard-scene/conditional-rendering/ConditionHeader.tsx new file mode 100644 index 00000000000..0112e96334e --- /dev/null +++ b/public/app/features/dashboard-scene/conditional-rendering/ConditionHeader.tsx @@ -0,0 +1,20 @@ +import { IconButton, Stack, Text } from '@grafana/ui'; +import { t } from 'app/core/internationalization'; + +type Props = { + title: string; + onDelete: () => void; +}; + +export const ConditionHeader = ({ title, onDelete }: Props) => { + return ( + + {title} + onDelete()} + /> + + ); +}; diff --git a/public/app/features/dashboard-scene/conditional-rendering/ConditionalRendering.tsx b/public/app/features/dashboard-scene/conditional-rendering/ConditionalRendering.tsx new file mode 100644 index 00000000000..50770dcce9a --- /dev/null +++ b/public/app/features/dashboard-scene/conditional-rendering/ConditionalRendering.tsx @@ -0,0 +1,45 @@ +import { SceneComponentProps, SceneObjectBase, SceneObjectState } from '@grafana/scenes'; + +import { ConditionalRenderingGroup } from './ConditionalRenderingGroup'; + +export interface ConditionalRenderingState extends SceneObjectState { + rootGroup: ConditionalRenderingGroup; +} + +export class ConditionalRendering extends SceneObjectBase { + public static Component = ConditionalRenderingRenderer; + + public constructor(state: ConditionalRenderingState) { + super(state); + + this.addActivationHandler(() => this._activationHandler()); + } + + private _activationHandler() { + // This ensures that all children are activated when conditional rendering is activated + // We need this in order to allow children to subscribe to variable changes etc. + this.forEachChild((child) => { + if (!child.isActive) { + this._subs.add(child.activate()); + } + }); + } + + public evaluate(): boolean { + return this.state.rootGroup.evaluate(); + } + + public notifyChange() { + this.parent?.forceRender(); + } + + public static createEmpty(): ConditionalRendering { + return new ConditionalRendering({ rootGroup: ConditionalRenderingGroup.createEmpty() }); + } +} + +function ConditionalRenderingRenderer({ model }: SceneComponentProps) { + const { rootGroup } = model.useState(); + + return ; +} diff --git a/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingBase.tsx b/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingBase.tsx new file mode 100644 index 00000000000..6fbbd1a83af --- /dev/null +++ b/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingBase.tsx @@ -0,0 +1,61 @@ +import { ReactNode } from 'react'; + +import { SceneComponentProps, sceneGraph, SceneObjectBase, SceneObjectState } from '@grafana/scenes'; + +import { ConditionalRendering } from './ConditionalRendering'; +import { ConditionalRenderingGroup } from './ConditionalRenderingGroup'; +import { ConditionValues } from './shared'; + +export interface ConditionalRenderingBaseState extends SceneObjectState { + value: V; +} + +export abstract class ConditionalRenderingBase< + S extends ConditionalRenderingBaseState, +> extends SceneObjectBase { + public static Component = ConditionalRenderingBaseRenderer; + + public constructor(state: S) { + super(state); + + this.addActivationHandler(() => this._baseActivationHandler()); + } + + private _baseActivationHandler() { + // Similarly to the ConditionalRendering activation handler, + // this ensures that all children are activated when conditional rendering is activated + // We need this in order to allow children to subscribe to variable changes etc. + this.forEachChild((child) => { + if (!child.isActive) { + this._subs.add(child.activate()); + } + }); + } + + public abstract readonly title: string; + + public abstract evaluate(): boolean; + + public abstract render(): ReactNode; + + public abstract onDelete(): void; + + public getConditionalLogicRoot(): ConditionalRendering { + return sceneGraph.getAncestor(this, ConditionalRendering); + } + + public getRootGroup(): ConditionalRenderingGroup { + return this.getConditionalLogicRoot().state.rootGroup; + } + + public setStateAndNotify(state: Partial) { + this.setState(state); + this.getConditionalLogicRoot().notifyChange(); + } +} + +function ConditionalRenderingBaseRenderer({ + model, +}: SceneComponentProps>) { + return model.render(); +} diff --git a/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingData.tsx b/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingData.tsx new file mode 100644 index 00000000000..e95b5f45b18 --- /dev/null +++ b/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingData.tsx @@ -0,0 +1,139 @@ +import { ReactNode, useMemo } from 'react'; + +import { PanelData, SelectableValue } from '@grafana/data'; +import { SceneComponentProps, SceneDataProvider, sceneGraph } from '@grafana/scenes'; +import { RadioButtonGroup, Stack } from '@grafana/ui'; +import { t } from 'app/core/internationalization'; + +import { ResponsiveGridItem } from '../scene/layout-responsive-grid/ResponsiveGridItem'; +import { RowItem } from '../scene/layout-rows/RowItem'; + +import { ConditionHeader } from './ConditionHeader'; +import { ConditionalRenderingBase, ConditionalRenderingBaseState } from './ConditionalRenderingBase'; +import { handleDeleteNonGroupCondition } from './shared'; + +export type DataConditionValue = boolean; + +type ConditionalRenderingDataState = ConditionalRenderingBaseState; + +export class ConditionalRenderingData extends ConditionalRenderingBase { + public get title(): string { + return t('dashboard.conditional-rendering.data.label', 'Data'); + } + + public constructor(state: ConditionalRenderingDataState) { + super(state); + + this.addActivationHandler(() => this._activationHandler()); + } + + private _activationHandler() { + let panelDataProviders: SceneDataProvider[] = []; + const item = this.getConditionalLogicRoot().parent; + if (item instanceof ResponsiveGridItem) { + const panelData = sceneGraph.getData(item.state.body); + if (panelData) { + panelDataProviders.push(panelData); + } + } + // extract multiple panel data from RowItem + if (item instanceof RowItem) { + const panels = item.getLayout().getVizPanels(); + for (const panel of panels) { + const panelData = sceneGraph.getData(panel); + if (panelData) { + panelDataProviders.push(panelData); + } + } + } + panelDataProviders.forEach((d) => { + this._subs.add( + d.subscribeToState(() => { + this.getConditionalLogicRoot().notifyChange(); + }) + ); + }); + } + + public evaluate(): boolean { + const { value } = this.state; + + // enable/disable condition + if (!value) { + return true; + } + + let data: PanelData[] = []; + + // get ResponsiveGridItem or RowItem + const item = this.getConditionalLogicRoot().parent; + + // extract single panel data from ResponsiveGridItem + if (item instanceof ResponsiveGridItem) { + const panelData = sceneGraph.getData(item.state.body).state.data; + if (panelData) { + data.push(panelData); + } + } + + // extract multiple panel data from RowItem + if (item instanceof RowItem) { + const panels = item.getLayout().getVizPanels(); + for (const panel of panels) { + const panelData = sceneGraph.getData(panel).state.data; + if (panelData) { + data.push(panelData); + } + } + } + + // early return if no panel data + if (!data.length) { + return false; + } + + for (let panelDataIdx = 0; panelDataIdx < data.length; panelDataIdx++) { + const series = data[panelDataIdx]?.series ?? []; + + for (let seriesIdx = 0; seriesIdx < series.length; seriesIdx++) { + if (series[seriesIdx].length > 0) { + return true; + } + } + } + + return false; + } + + public render(): ReactNode { + return ; + } + + public onDelete() { + handleDeleteNonGroupCondition(this); + } +} + +function ConditionalRenderingDataRenderer({ model }: SceneComponentProps) { + const { value } = model.useState(); + + const enableConditionOptions: Array> = useMemo( + () => [ + { label: t('dashboard.conditional-rendering.data.enable', 'Enable'), value: true }, + { label: t('dashboard.conditional-rendering.data.disable', 'Disable'), value: false }, + ], + [] + ); + + return ( + + model.onDelete()} /> + model.setStateAndNotify({ value: value })} + /> + + ); +} diff --git a/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingEditor.tsx b/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingEditor.tsx new file mode 100644 index 00000000000..510f3c50d0d --- /dev/null +++ b/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingEditor.tsx @@ -0,0 +1,24 @@ +import { t } from 'app/core/internationalization'; +import { OptionsPaneCategoryDescriptor } from 'app/features/dashboard/components/PanelEditor/OptionsPaneCategoryDescriptor'; +import { OptionsPaneItemDescriptor } from 'app/features/dashboard/components/PanelEditor/OptionsPaneItemDescriptor'; + +import { ConditionalRendering } from './ConditionalRendering'; + +export function useConditionalRenderingEditor( + conditionalRendering?: ConditionalRendering +): OptionsPaneCategoryDescriptor | null { + if (!conditionalRendering) { + return null; + } + + return new OptionsPaneCategoryDescriptor({ + title: t('dashboard.conditional-rendering.title', 'Conditional rendering options'), + id: 'conditional-rendering-options', + isOpenDefault: true, + }).addItem( + new OptionsPaneItemDescriptor({ + title: t('dashboard.conditional-rendering.title', 'Conditional rendering options'), + render: () => , + }) + ); +} diff --git a/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingGroup.tsx b/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingGroup.tsx new file mode 100644 index 00000000000..45f4edd92ca --- /dev/null +++ b/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingGroup.tsx @@ -0,0 +1,159 @@ +import { css } from '@emotion/css'; +import { Fragment, ReactNode, useMemo } from 'react'; + +import { GrafanaTheme2, SelectableValue } from '@grafana/data'; +import { SceneComponentProps } from '@grafana/scenes'; +import { Divider, Dropdown, Field, Menu, RadioButtonGroup, Stack, ToolbarButton, useStyles2 } from '@grafana/ui'; +import { t, Trans } from 'app/core/internationalization'; + +import { ConditionHeader } from './ConditionHeader'; +import { ConditionalRenderingBase, ConditionalRenderingBaseState } from './ConditionalRenderingBase'; +import { ConditionalRenderingData } from './ConditionalRenderingData'; +import { ConditionalRenderingInterval } from './ConditionalRenderingInterval'; +import { ConditionalRenderingVariable } from './ConditionalRenderingVariable'; +import { ConditionalRenderingConditions } from './shared'; + +export type GroupConditionValue = ConditionalRenderingConditions[]; +export interface ConditionalRenderingGroupState extends ConditionalRenderingBaseState { + condition: 'and' | 'or'; +} + +export class ConditionalRenderingGroup extends ConditionalRenderingBase { + public get title(): string { + return t('dashboard.conditional-rendering.group.label', 'Group'); + } + + public evaluate(): boolean { + if (this.state.value.length === 0) { + return true; + } + + if (this.state.condition === 'and') { + return this.state.value.every((entry) => entry.evaluate()); + } + + return this.state.value.some((entry) => entry.evaluate()); + } + + public render(): ReactNode { + return ; + } + + public changeCondition(condition: 'and' | 'or') { + this.setStateAndNotify({ condition }); + } + + public addItem(item: ConditionalRenderingConditions) { + // We don't use `setStateAndNotify` here because + // We need to set a parent and activate the new condition before notifying the root + this.setState({ value: [...this.state.value, item] }); + + if (this.isActive && !item.isActive) { + item.activate(); + } + + this.getConditionalLogicRoot().notifyChange(); + } + + public static createEmpty(): ConditionalRenderingGroup { + return new ConditionalRenderingGroup({ condition: 'and', value: [] }); + } + + public onDelete() { + const rootGroup = this.getRootGroup(); + if (this === rootGroup) { + this.getConditionalLogicRoot().setState({ rootGroup: ConditionalRenderingGroup.createEmpty() }); + } else { + rootGroup.setState({ value: rootGroup.state.value.filter((condition) => condition !== this) }); + } + this.getConditionalLogicRoot().notifyChange(); + } +} + +function ConditionalRenderingGroupRenderer({ model }: SceneComponentProps) { + const styles = useStyles2(getStyles); + const { condition, value } = model.useState(); + + const conditionsOptions: Array> = useMemo( + () => [ + { label: t('dashboard.conditional-rendering.group.condition.meet-all', 'Meet all'), value: 'and' }, + { label: t('dashboard.conditional-rendering.group.condition.meet-any', 'Meet any'), value: 'or' }, + ], + [] + ); + + return ( + + model.onDelete()} /> + + model.changeCondition(value!)} + /> + + + + + {value.map((entry) => ( + + {/* @ts-expect-error */} + + +
+ +

{condition}

+ +
+
+ ))} + +
+ + model.addItem(new ConditionalRenderingData({ value: true }))} + /> + model.addItem(new ConditionalRenderingInterval({ value: '7d' }))} + /> + + model.addItem(new ConditionalRenderingVariable({ value: { name: '', operator: '=', value: '' } })) + } + /> + + } + > + + Add condition based on + + +
+
+ ); +} + +const getStyles = (theme: GrafanaTheme2) => ({ + entryDivider: css({ + display: 'flex', + flexDirection: 'row', + alignItems: 'center', + }), + entryDividerText: css({ + margin: 0, + padding: theme.spacing(0, 2), + textTransform: 'capitalize', + }), + addButtonContainer: css({ + display: 'flex', + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'center', + }), +}); diff --git a/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingInterval.tsx b/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingInterval.tsx new file mode 100644 index 00000000000..8454fa627f5 --- /dev/null +++ b/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingInterval.tsx @@ -0,0 +1,83 @@ +import { ReactNode, useState } from 'react'; + +import { rangeUtil } from '@grafana/data'; +import { SceneComponentProps, sceneGraph } from '@grafana/scenes'; +import { Field, Input, Stack } from '@grafana/ui'; +import { t } from 'app/core/internationalization'; + +import { ConditionHeader } from './ConditionHeader'; +import { ConditionalRenderingBase, ConditionalRenderingBaseState } from './ConditionalRenderingBase'; +import { handleDeleteNonGroupCondition } from './shared'; + +export type IntervalConditionValue = string; +type ConditionalRenderingIntervalState = ConditionalRenderingBaseState; + +export class ConditionalRenderingInterval extends ConditionalRenderingBase { + public get title(): string { + return t('dashboard.conditional-rendering.interval.label', 'Time range interval'); + } + + public constructor(state: ConditionalRenderingIntervalState) { + super(state); + + this.addActivationHandler(() => this._activationHandler()); + } + + private _activationHandler() { + this._subs.add( + sceneGraph.getTimeRange(this).subscribeToState(() => { + this.getConditionalLogicRoot().notifyChange(); + }) + ); + } + + public evaluate(): boolean { + try { + const interval = rangeUtil.intervalToSeconds(this.state.value); + + const timeRange = sceneGraph.getTimeRange(this); + + if (timeRange.state.value.to.unix() - timeRange.state.value.from.unix() <= interval) { + return true; + } + } catch { + return false; + } + + return false; + } + + public render(): ReactNode { + return ; + } + + public onDelete() { + handleDeleteNonGroupCondition(this); + } +} + +function ConditionalRenderingIntervalRenderer({ model }: SceneComponentProps) { + const { value } = model.useState(); + const [isValid, setIsValid] = useState(validateIntervalRegex.test(value)); + + return ( + + model.onDelete()} /> + + { + setIsValid(validateIntervalRegex.test(e.currentTarget.value)); + model.setStateAndNotify({ value: e.currentTarget.value }); + }} + /> + + + ); +} + +export const validateIntervalRegex = /^(-?\d+(?:\.\d+)?)(ms|[Mwdhmsy])?$/; diff --git a/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingVariable.tsx b/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingVariable.tsx new file mode 100644 index 00000000000..5899dfd1797 --- /dev/null +++ b/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingVariable.tsx @@ -0,0 +1,126 @@ +import { css } from '@emotion/css'; +import { ReactNode, useMemo } from 'react'; + +import { GrafanaTheme2 } from '@grafana/data'; +import { SceneComponentProps, sceneGraph, VariableDependencyConfig } from '@grafana/scenes'; +import { Combobox, ComboboxOption, Field, Input, Stack, useStyles2 } from '@grafana/ui'; +import { t } from 'app/core/internationalization'; + +import { ConditionHeader } from './ConditionHeader'; +import { ConditionalRenderingBase, ConditionalRenderingBaseState } from './ConditionalRenderingBase'; +import { handleDeleteNonGroupCondition } from './shared'; + +export type VariableConditionValue = { + name: string; + operator: '=' | '!='; + value: string; +}; + +type ConditionalRenderingVariableState = ConditionalRenderingBaseState; + +export class ConditionalRenderingVariable extends ConditionalRenderingBase { + public get title(): string { + return t('dashboard.conditional-rendering.variable.label', 'Variable'); + } + + protected _variableDependency = new VariableDependencyConfig(this, { + onAnyVariableChanged: (v) => { + if (v.state.name === this.state.value.name) { + this.getConditionalLogicRoot().notifyChange(); + } + }, + }); + + public evaluate(): boolean { + if (!this.state.value.name) { + return true; + } + const variable = sceneGraph.getVariables(this).state.variables.find((v) => v.state.name === this.state.value.name); + + // name is defined but no variable found - return false + if (!variable) { + return false; + } + + const value = variable.getValue(); + + let hit = Array.isArray(value) ? value.includes(this.state.value.value) : value === this.state.value.value; + + if (this.state.value.operator === '!=') { + hit = !hit; + } + + return hit; + } + + public render(): ReactNode { + return ; + } + + public onDelete() { + handleDeleteNonGroupCondition(this); + } +} + +function ConditionalRenderingVariableRenderer({ model }: SceneComponentProps) { + const variables = useMemo(() => sceneGraph.getVariables(model), [model]); + const variableNames = useMemo( + () => variables.state.variables.map((v) => ({ value: v.state.name, label: v.state.label ?? v.state.name })), + [variables.state.variables] + ); + const operatorOptions: Array + model.onDelete()} /> + + + + model.setStateAndNotify({ value: { ...value, name: option.value } })} + /> + + + model.setStateAndNotify({ value: { ...value, operator: option.value } })} + /> + + + + model.setStateAndNotify({ value: { ...value, value: e.currentTarget.value } })} + /> + + + + ); +} + +const getStyles = (theme: GrafanaTheme2) => ({ + variableNameSelect: css({ + flexGrow: 1, + }), + operatorSelect: css({ + width: theme.spacing(12), + }), +}); diff --git a/public/app/features/dashboard-scene/conditional-rendering/shared.ts b/public/app/features/dashboard-scene/conditional-rendering/shared.ts new file mode 100644 index 00000000000..2a88ffc62b6 --- /dev/null +++ b/public/app/features/dashboard-scene/conditional-rendering/shared.ts @@ -0,0 +1,25 @@ +import { ConditionalRenderingData, DataConditionValue } from './ConditionalRenderingData'; +import { ConditionalRenderingGroup, GroupConditionValue } from './ConditionalRenderingGroup'; +import { ConditionalRenderingInterval, IntervalConditionValue } from './ConditionalRenderingInterval'; +import { ConditionalRenderingVariable, VariableConditionValue } from './ConditionalRenderingVariable'; + +export type ConditionValues = + | DataConditionValue + | VariableConditionValue + | GroupConditionValue + | IntervalConditionValue; + +export type ConditionalRenderingConditions = + | ConditionalRenderingData + | ConditionalRenderingVariable + | ConditionalRenderingInterval + | ConditionalRenderingGroup; + +type NonGroupConditions = Exclude; + +export const handleDeleteNonGroupCondition = (model: NonGroupConditions) => { + if (model.parent instanceof ConditionalRenderingGroup) { + model.parent.setState({ value: model.parent.state.value.filter((condition) => condition !== model) }); + model.getConditionalLogicRoot().notifyChange(); + } +}; diff --git a/public/app/features/dashboard-scene/edit-pane/DashboardEditPane.tsx b/public/app/features/dashboard-scene/edit-pane/DashboardEditPane.tsx index 072d80ba367..7fec9b3106b 100644 --- a/public/app/features/dashboard-scene/edit-pane/DashboardEditPane.tsx +++ b/public/app/features/dashboard-scene/edit-pane/DashboardEditPane.tsx @@ -39,6 +39,7 @@ export class DashboardEditPane extends SceneObjectBase { enabled: false, selected: [], onSelect: (item, multi) => this.selectElement(item, multi), + onClear: () => this.clearSelection(), }, }); diff --git a/public/app/features/dashboard-scene/scene/layout-default/DefaultGridLayoutManager.tsx b/public/app/features/dashboard-scene/scene/layout-default/DefaultGridLayoutManager.tsx index c30558f3221..652d62dd757 100644 --- a/public/app/features/dashboard-scene/scene/layout-default/DefaultGridLayoutManager.tsx +++ b/public/app/features/dashboard-scene/scene/layout-default/DefaultGridLayoutManager.tsx @@ -25,7 +25,7 @@ import { NEW_PANEL_WIDTH, getVizPanelKeyForPanelId, getGridItemKeyForPanelId, - getDashboardSceneFor, + useDashboard, } from '../../utils/utils'; import { DashboardLayoutManager } from '../types/DashboardLayoutManager'; import { LayoutRegistryItem } from '../types/LayoutRegistryItem'; @@ -442,7 +442,7 @@ export class DefaultGridLayoutManager function DefaultGridLayoutManagerRenderer({ model }: SceneComponentProps) { const { children } = useSceneObjectState(model.state.grid, { shouldActivateOrKeepAlive: true }); - const dashboard = getDashboardSceneFor(model); + const dashboard = useDashboard(model); // If we are top level layout and have no children, show empty state if (model.parent === dashboard && children.length === 0) { diff --git a/public/app/features/dashboard-scene/scene/layout-default/row-actions/RowActionsRenderer.tsx b/public/app/features/dashboard-scene/scene/layout-default/row-actions/RowActionsRenderer.tsx index 2d7dbfabca3..64f4787cba7 100644 --- a/public/app/features/dashboard-scene/scene/layout-default/row-actions/RowActionsRenderer.tsx +++ b/public/app/features/dashboard-scene/scene/layout-default/row-actions/RowActionsRenderer.tsx @@ -8,7 +8,7 @@ import { t } from 'app/core/internationalization'; import { SHARED_DASHBOARD_QUERY } from 'app/plugins/datasource/dashboard/constants'; import { MIXED_DATASOURCE_NAME } from 'app/plugins/datasource/mixed/MixedDataSource'; -import { getDashboardSceneFor, getQueryRunnerFor } from '../../../utils/utils'; +import { getQueryRunnerFor, useDashboard, useDashboardState } from '../../../utils/utils'; import { DashboardGridItem } from '../DashboardGridItem'; import { RowRepeaterBehavior } from '../RowRepeaterBehavior'; @@ -16,10 +16,10 @@ import { RowActions } from './RowActions'; import { RowOptionsButton } from './RowOptionsButton'; export function RowActionsRenderer({ model }: SceneComponentProps) { - const dashboard = getDashboardSceneFor(model); const row = model.getParent(); const { title, children } = row.useState(); - const { meta, isEditing } = dashboard.useState(); + const dashboard = useDashboard(model); + const { meta, isEditing } = useDashboardState(model); const styles = useStyles2(getStyles); const isUsingDashboardDS = useMemo( diff --git a/public/app/features/dashboard-scene/scene/layout-responsive-grid/ResponsiveGridItem.tsx b/public/app/features/dashboard-scene/scene/layout-responsive-grid/ResponsiveGridItem.tsx index e7b9010a3d5..29997c4c2ed 100644 --- a/public/app/features/dashboard-scene/scene/layout-responsive-grid/ResponsiveGridItem.tsx +++ b/public/app/features/dashboard-scene/scene/layout-responsive-grid/ResponsiveGridItem.tsx @@ -15,6 +15,7 @@ import { } from '@grafana/scenes'; import { OptionsPaneCategoryDescriptor } from 'app/features/dashboard/components/PanelEditor/OptionsPaneCategoryDescriptor'; +import { ConditionalRendering } from '../../conditional-rendering/ConditionalRendering'; import { getCloneKey } from '../../utils/clone'; import { getMultiVariableValues } from '../../utils/utils'; import { DashboardLayoutItem } from '../types/DashboardLayoutItem'; @@ -28,6 +29,7 @@ export interface ResponsiveGridItemState extends SceneObjectState { hideWhenNoData?: boolean; repeatedPanels?: VizPanel[]; variableName?: string; + conditionalRendering?: ConditionalRendering; } export class ResponsiveGridItem extends SceneObjectBase implements DashboardLayoutItem { @@ -40,7 +42,7 @@ export class ResponsiveGridItem extends SceneObjectBase public readonly isDashboardLayoutItem = true; public constructor(state: ResponsiveGridItemState) { - super(state); + super({ ...state, conditionalRendering: state?.conditionalRendering ?? ConditionalRendering.createEmpty() }); this.addActivationHandler(() => this._activationHandler()); } @@ -48,6 +50,14 @@ export class ResponsiveGridItem extends SceneObjectBase if (this.state.variableName) { this.performRepeat(); } + + const deactivate = this.state.conditionalRendering?.activate(); + + return () => { + if (deactivate) { + deactivate(); + } + }; } public getOptions(): OptionsPaneCategoryDescriptor { diff --git a/public/app/features/dashboard-scene/scene/layout-responsive-grid/ResponsiveGridItemEditor.tsx b/public/app/features/dashboard-scene/scene/layout-responsive-grid/ResponsiveGridItemEditor.tsx index 47be0b1272a..4e7b4f80dc9 100644 --- a/public/app/features/dashboard-scene/scene/layout-responsive-grid/ResponsiveGridItemEditor.tsx +++ b/public/app/features/dashboard-scene/scene/layout-responsive-grid/ResponsiveGridItemEditor.tsx @@ -1,54 +1,9 @@ -import { Switch } from '@grafana/ui'; -import { t } from 'app/core/internationalization'; import { OptionsPaneCategoryDescriptor } from 'app/features/dashboard/components/PanelEditor/OptionsPaneCategoryDescriptor'; -import { OptionsPaneItemDescriptor } from 'app/features/dashboard/components/PanelEditor/OptionsPaneItemDescriptor'; -import { RepeatRowSelect2 } from 'app/features/dashboard/components/RepeatRowSelect/RepeatRowSelect'; + +import { useConditionalRenderingEditor } from '../../conditional-rendering/ConditionalRenderingEditor'; import { ResponsiveGridItem } from './ResponsiveGridItem'; export function getOptions(model: ResponsiveGridItem): OptionsPaneCategoryDescriptor { - const category = new OptionsPaneCategoryDescriptor({ - title: t('dashboard.responsive-layout.item-options.title', 'Layout options'), - id: 'layout-options', - isOpenDefault: false, - }); - - category.addItem( - new OptionsPaneItemDescriptor({ - title: t('dashboard.responsive-layout.item-options.hide-no-data', 'Hide when no data'), - render: () => , - }) - ); - - category.addItem( - new OptionsPaneItemDescriptor({ - title: t('dashboard.responsive-layout.item-options.repeat.variable.title', 'Repeat by variable'), - description: t( - 'dashboard.responsive-layout.item-options.repeat.variable.description', - 'Repeat this panel for each value in the selected variable. This is not visible while in edit mode. You need to go back to dashboard and then update the variable or reload the dashboard.' - ), - render: () => , - }) - ); - - return category; -} - -function GridItemNoDataToggle({ item }: { item: ResponsiveGridItem }) { - const { hideWhenNoData } = item.useState(); - - return item.toggleHideWhenNoData()} />; -} - -function RepeatByOption({ item }: { item: ResponsiveGridItem }) { - const { variableName } = item.useState(); - - return ( - item.setRepeatByVariable(value)} - /> - ); + return useConditionalRenderingEditor(model.state.conditionalRendering)!; } diff --git a/public/app/features/dashboard-scene/scene/layout-responsive-grid/ResponsiveGridItemRenderer.tsx b/public/app/features/dashboard-scene/scene/layout-responsive-grid/ResponsiveGridItemRenderer.tsx index 9a039becb97..15570072389 100644 --- a/public/app/features/dashboard-scene/scene/layout-responsive-grid/ResponsiveGridItemRenderer.tsx +++ b/public/app/features/dashboard-scene/scene/layout-responsive-grid/ResponsiveGridItemRenderer.tsx @@ -3,22 +3,34 @@ import { css, cx } from '@emotion/css'; import { SceneComponentProps } from '@grafana/scenes'; import { useStyles2 } from '@grafana/ui'; +import { useDashboardState, useIsConditionallyHidden } from '../../utils/utils'; + import { ResponsiveGridItem } from './ResponsiveGridItem'; export function ResponsiveGridItemRenderer({ model }: SceneComponentProps) { const { body } = model.useState(); const style = useStyles2(getStyles); + const { showHiddenElements } = useDashboardState(model); + const isConditionallyHidden = useIsConditionallyHidden(model); + + if (isConditionallyHidden && !showHiddenElements) { + return null; + } + const isHiddenButVisibleElement = showHiddenElements && isConditionallyHidden; return model.state.repeatedPanels ? ( <> {model.state.repeatedPanels.map((item) => ( -
+
))} ) : ( -
+
); diff --git a/public/app/features/dashboard-scene/scene/layout-rows/RowItem.tsx b/public/app/features/dashboard-scene/scene/layout-rows/RowItem.tsx index b5119359850..a518ac891f4 100644 --- a/public/app/features/dashboard-scene/scene/layout-rows/RowItem.tsx +++ b/public/app/features/dashboard-scene/scene/layout-rows/RowItem.tsx @@ -1,7 +1,8 @@ -import { SceneObjectState, SceneObjectBase, sceneGraph, VariableDependencyConfig, SceneObject } from '@grafana/scenes'; +import { sceneGraph, SceneObject, SceneObjectBase, SceneObjectState, VariableDependencyConfig } from '@grafana/scenes'; import { t } from 'app/core/internationalization'; import { OptionsPaneCategoryDescriptor } from 'app/features/dashboard/components/PanelEditor/OptionsPaneCategoryDescriptor'; +import { ConditionalRendering } from '../../conditional-rendering/ConditionalRendering'; import { getDefaultVizPanel } from '../../utils/utils'; import { ResponsiveGridLayoutManager } from '../layout-responsive-grid/ResponsiveGridLayoutManager'; import { BulkActionElement } from '../types/BulkActionElement'; @@ -21,6 +22,7 @@ export interface RowItemState extends SceneObjectState { isCollapsed?: boolean; isHeaderHidden?: boolean; height?: 'expand' | 'min'; + conditionalRendering?: ConditionalRendering; } export class RowItem @@ -40,7 +42,20 @@ export class RowItem ...state, title: state?.title ?? t('dashboard.rows-layout.row.new', 'New row'), layout: state?.layout ?? ResponsiveGridLayoutManager.createEmpty(), + conditionalRendering: state?.conditionalRendering ?? ConditionalRendering.createEmpty(), }); + + this.addActivationHandler(() => this._activationHandler()); + } + + private _activationHandler() { + const deactivate = this.state.conditionalRendering?.activate(); + + return () => { + if (deactivate) { + deactivate(); + } + }; } public getEditableElementInfo(): EditableDashboardElementInfo { diff --git a/public/app/features/dashboard-scene/scene/layout-rows/RowItemEditor.tsx b/public/app/features/dashboard-scene/scene/layout-rows/RowItemEditor.tsx index b7fe35e580a..3467b7bbcc7 100644 --- a/public/app/features/dashboard-scene/scene/layout-rows/RowItemEditor.tsx +++ b/public/app/features/dashboard-scene/scene/layout-rows/RowItemEditor.tsx @@ -10,8 +10,8 @@ import { RepeatRowSelect2 } from 'app/features/dashboard/components/RepeatRowSel import { SHARED_DASHBOARD_QUERY } from 'app/plugins/datasource/dashboard/constants'; import { MIXED_DATASOURCE_NAME } from 'app/plugins/datasource/mixed/MixedDataSource'; -import { getDashboardSceneFor, getQueryRunnerFor } from '../../utils/utils'; -import { DashboardScene } from '../DashboardScene'; +import { useConditionalRenderingEditor } from '../../conditional-rendering/ConditionalRenderingEditor'; +import { getQueryRunnerFor, useDashboard } from '../../utils/utils'; import { DashboardLayoutSelector } from '../layouts-shared/DashboardLayoutSelector'; import { useEditPaneInputAutoFocus } from '../layouts-shared/utils'; @@ -20,8 +20,6 @@ import { RowItem } from './RowItem'; export function getEditOptions(model: RowItem): OptionsPaneCategoryDescriptor[] { const { layout } = model.useState(); const rowOptions = useMemo(() => { - const dashboard = getDashboardSceneFor(model); - const editPaneHeaderOptions = new OptionsPaneCategoryDescriptor({ title: '', id: 'row-options' }) .addItem( new OptionsPaneItemDescriptor({ @@ -52,7 +50,7 @@ export function getEditOptions(model: RowItem): OptionsPaneCategoryDescriptor[] .addItem( new OptionsPaneItemDescriptor({ title: t('dashboard.rows-layout.option.repeat', 'Repeat for'), - render: () => , + render: () => , }) ) .addItem( @@ -65,7 +63,17 @@ export function getEditOptions(model: RowItem): OptionsPaneCategoryDescriptor[] return editPaneHeaderOptions; }, [layout, model]); - return [rowOptions]; + const conditionalRenderingOptions = useMemo(() => { + return useConditionalRenderingEditor(model.state.conditionalRendering); + }, [model]); + + const editOptions = [rowOptions]; + + if (conditionalRenderingOptions) { + editOptions.push(conditionalRenderingOptions); + } + + return editOptions; } function RowTitleInput({ row }: { row: RowItem }) { @@ -99,8 +107,9 @@ function RowHeightSelect({ row }: { row: RowItem }) { return row.onChangeHeight(option)} />; } -function RowRepeatSelect({ row, dashboard }: { row: RowItem; dashboard: DashboardScene }) { +function RowRepeatSelect({ row }: { row: RowItem }) { const { layout } = row.useState(); + const dashboard = useDashboard(row); const isAnyPanelUsingDashboardDS = layout.getVizPanels().some((vizPanel) => { const runner = getQueryRunnerFor(vizPanel); diff --git a/public/app/features/dashboard-scene/scene/layout-rows/RowItemRenderer.tsx b/public/app/features/dashboard-scene/scene/layout-rows/RowItemRenderer.tsx index e7af3b4f570..e69e6d8d407 100644 --- a/public/app/features/dashboard-scene/scene/layout-rows/RowItemRenderer.tsx +++ b/public/app/features/dashboard-scene/scene/layout-rows/RowItemRenderer.tsx @@ -1,35 +1,46 @@ import { css, cx } from '@emotion/css'; -import { useCallback, useMemo, useRef, useState } from 'react'; +import { useCallback, useState } from 'react'; import { GrafanaTheme2 } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; -import { SceneComponentProps, sceneGraph } from '@grafana/scenes'; -import { clearButtonStyles, Icon, useElementSelection, useStyles2 } from '@grafana/ui'; +import { SceneComponentProps } from '@grafana/scenes'; +import { clearButtonStyles, Icon, useStyles2 } from '@grafana/ui'; import { t } from 'app/core/internationalization'; -import { isClonedKey } from '../../utils/clone'; -import { getDashboardSceneFor } from '../../utils/utils'; +import { useIsClone } from '../../utils/clone'; +import { + useDashboardState, + useElementSelectionScene, + useInterpolatedTitle, + useIsConditionallyHidden, +} from '../../utils/utils'; import { RowItem } from './RowItem'; import { RowItemMenu } from './RowItemMenu'; export function RowItemRenderer({ model }: SceneComponentProps) { - const { layout, title, isCollapsed, height = 'min', isHeaderHidden, key } = model.useState(); - const isClone = useMemo(() => isClonedKey(key!), [key]); - const dashboard = getDashboardSceneFor(model); - const { isEditing, showHiddenElements } = dashboard.useState(); + const { layout, isCollapsed, height = 'min', isHeaderHidden } = model.useState(); + const isClone = useIsClone(model); + const { isEditing, showHiddenElements } = useDashboardState(model); + const isConditionallyHidden = useIsConditionallyHidden(model); + const { isSelected, onSelect, isSelectable } = useElementSelectionScene(model); + const title = useInterpolatedTitle(model); const styles = useStyles2(getStyles); const clearStyles = useStyles2(clearButtonStyles); - const titleInterpolated = sceneGraph.interpolate(model, title, undefined, 'text'); - const ref = useRef(null); + const shouldGrow = !isCollapsed && height === 'expand'; - const { isSelected, isSelectable, onSelect } = useElementSelection(key); + const isHiddenButVisibleElement = showHiddenElements && isConditionallyHidden; + const isHiddenButVisibleHeader = showHiddenElements && isHeaderHidden; // Highlight the full row when hovering over header const [selectableHighlight, setSelectableHighlight] = useState(false); const onHeaderEnter = useCallback(() => setSelectableHighlight(true), []); const onHeaderLeave = useCallback(() => setSelectableHighlight(false), []); + if (isConditionallyHidden && !showHiddenElements) { + return null; + } + return (
) { isEditing && isCollapsed && styles.wrapperEditingCollapsed, isCollapsed && styles.wrapperCollapsed, shouldGrow && styles.wrapperGrow, + isHiddenButVisibleElement && 'dashboard-visible-hidden-element', !isClone && isSelected && 'dashboard-selected-element', !isClone && !isSelected && selectableHighlight && 'dashboard-selectable-element' )} - ref={ref} onPointerDown={onSelect} > {(!isHeaderHidden || (isEditing && showHiddenElements)) && (
@@ -58,11 +73,11 @@ export function RowItemRenderer({ model }: SceneComponentProps) { ? t('dashboard.rows-layout.row.expand', 'Expand row') : t('dashboard.rows-layout.row.collapse', 'Collapse row') } - data-testid={selectors.components.DashboardRow.title(titleInterpolated!)} + data-testid={selectors.components.DashboardRow.title(title!)} > - {titleInterpolated} + {title} {!isClone && isEditing && } diff --git a/public/app/features/dashboard-scene/utils/clone.ts b/public/app/features/dashboard-scene/utils/clone.ts index 05d9459e0e2..f084b2e0182 100644 --- a/public/app/features/dashboard-scene/utils/clone.ts +++ b/public/app/features/dashboard-scene/utils/clone.ts @@ -1,3 +1,5 @@ +import { SceneObject } from '@grafana/scenes'; + const CLONE_KEY = '-clone-'; const CLONE_SEPARATOR = '/'; @@ -71,3 +73,12 @@ export function joinCloneKeys(...keys: string[]): string { export function containsCloneKey(key: string): boolean { return key.includes(CLONE_KEY); } + +/** + * Useful hook for checking of a scene is a clone + * @param scene + */ +export function useIsClone(scene: SceneObject): boolean { + const { key } = scene.useState(); + return isClonedKey(key!); +} diff --git a/public/app/features/dashboard-scene/utils/utils.ts b/public/app/features/dashboard-scene/utils/utils.ts index f22210dd3d2..33321ca235b 100644 --- a/public/app/features/dashboard-scene/utils/utils.ts +++ b/public/app/features/dashboard-scene/utils/utils.ts @@ -7,18 +7,22 @@ import { SceneDataTransformer, sceneGraph, SceneObject, + SceneObjectState, SceneQueryRunner, VizPanel, VizPanelMenu, } from '@grafana/scenes'; +import { useElementSelection, UseElementSelectionResult } from '@grafana/ui'; import { initialIntervalVariableModelState } from 'app/features/variables/interval/reducer'; import { DashboardDatasourceBehaviour } from '../scene/DashboardDatasourceBehaviour'; -import { DashboardScene } from '../scene/DashboardScene'; +import { DashboardScene, DashboardSceneState } from '../scene/DashboardScene'; import { LibraryPanelBehavior } from '../scene/LibraryPanelBehavior'; import { VizPanelLinks, VizPanelLinksMenu } from '../scene/PanelLinks'; import { panelMenuBehavior } from '../scene/PanelMenuBehavior'; import { DashboardGridItem } from '../scene/layout-default/DashboardGridItem'; +import { ResponsiveGridItem } from '../scene/layout-responsive-grid/ResponsiveGridItem'; +import { RowItem } from '../scene/layout-rows/RowItem'; import { setDashboardPanelContext } from '../scene/setDashboardPanelContext'; import { DashboardLayoutManager, isDashboardLayoutManager } from '../scene/types/DashboardLayoutManager'; @@ -437,3 +441,42 @@ export function getLayoutManagerFor(sceneObject: SceneObject): DashboardLayoutMa export function getGridItemKeyForPanelId(panelId: number): string { return `grid-item-${panelId}`; } + +export function useDashboard(scene: SceneObject): DashboardScene { + return getDashboardSceneFor(scene); +} + +export function useDashboardState( + scene: SceneObject +): DashboardSceneState & { isEditing: boolean; showHiddenElements: boolean } { + const dashboard = useDashboard(scene); + const state = dashboard.useState(); + + return { + ...state, + isEditing: !!state.isEditing, + showHiddenElements: !!(state.isEditing && state.showHiddenElements), + }; +} + +export function useIsConditionallyHidden(scene: RowItem | ResponsiveGridItem): boolean { + const { conditionalRendering } = scene.useState(); + + return !(conditionalRendering?.evaluate() ?? true); +} + +export function useElementSelectionScene(scene: SceneObject): UseElementSelectionResult { + const { key } = scene.useState(); + + return useElementSelection(key); +} + +export function useInterpolatedTitle(scene: SceneObject): string { + const { title } = scene.useState(); + + if (!title) { + return ''; + } + + return sceneGraph.interpolate(scene, title, undefined, 'text'); +} diff --git a/public/locales/en-US/grafana.json b/public/locales/en-US/grafana.json index 95e6fe9744d..3d1bb21e1d3 100644 --- a/public/locales/en-US/grafana.json +++ b/public/locales/en-US/grafana.json @@ -1020,6 +1020,46 @@ "redirect-link": "List in Grafana Alerting", "subtitle": "Alert rules related to this dashboard" }, + "conditional-rendering": { + "data": { + "disable": "Disable", + "enable": "Enable", + "label": "Data" + }, + "group": { + "add": { + "button": "Add condition based on", + "data": "Data", + "interval": "Interval", + "variable": "Variable value" + }, + "condition": { + "label": "Evaluate conditions", + "meet-all": "Meet all", + "meet-any": "Meet any" + }, + "label": "Group" + }, + "interval": { + "input-label": "Value", + "invalid-message": "Invalid interval", + "label": "Time range interval" + }, + "shared": { + "delete-condition": "Delete Condition" + }, + "title": "Conditional rendering options", + "variable": { + "label": "Variable", + "operator": { + "equals": "Equals", + "not-equal": "Not equal" + }, + "select-operator": "Operator", + "select-variable": "Select variable", + "value-input": "Value" + } + }, "default-layout": { "description": "Manually size and position panels", "item-options": { @@ -1194,16 +1234,6 @@ }, "responsive-layout": { "description": "Automatically positions panels into a grid.", - "item-options": { - "hide-no-data": "Hide when no data", - "repeat": { - "variable": { - "description": "Repeat this panel for each value in the selected variable. This is not visible while in edit mode. You need to go back to dashboard and then update the variable or reload the dashboard.", - "title": "Repeat by variable" - } - }, - "title": "Layout options" - }, "name": "Auto", "options": { "columns": "Columns", From 270700c8908235694b6c3882c5a07a1599d4041a Mon Sep 17 00:00:00 2001 From: Victor Marin <36818606+mdvictor@users.noreply.github.com> Date: Thu, 13 Mar 2025 09:48:40 +0200 Subject: [PATCH 007/117] Dashboards: Remove panel edit override broken styles (#102054) remove panel edit override styles causing issues --- .../dashboard/components/PanelEditor/OptionsPaneCategory.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/public/app/features/dashboard/components/PanelEditor/OptionsPaneCategory.tsx b/public/app/features/dashboard/components/PanelEditor/OptionsPaneCategory.tsx index 2ce0a19527a..a9e43013151 100644 --- a/public/app/features/dashboard/components/PanelEditor/OptionsPaneCategory.tsx +++ b/public/app/features/dashboard/components/PanelEditor/OptionsPaneCategory.tsx @@ -162,9 +162,6 @@ const getStyles = (theme: GrafanaTheme2) => ({ fontSize: '1rem', fontWeight: theme.typography.fontWeightMedium, margin: 0, - height: theme.spacing(4), - display: 'flex', - alignItems: 'center', }), header: css({ display: 'flex', From 2d71c8ae72eeeca71dab679e36109b315808ad44 Mon Sep 17 00:00:00 2001 From: Sven Grossmann Date: Thu, 13 Mar 2025 08:59:09 +0100 Subject: [PATCH 008/117] Chore: Prevent `make run` from printing all environment variables (#101924) --- .bra.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.bra.toml b/.bra.toml index e3b7510804f..6572f9a6afb 100644 --- a/.bra.toml +++ b/.bra.toml @@ -1,6 +1,6 @@ [run] init_cmds = [ - ["GO_BUILD_DEV=1", "make", "build-go"], + ["make","GO_BUILD_DEV=1", "build-go"], ["make", "gen-jsonnet"], ["./bin/grafana", "server", "-profile", "-profile-addr=127.0.0.1", "-profile-port=6000", "-profile-block-rate=1", "-profile-mutex-rate=5", "-packaging=dev", "cfg:app_mode=development"] ] @@ -17,7 +17,7 @@ watch_exts = [".go", ".ini", ".toml", ".template.html"] ignore_files = [".*_gen.go"] build_delay = 1500 cmds = [ - ["GO_BUILD_DEV=1", "make", "build-go-fast"], + ["make", "GO_BUILD_DEV=1", "build-go-fast"], ["make", "gen-jsonnet"], ["./bin/grafana", "server", "-profile", "-profile-addr=127.0.0.1", "-profile-port=6000", "-profile-block-rate=1", "-profile-mutex-rate=5", "-packaging=dev", "cfg:app_mode=development"] ] From 3589baac68923e9c711a619480b50608959aa9dd Mon Sep 17 00:00:00 2001 From: Georges Chaudy Date: Thu, 13 Mar 2025 09:24:12 +0100 Subject: [PATCH 009/117] Unistore: Batch write events (#101381) * Batch write events * Improve instrumentation * Measure batch phases * Detect lock contention * remove the execBatch goroutine * removing tracing prefix * detect context cancel * batch channel map --- pkg/storage/unified/sql/backend.go | 241 ++--------- pkg/storage/unified/sql/backend_test.go | 323 ++------------ pkg/storage/unified/sql/bulk.go | 4 +- .../sql/data/resource_history_update_rv.sql | 14 +- .../unified/sql/data/resource_update.sql | 3 +- .../unified/sql/data/resource_update_rv.sql | 14 +- pkg/storage/unified/sql/queries.go | 3 +- pkg/storage/unified/sql/queries_test.go | 8 + pkg/storage/unified/sql/rv_manager.go | 400 ++++++++++++++++++ pkg/storage/unified/sql/rv_manager_test.go | 64 +++ .../unified/sql/test/benchmark_test.go | 2 +- ...resource_history_update_rv-single path.sql | 12 +- .../mysql--resource_update-single path.sql | 3 +- .../mysql--resource_update_rv-single path.sql | 12 +- ...resource_history_update_rv-single path.sql | 12 +- .../postgres--resource_update-single path.sql | 3 +- ...stgres--resource_update_rv-single path.sql | 12 +- ...resource_history_update_rv-single path.sql | 12 +- .../sqlite--resource_update-single path.sql | 3 +- ...sqlite--resource_update_rv-single path.sql | 12 +- pkg/storage/unified/testing/benchmark.go | 2 +- 21 files changed, 632 insertions(+), 527 deletions(-) create mode 100644 pkg/storage/unified/sql/rv_manager.go create mode 100644 pkg/storage/unified/sql/rv_manager_test.go diff --git a/pkg/storage/unified/sql/backend.go b/pkg/storage/unified/sql/backend.go index f0ad22bbdff..9220633ad7b 100644 --- a/pkg/storage/unified/sql/backend.go +++ b/pkg/storage/unified/sql/backend.go @@ -10,8 +10,6 @@ import ( "time" "github.com/google/uuid" - "go.opentelemetry.io/otel/attribute" - semconv "go.opentelemetry.io/otel/semconv/v1.26.0" "go.opentelemetry.io/otel/trace" "go.opentelemetry.io/otel/trace/noop" "google.golang.org/protobuf/proto" @@ -103,6 +101,9 @@ type backend struct { watchBufferSize int notifier eventNotifier + // resource version manager + rvManager *resourceVersionManager + // testing simulatedNetworkLatency time.Duration } @@ -127,6 +128,17 @@ func (b *backend) initLocked(ctx context.Context) error { return fmt.Errorf("no dialect for driver %q", driverName) } + // Initialize ResourceVersionManager + rvManager, err := NewResourceVersionManager(ResourceManagerOptions{ + Dialect: b.dialect, + DB: b.db, + Tracer: b.tracer, + }) + if err != nil { + return fmt.Errorf("failed to create resource version manager: %w", err) + } + b.rvManager = rvManager + // Initialize notifier after dialect is set up notifier, err := newNotifier(b) if err != nil { @@ -207,13 +219,14 @@ func (b *backend) WriteEvent(ctx context.Context, event resource.WriteEvent) (in func (b *backend) create(ctx context.Context, event resource.WriteEvent) (int64, error) { ctx, span := b.tracer.Start(ctx, tracePrefix+"Create") defer span.End() - var newVersion int64 + guid := uuid.New().String() folder := "" if event.Object != nil { folder = event.Object.GetFolder() } - err := b.db.WithTx(ctx, ReadCommitted, func(ctx context.Context, tx db.Tx) error { + + rv, err := b.rvManager.ExecWithRV(ctx, event.Key, func(tx db.Tx) (string, error) { // 1. Insert into resource if _, err := dbutil.Exec(ctx, tx, sqlResourceInsert, sqlResourceRequest{ SQLTemplate: sqltemplate.New(b.dialect), @@ -221,7 +234,7 @@ func (b *backend) create(ctx context.Context, event resource.WriteEvent) (int64, Folder: folder, GUID: guid, }); err != nil { - return fmt.Errorf("insert into resource: %w", err) + return guid, fmt.Errorf("insert into resource: %w", err) } // 2. Insert into resource history @@ -231,38 +244,12 @@ func (b *backend) create(ctx context.Context, event resource.WriteEvent) (int64, Folder: folder, GUID: guid, }); err != nil { - return fmt.Errorf("insert into resource history: %w", err) - } - - // 3. TODO: Rebuild the whole folder tree structure if we're creating a folder - - // 4. Atomically increment resource version for this kind - rv, err := b.resourceVersionAtomicInc(ctx, tx, event.Key) - if err != nil { - return fmt.Errorf("increment resource version: %w", err) - } - - // 5. Update the RV in both resource and resource_history - if _, err = dbutil.Exec(ctx, tx, sqlResourceHistoryUpdateRV, sqlResourceUpdateRVRequest{ - SQLTemplate: sqltemplate.New(b.dialect), - GUID: guid, - ResourceVersion: rv, - }); err != nil { - return fmt.Errorf("update resource_history rv: %w", err) + return guid, fmt.Errorf("insert into resource history: %w", err) } - - if _, err = dbutil.Exec(ctx, tx, sqlResourceUpdateRV, sqlResourceUpdateRVRequest{ - SQLTemplate: sqltemplate.New(b.dialect), - GUID: guid, - ResourceVersion: rv, - }); err != nil { - return fmt.Errorf("update resource rv: %w", err) - } - newVersion = rv if b.simulatedNetworkLatency > 0 { time.Sleep(b.simulatedNetworkLatency) } - return nil + return guid, nil }) if err != nil { @@ -274,23 +261,24 @@ func (b *backend) create(ctx context.Context, event resource.WriteEvent) (int64, Key: event.Key, PreviousRV: event.PreviousRV, Value: event.Value, - ResourceVersion: newVersion, + ResourceVersion: rv, Folder: folder, }) - return newVersion, nil + return rv, nil } func (b *backend) update(ctx context.Context, event resource.WriteEvent) (int64, error) { ctx, span := b.tracer.Start(ctx, tracePrefix+"Update") defer span.End() - var newVersion int64 guid := uuid.New().String() folder := "" if event.Object != nil { folder = event.Object.GetFolder() } - err := b.db.WithTx(ctx, ReadCommitted, func(ctx context.Context, tx db.Tx) error { + + // Use rvManager.ExecWithRV instead of direct transaction + rv, err := b.rvManager.ExecWithRV(ctx, event.Key, func(tx db.Tx) (string, error) { // 1. Update resource _, err := dbutil.Exec(ctx, tx, sqlResourceUpdate, sqlResourceRequest{ SQLTemplate: sqltemplate.New(b.dialect), @@ -299,7 +287,7 @@ func (b *backend) update(ctx context.Context, event resource.WriteEvent) (int64, GUID: guid, }) if err != nil { - return fmt.Errorf("initial resource update: %w", err) + return guid, fmt.Errorf("resource update: %w", err) } // 2. Insert into resource history @@ -309,36 +297,9 @@ func (b *backend) update(ctx context.Context, event resource.WriteEvent) (int64, Folder: folder, GUID: guid, }); err != nil { - return fmt.Errorf("insert into resource history: %w", err) + return guid, fmt.Errorf("insert into resource history: %w", err) } - - // 3. TODO: Rebuild the whole folder tree structure if we're creating a folder - - // 4. Atomically increment resource version for this kind - rv, err := b.resourceVersionAtomicInc(ctx, tx, event.Key) - if err != nil { - return fmt.Errorf("increment resource version: %w", err) - } - - // 5. Update the RV in both resource and resource_history - if _, err = dbutil.Exec(ctx, tx, sqlResourceHistoryUpdateRV, sqlResourceUpdateRVRequest{ - SQLTemplate: sqltemplate.New(b.dialect), - GUID: guid, - ResourceVersion: rv, - }); err != nil { - return fmt.Errorf("update history rv: %w", err) - } - - if _, err = dbutil.Exec(ctx, tx, sqlResourceUpdateRV, sqlResourceUpdateRVRequest{ - SQLTemplate: sqltemplate.New(b.dialect), - GUID: guid, - ResourceVersion: rv, - }); err != nil { - return fmt.Errorf("update resource rv: %w", err) - } - newVersion = rv - - return nil + return guid, nil }) if err != nil { @@ -350,23 +311,22 @@ func (b *backend) update(ctx context.Context, event resource.WriteEvent) (int64, Key: event.Key, PreviousRV: event.PreviousRV, Value: event.Value, - ResourceVersion: newVersion, + ResourceVersion: rv, Folder: folder, }) - return newVersion, nil + return rv, nil } func (b *backend) delete(ctx context.Context, event resource.WriteEvent) (int64, error) { ctx, span := b.tracer.Start(ctx, tracePrefix+"Delete") defer span.End() - var newVersion int64 guid := uuid.New().String() folder := "" if event.Object != nil { folder = event.Object.GetFolder() } - err := b.db.WithTx(ctx, ReadCommitted, func(ctx context.Context, tx db.Tx) error { + rv, err := b.rvManager.ExecWithRV(ctx, event.Key, func(tx db.Tx) (string, error) { // 1. delete from resource _, err := dbutil.Exec(ctx, tx, sqlResourceDelete, sqlResourceRequest{ SQLTemplate: sqltemplate.New(b.dialect), @@ -374,7 +334,7 @@ func (b *backend) delete(ctx context.Context, event resource.WriteEvent) (int64, GUID: guid, }) if err != nil { - return fmt.Errorf("delete resource: %w", err) + return guid, fmt.Errorf("delete resource: %w", err) } // 2. Add event to resource history @@ -384,28 +344,9 @@ func (b *backend) delete(ctx context.Context, event resource.WriteEvent) (int64, Folder: folder, GUID: guid, }); err != nil { - return fmt.Errorf("insert into resource history: %w", err) - } - - // 3. TODO: Rebuild the whole folder tree structure if we're creating a folder - - // 4. Atomically increment resource version for this kind - rv, err := b.resourceVersionAtomicInc(ctx, tx, event.Key) - if err != nil { - return fmt.Errorf("increment resource version: %w", err) - } - - // 5. Update the RV in resource_history - if _, err = dbutil.Exec(ctx, tx, sqlResourceHistoryUpdateRV, sqlResourceUpdateRVRequest{ - SQLTemplate: sqltemplate.New(b.dialect), - GUID: guid, - ResourceVersion: rv, - }); err != nil { - return fmt.Errorf("update history rv: %w", err) + return guid, fmt.Errorf("insert into resource history: %w", err) } - newVersion = rv - - return nil + return guid, nil }) if err != nil { @@ -417,23 +358,22 @@ func (b *backend) delete(ctx context.Context, event resource.WriteEvent) (int64, Key: event.Key, PreviousRV: event.PreviousRV, Value: event.Value, - ResourceVersion: newVersion, + ResourceVersion: rv, Folder: folder, }) - return newVersion, nil + return rv, nil } func (b *backend) restore(ctx context.Context, event resource.WriteEvent) (int64, error) { ctx, span := b.tracer.Start(ctx, tracePrefix+"Restore") defer span.End() - var newVersion int64 guid := uuid.New().String() folder := "" if event.Object != nil { folder = event.Object.GetFolder() } - err := b.db.WithTx(ctx, ReadCommitted, func(ctx context.Context, tx db.Tx) error { + rv, err := b.rvManager.ExecWithRV(ctx, event.Key, func(tx db.Tx) (string, error) { // 1. Re-create resource // Note: we may want to replace the write event with a create event, tbd. if _, err := dbutil.Exec(ctx, tx, sqlResourceInsert, sqlResourceRequest{ @@ -442,7 +382,7 @@ func (b *backend) restore(ctx context.Context, event resource.WriteEvent) (int64 Folder: folder, GUID: guid, }); err != nil { - return fmt.Errorf("insert into resource: %w", err) + return guid, fmt.Errorf("insert into resource: %w", err) } // 2. Insert into resource history @@ -452,49 +392,22 @@ func (b *backend) restore(ctx context.Context, event resource.WriteEvent) (int64 Folder: folder, GUID: guid, }); err != nil { - return fmt.Errorf("insert into resource history: %w", err) - } - - // 3. TODO: Rebuild the whole folder tree structure if we're creating a folder - - // 4. Atomically increment resource version for this kind - rv, err := b.resourceVersionAtomicInc(ctx, tx, event.Key) - if err != nil { - return fmt.Errorf("increment resource version: %w", err) - } - - // 5. Update the RV in both resource and resource_history - if _, err = dbutil.Exec(ctx, tx, sqlResourceHistoryUpdateRV, sqlResourceUpdateRVRequest{ - SQLTemplate: sqltemplate.New(b.dialect), - GUID: guid, - ResourceVersion: rv, - }); err != nil { - return fmt.Errorf("update history rv: %w", err) - } - - if _, err = dbutil.Exec(ctx, tx, sqlResourceUpdateRV, sqlResourceUpdateRVRequest{ - SQLTemplate: sqltemplate.New(b.dialect), - GUID: guid, - ResourceVersion: rv, - }); err != nil { - return fmt.Errorf("update resource rv: %w", err) + return guid, fmt.Errorf("insert into resource history: %w", err) } - // 6. Update all resource history entries with the new UID + // 3. Update all resource history entries with the new UID // Note: we do not update any history entries that have a deletion timestamp included. This will become // important once we start using finalizers, as the initial delete will show up as an update with a deletion timestamp included. - if _, err = dbutil.Exec(ctx, tx, sqlResoureceHistoryUpdateUid, sqlResourceHistoryUpdateRequest{ + if _, err := dbutil.Exec(ctx, tx, sqlResoureceHistoryUpdateUid, sqlResourceHistoryUpdateRequest{ SQLTemplate: sqltemplate.New(b.dialect), WriteEvent: event, OldUID: string(event.ObjectOld.GetUID()), NewUID: string(event.Object.GetUID()), }); err != nil { - return fmt.Errorf("update history uid: %w", err) + return guid, fmt.Errorf("update history uid: %w", err) } - newVersion = rv - - return nil + return guid, nil }) if err != nil { @@ -506,11 +419,11 @@ func (b *backend) restore(ctx context.Context, event resource.WriteEvent) (int64 Key: event.Key, PreviousRV: event.PreviousRV, Value: event.Value, - ResourceVersion: newVersion, + ResourceVersion: rv, Folder: folder, }) - return newVersion, nil + return rv, nil } func (b *backend) ReadResource(ctx context.Context, req *resource.ReadRequest) *resource.BackendReadResponse { @@ -830,67 +743,3 @@ func fetchLatestRV(ctx context.Context, x db.ContextExecer, d sqltemplate.Dialec } return res.ResourceVersion, nil } - -// resourceVersionAtomicInc atomically increases the version of a kind within a transaction. -// TODO: Ideally we should attempt to update the RV in the resource and resource_history tables -// in a single roundtrip. This would reduce the latency of the operation, and also increase the -// throughput of the system. This is a good candidate for a future optimization. -func (b *backend) resourceVersionAtomicInc(ctx context.Context, x db.ContextExecer, key *resource.ResourceKey) (newVersion int64, err error) { - ctx, span := b.tracer.Start(ctx, tracePrefix+"version_atomic_inc", trace.WithAttributes( - semconv.K8SNamespaceName(key.Namespace), - // TODO: the following attributes could use some standardization. - attribute.String("k8s.resource.group", key.Group), - attribute.String("k8s.resource.type", key.Resource), - )) - defer span.End() - - // 1. Lock to row and prevent concurrent updates until the transaction is committed. - res, err := dbutil.QueryRow(ctx, x, sqlResourceVersionGet, sqlResourceVersionGetRequest{ - SQLTemplate: sqltemplate.New(b.dialect), - Group: key.Group, - Resource: key.Resource, - - Response: new(resourceVersionResponse), ReadOnly: false, // This locks the row for update - }) - - if errors.Is(err, sql.ErrNoRows) { - // if there wasn't a row associated with the given resource, then we create it. - if _, err = dbutil.Exec(ctx, x, sqlResourceVersionInsert, sqlResourceVersionUpsertRequest{ - SQLTemplate: sqltemplate.New(b.dialect), - Group: key.Group, - Resource: key.Resource, - }); err != nil { - return 0, fmt.Errorf("insert into resource_version: %w", err) - } - res, err = dbutil.QueryRow(ctx, x, sqlResourceVersionGet, sqlResourceVersionGetRequest{ - SQLTemplate: sqltemplate.New(b.dialect), - Group: key.Group, - Resource: key.Resource, - Response: new(resourceVersionResponse), - ReadOnly: true, // This locks the row for update - }) - if err != nil { - return 0, fmt.Errorf("fetching RV after read") - } - return res.ResourceVersion, nil - } else if err != nil { - return 0, fmt.Errorf("lock the resource version: %w", err) - } - - // 2. Update the RV - // Most times, the RV is the current microsecond timestamp generated on the sql server (to avoid clock skew). - // In rare occasion, the server clock might go back in time. In those cases, we simply increment the - // previous RV until the clock catches up. - nextRV := max(res.CurrentEpoch, res.ResourceVersion+1) - - _, err = dbutil.Exec(ctx, x, sqlResourceVersionUpdate, sqlResourceVersionUpsertRequest{ - SQLTemplate: sqltemplate.New(b.dialect), - Group: key.Group, - Resource: key.Resource, - ResourceVersion: nextRV, - }) - if err != nil { - return 0, fmt.Errorf("increase resource version: %w", err) - } - return nextRV, nil -} diff --git a/pkg/storage/unified/sql/backend_test.go b/pkg/storage/unified/sql/backend_test.go index 1703c34384b..d2ef981e91b 100644 --- a/pkg/storage/unified/sql/backend_test.go +++ b/pkg/storage/unified/sql/backend_test.go @@ -202,85 +202,6 @@ func TestBackend_IsHealthy(t *testing.T) { require.ErrorIs(t, err, errTest) } -// expectSuccessfulResourceVersionAtomicInc sets up expectations for calling -// resourceVersionAtomicInc, where the returned RV will be 1. -func expectSuccessfulResourceVersionAtomicInc(t *testing.T, b testBackend) { - b.QueryWithResult("select resource_version for update", 2, Rows{{12345, 23456}}) - b.ExecWithResult("update resource_version set resource_version", 0, 0) -} - -// expectUnsuccessfulResourceVersionAtomicInc sets up expectations for calling -// resourceVersionAtomicInc, where the returned RV will be 1. -func expectUnsuccessfulResourceVersionAtomicInc(t *testing.T, b testBackend, err error) { - b.QueryWithErr("select resource_version for update", errTest) -} - -func TestResourceVersionAtomicInc(t *testing.T) { - t.Parallel() - - t.Run("happy path - insert new row", func(t *testing.T) { - t.Parallel() - b, ctx := setupBackendTest(t) - - expectSuccessfulResourceVersionAtomicInc(t, b) // returns RV=1 - - v, err := b.resourceVersionAtomicInc(ctx, b.DB, resKey) - require.NoError(t, err) - require.Equal(t, int64(23456), v) - }) - - t.Run("happy path - update existing row", func(t *testing.T) { - t.Parallel() - - b, ctx := setupBackendTest(t) - - b.QueryWithResult("select resource_version for update", 2, Rows{{12345, 23456}}) - b.ExecWithResult("update resource_version", 0, 1) - - v, err := b.resourceVersionAtomicInc(ctx, b.DB, resKey) - require.NoError(t, err) - require.Equal(t, int64(23456), v) - }) - - t.Run("error getting current version", func(t *testing.T) { - t.Parallel() - b, ctx := setupBackendTest(t) - b.QueryWithErr("select resource_version for update", errTest) - - v, err := b.resourceVersionAtomicInc(ctx, b.DB, resKey) - require.Zero(t, v) - require.Error(t, err) - require.ErrorContains(t, err, "lock the resource version") - }) - - t.Run("error inserting new row", func(t *testing.T) { - t.Parallel() - - b, ctx := setupBackendTest(t) - - b.QueryWithResult("select resource_version", 0, Rows{}) - b.ExecWithErr("insert resource_version", errTest) - - v, err := b.resourceVersionAtomicInc(ctx, b.DB, resKey) - require.Zero(t, v) - require.Error(t, err) - require.ErrorContains(t, err, "insert into resource_version") - }) - - t.Run("error updating existing row", func(t *testing.T) { - t.Parallel() - b, ctx := setupBackendTest(t) - - b.QueryWithResult("select resource_version for update", 2, Rows{{12345, 23456}}) - b.ExecWithErr("update resource_version", errTest) - - v, err := b.resourceVersionAtomicInc(ctx, b.DB, resKey) - require.Zero(t, v) - require.Error(t, err) - require.ErrorContains(t, err, "increase resource version") - }) -} - func TestBackend_create(t *testing.T) { t.Parallel() meta, err := utils.MetaAccessor(&unstructured.Unstructured{ @@ -296,18 +217,15 @@ func TestBackend_create(t *testing.T) { t.Run("happy path", func(t *testing.T) { t.Parallel() b, ctx := setupBackendTest(t) - b.SQLMock.ExpectBegin() - b.ExecWithResult("insert resource", 0, 1) - b.ExecWithResult("insert resource_history", 0, 1) - expectSuccessfulResourceVersionAtomicInc(t, b) // returns RV=1 - b.ExecWithResult("update resource_history", 0, 1) - b.ExecWithResult("update resource", 0, 1) + expectSuccessfulResourceVersionExec(t, b.TestDBProvider, + func() { b.ExecWithResult("insert resource", 0, 1) }, + func() { b.ExecWithResult("insert resource_history", 0, 1) }, + ) b.SQLMock.ExpectCommit() - v, err := b.create(ctx, event) require.NoError(t, err) - require.Equal(t, int64(23456), v) + require.Equal(t, int64(200), v) }) t.Run("error inserting into resource", func(t *testing.T) { @@ -321,7 +239,7 @@ func TestBackend_create(t *testing.T) { v, err := b.create(ctx, event) require.Zero(t, v) require.Error(t, err) - require.ErrorContains(t, err, "insert into resource:") + require.ErrorContains(t, err, "insert into resource") }) t.Run("error inserting into resource_history", func(t *testing.T) { @@ -336,58 +254,7 @@ func TestBackend_create(t *testing.T) { v, err := b.create(ctx, event) require.Zero(t, v) require.Error(t, err) - require.ErrorContains(t, err, "insert into resource history:") - }) - - t.Run("error incrementing resource version", func(t *testing.T) { - t.Parallel() - b, ctx := setupBackendTest(t) - - b.SQLMock.ExpectBegin() - b.ExecWithResult("insert resource", 0, 1) - b.ExecWithResult("insert resource_history", 0, 1) - expectUnsuccessfulResourceVersionAtomicInc(t, b, errTest) - b.SQLMock.ExpectRollback() - - v, err := b.create(ctx, event) - require.Zero(t, v) - require.Error(t, err) - require.ErrorContains(t, err, "increment resource version") - }) - - t.Run("error updating resource_history", func(t *testing.T) { - t.Parallel() - b, ctx := setupBackendTest(t) - - b.SQLMock.ExpectBegin() - b.ExecWithResult("insert resource", 0, 1) - b.ExecWithResult("insert resource_history", 0, 1) - expectSuccessfulResourceVersionAtomicInc(t, b) - b.ExecWithErr("update resource_history", errTest) - b.SQLMock.ExpectRollback() - - v, err := b.create(ctx, event) - require.Zero(t, v) - require.Error(t, err) - require.ErrorContains(t, err, "update resource_history", 0, 1) - }) - - t.Run("error updating resource", func(t *testing.T) { - t.Parallel() - b, ctx := setupBackendTest(t) - - b.SQLMock.ExpectBegin() - b.ExecWithResult("insert resource", 0, 1) - b.ExecWithResult("insert resource_history", 0, 1) - expectSuccessfulResourceVersionAtomicInc(t, b) - b.ExecWithResult("update resource_history", 0, 1) - b.ExecWithErr("update resource", errTest) - b.SQLMock.ExpectRollback() - - v, err := b.create(ctx, event) - require.Zero(t, v) - require.Error(t, err) - require.ErrorContains(t, err, "update resource rv") + require.ErrorContains(t, err, "insert into resource history") }) } @@ -409,16 +276,15 @@ func TestBackend_update(t *testing.T) { b, ctx := setupBackendTest(t) b.SQLMock.ExpectBegin() - b.ExecWithResult("update resource", 0, 1) - b.ExecWithResult("insert resource_history", 0, 1) - expectSuccessfulResourceVersionAtomicInc(t, b) - b.ExecWithResult("update resource_history", 0, 1) - b.ExecWithResult("update resource", 0, 1) + expectSuccessfulResourceVersionExec(t, b.TestDBProvider, + func() { b.ExecWithResult("update resource", 0, 1) }, + func() { b.ExecWithResult("insert resource_history", 0, 1) }, + ) b.SQLMock.ExpectCommit() v, err := b.update(ctx, event) require.NoError(t, err) - require.Equal(t, int64(23456), v) + require.Equal(t, int64(200), v) }) t.Run("error in first update to resource", func(t *testing.T) { @@ -432,7 +298,7 @@ func TestBackend_update(t *testing.T) { v, err := b.update(ctx, event) require.Zero(t, v) require.Error(t, err) - require.ErrorContains(t, err, "initial resource update") + require.ErrorContains(t, err, "resource update") }) t.Run("error inserting into resource history", func(t *testing.T) { @@ -449,57 +315,6 @@ func TestBackend_update(t *testing.T) { require.Error(t, err) require.ErrorContains(t, err, "insert into resource history") }) - - t.Run("error incrementing rv", func(t *testing.T) { - t.Parallel() - b, ctx := setupBackendTest(t) - - b.SQLMock.ExpectBegin() - b.ExecWithResult("update resource", 0, 1) - b.ExecWithResult("insert resource_history", 0, 1) - expectUnsuccessfulResourceVersionAtomicInc(t, b, errTest) - b.SQLMock.ExpectRollback() - - v, err := b.update(ctx, event) - require.Zero(t, v) - require.Error(t, err) - require.ErrorContains(t, err, "increment resource version") - }) - - t.Run("error updating history rv", func(t *testing.T) { - t.Parallel() - b, ctx := setupBackendTest(t) - - b.SQLMock.ExpectBegin() - b.ExecWithResult("update resource", 0, 1) - b.ExecWithResult("insert resource_history", 0, 1) - expectSuccessfulResourceVersionAtomicInc(t, b) // returns RV=1 - b.ExecWithErr("update resource_history", errTest) - b.SQLMock.ExpectRollback() - - v, err := b.update(ctx, event) - require.Zero(t, v) - require.Error(t, err) - require.ErrorContains(t, err, "update history rv") - }) - - t.Run("error updating resource rv", func(t *testing.T) { - t.Parallel() - b, ctx := setupBackendTest(t) - - b.SQLMock.ExpectBegin() - b.ExecWithResult("update resource", 0, 1) - b.ExecWithResult("insert resource_history", 0, 1) - expectSuccessfulResourceVersionAtomicInc(t, b) // returns RV=1 - b.ExecWithResult("update resource_history", 0, 1) - b.ExecWithErr("update resource", errTest) - b.SQLMock.ExpectRollback() - - v, err := b.update(ctx, event) - require.Zero(t, v) - require.Error(t, err) - require.ErrorContains(t, err, "update resource rv") - }) } func TestBackend_delete(t *testing.T) { @@ -519,15 +334,15 @@ func TestBackend_delete(t *testing.T) { b, ctx := setupBackendTest(t) b.SQLMock.ExpectBegin() - b.ExecWithResult("delete resource", 0, 1) - b.ExecWithResult("insert resource_history", 0, 1) - expectSuccessfulResourceVersionAtomicInc(t, b) - b.ExecWithResult("update resource_history", 0, 1) + expectSuccessfulResourceVersionExec(t, b.TestDBProvider, + func() { b.ExecWithResult("delete resource", 0, 1) }, + func() { b.ExecWithResult("insert resource_history", 0, 1) }, + ) b.SQLMock.ExpectCommit() v, err := b.delete(ctx, event) require.NoError(t, err) - require.Equal(t, int64(23456), v) + require.Equal(t, int64(200), v) }) t.Run("error deleting resource", func(t *testing.T) { @@ -558,39 +373,6 @@ func TestBackend_delete(t *testing.T) { require.Error(t, err) require.ErrorContains(t, err, "insert into resource history") }) - - t.Run("error incrementing resource version", func(t *testing.T) { - t.Parallel() - b, ctx := setupBackendTest(t) - - b.SQLMock.ExpectBegin() - b.ExecWithResult("delete resource", 0, 1) - b.ExecWithResult("insert resource_history", 0, 1) - expectUnsuccessfulResourceVersionAtomicInc(t, b, errTest) - b.SQLMock.ExpectCommit() - - v, err := b.delete(ctx, event) - require.Zero(t, v) - require.Error(t, err) - require.ErrorContains(t, err, "increment resource version") - }) - - t.Run("error updating resource history", func(t *testing.T) { - t.Parallel() - b, ctx := setupBackendTest(t) - - b.SQLMock.ExpectBegin() - b.ExecWithResult("delete resource", 0, 1) - b.ExecWithResult("insert resource_history", 0, 1) - expectSuccessfulResourceVersionAtomicInc(t, b) // returns RV=1 - b.ExecWithErr("update resource_history", errTest) - b.SQLMock.ExpectCommit() - - v, err := b.delete(ctx, event) - require.Zero(t, v) - require.Error(t, err) - require.ErrorContains(t, err, "update history rv") - }) } func TestBackend_restore(t *testing.T) { @@ -617,17 +399,16 @@ func TestBackend_restore(t *testing.T) { b, ctx := setupBackendTest(t) b.SQLMock.ExpectBegin() - b.ExecWithResult("insert resource", 0, 1) - b.ExecWithResult("insert resource_history", 0, 1) - expectSuccessfulResourceVersionAtomicInc(t, b) - b.ExecWithResult("update resource_history", 0, 1) - b.ExecWithResult("update resource", 0, 1) - b.ExecWithResult("update resource_history", 0, 1) + expectSuccessfulResourceVersionExec(t, b.TestDBProvider, + func() { b.ExecWithResult("insert resource", 0, 1) }, + func() { b.ExecWithResult("insert resource_history", 0, 1) }, + func() { b.ExecWithResult("update resource_history", 0, 1) }, + ) b.SQLMock.ExpectCommit() v, err := b.restore(ctx, event) require.NoError(t, err) - require.Equal(t, int64(23456), v) + require.Equal(t, int64(200), v) }) t.Run("error restoring resource", func(t *testing.T) { @@ -641,7 +422,7 @@ func TestBackend_restore(t *testing.T) { v, err := b.restore(ctx, event) require.Zero(t, v) require.Error(t, err) - require.ErrorContains(t, err, "insert into resource:") + require.ErrorContains(t, err, "insert into resource") }) t.Run("error inserting into resource history", func(t *testing.T) { @@ -659,57 +440,6 @@ func TestBackend_restore(t *testing.T) { require.ErrorContains(t, err, "insert into resource history") }) - t.Run("error incrementing resource version", func(t *testing.T) { - t.Parallel() - b, ctx := setupBackendTest(t) - - b.SQLMock.ExpectBegin() - b.ExecWithResult("insert resource", 0, 1) - b.ExecWithResult("insert resource_history", 0, 1) - expectUnsuccessfulResourceVersionAtomicInc(t, b, errTest) - b.SQLMock.ExpectRollback() - - v, err := b.restore(ctx, event) - require.Zero(t, v) - require.Error(t, err) - require.ErrorContains(t, err, "increment resource version") - }) - - t.Run("error updating resource history", func(t *testing.T) { - t.Parallel() - b, ctx := setupBackendTest(t) - - b.SQLMock.ExpectBegin() - b.ExecWithResult("insert resource", 0, 1) - b.ExecWithResult("insert resource_history", 0, 1) - expectSuccessfulResourceVersionAtomicInc(t, b) - b.ExecWithErr("update resource_history", errTest) - b.SQLMock.ExpectRollback() - - v, err := b.restore(ctx, event) - require.Zero(t, v) - require.Error(t, err) - require.ErrorContains(t, err, "update history rv") - }) - - t.Run("error updating resource", func(t *testing.T) { - t.Parallel() - b, ctx := setupBackendTest(t) - - b.SQLMock.ExpectBegin() - b.ExecWithResult("insert resource", 0, 1) - b.ExecWithResult("insert resource_history", 0, 1) - expectSuccessfulResourceVersionAtomicInc(t, b) - b.ExecWithResult("update resource_history", 0, 1) - b.ExecWithErr("update resource", errTest) - b.SQLMock.ExpectRollback() - - v, err := b.restore(ctx, event) - require.Zero(t, v) - require.Error(t, err) - require.ErrorContains(t, err, "update resource rv") - }) - t.Run("error updating resource history uid", func(t *testing.T) { t.Parallel() b, ctx := setupBackendTest(t) @@ -717,9 +447,6 @@ func TestBackend_restore(t *testing.T) { b.SQLMock.ExpectBegin() b.ExecWithResult("insert resource", 0, 1) b.ExecWithResult("insert resource_history", 0, 1) - expectSuccessfulResourceVersionAtomicInc(t, b) - b.ExecWithResult("update resource_history", 0, 1) - b.ExecWithResult("update resource", 0, 1) b.ExecWithErr("update resource_history", errTest) b.SQLMock.ExpectRollback() diff --git a/pkg/storage/unified/sql/bulk.go b/pkg/storage/unified/sql/bulk.go index dfc6703b06f..a39147ee640 100644 --- a/pkg/storage/unified/sql/bulk.go +++ b/pkg/storage/unified/sql/bulk.go @@ -245,7 +245,9 @@ func (b *backend) processBulk(ctx context.Context, setting resource.BulkSettings } // Make sure the collection RV is above our last written event - _, err = b.resourceVersionAtomicInc(ctx, tx, key) + _, err = b.rvManager.ExecWithRV(ctx, key, func(tx db.Tx) (string, error) { + return "", nil + }) if err != nil { b.log.Warn("error increasing RV", "error", err) } diff --git a/pkg/storage/unified/sql/data/resource_history_update_rv.sql b/pkg/storage/unified/sql/data/resource_history_update_rv.sql index c37ed2fbe8f..767338ddb34 100644 --- a/pkg/storage/unified/sql/data/resource_history_update_rv.sql +++ b/pkg/storage/unified/sql/data/resource_history_update_rv.sql @@ -1,4 +1,12 @@ UPDATE {{ .Ident "resource_history" }} - SET {{ .Ident "resource_version" }} = {{ .Arg .ResourceVersion }} - WHERE {{ .Ident "guid" }} = {{ .Arg .GUID }} -; +SET {{ .Ident "resource_version" }} = ( + CASE + {{ range $guid, $rv := .GUIDToRV }} + WHEN {{ $.Ident "guid" }} = {{ $.Arg $guid }} THEN CAST({{ $.Arg $rv }} AS {{ if eq $.DialectName "postgres" }}BIGINT{{ else }}SIGNED{{ end }}) + {{ end }} + END +) +WHERE {{ .Ident "guid" }} IN ( + {{$first := true}} + {{ range $guid, $rv := .GUIDToRV }}{{if $first}}{{$first = false}}{{else}}, {{end}}{{ $.Arg $guid }}{{ end }} +); diff --git a/pkg/storage/unified/sql/data/resource_update.sql b/pkg/storage/unified/sql/data/resource_update.sql index 653fd820ccd..59ea5f4cdda 100644 --- a/pkg/storage/unified/sql/data/resource_update.sql +++ b/pkg/storage/unified/sql/data/resource_update.sql @@ -3,7 +3,8 @@ UPDATE {{ .Ident "resource" }} {{ .Ident "guid" }} = {{ .Arg .GUID }}, {{ .Ident "value" }} = {{ .Arg .WriteEvent.Value }}, {{ .Ident "folder" }} = {{ .Arg .Folder }}, - {{ .Ident "action" }} = {{ .Arg .WriteEvent.Type }} + {{ .Ident "action" }} = {{ .Arg .WriteEvent.Type }}, + {{ .Ident "resource_version" }} = {{ .Arg .ResourceVersion }} WHERE 1 = 1 AND {{ .Ident "group" }} = {{ .Arg .WriteEvent.Key.Group }} AND {{ .Ident "resource" }} = {{ .Arg .WriteEvent.Key.Resource }} diff --git a/pkg/storage/unified/sql/data/resource_update_rv.sql b/pkg/storage/unified/sql/data/resource_update_rv.sql index 33c97a9e17a..f2482fbe912 100644 --- a/pkg/storage/unified/sql/data/resource_update_rv.sql +++ b/pkg/storage/unified/sql/data/resource_update_rv.sql @@ -1,4 +1,12 @@ UPDATE {{ .Ident "resource" }} - SET {{ .Ident "resource_version" }} = {{ .Arg .ResourceVersion }} - WHERE {{ .Ident "guid" }} = {{ .Arg .GUID }} -; +SET {{ .Ident "resource_version" }} = ( + CASE + {{ range $guid, $rv := .GUIDToRV }} + WHEN {{ $.Ident "guid" }} = {{ $.Arg $guid }} THEN CAST({{ $.Arg $rv }} AS {{ if eq $.DialectName "postgres" }}BIGINT{{ else }}SIGNED{{ end }}) + {{ end }} + END +) +WHERE {{ .Ident "guid" }} IN ( + {{$first := true}} + {{ range $guid, $rv := .GUIDToRV }}{{if $first}}{{$first = false}}{{else}}, {{end}}{{ $.Arg $guid }}{{ end }} +); diff --git a/pkg/storage/unified/sql/queries.go b/pkg/storage/unified/sql/queries.go index b91b17791f5..3902ee8ecc3 100644 --- a/pkg/storage/unified/sql/queries.go +++ b/pkg/storage/unified/sql/queries.go @@ -295,8 +295,7 @@ func (r sqlResourceBlobQueryRequest) Validate() error { type sqlResourceUpdateRVRequest struct { sqltemplate.SQLTemplate - GUID string - ResourceVersion int64 + GUIDToRV map[string]int64 } func (r sqlResourceUpdateRVRequest) Validate() error { diff --git a/pkg/storage/unified/sql/queries_test.go b/pkg/storage/unified/sql/queries_test.go index e14eaef18d5..c8662ad310a 100644 --- a/pkg/storage/unified/sql/queries_test.go +++ b/pkg/storage/unified/sql/queries_test.go @@ -136,6 +136,10 @@ func TestUnifiedStorageQueries(t *testing.T) { Name: "single path", Data: &sqlResourceUpdateRVRequest{ SQLTemplate: mocks.NewTestingSQLTemplate(), + GUIDToRV: map[string]int64{ + "guid1": 123, + "guid2": 456, + }, }, }, }, @@ -164,6 +168,10 @@ func TestUnifiedStorageQueries(t *testing.T) { Name: "single path", Data: &sqlResourceUpdateRVRequest{ SQLTemplate: mocks.NewTestingSQLTemplate(), + GUIDToRV: map[string]int64{ + "guid1": 123, + "guid2": 456, + }, }, }, }, diff --git a/pkg/storage/unified/sql/rv_manager.go b/pkg/storage/unified/sql/rv_manager.go new file mode 100644 index 00000000000..1f3211dc9ec --- /dev/null +++ b/pkg/storage/unified/sql/rv_manager.go @@ -0,0 +1,400 @@ +package sql + +import ( + "context" + "database/sql" + "errors" + "fmt" + "sync" + "time" + + "github.com/grafana/grafana/pkg/storage/unified/resource" + "github.com/grafana/grafana/pkg/storage/unified/sql/db" + "github.com/grafana/grafana/pkg/storage/unified/sql/dbutil" + "github.com/grafana/grafana/pkg/storage/unified/sql/sqltemplate" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/trace" + "go.opentelemetry.io/otel/trace/noop" +) + +var ( + rvmWriteDuration = promauto.NewHistogramVec(prometheus.HistogramOpts{ + Name: "rvmanager_write_duration_seconds", + Help: "Duration of ResourceVersionManager write operations", + Namespace: "grafana", + NativeHistogramBucketFactor: 1.1, + }, []string{"group", "resource", "status"}) + + rvmExecBatchDuration = promauto.NewHistogramVec(prometheus.HistogramOpts{ + Name: "rvmanager_exec_batch_duration_seconds", + Help: "Duration of ResourceVersionManager batch operations", + Namespace: "grafana", + NativeHistogramBucketFactor: 1.1, + }, []string{"group", "resource", "status"}) + + rvmExecBatchPhaseDuration = promauto.NewHistogramVec(prometheus.HistogramOpts{ + Name: "rvmanager_exec_batch_phase_duration_seconds", + Help: "Duration of batch operation phases", + Namespace: "grafana", + NativeHistogramBucketFactor: 1.1, + }, []string{"group", "resource", "phase"}) + + rvmInflightWrites = promauto.NewGaugeVec(prometheus.GaugeOpts{ + Name: "rvmanager_inflight_writes", + Help: "Number of concurrent write operations", + Namespace: "grafana", + }, []string{"group", "resource"}) + + rvmBatchSize = promauto.NewHistogramVec(prometheus.HistogramOpts{ + Name: "rvmanager_batch_size", + Help: "Number of write operations per batch", + Namespace: "grafana", + NativeHistogramBucketFactor: 1.1, + }, []string{"group", "resource"}) +) + +const ( + defaultMaxBatchSize = 25 + defaultMaxBatchWaitTime = 100 * time.Millisecond + defaultBatchTimeout = 5 * time.Second +) + +// resourceVersionManager handles resource version operations +type resourceVersionManager struct { + dialect sqltemplate.Dialect + db db.DB + tracer trace.Tracer + batchMu sync.RWMutex + batchChMap map[string]chan *writeOp + + maxBatchSize int // The maximum number of operations to batch together + maxBatchWaitTime time.Duration // The maximum time to wait for a batch to be ready +} + +type writeOpResult struct { + guid string + rv int64 + err error + batchTraceLink trace.Link +} + +// writeOp is a write operation that is executed with an incremented resource version +type writeOp struct { + key *resource.ResourceKey // The key of the resource + fn WriteEventFunc // The function to execute to write the event + done chan writeOpResult // A channel informing the operation is done +} + +// WriteEventFunc is a function that writes a resource to the database +// It returns the GUID of the created resource +// The GUID is used to update the resource version for the resource in the same transaction. +type WriteEventFunc func(tx db.Tx) (guid string, err error) + +type ResourceManagerOptions struct { + Dialect sqltemplate.Dialect // The dialect to use for the database + DB db.DB // The database to use + MaxBatchSize int // The maximum number of operations to batch together + MaxBatchWaitTime time.Duration // The maximum time to wait for a batch to be ready + Tracer trace.Tracer // The tracer to use for tracing +} + +// NewResourceVersionManager creates a new ResourceVersionManager +func NewResourceVersionManager(opts ResourceManagerOptions) (*resourceVersionManager, error) { + if opts.MaxBatchSize == 0 { + opts.MaxBatchSize = defaultMaxBatchSize + } + if opts.MaxBatchWaitTime == 0 { + opts.MaxBatchWaitTime = defaultMaxBatchWaitTime + } + if opts.Tracer == nil { + opts.Tracer = noop.NewTracerProvider().Tracer("resource-version-manager") + } + if opts.Dialect == nil { + return nil, errors.New("dialect is required") + } + if opts.DB == nil { + return nil, errors.New("db is required") + } + return &resourceVersionManager{ + dialect: opts.Dialect, + db: opts.DB, + tracer: opts.Tracer, + batchChMap: make(map[string]chan *writeOp), + maxBatchSize: opts.MaxBatchSize, + maxBatchWaitTime: opts.MaxBatchWaitTime, + }, nil +} + +// ExecWithRV executes the given function with an incremented resource version +func (m *resourceVersionManager) ExecWithRV(ctx context.Context, key *resource.ResourceKey, fn WriteEventFunc) (rv int64, err error) { + rvmInflightWrites.WithLabelValues(key.Group, key.Resource).Inc() + defer rvmInflightWrites.WithLabelValues(key.Group, key.Resource).Dec() + + var status string + timer := prometheus.NewTimer(prometheus.ObserverFunc(func(v float64) { + status = "success" + if err != nil { + status = "error" + } + rvmWriteDuration.WithLabelValues(key.Group, key.Resource, status).Observe(v) + })) + defer timer.ObserveDuration() + + ctx, span := m.tracer.Start(ctx, "sql.rvmanager.ExecWithRV") + defer span.End() + + span.SetAttributes( + attribute.String("group", key.Group), + attribute.String("resource", key.Resource), + ) + op := writeOp{key: key, fn: fn, done: make(chan writeOpResult, 1)} + batchKey := fmt.Sprintf("%s/%s", key.Group, key.Resource) + + m.batchMu.Lock() + ch, ok := m.batchChMap[batchKey] + if !ok { + ch = make(chan *writeOp, m.maxBatchSize) + m.batchChMap[batchKey] = ch + go m.startBatchProcessor(key.Group, key.Resource) + } + m.batchMu.Unlock() + select { + case ch <- &op: + case <-ctx.Done(): + return 0, ctx.Err() + } + + select { + case res := <-op.done: + if res.err != nil { + span.RecordError(res.err) + } + span.SetAttributes( + attribute.String("guid", res.guid), + attribute.Int64("resource_version", res.rv), + ) + span.AddLink(res.batchTraceLink) + + return res.rv, res.err + case <-ctx.Done(): + return 0, ctx.Err() + } +} + +// startBatchProcessor is responsible for processing batches of write operations +func (m *resourceVersionManager) startBatchProcessor(group, resource string) { + ctx := context.TODO() + batchKey := fmt.Sprintf("%s/%s", group, resource) + + m.batchMu.Lock() + ch, ok := m.batchChMap[batchKey] + if !ok { + m.batchMu.Unlock() + return + } + m.batchMu.Unlock() + + for { + batch := make([]writeOp, 0, m.maxBatchSize) + // wait for a new writeOp + select { + case op := <-ch: + batch = append(batch, *op) + case <-ctx.Done(): + return + } + + prepare: + for len(batch) < m.maxBatchSize { + select { + case op := <-ch: + batch = append(batch, *op) + default: + break prepare + } + } + + rvmBatchSize.WithLabelValues(group, resource).Observe(float64(len(batch))) + m.execBatch(ctx, group, resource, batch) + } +} + +func (m *resourceVersionManager) execBatch(ctx context.Context, group, resource string, batch []writeOp) { + ctx, span := m.tracer.Start(ctx, "sql.rvmanager.execBatch") + defer span.End() + + // Add batch size attribute + span.SetAttributes( + attribute.Int("batch_size", len(batch)), + attribute.String("group", group), + attribute.String("resource", resource), + ) + + var err error + timer := prometheus.NewTimer(prometheus.ObserverFunc(func(v float64) { + status := "success" + if err != nil { + status = "error" + } + rvmExecBatchDuration.WithLabelValues(group, resource, status).Observe(v) + })) + defer timer.ObserveDuration() + + ctx, cancel := context.WithTimeout(ctx, defaultBatchTimeout) + defer cancel() + + guidToRV := make(map[string]int64, len(batch)) + guids := make([]string, len(batch)) // The GUIDs of the created resources in the same order as the batch + rvs := make([]int64, len(batch)) // The RVs of the created resources in the same order as the batch + + err = m.db.WithTx(ctx, ReadCommitted, func(ctx context.Context, tx db.Tx) error { + span.AddEvent("starting_batch_transaction") + + writeTimer := prometheus.NewTimer(prometheus.ObserverFunc(func(v float64) { + rvmExecBatchPhaseDuration.WithLabelValues(group, resource, "write_ops").Observe(v) + })) + for i := range batch { + guid, err := batch[i].fn(tx) + if err != nil { + span.AddEvent("batch_operation_failed", trace.WithAttributes( + attribute.Int("operation_index", i), + attribute.String("error", err.Error()), + )) + return fmt.Errorf("failed to execute function: %w", err) + } + guids[i] = guid + } + writeTimer.ObserveDuration() + span.AddEvent("batch_operations_completed") + + lockTimer := prometheus.NewTimer(prometheus.ObserverFunc(func(v float64) { + rvmExecBatchPhaseDuration.WithLabelValues(group, resource, "waiting_for_lock").Observe(v) + })) + rv, err := m.lock(ctx, tx, group, resource) + lockTimer.ObserveDuration() + if err != nil { + span.AddEvent("resource_version_lock_failed", trace.WithAttributes( + attribute.String("error", err.Error()), + )) + return fmt.Errorf("failed to increment resource version: %w", err) + } + span.AddEvent("resource_version_locked", trace.WithAttributes( + attribute.Int64("initial_rv", rv), + )) + + rvUpdateTimer := prometheus.NewTimer(prometheus.ObserverFunc(func(v float64) { + rvmExecBatchPhaseDuration.WithLabelValues(group, resource, "update_resource_versions").Observe(v) + })) + defer rvUpdateTimer.ObserveDuration() + // Allocate the RVs + for i, guid := range guids { + guidToRV[guid] = rv + rvs[i] = rv + rv++ + } + // Update the resource version for the created resources in both the resource and the resource history + if _, err := dbutil.Exec(ctx, tx, sqlResourceUpdateRV, sqlResourceUpdateRVRequest{ + SQLTemplate: sqltemplate.New(m.dialect), + GUIDToRV: guidToRV, + }); err != nil { + span.AddEvent("resource_update_rv_failed", trace.WithAttributes( + attribute.String("error", err.Error()), + )) + return fmt.Errorf("update resource version: %w", err) + } + span.AddEvent("resource_versions_updated") + + if _, err := dbutil.Exec(ctx, tx, sqlResourceHistoryUpdateRV, sqlResourceUpdateRVRequest{ + SQLTemplate: sqltemplate.New(m.dialect), + GUIDToRV: guidToRV, + }); err != nil { + span.AddEvent("resource_history_update_rv_failed", trace.WithAttributes( + attribute.String("error", err.Error()), + )) + return fmt.Errorf("update resource history version: %w", err) + } + span.AddEvent("resource_history_versions_updated") + + // Record the latest RV in the resource version table + err = m.saveRV(ctx, tx, group, resource, rv) + if err != nil { + span.AddEvent("save_rv_failed", trace.WithAttributes( + attribute.String("error", err.Error()), + )) + } + return err + }) + + if err != nil { + span.AddEvent("batch_transaction_failed", trace.WithAttributes( + attribute.String("error", err.Error()), + )) + } else { + span.AddEvent("batch_transaction_completed") + } + + // notify the caller that the operations are done + for i := range batch { + batch[i].done <- writeOpResult{ + guid: guids[i], + rv: rvs[i], + err: err, + batchTraceLink: trace.LinkFromContext(ctx), + } + } +} + +// lock locks the resource version for the given key +func (m *resourceVersionManager) lock(ctx context.Context, x db.ContextExecer, group, resource string) (nextRV int64, err error) { + // 1. Lock the row and prevent concurrent updates until the transaction is committed + res, err := dbutil.QueryRow(ctx, x, sqlResourceVersionGet, sqlResourceVersionGetRequest{ + SQLTemplate: sqltemplate.New(m.dialect), + Group: group, + Resource: resource, + Response: new(resourceVersionResponse), + ReadOnly: false, // Lock the row for update + }) + + if errors.Is(err, sql.ErrNoRows) { + // If there wasn't a row for this resource, create it + if _, err = dbutil.Exec(ctx, x, sqlResourceVersionInsert, sqlResourceVersionUpsertRequest{ + SQLTemplate: sqltemplate.New(m.dialect), + Group: group, + Resource: resource, + }); err != nil { + return 0, fmt.Errorf("insert into resource_version: %w", err) + } + + // Fetch the newly created resource version + res, err = dbutil.QueryRow(ctx, x, sqlResourceVersionGet, sqlResourceVersionGetRequest{ + SQLTemplate: sqltemplate.New(m.dialect), + Group: group, + Resource: resource, + Response: new(resourceVersionResponse), + ReadOnly: true, + }) + if err != nil { + return 0, fmt.Errorf("fetching RV after insert: %w", err) + } + return res.ResourceVersion, nil + } else if err != nil { + return 0, fmt.Errorf("lock the resource version: %w", err) + } + + return max(res.CurrentEpoch, res.ResourceVersion+1), nil +} + +func (m *resourceVersionManager) saveRV(ctx context.Context, x db.ContextExecer, group, resource string, rv int64) error { + _, err := dbutil.Exec(ctx, x, sqlResourceVersionUpdate, sqlResourceVersionUpsertRequest{ + SQLTemplate: sqltemplate.New(m.dialect), + Group: group, + Resource: resource, + ResourceVersion: rv, + }) + if err != nil { + return fmt.Errorf("save resource version: %w", err) + } + return nil +} diff --git a/pkg/storage/unified/sql/rv_manager_test.go b/pkg/storage/unified/sql/rv_manager_test.go new file mode 100644 index 00000000000..2186323f845 --- /dev/null +++ b/pkg/storage/unified/sql/rv_manager_test.go @@ -0,0 +1,64 @@ +package sql + +import ( + "testing" + + sqlmock "github.com/DATA-DOG/go-sqlmock" + "github.com/grafana/grafana/pkg/storage/unified/resource" + "github.com/grafana/grafana/pkg/storage/unified/sql/db" + "github.com/grafana/grafana/pkg/storage/unified/sql/sqltemplate" + "github.com/grafana/grafana/pkg/storage/unified/sql/test" + "github.com/grafana/grafana/pkg/util/testutil" + "github.com/stretchr/testify/require" +) + +func expectSuccessfulResourceVersionLock(t *testing.T, dbp test.TestDBProvider, rv int64, timestamp int64) { + dbp.SQLMock.ExpectQuery("select resource_version, unix_timestamp for update"). + WillReturnRows(sqlmock.NewRows([]string{"resource_version", "unix_timestamp"}). + AddRow(rv, timestamp)) +} + +func expectSuccessfulResourceVersionSaveRV(t *testing.T, dbp test.TestDBProvider) { + dbp.SQLMock.ExpectExec("update resource set resource_version").WillReturnResult(sqlmock.NewResult(1, 1)) + dbp.SQLMock.ExpectExec("update resource_history set resource_version").WillReturnResult(sqlmock.NewResult(1, 1)) + dbp.SQLMock.ExpectExec("update resource_version set resource_version").WillReturnResult(sqlmock.NewResult(1, 1)) +} + +func expectSuccessfulResourceVersionExec(t *testing.T, dbp test.TestDBProvider, cbs ...func()) { + for _, cb := range cbs { + cb() + } + expectSuccessfulResourceVersionLock(t, dbp, 100, 200) + expectSuccessfulResourceVersionSaveRV(t, dbp) +} + +func TestResourceVersionManager(t *testing.T) { + ctx := testutil.NewDefaultTestContext(t) + dbp := test.NewDBProviderMatchWords(t) + dialect := sqltemplate.DialectForDriver(dbp.DB.DriverName()) + manager, err := NewResourceVersionManager(ResourceManagerOptions{ + DB: dbp.DB, + Dialect: dialect, + }) + require.NoError(t, err) + require.NotNil(t, manager) + + t.Run("should handle single operation", func(t *testing.T) { + key := &resource.ResourceKey{ + Group: "test-group", + Resource: "test-resource", + } + dbp.SQLMock.ExpectBegin() + expectSuccessfulResourceVersionExec(t, dbp, func() { + dbp.SQLMock.ExpectExec("select 1").WillReturnResult(sqlmock.NewResult(1, 1)) + }) + dbp.SQLMock.ExpectCommit() + + rv, err := manager.ExecWithRV(ctx, key, func(tx db.Tx) (string, error) { + _, err := tx.ExecContext(ctx, "select 1") + return "1234", err + }) + require.NoError(t, err) + require.Equal(t, rv, int64(200)) + }) +} diff --git a/pkg/storage/unified/sql/test/benchmark_test.go b/pkg/storage/unified/sql/test/benchmark_test.go index 9ac1713db66..b91bcb003ab 100644 --- a/pkg/storage/unified/sql/test/benchmark_test.go +++ b/pkg/storage/unified/sql/test/benchmark_test.go @@ -23,7 +23,7 @@ func newTestBackend(b *testing.B) resource.StorageBackend { backend, err := sql.NewBackend(sql.BackendOptions{ DBProvider: eDB, IsHA: true, - SimulatedNetworkLatency: 5 * time.Millisecond, // to simulate some network latency + SimulatedNetworkLatency: 2 * time.Millisecond, // to simulate some network latency }) require.NoError(b, err) require.NotNil(b, backend) diff --git a/pkg/storage/unified/sql/testdata/mysql--resource_history_update_rv-single path.sql b/pkg/storage/unified/sql/testdata/mysql--resource_history_update_rv-single path.sql index c09ee183e62..6b07ff5e55b 100755 --- a/pkg/storage/unified/sql/testdata/mysql--resource_history_update_rv-single path.sql +++ b/pkg/storage/unified/sql/testdata/mysql--resource_history_update_rv-single path.sql @@ -1,4 +1,10 @@ UPDATE `resource_history` - SET `resource_version` = 0 - WHERE `guid` = '' -; +SET `resource_version` = ( + CASE + WHEN `guid` = 'guid1' THEN CAST(123 AS SIGNED) + WHEN `guid` = 'guid2' THEN CAST(456 AS SIGNED) + END +) +WHERE `guid` IN ( + 'guid1', 'guid2' +); diff --git a/pkg/storage/unified/sql/testdata/mysql--resource_update-single path.sql b/pkg/storage/unified/sql/testdata/mysql--resource_update-single path.sql index ed94a0d7e1d..e54cda2c0d7 100755 --- a/pkg/storage/unified/sql/testdata/mysql--resource_update-single path.sql +++ b/pkg/storage/unified/sql/testdata/mysql--resource_update-single path.sql @@ -3,7 +3,8 @@ UPDATE `resource` `guid` = '', `value` = '[]', `folder` = 'fldr', - `action` = 'UNKNOWN' + `action` = 'UNKNOWN', + `resource_version` = 0 WHERE 1 = 1 AND `group` = 'gg' AND `resource` = 'rr' diff --git a/pkg/storage/unified/sql/testdata/mysql--resource_update_rv-single path.sql b/pkg/storage/unified/sql/testdata/mysql--resource_update_rv-single path.sql index f09b3e91c14..4e1573992f6 100755 --- a/pkg/storage/unified/sql/testdata/mysql--resource_update_rv-single path.sql +++ b/pkg/storage/unified/sql/testdata/mysql--resource_update_rv-single path.sql @@ -1,4 +1,10 @@ UPDATE `resource` - SET `resource_version` = 0 - WHERE `guid` = '' -; +SET `resource_version` = ( + CASE + WHEN `guid` = 'guid1' THEN CAST(123 AS SIGNED) + WHEN `guid` = 'guid2' THEN CAST(456 AS SIGNED) + END +) +WHERE `guid` IN ( + 'guid1', 'guid2' +); diff --git a/pkg/storage/unified/sql/testdata/postgres--resource_history_update_rv-single path.sql b/pkg/storage/unified/sql/testdata/postgres--resource_history_update_rv-single path.sql index 7cddc81c5ab..85352e9ead4 100755 --- a/pkg/storage/unified/sql/testdata/postgres--resource_history_update_rv-single path.sql +++ b/pkg/storage/unified/sql/testdata/postgres--resource_history_update_rv-single path.sql @@ -1,4 +1,10 @@ UPDATE "resource_history" - SET "resource_version" = 0 - WHERE "guid" = '' -; +SET "resource_version" = ( + CASE + WHEN "guid" = 'guid1' THEN CAST(123 AS BIGINT) + WHEN "guid" = 'guid2' THEN CAST(456 AS BIGINT) + END +) +WHERE "guid" IN ( + 'guid1', 'guid2' +); diff --git a/pkg/storage/unified/sql/testdata/postgres--resource_update-single path.sql b/pkg/storage/unified/sql/testdata/postgres--resource_update-single path.sql index 6d76b8f568e..2b549ed8925 100755 --- a/pkg/storage/unified/sql/testdata/postgres--resource_update-single path.sql +++ b/pkg/storage/unified/sql/testdata/postgres--resource_update-single path.sql @@ -3,7 +3,8 @@ UPDATE "resource" "guid" = '', "value" = '[]', "folder" = 'fldr', - "action" = 'UNKNOWN' + "action" = 'UNKNOWN', + "resource_version" = 0 WHERE 1 = 1 AND "group" = 'gg' AND "resource" = 'rr' diff --git a/pkg/storage/unified/sql/testdata/postgres--resource_update_rv-single path.sql b/pkg/storage/unified/sql/testdata/postgres--resource_update_rv-single path.sql index 22637847a12..1cf11690228 100755 --- a/pkg/storage/unified/sql/testdata/postgres--resource_update_rv-single path.sql +++ b/pkg/storage/unified/sql/testdata/postgres--resource_update_rv-single path.sql @@ -1,4 +1,10 @@ UPDATE "resource" - SET "resource_version" = 0 - WHERE "guid" = '' -; +SET "resource_version" = ( + CASE + WHEN "guid" = 'guid1' THEN CAST(123 AS BIGINT) + WHEN "guid" = 'guid2' THEN CAST(456 AS BIGINT) + END +) +WHERE "guid" IN ( + 'guid1', 'guid2' +); diff --git a/pkg/storage/unified/sql/testdata/sqlite--resource_history_update_rv-single path.sql b/pkg/storage/unified/sql/testdata/sqlite--resource_history_update_rv-single path.sql index 7cddc81c5ab..9fb23fb3956 100755 --- a/pkg/storage/unified/sql/testdata/sqlite--resource_history_update_rv-single path.sql +++ b/pkg/storage/unified/sql/testdata/sqlite--resource_history_update_rv-single path.sql @@ -1,4 +1,10 @@ UPDATE "resource_history" - SET "resource_version" = 0 - WHERE "guid" = '' -; +SET "resource_version" = ( + CASE + WHEN "guid" = 'guid1' THEN CAST(123 AS SIGNED) + WHEN "guid" = 'guid2' THEN CAST(456 AS SIGNED) + END +) +WHERE "guid" IN ( + 'guid1', 'guid2' +); diff --git a/pkg/storage/unified/sql/testdata/sqlite--resource_update-single path.sql b/pkg/storage/unified/sql/testdata/sqlite--resource_update-single path.sql index 6d76b8f568e..2b549ed8925 100755 --- a/pkg/storage/unified/sql/testdata/sqlite--resource_update-single path.sql +++ b/pkg/storage/unified/sql/testdata/sqlite--resource_update-single path.sql @@ -3,7 +3,8 @@ UPDATE "resource" "guid" = '', "value" = '[]', "folder" = 'fldr', - "action" = 'UNKNOWN' + "action" = 'UNKNOWN', + "resource_version" = 0 WHERE 1 = 1 AND "group" = 'gg' AND "resource" = 'rr' diff --git a/pkg/storage/unified/sql/testdata/sqlite--resource_update_rv-single path.sql b/pkg/storage/unified/sql/testdata/sqlite--resource_update_rv-single path.sql index 22637847a12..b3d839f3219 100755 --- a/pkg/storage/unified/sql/testdata/sqlite--resource_update_rv-single path.sql +++ b/pkg/storage/unified/sql/testdata/sqlite--resource_update_rv-single path.sql @@ -1,4 +1,10 @@ UPDATE "resource" - SET "resource_version" = 0 - WHERE "guid" = '' -; +SET "resource_version" = ( + CASE + WHEN "guid" = 'guid1' THEN CAST(123 AS SIGNED) + WHEN "guid" = 'guid2' THEN CAST(456 AS SIGNED) + END +) +WHERE "guid" IN ( + 'guid1', 'guid2' +); diff --git a/pkg/storage/unified/testing/benchmark.go b/pkg/storage/unified/testing/benchmark.go index 0f16e5a7d15..2f81f1a077b 100644 --- a/pkg/storage/unified/testing/benchmark.go +++ b/pkg/storage/unified/testing/benchmark.go @@ -26,7 +26,7 @@ type BenchmarkOptions struct { func DefaultBenchmarkOptions() *BenchmarkOptions { return &BenchmarkOptions{ NumResources: 1000, - Concurrency: 20, + Concurrency: 50, NumNamespaces: 1, NumGroups: 1, NumResourceTypes: 1, From 87638c0170800c3b4e67f60f4e7995a790157e55 Mon Sep 17 00:00:00 2001 From: Steve Simpson Date: Thu, 13 Mar 2025 09:28:35 +0100 Subject: [PATCH 010/117] Alerting: Start splitting apart ngalert/api package. (#102075) --- .../snapshot_mgmt_alerts.go | 2 +- pkg/services/ngalert/api/api.go | 5 +- pkg/services/ngalert/api/api_notifications.go | 1 + .../ngalert/api/api_notifications_test.go | 1 + .../ngalert/api/api_prometheus_test.go | 82 ++++++++++--------- pkg/services/ngalert/api/api_provisioning.go | 1 + pkg/services/ngalert/api/api_ruler.go | 13 ++- pkg/services/ngalert/api/api_ruler_export.go | 4 +- .../ngalert/api/api_ruler_export_test.go | 1 + .../ngalert/api/api_ruler_validation_test.go | 25 +++--- pkg/services/ngalert/api/api_testing.go | 8 +- pkg/services/ngalert/api/api_testing_test.go | 1 + .../ngalert/api/{ => compat}/compat.go | 0 .../ngalert/api/{ => compat}/compat_test.go | 0 .../ngalert/api/compat_contact_points_test.go | 3 +- .../ngalert/api/forking_prometheus.go | 6 +- .../api/{ => prometheus}/api_prometheus.go | 31 +++++-- .../{ => validation}/api_ruler_validation.go | 19 +++-- 18 files changed, 127 insertions(+), 76 deletions(-) rename pkg/services/ngalert/api/{ => compat}/compat.go (100%) rename pkg/services/ngalert/api/{ => compat}/compat_test.go (100%) rename pkg/services/ngalert/api/{ => prometheus}/api_prometheus.go (95%) rename pkg/services/ngalert/api/{ => validation}/api_ruler_validation.go (95%) diff --git a/pkg/services/cloudmigration/cloudmigrationimpl/snapshot_mgmt_alerts.go b/pkg/services/cloudmigration/cloudmigrationimpl/snapshot_mgmt_alerts.go index c75d8a35df0..886070aee09 100644 --- a/pkg/services/cloudmigration/cloudmigrationimpl/snapshot_mgmt_alerts.go +++ b/pkg/services/cloudmigration/cloudmigrationimpl/snapshot_mgmt_alerts.go @@ -9,7 +9,7 @@ import ( "github.com/prometheus/common/model" "github.com/grafana/grafana/pkg/components/simplejson" - ngalertapi "github.com/grafana/grafana/pkg/services/ngalert/api" + ngalertapi "github.com/grafana/grafana/pkg/services/ngalert/api/compat" "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" "github.com/grafana/grafana/pkg/services/ngalert/provisioning" "github.com/grafana/grafana/pkg/services/user" diff --git a/pkg/services/ngalert/api/api.go b/pkg/services/ngalert/api/api.go index 03431b0d7ca..31c9211ad6a 100644 --- a/pkg/services/ngalert/api/api.go +++ b/pkg/services/ngalert/api/api.go @@ -14,6 +14,7 @@ import ( "github.com/grafana/grafana/pkg/services/datasources" "github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/services/ngalert/accesscontrol" + apiprometheus "github.com/grafana/grafana/pkg/services/ngalert/api/prometheus" "github.com/grafana/grafana/pkg/services/ngalert/backtesting" "github.com/grafana/grafana/pkg/services/ngalert/eval" "github.com/grafana/grafana/pkg/services/ngalert/metrics" @@ -64,7 +65,7 @@ type API struct { DataProxy *datasourceproxy.DataSourceProxyService MultiOrgAlertmanager *notifier.MultiOrgAlertmanager StateManager *state.Manager - Scheduler StatusReader + Scheduler apiprometheus.StatusReader AccessControl ac.AccessControl Policies *provisioning.NotificationPolicyService ReceiverService *notifier.ReceiverService @@ -119,7 +120,7 @@ func (api *API) RegisterAPIEndpoints(m *metrics.API) { api.RegisterPrometheusApiEndpoints(NewForkingProm( api.DatasourceCache, NewLotexProm(proxy, logger), - &PrometheusSrv{log: logger, manager: api.StateManager, status: api.Scheduler, store: api.RuleStore, authz: ruleAuthzService}, + apiprometheus.NewPrometheusSrv(logger, api.StateManager, api.Scheduler, api.RuleStore, ruleAuthzService), ), m) // Register endpoints for proxying to Cortex Ruler-compatible backends. api.RegisterRulerApiEndpoints(NewForkingRuler( diff --git a/pkg/services/ngalert/api/api_notifications.go b/pkg/services/ngalert/api/api_notifications.go index c828895c1bf..c29a9d14c16 100644 --- a/pkg/services/ngalert/api/api_notifications.go +++ b/pkg/services/ngalert/api/api_notifications.go @@ -8,6 +8,7 @@ import ( "github.com/grafana/grafana/pkg/apimachinery/identity" "github.com/grafana/grafana/pkg/infra/log" contextmodel "github.com/grafana/grafana/pkg/services/contexthandler/model" + . "github.com/grafana/grafana/pkg/services/ngalert/api/compat" "github.com/grafana/grafana/pkg/services/ngalert/models" ) diff --git a/pkg/services/ngalert/api/api_notifications_test.go b/pkg/services/ngalert/api/api_notifications_test.go index d4e97b3c6f3..aec7c0072c1 100644 --- a/pkg/services/ngalert/api/api_notifications_test.go +++ b/pkg/services/ngalert/api/api_notifications_test.go @@ -18,6 +18,7 @@ import ( "github.com/grafana/grafana/pkg/services/accesscontrol" contextmodel "github.com/grafana/grafana/pkg/services/contexthandler/model" ac "github.com/grafana/grafana/pkg/services/ngalert/accesscontrol" + . "github.com/grafana/grafana/pkg/services/ngalert/api/compat" "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" "github.com/grafana/grafana/pkg/services/ngalert/models" "github.com/grafana/grafana/pkg/services/ngalert/notifier" diff --git a/pkg/services/ngalert/api/api_prometheus_test.go b/pkg/services/ngalert/api/api_prometheus_test.go index 8ac41c3606e..d37dea79d2a 100644 --- a/pkg/services/ngalert/api/api_prometheus_test.go +++ b/pkg/services/ngalert/api/api_prometheus_test.go @@ -32,6 +32,8 @@ import ( "github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/util" "github.com/grafana/grafana/pkg/web" + + . "github.com/grafana/grafana/pkg/services/ngalert/api/prometheus" ) func Test_FormatValues(t *testing.T) { @@ -79,7 +81,7 @@ func Test_FormatValues(t *testing.T) { for _, tt := range tc { t.Run(tt.name, func(t *testing.T) { - require.Equal(t, tt.expected, formatValues(tt.alertState)) + require.Equal(t, tt.expected, FormatValues(tt.alertState)) }) } } @@ -503,13 +505,13 @@ func TestRouteGetRuleStatuses(t *testing.T) { rules := gen.With(gen.WithGroupKey(groupKey), gen.WithUniqueGroupIndex()).GenerateManyRef(5, 10) ruleStore.PutRule(context.Background(), rules...) - api := PrometheusSrv{ - log: log.NewNopLogger(), - manager: fakeAIM, - status: fakeSch, - store: ruleStore, - authz: &fakeRuleAccessControlService{}, - } + api := NewPrometheusSrv( + log.NewNopLogger(), + fakeAIM, + fakeSch, + ruleStore, + &fakeRuleAccessControlService{}, + ) response := api.RouteGetRuleStatuses(c) require.Equal(t, http.StatusOK, response.Status()) @@ -565,13 +567,13 @@ func TestRouteGetRuleStatuses(t *testing.T) { ruleStore.PutRule(context.Background(), rulesInGroup2...) ruleStore.PutRule(context.Background(), rulesInGroup3...) - api := PrometheusSrv{ - log: log.NewNopLogger(), - manager: fakeAIM, - status: newFakeSchedulerReader(t).setupStates(fakeAIM), - store: ruleStore, - authz: accesscontrol.NewRuleService(acimpl.ProvideAccessControl(featuremgmt.WithFeatures())), - } + api := NewPrometheusSrv( + log.NewNopLogger(), + fakeAIM, + newFakeSchedulerReader(t).setupStates(fakeAIM), + ruleStore, + accesscontrol.NewRuleService(acimpl.ProvideAccessControl(featuremgmt.WithFeatures())), + ) permissions := createPermissionsForRules(slices.Concat(rulesInGroup1, rulesInGroup2, rulesInGroup3), orgID) user := &user.SignedInUser{ @@ -663,7 +665,7 @@ func TestRouteGetRuleStatuses(t *testing.T) { require.NoError(t, json.Unmarshal(resp.Body(), result)) require.Len(t, result.Data.RuleGroups, 1) - folder, err := api.store.GetNamespaceByUID(context.Background(), "folder-1", orgID, user) + folder, err := ruleStore.GetNamespaceByUID(context.Background(), "folder-1", orgID, user) require.NoError(t, err) require.Equal(t, folder.Fullpath, result.Data.RuleGroups[0].File) require.Equal(t, "rule-group-3", result.Data.RuleGroups[0].Name) @@ -691,13 +693,13 @@ func TestRouteGetRuleStatuses(t *testing.T) { ruleStore.PutRule(context.Background(), rules...) } - api := PrometheusSrv{ - log: log.NewNopLogger(), - manager: fakeAIM, - status: newFakeSchedulerReader(t).setupStates(fakeAIM), - store: ruleStore, - authz: accesscontrol.NewRuleService(acimpl.ProvideAccessControl(featuremgmt.WithFeatures())), - } + api := NewPrometheusSrv( + log.NewNopLogger(), + fakeAIM, + newFakeSchedulerReader(t).setupStates(fakeAIM), + ruleStore, + accesscontrol.NewRuleService(acimpl.ProvideAccessControl(featuremgmt.WithFeatures())), + ) permissions := createPermissionsForRules(allRules, orgID) user := &user.SignedInUser{ @@ -722,7 +724,7 @@ func TestRouteGetRuleStatuses(t *testing.T) { require.Len(t, result.Data.RuleGroups, 9) require.NotZero(t, len(result.Data.Totals)) for i := 0; i < 9; i++ { - folder, err := api.store.GetNamespaceByUID(context.Background(), fmt.Sprintf("namespace_%d", i/9), orgID, user) + folder, err := ruleStore.GetNamespaceByUID(context.Background(), fmt.Sprintf("namespace_%d", i/9), orgID, user) require.NoError(t, err) require.Equal(t, folder.Fullpath, result.Data.RuleGroups[i].File) require.Equal(t, fmt.Sprintf("rule_group_%d", i), result.Data.RuleGroups[i].Name) @@ -783,7 +785,7 @@ func TestRouteGetRuleStatuses(t *testing.T) { require.Empty(t, result.Data.NextToken) for i := 0; i < 9; i++ { - folder, err := api.store.GetNamespaceByUID(context.Background(), fmt.Sprintf("namespace_%d", i/9), orgID, user) + folder, err := ruleStore.GetNamespaceByUID(context.Background(), fmt.Sprintf("namespace_%d", i/9), orgID, user) require.NoError(t, err) require.Equal(t, folder.Fullpath, returnedGroups[i].File) require.Equal(t, fmt.Sprintf("rule_group_%d", i), returnedGroups[i].Name) @@ -805,7 +807,7 @@ func TestRouteGetRuleStatuses(t *testing.T) { require.Len(t, result.Data.Totals, 0) require.NotEmpty(t, result.Data.NextToken) - folder, err := api.store.GetNamespaceByUID(context.Background(), "namespace_0", orgID, user) + folder, err := ruleStore.GetNamespaceByUID(context.Background(), "namespace_0", orgID, user) require.NoError(t, err) require.Equal(t, folder.Fullpath, result.Data.RuleGroups[0].File) require.Equal(t, "rule_group_0", result.Data.RuleGroups[0].Name) @@ -835,13 +837,13 @@ func TestRouteGetRuleStatuses(t *testing.T) { ruleStore.PutRule(context.Background(), rules...) ruleStore.PutRule(context.Background(), gen.GenerateManyRef(2, 6)...) - api := PrometheusSrv{ - log: log.NewNopLogger(), - manager: fakeAIM, - status: newFakeSchedulerReader(t).setupStates(fakeAIM), - store: ruleStore, - authz: accesscontrol.NewRuleService(acimpl.ProvideAccessControl(featuremgmt.WithFeatures())), - } + api := NewPrometheusSrv( + log.NewNopLogger(), + fakeAIM, + newFakeSchedulerReader(t).setupStates(fakeAIM), + ruleStore, + accesscontrol.NewRuleService(acimpl.ProvideAccessControl(featuremgmt.WithFeatures())), + ) c := &contextmodel.ReqContext{Context: &web.Context{Req: req}, SignedInUser: &user.SignedInUser{OrgID: orgID, Permissions: createPermissionsForRules(rules, orgID)}} @@ -1523,13 +1525,13 @@ func setupAPI(t *testing.T) (*fakes.RuleStore, *fakeAlertInstanceManager, Promet fakeSch := newFakeSchedulerReader(t).setupStates(fakeAIM) fakeAuthz := &fakeRuleAccessControlService{} - api := PrometheusSrv{ - log: log.NewNopLogger(), - manager: fakeAIM, - status: fakeSch, - store: fakeStore, - authz: fakeAuthz, - } + api := *NewPrometheusSrv( + log.NewNopLogger(), + fakeAIM, + fakeSch, + fakeStore, + fakeAuthz, + ) return fakeStore, fakeAIM, api } diff --git a/pkg/services/ngalert/api/api_provisioning.go b/pkg/services/ngalert/api/api_provisioning.go index b5c7f5ab1c2..44e2fd9a935 100644 --- a/pkg/services/ngalert/api/api_provisioning.go +++ b/pkg/services/ngalert/api/api_provisioning.go @@ -14,6 +14,7 @@ import ( contextmodel "github.com/grafana/grafana/pkg/services/contexthandler/model" "github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/services/folder" + . "github.com/grafana/grafana/pkg/services/ngalert/api/compat" "github.com/grafana/grafana/pkg/services/ngalert/api/hcl" "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" alerting_models "github.com/grafana/grafana/pkg/services/ngalert/models" diff --git a/pkg/services/ngalert/api/api_ruler.go b/pkg/services/ngalert/api/api_ruler.go index e5ece7154e3..f3f9573be66 100644 --- a/pkg/services/ngalert/api/api_ruler.go +++ b/pkg/services/ngalert/api/api_ruler.go @@ -5,8 +5,10 @@ import ( "errors" "fmt" "net/http" + "net/url" "slices" "sort" + "strconv" "strings" "time" @@ -21,7 +23,9 @@ import ( "github.com/grafana/grafana/pkg/services/dashboards" "github.com/grafana/grafana/pkg/services/featuremgmt" authz "github.com/grafana/grafana/pkg/services/ngalert/accesscontrol" + . "github.com/grafana/grafana/pkg/services/ngalert/api/compat" apimodels "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" + apivalidation "github.com/grafana/grafana/pkg/services/ngalert/api/validation" "github.com/grafana/grafana/pkg/services/ngalert/eval" ngmodels "github.com/grafana/grafana/pkg/services/ngalert/models" "github.com/grafana/grafana/pkg/services/ngalert/notifier" @@ -390,7 +394,7 @@ func (srv RulerSrv) RoutePostNameRulesConfig(c *contextmodel.ReqContext, ruleGro return ErrResp(http.StatusBadRequest, err, "") } - rules, err := ValidateRuleGroup(&ruleGroupConfig, c.SignedInUser.GetOrgID(), namespace.UID, RuleLimitsFromConfig(srv.cfg, srv.featureManager)) + rules, err := apivalidation.ValidateRuleGroup(&ruleGroupConfig, c.SignedInUser.GetOrgID(), namespace.UID, apivalidation.RuleLimitsFromConfig(srv.cfg, srv.featureManager)) if err != nil { return ErrResp(http.StatusBadRequest, err, "") } @@ -813,3 +817,10 @@ func (srv RulerSrv) resolveUserIdToNameFn(ctx context.Context) userIDToUserInfoF return result } } + +func getPanelIDFromQuery(v url.Values) (int64, error) { + if s := strings.TrimSpace(v.Get("panel_id")); s != "" { + return strconv.ParseInt(s, 10, 64) + } + return 0, nil +} diff --git a/pkg/services/ngalert/api/api_ruler_export.go b/pkg/services/ngalert/api/api_ruler_export.go index bd940a35b45..38af5aa9e4f 100644 --- a/pkg/services/ngalert/api/api_ruler_export.go +++ b/pkg/services/ngalert/api/api_ruler_export.go @@ -9,7 +9,9 @@ import ( contextmodel "github.com/grafana/grafana/pkg/services/contexthandler/model" authz "github.com/grafana/grafana/pkg/services/ngalert/accesscontrol" + . "github.com/grafana/grafana/pkg/services/ngalert/api/compat" apimodels "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" + apivalidation "github.com/grafana/grafana/pkg/services/ngalert/api/validation" ngmodels "github.com/grafana/grafana/pkg/services/ngalert/models" ) @@ -21,7 +23,7 @@ func (srv RulerSrv) ExportFromPayload(c *contextmodel.ReqContext, ruleGroupConfi return toNamespaceErrorResponse(err) } - rulesWithOptionals, err := ValidateRuleGroup(&ruleGroupConfig, c.SignedInUser.GetOrgID(), namespace.UID, RuleLimitsFromConfig(srv.cfg, srv.featureManager)) + rulesWithOptionals, err := apivalidation.ValidateRuleGroup(&ruleGroupConfig, c.SignedInUser.GetOrgID(), namespace.UID, apivalidation.RuleLimitsFromConfig(srv.cfg, srv.featureManager)) if err != nil { return ErrResp(http.StatusBadRequest, err, "") } diff --git a/pkg/services/ngalert/api/api_ruler_export_test.go b/pkg/services/ngalert/api/api_ruler_export_test.go index 866e31dbae0..f976bcf0e4e 100644 --- a/pkg/services/ngalert/api/api_ruler_export_test.go +++ b/pkg/services/ngalert/api/api_ruler_export_test.go @@ -20,6 +20,7 @@ import ( "github.com/grafana/grafana/pkg/services/dashboards" "github.com/grafana/grafana/pkg/services/datasources" folder2 "github.com/grafana/grafana/pkg/services/folder" + . "github.com/grafana/grafana/pkg/services/ngalert/api/compat" apimodels "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" ngmodels "github.com/grafana/grafana/pkg/services/ngalert/models" "github.com/grafana/grafana/pkg/services/ngalert/tests/fakes" diff --git a/pkg/services/ngalert/api/api_ruler_validation_test.go b/pkg/services/ngalert/api/api_ruler_validation_test.go index b56705f625f..7f47630a56b 100644 --- a/pkg/services/ngalert/api/api_ruler_validation_test.go +++ b/pkg/services/ngalert/api/api_ruler_validation_test.go @@ -14,11 +14,14 @@ import ( "github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/services/folder" + . "github.com/grafana/grafana/pkg/services/ngalert/api/compat" apimodels "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" "github.com/grafana/grafana/pkg/services/ngalert/models" "github.com/grafana/grafana/pkg/services/ngalert/store" "github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/util" + + . "github.com/grafana/grafana/pkg/services/ngalert/api/validation" ) var allNoData = []apimodels.NoDataState{ @@ -187,7 +190,7 @@ func TestValidateCondition(t *testing.T) { for _, tc := range testcases { t.Run(tc.name, func(t *testing.T) { - err := validateCondition(tc.condition, tc.data, false) + err := ValidateCondition(tc.condition, tc.data, false) if tc.errorMsg == "" { require.NoError(t, err) } else { @@ -511,7 +514,7 @@ func TestValidateRuleNode_NoUID(t *testing.T) { lim = *testCase.limits } - alert, err := validateRuleNode(r, name, interval, orgId, folder.UID, lim) + alert, err := ValidateRuleNode(r, name, interval, orgId, folder.UID, lim) require.NoError(t, err) testCase.assert(t, r, alert) }) @@ -519,7 +522,7 @@ func TestValidateRuleNode_NoUID(t *testing.T) { t.Run("accepts empty group name", func(t *testing.T) { r := validRule() - alert, err := validateRuleNode(&r, "", interval, orgId, folder.UID, limits) + alert, err := ValidateRuleNode(&r, "", interval, orgId, folder.UID, limits) require.NoError(t, err) require.Equal(t, "", alert.RuleGroup) }) @@ -739,7 +742,7 @@ func TestValidateRuleNodeFailures_NoUID(t *testing.T) { lim = *testCase.limits } - _, err := validateRuleNode(r, "", interval, orgId, folder.UID, lim) + _, err := ValidateRuleNode(r, "", interval, orgId, folder.UID, lim) require.Error(t, err) if testCase.expErr != "" { require.ErrorContains(t, err, testCase.expErr) @@ -835,7 +838,7 @@ func TestValidateRuleNode_UID(t *testing.T) { for _, testCase := range testCases { t.Run(testCase.name, func(t *testing.T) { r := testCase.rule() - alert, err := validateRuleNode(r, name, interval, orgId, folder.UID, limits) + alert, err := ValidateRuleNode(r, name, interval, orgId, folder.UID, limits) require.NoError(t, err) testCase.assert(t, r, alert) }) @@ -843,7 +846,7 @@ func TestValidateRuleNode_UID(t *testing.T) { t.Run("accepts empty group name", func(t *testing.T) { r := validRule() - alert, err := validateRuleNode(&r, "", interval, orgId, folder.UID, limits) + alert, err := ValidateRuleNode(&r, "", interval, orgId, folder.UID, limits) require.NoError(t, err) require.Equal(t, "", alert.RuleGroup) }) @@ -939,7 +942,7 @@ func TestValidateRuleNodeFailures_UID(t *testing.T) { interval = *testCase.interval } - _, err := validateRuleNode(r, "", interval, orgId, folder.UID, limits) + _, err := ValidateRuleNode(r, "", interval, orgId, folder.UID, limits) require.Error(t, err) if testCase.assert != nil { testCase.assert(t, r, err) @@ -973,7 +976,7 @@ func TestValidateRuleNodeIntervalFailures(t *testing.T) { for _, testCase := range testCases { t.Run(testCase.name, func(t *testing.T) { r := validRule() - _, err := validateRuleNode(&r, util.GenerateShortUID(), testCase.interval, rand.Int63(), randFolder().UID, limits) + _, err := ValidateRuleNode(&r, util.GenerateShortUID(), testCase.interval, rand.Int63(), randFolder().UID, limits) require.Error(t, err) }) } @@ -1064,7 +1067,7 @@ func TestValidateRuleNodeNotificationSettings(t *testing.T) { t.Run(tt.name, func(t *testing.T) { r := validRule() r.GrafanaManagedAlert.NotificationSettings = AlertRuleNotificationSettingsFromNotificationSettings([]models.NotificationSettings{tt.notificationSettings}) - _, err := validateRuleNode(&r, util.GenerateShortUID(), cfg.BaseInterval*time.Duration(rand.Int63n(10)+1), rand.Int63(), randFolder().UID, limits) + _, err := ValidateRuleNode(&r, util.GenerateShortUID(), cfg.BaseInterval*time.Duration(rand.Int63n(10)+1), rand.Int63(), randFolder().UID, limits) if tt.expErrorContains != "" { require.Error(t, err) @@ -1099,7 +1102,7 @@ func TestValidateRuleNodeEditorSettings(t *testing.T) { t.Run(tt.name, func(t *testing.T) { r := validRule() r.GrafanaManagedAlert.Metadata = AlertRuleMetadataFromModelMetadata(models.AlertRuleMetadata{EditorSettings: tt.editorSettings}) - newRule, err := validateRuleNode(&r, util.GenerateShortUID(), cfg.BaseInterval*time.Duration(rand.Int63n(10)+1), rand.Int63(), randFolder().UID, limits) + newRule, err := ValidateRuleNode(&r, util.GenerateShortUID(), cfg.BaseInterval*time.Duration(rand.Int63n(10)+1), rand.Int63(), randFolder().UID, limits) require.NoError(t, err) require.Equal(t, tt.editorSettings, newRule.Metadata.EditorSettings) }) @@ -1116,7 +1119,7 @@ func TestValidateRuleNodeReservedLabels(t *testing.T) { r.ApiRuleNode.Labels = map[string]string{ label: "true", } - _, err := validateRuleNode(&r, util.GenerateShortUID(), cfg.BaseInterval*time.Duration(rand.Int63n(10)+1), rand.Int63(), randFolder().UID, limits) + _, err := ValidateRuleNode(&r, util.GenerateShortUID(), cfg.BaseInterval*time.Duration(rand.Int63n(10)+1), rand.Int63(), randFolder().UID, limits) require.Error(t, err) require.ErrorContains(t, err, label) }) diff --git a/pkg/services/ngalert/api/api_testing.go b/pkg/services/ngalert/api/api_testing.go index ce1d941f000..a8eaec2223e 100644 --- a/pkg/services/ngalert/api/api_testing.go +++ b/pkg/services/ngalert/api/api_testing.go @@ -25,7 +25,9 @@ import ( "github.com/grafana/grafana/pkg/services/datasources" "github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/services/folder" + . "github.com/grafana/grafana/pkg/services/ngalert/api/compat" apimodels "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" + apivalidation "github.com/grafana/grafana/pkg/services/ngalert/api/validation" "github.com/grafana/grafana/pkg/services/ngalert/backtesting" "github.com/grafana/grafana/pkg/services/ngalert/eval" ngmodels "github.com/grafana/grafana/pkg/services/ngalert/models" @@ -61,13 +63,13 @@ func (srv TestingApiSrv) RouteTestGrafanaRuleConfig(c *contextmodel.ReqContext, if err != nil { return toNamespaceErrorResponse(dashboards.ErrFolderAccessDenied) } - rule, err := validateRuleNode( + rule, err := apivalidation.ValidateRuleNode( &body.Rule, body.RuleGroup, srv.cfg.BaseInterval, c.SignedInUser.GetOrgID(), folder.UID, - RuleLimitsFromConfig(srv.cfg, srv.featureManager), + apivalidation.RuleLimitsFromConfig(srv.cfg, srv.featureManager), ) if err != nil { return ErrResp(http.StatusBadRequest, err, "") @@ -239,7 +241,7 @@ func (srv TestingApiSrv) BacktestAlertRule(c *contextmodel.ReqContext, cmd apimo return ErrResp(400, nil, "Bad For interval") } - intervalSeconds, err := validateInterval(time.Duration(cmd.Interval), srv.cfg.BaseInterval) + intervalSeconds, err := apivalidation.ValidateInterval(time.Duration(cmd.Interval), srv.cfg.BaseInterval) if err != nil { return ErrResp(400, err, "") } diff --git a/pkg/services/ngalert/api/api_testing_test.go b/pkg/services/ngalert/api/api_testing_test.go index a8bee7838dd..4a1862240df 100644 --- a/pkg/services/ngalert/api/api_testing_test.go +++ b/pkg/services/ngalert/api/api_testing_test.go @@ -22,6 +22,7 @@ import ( "github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/services/folder" "github.com/grafana/grafana/pkg/services/ngalert/accesscontrol" + . "github.com/grafana/grafana/pkg/services/ngalert/api/compat" "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" "github.com/grafana/grafana/pkg/services/ngalert/eval" "github.com/grafana/grafana/pkg/services/ngalert/eval/eval_mocks" diff --git a/pkg/services/ngalert/api/compat.go b/pkg/services/ngalert/api/compat/compat.go similarity index 100% rename from pkg/services/ngalert/api/compat.go rename to pkg/services/ngalert/api/compat/compat.go diff --git a/pkg/services/ngalert/api/compat_test.go b/pkg/services/ngalert/api/compat/compat_test.go similarity index 100% rename from pkg/services/ngalert/api/compat_test.go rename to pkg/services/ngalert/api/compat/compat_test.go diff --git a/pkg/services/ngalert/api/compat_contact_points_test.go b/pkg/services/ngalert/api/compat_contact_points_test.go index 58698c8a65a..b8fa71fbee9 100644 --- a/pkg/services/ngalert/api/compat_contact_points_test.go +++ b/pkg/services/ngalert/api/compat_contact_points_test.go @@ -11,6 +11,7 @@ import ( receiversTesting "github.com/grafana/alerting/receivers/testing" "github.com/stretchr/testify/require" + apicompat "github.com/grafana/grafana/pkg/services/ngalert/api/compat" "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" "github.com/grafana/grafana/pkg/services/ngalert/models" "github.com/grafana/grafana/pkg/services/ngalert/provisioning" @@ -38,7 +39,7 @@ func TestContactPointFromContactPointExports(t *testing.T) { return string(d) }) require.NoError(t, err) - ex, err := ReceiverExportFromEmbeddedContactPoint(emb) + ex, err := apicompat.ReceiverExportFromEmbeddedContactPoint(emb) require.NoError(t, err) export = append(export, ex) } diff --git a/pkg/services/ngalert/api/forking_prometheus.go b/pkg/services/ngalert/api/forking_prometheus.go index c0fa78b9f74..e5286d4db48 100644 --- a/pkg/services/ngalert/api/forking_prometheus.go +++ b/pkg/services/ngalert/api/forking_prometheus.go @@ -5,16 +5,18 @@ import ( contextmodel "github.com/grafana/grafana/pkg/services/contexthandler/model" "github.com/grafana/grafana/pkg/services/datasources" apimodels "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" + + apiprometheus "github.com/grafana/grafana/pkg/services/ngalert/api/prometheus" ) type PrometheusApiHandler struct { ProxySvc *LotexProm - GrafanaSvc *PrometheusSrv + GrafanaSvc *apiprometheus.PrometheusSrv DatasourceCache datasources.CacheService } // NewForkingProm implements a set of routes that proxy to various Prometheus-compatible backends. -func NewForkingProm(datasourceCache datasources.CacheService, proxy *LotexProm, grafana *PrometheusSrv) *PrometheusApiHandler { +func NewForkingProm(datasourceCache datasources.CacheService, proxy *LotexProm, grafana *apiprometheus.PrometheusSrv) *PrometheusApiHandler { return &PrometheusApiHandler{ ProxySvc: proxy, GrafanaSvc: grafana, diff --git a/pkg/services/ngalert/api/api_prometheus.go b/pkg/services/ngalert/api/prometheus/api_prometheus.go similarity index 95% rename from pkg/services/ngalert/api/api_prometheus.go rename to pkg/services/ngalert/api/prometheus/api_prometheus.go index 364a7027253..635756e3a88 100644 --- a/pkg/services/ngalert/api/api_prometheus.go +++ b/pkg/services/ngalert/api/prometheus/api_prometheus.go @@ -16,8 +16,10 @@ import ( apiv1 "github.com/prometheus/client_golang/api/prometheus/v1" "github.com/grafana/grafana/pkg/api/response" + "github.com/grafana/grafana/pkg/apimachinery/identity" "github.com/grafana/grafana/pkg/infra/log" contextmodel "github.com/grafana/grafana/pkg/services/contexthandler/model" + "github.com/grafana/grafana/pkg/services/folder" apimodels "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" "github.com/grafana/grafana/pkg/services/ngalert/eval" ngmodels "github.com/grafana/grafana/pkg/services/ngalert/models" @@ -25,6 +27,15 @@ import ( "github.com/grafana/grafana/pkg/util" ) +type RuleStoreReader interface { + GetUserVisibleNamespaces(context.Context, int64, identity.Requester) (map[string]*folder.Folder, error) + ListAlertRules(ctx context.Context, query *ngmodels.ListAlertRulesQuery) (ngmodels.RulesGroup, error) +} + +type RuleGroupAccessControlService interface { + HasAccessToRuleGroup(ctx context.Context, user identity.Requester, rules ngmodels.RulesGroup) (bool, error) +} + type StatusReader interface { Status(key ngmodels.AlertRuleKey) (ngmodels.RuleStatus, bool) } @@ -33,8 +44,18 @@ type PrometheusSrv struct { log log.Logger manager state.AlertInstanceManager status StatusReader - store RuleStore - authz RuleAccessControlService + store RuleStoreReader + authz RuleGroupAccessControlService +} + +func NewPrometheusSrv(log log.Logger, manager state.AlertInstanceManager, status StatusReader, store RuleStoreReader, authz RuleGroupAccessControlService) *PrometheusSrv { + return &PrometheusSrv{ + log: log, + manager: manager, + status: status, + store: store, + authz: authz, + } } const queryIncludeInternalLabels = "includeInternalLabels" @@ -99,7 +120,7 @@ func PrepareAlertStatuses(manager state.AlertInstanceManager, opts AlertStatuses valString := "" if alertState.State == eval.Alerting || alertState.State == eval.Pending { - valString = formatValues(alertState) + valString = FormatValues(alertState) } alertResponse.Data.Alerts = append(alertResponse.Data.Alerts, &apimodels.Alert{ @@ -117,7 +138,7 @@ func PrepareAlertStatuses(manager state.AlertInstanceManager, opts AlertStatuses return alertResponse } -func formatValues(alertState *state.State) string { +func FormatValues(alertState *state.State) string { var fv string values := alertState.GetLastEvaluationValuesForCondition() @@ -546,7 +567,7 @@ func toRuleGroup(log log.Logger, manager state.AlertInstanceManager, sr StatusRe activeAt := alertState.StartsAt valString := "" if alertState.State == eval.Alerting || alertState.State == eval.Pending { - valString = formatValues(alertState) + valString = FormatValues(alertState) } stateKey := strings.ToLower(alertState.State.String()) totals[stateKey] += 1 diff --git a/pkg/services/ngalert/api/api_ruler_validation.go b/pkg/services/ngalert/api/validation/api_ruler_validation.go similarity index 95% rename from pkg/services/ngalert/api/api_ruler_validation.go rename to pkg/services/ngalert/api/validation/api_ruler_validation.go index 672873fa040..1635658fcd1 100644 --- a/pkg/services/ngalert/api/api_ruler_validation.go +++ b/pkg/services/ngalert/api/validation/api_ruler_validation.go @@ -1,4 +1,4 @@ -package api +package validation import ( "errors" @@ -8,6 +8,7 @@ import ( "time" "github.com/grafana/grafana/pkg/services/featuremgmt" + . "github.com/grafana/grafana/pkg/services/ngalert/api/compat" apimodels "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" ngmodels "github.com/grafana/grafana/pkg/services/ngalert/models" "github.com/grafana/grafana/pkg/services/ngalert/store" @@ -32,15 +33,15 @@ func RuleLimitsFromConfig(cfg *setting.UnifiedAlertingSettings, toggles featurem } } -// validateRuleNode validates API model (definitions.PostableExtendedRuleNode) and converts it to models.AlertRule -func validateRuleNode( +// ValidateRuleNode validates API model (definitions.PostableExtendedRuleNode) and converts it to models.AlertRule +func ValidateRuleNode( ruleNode *apimodels.PostableExtendedRuleNode, groupName string, interval time.Duration, orgId int64, namespaceUID string, limits RuleLimits) (*ngmodels.AlertRule, error) { - intervalSeconds, err := validateInterval(interval, limits.BaseInterval) + intervalSeconds, err := ValidateInterval(interval, limits.BaseInterval) if err != nil { return nil, err } @@ -132,7 +133,7 @@ func validateAlertingRuleFields(in *apimodels.PostableExtendedRuleNode, newRule } newRule.ExecErrState = errorState - err = validateCondition(in.GrafanaManagedAlert.Condition, in.GrafanaManagedAlert.Data, canPatch) + err = ValidateCondition(in.GrafanaManagedAlert.Condition, in.GrafanaManagedAlert.Data, canPatch) if err != nil { return ngmodels.AlertRule{}, err } @@ -166,7 +167,7 @@ func validateRecordingRuleFields(in *apimodels.PostableExtendedRuleNode, newRule return ngmodels.AlertRule{}, fmt.Errorf("%w: recording rules cannot be created on this instance", ngmodels.ErrAlertRuleFailedValidation) } - err := validateCondition(in.GrafanaManagedAlert.Record.From, in.GrafanaManagedAlert.Data, canPatch) + err := ValidateCondition(in.GrafanaManagedAlert.Record.From, in.GrafanaManagedAlert.Data, canPatch) if err != nil { return ngmodels.AlertRule{}, fmt.Errorf("%w: %s", ngmodels.ErrAlertRuleFailedValidation, err.Error()) } @@ -198,7 +199,7 @@ func validateLabels(l map[string]string) error { return nil } -func validateCondition(condition string, queries []apimodels.AlertQuery, canPatch bool) error { +func ValidateCondition(condition string, queries []apimodels.AlertQuery, canPatch bool) error { if canPatch { // Patch requests may leave both query and condition blank. If a request supplies one, it must supply the other. if len(queries) == 0 && condition == "" { @@ -240,7 +241,7 @@ func validateCondition(condition string, queries []apimodels.AlertQuery, canPatc return nil } -func validateInterval(interval, baseInterval time.Duration) (int64, error) { +func ValidateInterval(interval, baseInterval time.Duration) (int64, error) { intervalSeconds := int64(interval.Seconds()) baseIntervalSeconds := int64(baseInterval.Seconds()) @@ -302,7 +303,7 @@ func ValidateRuleGroup( result := make([]*ngmodels.AlertRuleWithOptionals, 0, len(ruleGroupConfig.Rules)) uids := make(map[string]int, cap(result)) for idx := range ruleGroupConfig.Rules { - rule, err := validateRuleNode(&ruleGroupConfig.Rules[idx], ruleGroupConfig.Name, interval, orgId, namespaceUID, limits) + rule, err := ValidateRuleNode(&ruleGroupConfig.Rules[idx], ruleGroupConfig.Name, interval, orgId, namespaceUID, limits) // TODO do not stop on the first failure but return all failures if err != nil { return nil, fmt.Errorf("invalid rule specification at index [%d]: %w", idx, err) From 5d2ba1011310c7834258ddf43afd376c8b6d5994 Mon Sep 17 00:00:00 2001 From: Igor Suleymanov Date: Thu, 13 Mar 2025 11:05:01 +0200 Subject: [PATCH 011/117] K8s/Dashboards: Extract Dashboard APIs to an app submodule (#102029) * Move dashboard k8s APIs to a separate app Signed-off-by: Igor Suleymanov * Copy dashboard code in Dockerfile Signed-off-by: Igor Suleymanov * Fix conversion generation Signed-off-by: Igor Suleymanov * Update OpenAPI snapshot for dashboard/v0alpha1 Signed-off-by: Igor Suleymanov --------- Signed-off-by: Igor Suleymanov --- Dockerfile | 129 ++-- apps/dashboard/Makefile | 2 +- apps/dashboard/go.mod | 125 ++++ apps/dashboard/go.sum | 377 ++++++++++ .../dashboard/pkg}/apis/dashboard/types.go | 0 .../dashboard/pkg}/apis/dashboard/utils.go | 0 .../pkg}/apis/dashboard/v0alpha1/constants.go | 0 .../dashboard/v0alpha1/dashboard_codec_gen.go | 0 .../v0alpha1/dashboard_metadata_gen.go | 0 .../v0alpha1/dashboard_object_gen.go | 0 .../v0alpha1/dashboard_schema_gen.go | 0 .../apis/dashboard/v0alpha1/dashboard_spec.go | 0 .../dashboard/v0alpha1/dashboard_spec_gen.go | 0 .../v0alpha1/dashboard_status_gen.go | 0 .../pkg}/apis/dashboard/v0alpha1/deepcopy.go | 0 .../pkg/apis/dashboard/v0alpha1}/doc.go | 4 +- .../pkg}/apis/dashboard/v0alpha1/register.go | 0 .../pkg}/apis/dashboard/v0alpha1/search.go | 0 .../pkg}/apis/dashboard/v0alpha1/types.go | 0 .../v0alpha1/zz_generated.conversion.go | 2 +- .../v0alpha1/zz_generated.deepcopy.go | 0 .../v0alpha1/zz_generated.defaults.go | 0 .../v0alpha1/zz_generated.openapi.go | 108 +-- ...enerated.openapi_violation_exceptions.list | 9 + .../pkg}/apis/dashboard/v1alpha1/constants.go | 0 .../dashboard/v1alpha1/dashboard_codec_gen.go | 0 .../v1alpha1/dashboard_metadata_gen.go | 0 .../v1alpha1/dashboard_object_gen.go | 0 .../v1alpha1/dashboard_schema_gen.go | 0 .../apis/dashboard/v1alpha1/dashboard_spec.go | 0 .../dashboard/v1alpha1/dashboard_spec_gen.go | 0 .../v1alpha1/dashboard_status_gen.go | 0 .../pkg}/apis/dashboard/v1alpha1/deepcopy.go | 0 .../pkg/apis/dashboard/v1alpha1}/doc.go | 4 +- .../pkg}/apis/dashboard/v1alpha1/register.go | 0 .../pkg}/apis/dashboard/v1alpha1/types.go | 0 .../v1alpha1/zz_generated.conversion.go | 2 +- .../v1alpha1/zz_generated.deepcopy.go | 0 .../v1alpha1/zz_generated.defaults.go | 0 .../v1alpha1/zz_generated.openapi.go | 78 +-- ...enerated.openapi_violation_exceptions.list | 4 +- .../pkg}/apis/dashboard/v2alpha1/constants.go | 0 .../dashboard/v2alpha1/dashboard_codec_gen.go | 0 .../v2alpha1/dashboard_metadata_gen.go | 0 .../v2alpha1/dashboard_object_gen.go | 0 .../v2alpha1/dashboard_schema_gen.go | 0 .../dashboard/v2alpha1/dashboard_spec_gen.go | 0 .../v2alpha1/dashboard_status_gen.go | 0 .../pkg}/apis/dashboard/v2alpha1/deepcopy.go | 0 .../pkg/apis/dashboard/v2alpha1}/doc.go | 4 +- .../pkg}/apis/dashboard/v2alpha1/register.go | 0 .../pkg}/apis/dashboard/v2alpha1/types.go | 0 .../v2alpha1/zz_generated.conversion.go | 2 +- .../v2alpha1/zz_generated.deepcopy.go | 0 .../v2alpha1/zz_generated.defaults.go | 0 .../v2alpha1/zz_generated.openapi.go | 642 +++++++++--------- ...enerated.openapi_violation_exceptions.list | 65 ++ .../dashboard/pkg}/apis/dashboard_manifest.go | 2 + .../pkg/migration/conversion/conversion.go | 173 +++++ .../migration/conversion/conversion_test.go | 14 +- .../dashboard/pkg}/migration/migrate.go | 2 +- .../dashboard/pkg}/migration/migrate_test.go | 4 +- .../pkg}/migration/schemaversion/errors.go | 0 .../migration/schemaversion/migrations.go | 0 .../schemaversion/migrations_test.go | 2 +- .../pkg}/migration/schemaversion/v37.go | 0 .../pkg}/migration/schemaversion/v37_test.go | 2 +- .../pkg}/migration/schemaversion/v38.go | 0 .../pkg}/migration/schemaversion/v38_test.go | 2 +- .../pkg}/migration/schemaversion/v39.go | 0 .../pkg}/migration/schemaversion/v39_test.go | 2 +- .../pkg}/migration/schemaversion/v40.go | 0 .../pkg}/migration/schemaversion/v40_test.go | 2 +- .../pkg}/migration/schemaversion/v41.go | 0 .../pkg}/migration/schemaversion/v41_test.go | 2 +- .../input/36.legend_normalization.json | 0 .../37.timeseries_table_display_mode.json | 0 .../input/38.transform_timeseries_table.json | 0 .../testdata/input/39.refresh_true.json | 0 .../input/40.time_picker_time_options.json | 0 .../output/36.legend_normalization.37.json | 0 .../output/36.legend_normalization.38.json | 0 .../output/36.legend_normalization.39.json | 0 .../output/36.legend_normalization.40.json | 0 .../output/36.legend_normalization.41.json | 0 .../37.timeseries_table_display_mode.38.json | 0 .../37.timeseries_table_display_mode.39.json | 0 .../37.timeseries_table_display_mode.40.json | 0 .../37.timeseries_table_display_mode.41.json | 0 .../38.transform_timeseries_table.39.json | 0 .../38.transform_timeseries_table.40.json | 0 .../38.transform_timeseries_table.41.json | 0 .../testdata/output/39.refresh_true.40.json | 0 .../testdata/output/39.refresh_true.41.json | 0 .../40.time_picker_time_options.41.json | 0 go.work | 1 + go.work.sum | 4 + hack/update-codegen.sh | 1 + pkg/api/dashboard.go | 2 +- pkg/api/dtos/dashboard.go | 2 +- .../migration/conversion/conversion.go | 173 ----- ...enerated.openapi_violation_exceptions.list | 9 - ...enerated.openapi_violation_exceptions.list | 65 -- .../datamigrations/to_unified_storage.go | 2 +- pkg/registry/apis/dashboard/large.go | 6 +- pkg/registry/apis/dashboard/large_test.go | 2 +- pkg/registry/apis/dashboard/legacy/migrate.go | 2 +- .../apis/dashboard/legacy/sql_dashboards.go | 4 +- pkg/registry/apis/dashboard/legacy/storage.go | 2 +- pkg/registry/apis/dashboard/legacy/types.go | 2 +- .../dashboard/legacysearcher/search_client.go | 2 +- .../legacysearcher/search_client_test.go | 2 +- pkg/registry/apis/dashboard/mutate.go | 6 +- pkg/registry/apis/dashboard/register.go | 70 +- pkg/registry/apis/dashboard/register_test.go | 6 +- pkg/registry/apis/dashboard/search.go | 6 +- pkg/registry/apis/dashboard/search_test.go | 2 +- pkg/registry/apis/dashboard/sub_dto.go | 2 +- .../apis/dashboardsnapshot/register.go | 4 +- pkg/services/authz/zanzana/common/tuple.go | 2 +- pkg/services/authz/zanzana/server/server.go | 2 +- pkg/services/authz/zanzana/translations.go | 2 +- .../dashboards/service/dashboard_service.go | 4 +- .../service/dashboard_service_test.go | 2 +- .../dashboards/service/search/search.go | 2 +- .../dashboardversion/dashverimpl/dashver.go | 2 +- pkg/services/folder/folderimpl/folder.go | 2 +- .../provisioning/dashboards/dashboard.go | 2 +- pkg/storage/legacysql/dualwrite/utils.go | 2 +- pkg/storage/unified/apistore/go.mod | 4 +- pkg/storage/unified/apistore/prepare_test.go | 2 +- pkg/storage/unified/resource/go.mod | 4 +- pkg/storage/unified/resource/go.sum | 3 +- pkg/storage/unified/resource/search.go | 2 +- pkg/storage/unified/search/dashboard.go | 2 +- pkg/tests/apis/dashboard/dashboards_test.go | 6 +- .../dashboard.grafana.app-v0alpha1.json | 144 ++-- .../apis/provisioning/provisioning_test.go | 2 +- 138 files changed, 1424 insertions(+), 908 deletions(-) create mode 100644 apps/dashboard/go.mod create mode 100644 apps/dashboard/go.sum rename {pkg => apps/dashboard/pkg}/apis/dashboard/types.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/utils.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v0alpha1/constants.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v0alpha1/dashboard_codec_gen.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v0alpha1/dashboard_metadata_gen.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v0alpha1/dashboard_object_gen.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v0alpha1/dashboard_schema_gen.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v0alpha1/dashboard_spec.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v0alpha1/dashboard_spec_gen.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v0alpha1/dashboard_status_gen.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v0alpha1/deepcopy.go (100%) rename {pkg/apis/dashboard/v1alpha1 => apps/dashboard/pkg/apis/dashboard/v0alpha1}/doc.go (63%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v0alpha1/register.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v0alpha1/search.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v0alpha1/types.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v0alpha1/zz_generated.conversion.go (99%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v0alpha1/zz_generated.deepcopy.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v0alpha1/zz_generated.defaults.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v0alpha1/zz_generated.openapi.go (82%) create mode 100644 apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.openapi_violation_exceptions.list rename {pkg => apps/dashboard/pkg}/apis/dashboard/v1alpha1/constants.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v1alpha1/dashboard_codec_gen.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v1alpha1/dashboard_metadata_gen.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v1alpha1/dashboard_object_gen.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v1alpha1/dashboard_schema_gen.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v1alpha1/dashboard_spec.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v1alpha1/dashboard_spec_gen.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v1alpha1/dashboard_status_gen.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v1alpha1/deepcopy.go (100%) rename {pkg/apis/dashboard/v2alpha1 => apps/dashboard/pkg/apis/dashboard/v1alpha1}/doc.go (63%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v1alpha1/register.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v1alpha1/types.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v1alpha1/zz_generated.conversion.go (99%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v1alpha1/zz_generated.deepcopy.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v1alpha1/zz_generated.defaults.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v1alpha1/zz_generated.openapi.go (82%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v1alpha1/zz_generated.openapi_violation_exceptions.list (62%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v2alpha1/constants.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v2alpha1/dashboard_codec_gen.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v2alpha1/dashboard_metadata_gen.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v2alpha1/dashboard_object_gen.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v2alpha1/dashboard_schema_gen.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v2alpha1/dashboard_spec_gen.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v2alpha1/dashboard_status_gen.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v2alpha1/deepcopy.go (100%) rename {pkg/apis/dashboard/v0alpha1 => apps/dashboard/pkg/apis/dashboard/v2alpha1}/doc.go (63%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v2alpha1/register.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v2alpha1/types.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v2alpha1/zz_generated.conversion.go (99%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v2alpha1/zz_generated.deepcopy.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v2alpha1/zz_generated.defaults.go (100%) rename {pkg => apps/dashboard/pkg}/apis/dashboard/v2alpha1/zz_generated.openapi.go (66%) create mode 100644 apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi_violation_exceptions.list rename {pkg => apps/dashboard/pkg}/apis/dashboard_manifest.go (99%) create mode 100644 apps/dashboard/pkg/migration/conversion/conversion.go rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/conversion/conversion_test.go (60%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/migrate.go (92%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/migrate_test.go (96%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/schemaversion/errors.go (100%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/schemaversion/migrations.go (100%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/schemaversion/migrations_test.go (95%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/schemaversion/v37.go (100%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/schemaversion/v37_test.go (98%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/schemaversion/v38.go (100%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/schemaversion/v38_test.go (98%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/schemaversion/v39.go (100%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/schemaversion/v39_test.go (97%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/schemaversion/v40.go (100%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/schemaversion/v40_test.go (94%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/schemaversion/v41.go (100%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/schemaversion/v41_test.go (92%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/testdata/input/36.legend_normalization.json (100%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/testdata/input/37.timeseries_table_display_mode.json (100%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/testdata/input/38.transform_timeseries_table.json (100%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/testdata/input/39.refresh_true.json (100%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/testdata/input/40.time_picker_time_options.json (100%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/testdata/output/36.legend_normalization.37.json (100%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/testdata/output/36.legend_normalization.38.json (100%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/testdata/output/36.legend_normalization.39.json (100%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/testdata/output/36.legend_normalization.40.json (100%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/testdata/output/36.legend_normalization.41.json (100%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/testdata/output/37.timeseries_table_display_mode.38.json (100%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/testdata/output/37.timeseries_table_display_mode.39.json (100%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/testdata/output/37.timeseries_table_display_mode.40.json (100%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/testdata/output/37.timeseries_table_display_mode.41.json (100%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/testdata/output/38.transform_timeseries_table.39.json (100%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/testdata/output/38.transform_timeseries_table.40.json (100%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/testdata/output/38.transform_timeseries_table.41.json (100%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/testdata/output/39.refresh_true.40.json (100%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/testdata/output/39.refresh_true.41.json (100%) rename {pkg/apis/dashboard => apps/dashboard/pkg}/migration/testdata/output/40.time_picker_time_options.41.json (100%) delete mode 100644 pkg/apis/dashboard/migration/conversion/conversion.go delete mode 100644 pkg/apis/dashboard/v0alpha1/zz_generated.openapi_violation_exceptions.list delete mode 100644 pkg/apis/dashboard/v2alpha1/zz_generated.openapi_violation_exceptions.list diff --git a/Dockerfile b/Dockerfile index 1ba856b9220..fc9eb506f28 100644 --- a/Dockerfile +++ b/Dockerfile @@ -48,13 +48,13 @@ ARG WIRE_TAGS="oss" ARG BINGO="true" RUN if grep -i -q alpine /etc/issue; then \ - apk add --no-cache \ - # This is required to allow building on arm64 due to https://github.com/golang/go/issues/22040 - binutils-gold \ - bash \ - # Install build dependencies - gcc g++ make git; \ - fi + apk add --no-cache \ + # This is required to allow building on arm64 due to https://github.com/golang/go/issues/22040 + binutils-gold \ + bash \ + # Install build dependencies + gcc g++ make git; \ + fi WORKDIR /tmp/grafana @@ -75,6 +75,7 @@ COPY pkg/aggregator pkg/aggregator COPY apps/playlist apps/playlist COPY apps/investigations apps/investigations COPY apps/advisor apps/advisor +COPY apps/dashboard apps/dashboard COPY apps apps COPY kindsv2 kindsv2 COPY apps/alerting/notifications apps/alerting/notifications @@ -83,9 +84,9 @@ COPY pkg/plugins/codegen pkg/plugins/codegen RUN go mod download RUN if [[ "$BINGO" = "true" ]]; then \ - go install github.com/bwplotka/bingo@latest && \ - bingo get -v; \ - fi + go install github.com/bwplotka/bingo@latest && \ + bingo get -v; \ + fi COPY embed.go Makefile build.go package.json ./ COPY cue.mod cue.mod @@ -130,75 +131,75 @@ ARG GF_UID="472" ARG GF_GID="0" ENV PATH="/usr/share/grafana/bin:$PATH" \ - GF_PATHS_CONFIG="/etc/grafana/grafana.ini" \ - GF_PATHS_DATA="/var/lib/grafana" \ - GF_PATHS_HOME="/usr/share/grafana" \ - GF_PATHS_LOGS="/var/log/grafana" \ - GF_PATHS_PLUGINS="/var/lib/grafana/plugins" \ - GF_PATHS_PROVISIONING="/etc/grafana/provisioning" + GF_PATHS_CONFIG="/etc/grafana/grafana.ini" \ + GF_PATHS_DATA="/var/lib/grafana" \ + GF_PATHS_HOME="/usr/share/grafana" \ + GF_PATHS_LOGS="/var/log/grafana" \ + GF_PATHS_PLUGINS="/var/lib/grafana/plugins" \ + GF_PATHS_PROVISIONING="/etc/grafana/provisioning" WORKDIR $GF_PATHS_HOME # Install dependencies RUN if grep -i -q alpine /etc/issue; then \ - apk add --no-cache ca-certificates bash curl tzdata musl-utils && \ - apk info -vv | sort; \ - elif grep -i -q ubuntu /etc/issue; then \ - DEBIAN_FRONTEND=noninteractive && \ - apt-get update && \ - apt-get install -y ca-certificates curl tzdata musl && \ - apt-get autoremove -y && \ - rm -rf /var/lib/apt/lists/*; \ - else \ - echo 'ERROR: Unsupported base image' && /bin/false; \ - fi + apk add --no-cache ca-certificates bash curl tzdata musl-utils && \ + apk info -vv | sort; \ + elif grep -i -q ubuntu /etc/issue; then \ + DEBIAN_FRONTEND=noninteractive && \ + apt-get update && \ + apt-get install -y ca-certificates curl tzdata musl && \ + apt-get autoremove -y && \ + rm -rf /var/lib/apt/lists/*; \ + else \ + echo 'ERROR: Unsupported base image' && /bin/false; \ + fi # glibc support for alpine x86_64 only # docker run --rm --env STDOUT=1 sgerrand/glibc-builder 2.40 /usr/glibc-compat > glibc-bin-2.40.tar.gz ARG GLIBC_VERSION=2.40 RUN if grep -i -q alpine /etc/issue && [ `arch` = "x86_64" ]; then \ - wget -qO- "https://dl.grafana.com/glibc/glibc-bin-$GLIBC_VERSION.tar.gz" | tar zxf - -C / \ - usr/glibc-compat/lib/ld-linux-x86-64.so.2 \ - usr/glibc-compat/lib/libc.so.6 \ - usr/glibc-compat/lib/libdl.so.2 \ - usr/glibc-compat/lib/libm.so.6 \ - usr/glibc-compat/lib/libpthread.so.0 \ - usr/glibc-compat/lib/librt.so.1 \ - usr/glibc-compat/lib/libresolv.so.2 && \ - mkdir /lib64 && \ - ln -s /usr/glibc-compat/lib/ld-linux-x86-64.so.2 /lib64; \ - fi + wget -qO- "https://dl.grafana.com/glibc/glibc-bin-$GLIBC_VERSION.tar.gz" | tar zxf - -C / \ + usr/glibc-compat/lib/ld-linux-x86-64.so.2 \ + usr/glibc-compat/lib/libc.so.6 \ + usr/glibc-compat/lib/libdl.so.2 \ + usr/glibc-compat/lib/libm.so.6 \ + usr/glibc-compat/lib/libpthread.so.0 \ + usr/glibc-compat/lib/librt.so.1 \ + usr/glibc-compat/lib/libresolv.so.2 && \ + mkdir /lib64 && \ + ln -s /usr/glibc-compat/lib/ld-linux-x86-64.so.2 /lib64; \ + fi COPY --from=go-src /tmp/grafana/conf ./conf RUN if [ ! $(getent group "$GF_GID") ]; then \ - if grep -i -q alpine /etc/issue; then \ - addgroup -S -g $GF_GID grafana; \ - else \ - addgroup --system --gid $GF_GID grafana; \ - fi; \ - fi && \ - GF_GID_NAME=$(getent group $GF_GID | cut -d':' -f1) && \ - mkdir -p "$GF_PATHS_HOME/.aws" && \ - if grep -i -q alpine /etc/issue; then \ - adduser -S -u $GF_UID -G "$GF_GID_NAME" grafana; \ - else \ - adduser --system --uid $GF_UID --ingroup "$GF_GID_NAME" grafana; \ - fi && \ - mkdir -p "$GF_PATHS_PROVISIONING/datasources" \ - "$GF_PATHS_PROVISIONING/dashboards" \ - "$GF_PATHS_PROVISIONING/notifiers" \ - "$GF_PATHS_PROVISIONING/plugins" \ - "$GF_PATHS_PROVISIONING/access-control" \ - "$GF_PATHS_PROVISIONING/alerting" \ - "$GF_PATHS_LOGS" \ - "$GF_PATHS_PLUGINS" \ - "$GF_PATHS_DATA" && \ - cp conf/sample.ini "$GF_PATHS_CONFIG" && \ - cp conf/ldap.toml /etc/grafana/ldap.toml && \ - chown -R "grafana:$GF_GID_NAME" "$GF_PATHS_DATA" "$GF_PATHS_HOME/.aws" "$GF_PATHS_LOGS" "$GF_PATHS_PLUGINS" "$GF_PATHS_PROVISIONING" && \ - chmod -R 777 "$GF_PATHS_DATA" "$GF_PATHS_HOME/.aws" "$GF_PATHS_LOGS" "$GF_PATHS_PLUGINS" "$GF_PATHS_PROVISIONING" + if grep -i -q alpine /etc/issue; then \ + addgroup -S -g $GF_GID grafana; \ + else \ + addgroup --system --gid $GF_GID grafana; \ + fi; \ + fi && \ + GF_GID_NAME=$(getent group $GF_GID | cut -d':' -f1) && \ + mkdir -p "$GF_PATHS_HOME/.aws" && \ + if grep -i -q alpine /etc/issue; then \ + adduser -S -u $GF_UID -G "$GF_GID_NAME" grafana; \ + else \ + adduser --system --uid $GF_UID --ingroup "$GF_GID_NAME" grafana; \ + fi && \ + mkdir -p "$GF_PATHS_PROVISIONING/datasources" \ + "$GF_PATHS_PROVISIONING/dashboards" \ + "$GF_PATHS_PROVISIONING/notifiers" \ + "$GF_PATHS_PROVISIONING/plugins" \ + "$GF_PATHS_PROVISIONING/access-control" \ + "$GF_PATHS_PROVISIONING/alerting" \ + "$GF_PATHS_LOGS" \ + "$GF_PATHS_PLUGINS" \ + "$GF_PATHS_DATA" && \ + cp conf/sample.ini "$GF_PATHS_CONFIG" && \ + cp conf/ldap.toml /etc/grafana/ldap.toml && \ + chown -R "grafana:$GF_GID_NAME" "$GF_PATHS_DATA" "$GF_PATHS_HOME/.aws" "$GF_PATHS_LOGS" "$GF_PATHS_PLUGINS" "$GF_PATHS_PROVISIONING" && \ + chmod -R 777 "$GF_PATHS_DATA" "$GF_PATHS_HOME/.aws" "$GF_PATHS_LOGS" "$GF_PATHS_PLUGINS" "$GF_PATHS_PROVISIONING" COPY --from=go-src /tmp/grafana/bin/grafana* /tmp/grafana/bin/*/grafana* ./bin/ COPY --from=js-src /tmp/grafana/public ./public diff --git a/apps/dashboard/Makefile b/apps/dashboard/Makefile index d95e25e1abd..d9d8b7de608 100644 --- a/apps/dashboard/Makefile +++ b/apps/dashboard/Makefile @@ -2,7 +2,7 @@ generate: @grafana-app-sdk generate \ --source=./kinds/ \ - --gogenpath=../../pkg/apis \ + --gogenpath=./pkg/apis \ --tsgenpath=../../packages/grafana-schema/src/schema \ --grouping=group \ --defencoding=none \ diff --git a/apps/dashboard/go.mod b/apps/dashboard/go.mod new file mode 100644 index 00000000000..5edd23ff5ae --- /dev/null +++ b/apps/dashboard/go.mod @@ -0,0 +1,125 @@ +module github.com/grafana/grafana/apps/dashboard + +go 1.23.7 + +require ( + github.com/grafana/grafana-app-sdk v0.31.0 + github.com/grafana/grafana-plugin-sdk-go v0.270.0 + github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250312121619-f64be062c432 + github.com/stretchr/testify v1.10.0 + k8s.io/apimachinery v0.32.1 + k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f +) + +require ( + github.com/BurntSushi/toml v1.4.0 // indirect + github.com/apache/arrow-go/v18 v18.0.1-0.20241212180703-82be143d7c30 // indirect + github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cheekybits/genny v1.0.0 // indirect + github.com/chromedp/cdproto v0.0.0-20240810084448-b931b754e476 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/elazarl/goproxy v1.7.2 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/fatih/color v1.17.0 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/getkin/kin-openapi v0.129.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect + github.com/go-openapi/swag v0.23.0 // indirect + github.com/goccy/go-json v0.10.4 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/flatbuffers v24.3.25+incompatible // indirect + github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/go-cmp v0.7.0 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/mux v1.8.1 // indirect + github.com/grafana/grafana-app-sdk/logging v0.30.0 // indirect + github.com/grafana/otel-profiling-go v0.5.1 // indirect + github.com/grafana/pyroscope-go/godeltaprof v0.1.8 // indirect + github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 // indirect + github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.1 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 // indirect + github.com/hashicorp/go-hclog v1.6.3 // indirect + github.com/hashicorp/go-plugin v1.6.3 // indirect + github.com/hashicorp/yamux v0.1.1 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/jszwedko/go-datemath v0.1.1-0.20230526204004-640a500621d6 // indirect + github.com/klauspost/compress v1.17.11 // indirect + github.com/klauspost/cpuid/v2 v2.2.9 // indirect + github.com/magefile/mage v1.15.0 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/mattetti/filebuffer v1.0.1 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/oasdiff/yaml v0.0.0-20241210131133-6b86fb107d80 // indirect + github.com/oasdiff/yaml3 v0.0.0-20241210130736-a94c01f36349 // indirect + github.com/oklog/run v1.1.0 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/perimeterx/marshmallow v1.1.5 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/prometheus/client_golang v1.21.0 // indirect + github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/common v0.62.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/smartystreets/goconvey v1.6.4 // indirect + github.com/unknwon/bra v0.0.0-20200517080246-1e3013ecaff8 // indirect + github.com/unknwon/com v1.0.1 // indirect + github.com/unknwon/log v0.0.0-20200308114134-929b1006e34a // indirect + github.com/urfave/cli v1.22.16 // indirect + github.com/x448/float16 v0.8.4 // indirect + github.com/zeebo/xxh3 v1.0.2 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.60.0 // indirect + go.opentelemetry.io/contrib/propagators/jaeger v1.34.0 // indirect + go.opentelemetry.io/contrib/samplers/jaegerremote v0.28.0 // indirect + go.opentelemetry.io/otel v1.35.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 // indirect + go.opentelemetry.io/otel/metric v1.35.0 // indirect + go.opentelemetry.io/otel/sdk v1.35.0 // indirect + go.opentelemetry.io/otel/trace v1.35.0 // indirect + go.opentelemetry.io/proto/otlp v1.5.0 // indirect + golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect + golang.org/x/mod v0.23.0 // indirect + golang.org/x/net v0.36.0 // indirect + golang.org/x/oauth2 v0.27.0 // indirect + golang.org/x/sync v0.11.0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/term v0.29.0 // indirect + golang.org/x/text v0.22.0 // indirect + golang.org/x/time v0.9.0 // indirect + golang.org/x/tools v0.30.0 // indirect + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250204164813-702378808489 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6 // indirect + google.golang.org/grpc v1.70.0 // indirect + google.golang.org/protobuf v1.36.5 // indirect + gopkg.in/fsnotify/fsnotify.v1 v1.4.7 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/client-go v0.32.1 // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect + sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.5.0 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect +) diff --git a/apps/dashboard/go.sum b/apps/dashboard/go.sum new file mode 100644 index 00000000000..838687c24bf --- /dev/null +++ b/apps/dashboard/go.sum @@ -0,0 +1,377 @@ +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= +github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= +github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= +github.com/apache/arrow-go/v18 v18.0.1-0.20241212180703-82be143d7c30 h1:hXVi7QKuCQ0E8Yujfu9b0f0RnzZ72efpWvPnZgnJPrE= +github.com/apache/arrow-go/v18 v18.0.1-0.20241212180703-82be143d7c30/go.mod h1:RNuWDIiGjq5nndL2PyQrndUy9nMLwheA3uWaAV7fe4U= +github.com/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE= +github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= +github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= +github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= +github.com/chromedp/cdproto v0.0.0-20240810084448-b931b754e476 h1:VnjHsRXCRti7Av7E+j4DCha3kf68echfDzQ+wD11SBU= +github.com/chromedp/cdproto v0.0.0-20240810084448-b931b754e476/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o= +github.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= +github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= +github.com/getkin/kin-openapi v0.129.0 h1:QGYTNcmyP5X0AtFQ2Dkou9DGBJsUETeLH9rFrJXZh30= +github.com/getkin/kin-openapi v0.129.0/go.mod h1:gmWI+b/J45xqpyK5wJmRRZse5wefA5H0RDMK46kLUtI= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= +github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= +github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= +github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/flatbuffers v24.3.25+incompatible h1:CX395cjN9Kke9mmalRoL3d81AtFUxJM+yDthflgJGkI= +github.com/google/flatbuffers v24.3.25+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e h1:JKmoR8x90Iww1ks85zJ1lfDGgIiMDuIptTOhJq+zKyg= +github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/grafana/grafana-app-sdk v0.31.0 h1:/mFCcx+YqG8cWAi9hePDJQxIdtXDClDIDRgZwHkksFk= +github.com/grafana/grafana-app-sdk v0.31.0/go.mod h1:Xw00NL7qpRLo5r3Gn48Bl1Xn2n4eUDI5pYf/wMufKWs= +github.com/grafana/grafana-app-sdk/logging v0.30.0 h1:K/P/bm7Cp7Di4tqIJ3EQz2+842JozQGRaz62r95ApME= +github.com/grafana/grafana-app-sdk/logging v0.30.0/go.mod h1:xy6ZyVXl50Z3DBDLybvBPphbykPhuVNed/VNmen9DQM= +github.com/grafana/grafana-plugin-sdk-go v0.270.0 h1:SST2Vo//ITQG5h401gC4jTkJpTHy8OV91sf2uDh6M/8= +github.com/grafana/grafana-plugin-sdk-go v0.270.0/go.mod h1:Z0Cvkj4WGadz6F6FQmK4NGb/hD18kTTNkSqFb97Rfyc= +github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250312121619-f64be062c432 h1:/0MLOGx9Ow7ihR4smlUYHFvomXBpdpf/jLWHKNfEUiI= +github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250312121619-f64be062c432/go.mod h1:A/SJ9CiAWNOdeD/IezNwRaDZusLKq0z6dTfhKDgZw5Y= +github.com/grafana/otel-profiling-go v0.5.1 h1:stVPKAFZSa7eGiqbYuG25VcqYksR6iWvF3YH66t4qL8= +github.com/grafana/otel-profiling-go v0.5.1/go.mod h1:ftN/t5A/4gQI19/8MoWurBEtC6gFw8Dns1sJZ9W4Tls= +github.com/grafana/pyroscope-go/godeltaprof v0.1.8 h1:iwOtYXeeVSAeYefJNaxDytgjKtUuKQbJqgAIjlnicKg= +github.com/grafana/pyroscope-go/godeltaprof v0.1.8/go.mod h1:2+l7K7twW49Ct4wFluZD3tZ6e0SjanjcUUBPVD/UuGU= +github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 h1:qnpSQwGEnkcRpTqNOIR6bJbR0gAorgP9CSALpRcKoAA= +github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1/go.mod h1:lXGCsh6c22WGtjr+qGHj1otzZpV/1kwTMAqkwZsnWRU= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.1 h1:KcFzXwzM/kGhIRHvc8jdixfIJjVzuUJdnv+5xsPutog= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.1/go.mod h1:qOchhhIlmRcqk/O9uCo/puJlyo07YINaIqdZfZG3Jkc= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 h1:e9Rjr40Z98/clHv5Yg79Is0NtosR5LXRvdr7o/6NwbA= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1/go.mod h1:tIxuGz/9mpox++sgp9fJjHO0+q1X9/UOWd798aAm22M= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-plugin v1.6.3 h1:xgHB+ZUSYeuJi96WtxEjzi23uh7YQpznjGh0U0UUrwg= +github.com/hashicorp/go-plugin v1.6.3/go.mod h1:MRobyh+Wc/nYy1V4KAXUiYfzxoYhs7V1mlH1Z7iY2h0= +github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= +github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c= +github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jszwedko/go-datemath v0.1.1-0.20230526204004-640a500621d6 h1:SwcnSwBR7X/5EHJQlXBockkJVIMRVt5yKaesBPMtyZQ= +github.com/jszwedko/go-datemath v0.1.1-0.20230526204004-640a500621d6/go.mod h1:WrYiIuiXUMIvTDAQw97C+9l0CnBmCcvosPjN3XDqS/o= +github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= +github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= +github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattetti/filebuffer v1.0.1 h1:gG7pyfnSIZCxdoKq+cPa8T0hhYtD9NxCdI4D7PTjRLM= +github.com/mattetti/filebuffer v1.0.1/go.mod h1:YdMURNDOttIiruleeVr6f56OrMc+MydEnTcXwtkxNVs= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/oasdiff/yaml v0.0.0-20241210131133-6b86fb107d80 h1:nZspmSkneBbtxU9TopEAE0CY+SBJLxO8LPUlw2vG4pU= +github.com/oasdiff/yaml v0.0.0-20241210131133-6b86fb107d80/go.mod h1:7tFDb+Y51LcDpn26GccuUgQXUk6t0CXZsivKjyimYX8= +github.com/oasdiff/yaml3 v0.0.0-20241210130736-a94c01f36349 h1:t05Ww3DxZutOqbMN+7OIuqDwXbhl32HiZGpLy26BAPc= +github.com/oasdiff/yaml3 v0.0.0-20241210130736-a94c01f36349/go.mod h1:y5+oSEHCPT/DGrS++Wc/479ERge0zTFxaF8PbGKcg2o= +github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= +github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= +github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v1.21.0 h1:DIsaGmiaBkSangBgMtWdNfxbMNdku5IK6iNhrEqWvdA= +github.com/prometheus/client_golang v1.21.0/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= +github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304 h1:Jpy1PXuP99tXNrhbq2BaPz9B+jNAvH1JPQQpG/9GCXY= +github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/unknwon/bra v0.0.0-20200517080246-1e3013ecaff8 h1:aVGB3YnaS/JNfOW3tiHIlmNmTDg618va+eT0mVomgyI= +github.com/unknwon/bra v0.0.0-20200517080246-1e3013ecaff8/go.mod h1:fVle4kNr08ydeohzYafr20oZzbAkhQT39gKK/pFQ5M4= +github.com/unknwon/com v1.0.1 h1:3d1LTxD+Lnf3soQiD4Cp/0BRB+Rsa/+RTvz8GMMzIXs= +github.com/unknwon/com v1.0.1/go.mod h1:tOOxU81rwgoCLoOVVPHb6T/wt8HZygqH5id+GNnlCXM= +github.com/unknwon/log v0.0.0-20150304194804-e617c87089d3/go.mod h1:1xEUf2abjfP92w2GZTV+GgaRxXErwRXcClbUwrNJffU= +github.com/unknwon/log v0.0.0-20200308114134-929b1006e34a h1:vcrhXnj9g9PIE+cmZgaPSwOyJ8MAQTRmsgGrB0x5rF4= +github.com/unknwon/log v0.0.0-20200308114134-929b1006e34a/go.mod h1:1xEUf2abjfP92w2GZTV+GgaRxXErwRXcClbUwrNJffU= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.16 h1:MH0k6uJxdwdeWQTwhSO42Pwr4YLrNLwBtg1MRgTqPdQ= +github.com/urfave/cli v1.22.16/go.mod h1:EeJR6BKodywf4zciqrdw6hpCPk68JO9z5LazXZMn5Po= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 h1:rgMkmiGfix9vFJDcDi1PK8WEQP4FLQwLDfhp5ZLpFeE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0/go.mod h1:ijPqXp5P6IRRByFVVg9DY8P5HkxkHE5ARIa+86aXPf4= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.60.0 h1:0tY123n7CdWMem7MOVdKOt0YfshufLCwfE5Bob+hQuM= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.60.0/go.mod h1:CosX/aS4eHnG9D7nESYpV753l4j9q5j3SL/PUYd2lR8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ= +go.opentelemetry.io/contrib/propagators/jaeger v1.34.0 h1:D3htJISCUU/wOVlKwisVKancWm+2U4h9xDEaiMkiyRE= +go.opentelemetry.io/contrib/propagators/jaeger v1.34.0/go.mod h1:DAX1bsj+uDm2ZuOQH/RgZRx7RQZWyzV5W2WR/0UX8JA= +go.opentelemetry.io/contrib/samplers/jaegerremote v0.28.0 h1:Xx1N6cDr8iWy1Cz6OcY7oS0ACdt/6HDYTdu4KskuC7s= +go.opentelemetry.io/contrib/samplers/jaegerremote v0.28.0/go.mod h1:iWS+NvC948FyfnJbVfPN9h/8+vr8CR2FPn6XsLRkvH8= +go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= +go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= +go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE= +go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= +go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= +go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE= +go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= +go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY= +go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg= +go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o= +go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w= +go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= +go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= +go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= +go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= +go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk= +golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM= +golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.36.0 h1:vWF2fRbw4qslQsQzgFqZff+BItCvGFQqKzKIzx1rmoA= +golang.org/x/net v0.36.0/go.mod h1:bFmbeoIPfrw4sMHNhb4J9f6+tPziuGjq7Jk/38fxi1I= +golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M= +golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191020152052-9984515f0562/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= +golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= +golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY= +golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY= +golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= +gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= +google.golang.org/genproto/googleapis/api v0.0.0-20250204164813-702378808489 h1:fCuMM4fowGzigT89NCIsW57Pk9k2D12MMi2ODn+Nk+o= +google.golang.org/genproto/googleapis/api v0.0.0-20250204164813-702378808489/go.mod h1:iYONQfRdizDB8JJBybql13nArx91jcUk7zCXEsOofM4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6 h1:2duwAxN2+k0xLNpjnHTXoMUgnv6VPSp5fiqTuwSxjmI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk= +google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ= +google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw= +google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= +google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= +gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= +gopkg.in/fsnotify/fsnotify.v1 v1.4.7 h1:XNNYLJHt73EyYiCZi6+xjupS9CpvmiDgjPTAjrBlQbo= +gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/api v0.32.1 h1:f562zw9cy+GvXzXf0CKlVQ7yHJVYzLfL6JAS4kOAaOc= +k8s.io/api v0.32.1/go.mod h1:/Yi/BqkuueW1BgpoePYBRdDYfjPF5sgTr5+YqDZra5k= +k8s.io/apimachinery v0.32.1 h1:683ENpaCBjma4CYqsmZyhEzrGz6cjn1MY/X2jB2hkZs= +k8s.io/apimachinery v0.32.1/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= +k8s.io/client-go v0.32.1 h1:otM0AxdhdBIaQh7l1Q0jQpmo7WOFIk5FFa4bg6YMdUU= +k8s.io/client-go v0.32.1/go.mod h1:aTTKZY7MdxUaJ/KiUs8D+GssR9zJZi77ZqtzcGXIiDg= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y= +k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f/go.mod h1:R/HEjbvWI0qdfb8viZUeVZm0X6IZnxAydC7YU42CMw4= +k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro= +k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= +sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= +sigs.k8s.io/structured-merge-diff/v4 v4.5.0 h1:nbCitCK2hfnhyiKo6uf2HxUPTCodY6Qaf85SbDIaMBk= +sigs.k8s.io/structured-merge-diff/v4 v4.5.0/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/pkg/apis/dashboard/types.go b/apps/dashboard/pkg/apis/dashboard/types.go similarity index 100% rename from pkg/apis/dashboard/types.go rename to apps/dashboard/pkg/apis/dashboard/types.go diff --git a/pkg/apis/dashboard/utils.go b/apps/dashboard/pkg/apis/dashboard/utils.go similarity index 100% rename from pkg/apis/dashboard/utils.go rename to apps/dashboard/pkg/apis/dashboard/utils.go diff --git a/pkg/apis/dashboard/v0alpha1/constants.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/constants.go similarity index 100% rename from pkg/apis/dashboard/v0alpha1/constants.go rename to apps/dashboard/pkg/apis/dashboard/v0alpha1/constants.go diff --git a/pkg/apis/dashboard/v0alpha1/dashboard_codec_gen.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_codec_gen.go similarity index 100% rename from pkg/apis/dashboard/v0alpha1/dashboard_codec_gen.go rename to apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_codec_gen.go diff --git a/pkg/apis/dashboard/v0alpha1/dashboard_metadata_gen.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_metadata_gen.go similarity index 100% rename from pkg/apis/dashboard/v0alpha1/dashboard_metadata_gen.go rename to apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_metadata_gen.go diff --git a/pkg/apis/dashboard/v0alpha1/dashboard_object_gen.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_object_gen.go similarity index 100% rename from pkg/apis/dashboard/v0alpha1/dashboard_object_gen.go rename to apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_object_gen.go diff --git a/pkg/apis/dashboard/v0alpha1/dashboard_schema_gen.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_schema_gen.go similarity index 100% rename from pkg/apis/dashboard/v0alpha1/dashboard_schema_gen.go rename to apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_schema_gen.go diff --git a/pkg/apis/dashboard/v0alpha1/dashboard_spec.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_spec.go similarity index 100% rename from pkg/apis/dashboard/v0alpha1/dashboard_spec.go rename to apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_spec.go diff --git a/pkg/apis/dashboard/v0alpha1/dashboard_spec_gen.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_spec_gen.go similarity index 100% rename from pkg/apis/dashboard/v0alpha1/dashboard_spec_gen.go rename to apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_spec_gen.go diff --git a/pkg/apis/dashboard/v0alpha1/dashboard_status_gen.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_status_gen.go similarity index 100% rename from pkg/apis/dashboard/v0alpha1/dashboard_status_gen.go rename to apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_status_gen.go diff --git a/pkg/apis/dashboard/v0alpha1/deepcopy.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/deepcopy.go similarity index 100% rename from pkg/apis/dashboard/v0alpha1/deepcopy.go rename to apps/dashboard/pkg/apis/dashboard/v0alpha1/deepcopy.go diff --git a/pkg/apis/dashboard/v1alpha1/doc.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/doc.go similarity index 63% rename from pkg/apis/dashboard/v1alpha1/doc.go rename to apps/dashboard/pkg/apis/dashboard/v0alpha1/doc.go index f10d157ec41..a71646dde24 100644 --- a/pkg/apis/dashboard/v1alpha1/doc.go +++ b/apps/dashboard/pkg/apis/dashboard/v0alpha1/doc.go @@ -1,10 +1,10 @@ // +k8s:openapi-gen=true // +k8s:defaulter-gen=TypeMeta -// +k8s:conversion-gen=github.com/grafana/grafana/pkg/apis/dashboard +// +k8s:conversion-gen=github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard // +groupName=dashboard.grafana.app // NOTE (@radiohead): we do not use package-wide deepcopy generation // because grafana-app-sdk already provides deepcopy functions. // Kinds which are not generated by the SDK are explicitly opted in to deepcopy generation. -package v1alpha1 // import "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1" +package v0alpha1 // import "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1" diff --git a/pkg/apis/dashboard/v0alpha1/register.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/register.go similarity index 100% rename from pkg/apis/dashboard/v0alpha1/register.go rename to apps/dashboard/pkg/apis/dashboard/v0alpha1/register.go diff --git a/pkg/apis/dashboard/v0alpha1/search.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/search.go similarity index 100% rename from pkg/apis/dashboard/v0alpha1/search.go rename to apps/dashboard/pkg/apis/dashboard/v0alpha1/search.go diff --git a/pkg/apis/dashboard/v0alpha1/types.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/types.go similarity index 100% rename from pkg/apis/dashboard/v0alpha1/types.go rename to apps/dashboard/pkg/apis/dashboard/v0alpha1/types.go diff --git a/pkg/apis/dashboard/v0alpha1/zz_generated.conversion.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.conversion.go similarity index 99% rename from pkg/apis/dashboard/v0alpha1/zz_generated.conversion.go rename to apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.conversion.go index ade3e08a22a..b76e6b614ab 100644 --- a/pkg/apis/dashboard/v0alpha1/zz_generated.conversion.go +++ b/apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.conversion.go @@ -11,7 +11,7 @@ import ( url "net/url" unsafe "unsafe" - dashboard "github.com/grafana/grafana/pkg/apis/dashboard" + dashboard "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard" conversion "k8s.io/apimachinery/pkg/conversion" runtime "k8s.io/apimachinery/pkg/runtime" ) diff --git a/pkg/apis/dashboard/v0alpha1/zz_generated.deepcopy.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.deepcopy.go similarity index 100% rename from pkg/apis/dashboard/v0alpha1/zz_generated.deepcopy.go rename to apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.deepcopy.go diff --git a/pkg/apis/dashboard/v0alpha1/zz_generated.defaults.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.defaults.go similarity index 100% rename from pkg/apis/dashboard/v0alpha1/zz_generated.defaults.go rename to apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.defaults.go diff --git a/pkg/apis/dashboard/v0alpha1/zz_generated.openapi.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.openapi.go similarity index 82% rename from pkg/apis/dashboard/v0alpha1/zz_generated.openapi.go rename to apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.openapi.go index 6249102860d..a9d0f5b73c7 100644 --- a/pkg/apis/dashboard/v0alpha1/zz_generated.openapi.go +++ b/apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.openapi.go @@ -15,31 +15,31 @@ import ( func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenAPIDefinition { return map[string]common.OpenAPIDefinition{ - "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1.Unstructured": commonv0alpha1.Unstructured{}.OpenAPIDefinition(), - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.AnnotationActions": schema_pkg_apis_dashboard_v0alpha1_AnnotationActions(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.AnnotationPermission": schema_pkg_apis_dashboard_v0alpha1_AnnotationPermission(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.Dashboard": schema_pkg_apis_dashboard_v0alpha1_Dashboard(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardAccess": schema_pkg_apis_dashboard_v0alpha1_DashboardAccess(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardConversionStatus": schema_pkg_apis_dashboard_v0alpha1_DashboardConversionStatus(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardHit": schema_pkg_apis_dashboard_v0alpha1_DashboardHit(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardJSONCodec": schema_pkg_apis_dashboard_v0alpha1_DashboardJSONCodec(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardList": schema_pkg_apis_dashboard_v0alpha1_DashboardList(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardMetadata": schema_pkg_apis_dashboard_v0alpha1_DashboardMetadata(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardStatus": schema_pkg_apis_dashboard_v0alpha1_DashboardStatus(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardVersionInfo": schema_pkg_apis_dashboard_v0alpha1_DashboardVersionInfo(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardVersionList": schema_pkg_apis_dashboard_v0alpha1_DashboardVersionList(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardWithAccessInfo": schema_pkg_apis_dashboard_v0alpha1_DashboardWithAccessInfo(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.FacetResult": schema_pkg_apis_dashboard_v0alpha1_FacetResult(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.LibraryPanel": schema_pkg_apis_dashboard_v0alpha1_LibraryPanel(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.LibraryPanelList": schema_pkg_apis_dashboard_v0alpha1_LibraryPanelList(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.LibraryPanelSpec": schema_pkg_apis_dashboard_v0alpha1_LibraryPanelSpec(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.LibraryPanelStatus": schema_pkg_apis_dashboard_v0alpha1_LibraryPanelStatus(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.SearchResults": schema_pkg_apis_dashboard_v0alpha1_SearchResults(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.SortBy": schema_pkg_apis_dashboard_v0alpha1_SortBy(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.SortableField": schema_pkg_apis_dashboard_v0alpha1_SortableField(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.SortableFields": schema_pkg_apis_dashboard_v0alpha1_SortableFields(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.TermFacet": schema_pkg_apis_dashboard_v0alpha1_TermFacet(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.VersionsQueryOptions": schema_pkg_apis_dashboard_v0alpha1_VersionsQueryOptions(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.AnnotationActions": schema_pkg_apis_dashboard_v0alpha1_AnnotationActions(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.AnnotationPermission": schema_pkg_apis_dashboard_v0alpha1_AnnotationPermission(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.Dashboard": schema_pkg_apis_dashboard_v0alpha1_Dashboard(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardAccess": schema_pkg_apis_dashboard_v0alpha1_DashboardAccess(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardConversionStatus": schema_pkg_apis_dashboard_v0alpha1_DashboardConversionStatus(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardHit": schema_pkg_apis_dashboard_v0alpha1_DashboardHit(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardJSONCodec": schema_pkg_apis_dashboard_v0alpha1_DashboardJSONCodec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardList": schema_pkg_apis_dashboard_v0alpha1_DashboardList(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardMetadata": schema_pkg_apis_dashboard_v0alpha1_DashboardMetadata(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardStatus": schema_pkg_apis_dashboard_v0alpha1_DashboardStatus(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardVersionInfo": schema_pkg_apis_dashboard_v0alpha1_DashboardVersionInfo(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardVersionList": schema_pkg_apis_dashboard_v0alpha1_DashboardVersionList(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardWithAccessInfo": schema_pkg_apis_dashboard_v0alpha1_DashboardWithAccessInfo(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.FacetResult": schema_pkg_apis_dashboard_v0alpha1_FacetResult(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.LibraryPanel": schema_pkg_apis_dashboard_v0alpha1_LibraryPanel(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.LibraryPanelList": schema_pkg_apis_dashboard_v0alpha1_LibraryPanelList(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.LibraryPanelSpec": schema_pkg_apis_dashboard_v0alpha1_LibraryPanelSpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.LibraryPanelStatus": schema_pkg_apis_dashboard_v0alpha1_LibraryPanelStatus(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.SearchResults": schema_pkg_apis_dashboard_v0alpha1_SearchResults(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.SortBy": schema_pkg_apis_dashboard_v0alpha1_SortBy(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.SortableField": schema_pkg_apis_dashboard_v0alpha1_SortableField(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.SortableFields": schema_pkg_apis_dashboard_v0alpha1_SortableFields(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.TermFacet": schema_pkg_apis_dashboard_v0alpha1_TermFacet(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.VersionsQueryOptions": schema_pkg_apis_dashboard_v0alpha1_VersionsQueryOptions(ref), + "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1.Unstructured": commonv0alpha1.Unstructured{}.OpenAPIDefinition(), } } @@ -86,13 +86,13 @@ func schema_pkg_apis_dashboard_v0alpha1_AnnotationPermission(ref common.Referenc "dashboard": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.AnnotationActions"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.AnnotationActions"), }, }, "organization": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.AnnotationActions"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.AnnotationActions"), }, }, }, @@ -100,7 +100,7 @@ func schema_pkg_apis_dashboard_v0alpha1_AnnotationPermission(ref common.Referenc }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.AnnotationActions"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.AnnotationActions"}, } } @@ -139,7 +139,7 @@ func schema_pkg_apis_dashboard_v0alpha1_Dashboard(ref common.ReferenceCallback) "status": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardStatus"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardStatus"), }, }, }, @@ -147,7 +147,7 @@ func schema_pkg_apis_dashboard_v0alpha1_Dashboard(ref common.ReferenceCallback) }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1.Unstructured", "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardStatus", "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1.Unstructured", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, } } @@ -208,7 +208,7 @@ func schema_pkg_apis_dashboard_v0alpha1_DashboardAccess(ref common.ReferenceCall }, "annotationsPermissions": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.AnnotationPermission"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.AnnotationPermission"), }, }, }, @@ -216,7 +216,7 @@ func schema_pkg_apis_dashboard_v0alpha1_DashboardAccess(ref common.ReferenceCall }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.AnnotationPermission"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.AnnotationPermission"}, } } @@ -382,7 +382,7 @@ func schema_pkg_apis_dashboard_v0alpha1_DashboardList(ref common.ReferenceCallba Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.Dashboard"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.Dashboard"), }, }, }, @@ -393,7 +393,7 @@ func schema_pkg_apis_dashboard_v0alpha1_DashboardList(ref common.ReferenceCallba }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.Dashboard", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.Dashboard", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, } } @@ -502,14 +502,14 @@ func schema_pkg_apis_dashboard_v0alpha1_DashboardStatus(ref common.ReferenceCall "conversion": { SchemaProps: spec.SchemaProps{ Description: "Optional conversion status.", - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardConversionStatus"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardConversionStatus"), }, }, }, }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardConversionStatus"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardConversionStatus"}, } } @@ -596,7 +596,7 @@ func schema_pkg_apis_dashboard_v0alpha1_DashboardVersionList(ref common.Referenc Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardVersionInfo"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardVersionInfo"), }, }, }, @@ -606,7 +606,7 @@ func schema_pkg_apis_dashboard_v0alpha1_DashboardVersionList(ref common.Referenc }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardVersionInfo", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardVersionInfo", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, } } @@ -646,13 +646,13 @@ func schema_pkg_apis_dashboard_v0alpha1_DashboardWithAccessInfo(ref common.Refer "status": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardStatus"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardStatus"), }, }, "access": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardAccess"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardAccess"), }, }, }, @@ -660,7 +660,7 @@ func schema_pkg_apis_dashboard_v0alpha1_DashboardWithAccessInfo(ref common.Refer }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1.Unstructured", "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardAccess", "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardAccess", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardStatus", "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1.Unstructured", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, } } @@ -698,7 +698,7 @@ func schema_pkg_apis_dashboard_v0alpha1_FacetResult(ref common.ReferenceCallback Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.TermFacet"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.TermFacet"), }, }, }, @@ -708,7 +708,7 @@ func schema_pkg_apis_dashboard_v0alpha1_FacetResult(ref common.ReferenceCallback }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.TermFacet"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.TermFacet"}, } } @@ -743,13 +743,13 @@ func schema_pkg_apis_dashboard_v0alpha1_LibraryPanel(ref common.ReferenceCallbac SchemaProps: spec.SchemaProps{ Description: "Panel properties", Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.LibraryPanelSpec"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.LibraryPanelSpec"), }, }, "status": { SchemaProps: spec.SchemaProps{ Description: "Status will show errors", - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.LibraryPanelStatus"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.LibraryPanelStatus"), }, }, }, @@ -757,7 +757,7 @@ func schema_pkg_apis_dashboard_v0alpha1_LibraryPanel(ref common.ReferenceCallbac }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.LibraryPanelSpec", "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.LibraryPanelStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.LibraryPanelSpec", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.LibraryPanelStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, } } @@ -794,7 +794,7 @@ func schema_pkg_apis_dashboard_v0alpha1_LibraryPanelList(ref common.ReferenceCal Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.LibraryPanel"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.LibraryPanel"), }, }, }, @@ -804,7 +804,7 @@ func schema_pkg_apis_dashboard_v0alpha1_LibraryPanelList(ref common.ReferenceCal }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.LibraryPanel", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.LibraryPanel", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, } } @@ -966,7 +966,7 @@ func schema_pkg_apis_dashboard_v0alpha1_SearchResults(ref common.ReferenceCallba Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardHit"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardHit"), }, }, }, @@ -989,7 +989,7 @@ func schema_pkg_apis_dashboard_v0alpha1_SearchResults(ref common.ReferenceCallba "sortBy": { SchemaProps: spec.SchemaProps{ Description: "How are the results sorted", - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.SortBy"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.SortBy"), }, }, "facets": { @@ -1001,7 +1001,7 @@ func schema_pkg_apis_dashboard_v0alpha1_SearchResults(ref common.ReferenceCallba Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.FacetResult"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.FacetResult"), }, }, }, @@ -1012,7 +1012,7 @@ func schema_pkg_apis_dashboard_v0alpha1_SearchResults(ref common.ReferenceCallba }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardHit", "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.FacetResult", "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.SortBy"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardHit", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.FacetResult", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.SortBy"}, } } @@ -1100,7 +1100,7 @@ func schema_pkg_apis_dashboard_v0alpha1_SortableFields(ref common.ReferenceCallb Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.SortableField"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.SortableField"), }, }, }, @@ -1111,7 +1111,7 @@ func schema_pkg_apis_dashboard_v0alpha1_SortableFields(ref common.ReferenceCallb }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.SortableField"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.SortableField"}, } } diff --git a/apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.openapi_violation_exceptions.list b/apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.openapi_violation_exceptions.list new file mode 100644 index 00000000000..68505c7d05d --- /dev/null +++ b/apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.openapi_violation_exceptions.list @@ -0,0 +1,9 @@ +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1,DashboardHit,Tags +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1,DashboardMetadata,Finalizers +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1,FacetResult,Terms +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1,LibraryPanelStatus,Warnings +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1,SearchResults,Hits +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1,SortableFields,Fields +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1,SortBy,Descending +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1,SortableField,Field +API rule violation: names_match,github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1,Unstructured,Object diff --git a/pkg/apis/dashboard/v1alpha1/constants.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/constants.go similarity index 100% rename from pkg/apis/dashboard/v1alpha1/constants.go rename to apps/dashboard/pkg/apis/dashboard/v1alpha1/constants.go diff --git a/pkg/apis/dashboard/v1alpha1/dashboard_codec_gen.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_codec_gen.go similarity index 100% rename from pkg/apis/dashboard/v1alpha1/dashboard_codec_gen.go rename to apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_codec_gen.go diff --git a/pkg/apis/dashboard/v1alpha1/dashboard_metadata_gen.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_metadata_gen.go similarity index 100% rename from pkg/apis/dashboard/v1alpha1/dashboard_metadata_gen.go rename to apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_metadata_gen.go diff --git a/pkg/apis/dashboard/v1alpha1/dashboard_object_gen.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_object_gen.go similarity index 100% rename from pkg/apis/dashboard/v1alpha1/dashboard_object_gen.go rename to apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_object_gen.go diff --git a/pkg/apis/dashboard/v1alpha1/dashboard_schema_gen.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_schema_gen.go similarity index 100% rename from pkg/apis/dashboard/v1alpha1/dashboard_schema_gen.go rename to apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_schema_gen.go diff --git a/pkg/apis/dashboard/v1alpha1/dashboard_spec.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_spec.go similarity index 100% rename from pkg/apis/dashboard/v1alpha1/dashboard_spec.go rename to apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_spec.go diff --git a/pkg/apis/dashboard/v1alpha1/dashboard_spec_gen.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_spec_gen.go similarity index 100% rename from pkg/apis/dashboard/v1alpha1/dashboard_spec_gen.go rename to apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_spec_gen.go diff --git a/pkg/apis/dashboard/v1alpha1/dashboard_status_gen.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_status_gen.go similarity index 100% rename from pkg/apis/dashboard/v1alpha1/dashboard_status_gen.go rename to apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_status_gen.go diff --git a/pkg/apis/dashboard/v1alpha1/deepcopy.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/deepcopy.go similarity index 100% rename from pkg/apis/dashboard/v1alpha1/deepcopy.go rename to apps/dashboard/pkg/apis/dashboard/v1alpha1/deepcopy.go diff --git a/pkg/apis/dashboard/v2alpha1/doc.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/doc.go similarity index 63% rename from pkg/apis/dashboard/v2alpha1/doc.go rename to apps/dashboard/pkg/apis/dashboard/v1alpha1/doc.go index 8866425fdce..66bf673964c 100644 --- a/pkg/apis/dashboard/v2alpha1/doc.go +++ b/apps/dashboard/pkg/apis/dashboard/v1alpha1/doc.go @@ -1,10 +1,10 @@ // +k8s:openapi-gen=true // +k8s:defaulter-gen=TypeMeta -// +k8s:conversion-gen=github.com/grafana/grafana/pkg/apis/dashboard +// +k8s:conversion-gen=github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard // +groupName=dashboard.grafana.app // NOTE (@radiohead): we do not use package-wide deepcopy generation // because grafana-app-sdk already provides deepcopy functions. // Kinds which are not generated by the SDK are explicitly opted in to deepcopy generation. -package v2alpha1 // import "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1" +package v1alpha1 // import "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1" diff --git a/pkg/apis/dashboard/v1alpha1/register.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/register.go similarity index 100% rename from pkg/apis/dashboard/v1alpha1/register.go rename to apps/dashboard/pkg/apis/dashboard/v1alpha1/register.go diff --git a/pkg/apis/dashboard/v1alpha1/types.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/types.go similarity index 100% rename from pkg/apis/dashboard/v1alpha1/types.go rename to apps/dashboard/pkg/apis/dashboard/v1alpha1/types.go diff --git a/pkg/apis/dashboard/v1alpha1/zz_generated.conversion.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/zz_generated.conversion.go similarity index 99% rename from pkg/apis/dashboard/v1alpha1/zz_generated.conversion.go rename to apps/dashboard/pkg/apis/dashboard/v1alpha1/zz_generated.conversion.go index d5a3f99ce07..85780124520 100644 --- a/pkg/apis/dashboard/v1alpha1/zz_generated.conversion.go +++ b/apps/dashboard/pkg/apis/dashboard/v1alpha1/zz_generated.conversion.go @@ -11,7 +11,7 @@ import ( url "net/url" unsafe "unsafe" - dashboard "github.com/grafana/grafana/pkg/apis/dashboard" + dashboard "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard" conversion "k8s.io/apimachinery/pkg/conversion" runtime "k8s.io/apimachinery/pkg/runtime" ) diff --git a/pkg/apis/dashboard/v1alpha1/zz_generated.deepcopy.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/zz_generated.deepcopy.go similarity index 100% rename from pkg/apis/dashboard/v1alpha1/zz_generated.deepcopy.go rename to apps/dashboard/pkg/apis/dashboard/v1alpha1/zz_generated.deepcopy.go diff --git a/pkg/apis/dashboard/v1alpha1/zz_generated.defaults.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/zz_generated.defaults.go similarity index 100% rename from pkg/apis/dashboard/v1alpha1/zz_generated.defaults.go rename to apps/dashboard/pkg/apis/dashboard/v1alpha1/zz_generated.defaults.go diff --git a/pkg/apis/dashboard/v1alpha1/zz_generated.openapi.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/zz_generated.openapi.go similarity index 82% rename from pkg/apis/dashboard/v1alpha1/zz_generated.openapi.go rename to apps/dashboard/pkg/apis/dashboard/v1alpha1/zz_generated.openapi.go index f9de16ee169..9e3bb475d68 100644 --- a/pkg/apis/dashboard/v1alpha1/zz_generated.openapi.go +++ b/apps/dashboard/pkg/apis/dashboard/v1alpha1/zz_generated.openapi.go @@ -15,24 +15,24 @@ import ( func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenAPIDefinition { return map[string]common.OpenAPIDefinition{ - "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1.Unstructured": v0alpha1.Unstructured{}.OpenAPIDefinition(), - "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.AnnotationActions": schema_pkg_apis_dashboard_v1alpha1_AnnotationActions(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.AnnotationPermission": schema_pkg_apis_dashboard_v1alpha1_AnnotationPermission(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.Dashboard": schema_pkg_apis_dashboard_v1alpha1_Dashboard(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardAccess": schema_pkg_apis_dashboard_v1alpha1_DashboardAccess(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardConversionStatus": schema_pkg_apis_dashboard_v1alpha1_DashboardConversionStatus(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardJSONCodec": schema_pkg_apis_dashboard_v1alpha1_DashboardJSONCodec(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardList": schema_pkg_apis_dashboard_v1alpha1_DashboardList(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardMetadata": schema_pkg_apis_dashboard_v1alpha1_DashboardMetadata(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardStatus": schema_pkg_apis_dashboard_v1alpha1_DashboardStatus(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardVersionInfo": schema_pkg_apis_dashboard_v1alpha1_DashboardVersionInfo(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardVersionList": schema_pkg_apis_dashboard_v1alpha1_DashboardVersionList(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardWithAccessInfo": schema_pkg_apis_dashboard_v1alpha1_DashboardWithAccessInfo(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.LibraryPanel": schema_pkg_apis_dashboard_v1alpha1_LibraryPanel(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.LibraryPanelList": schema_pkg_apis_dashboard_v1alpha1_LibraryPanelList(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.LibraryPanelSpec": schema_pkg_apis_dashboard_v1alpha1_LibraryPanelSpec(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.LibraryPanelStatus": schema_pkg_apis_dashboard_v1alpha1_LibraryPanelStatus(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.VersionsQueryOptions": schema_pkg_apis_dashboard_v1alpha1_VersionsQueryOptions(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.AnnotationActions": schema_pkg_apis_dashboard_v1alpha1_AnnotationActions(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.AnnotationPermission": schema_pkg_apis_dashboard_v1alpha1_AnnotationPermission(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.Dashboard": schema_pkg_apis_dashboard_v1alpha1_Dashboard(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardAccess": schema_pkg_apis_dashboard_v1alpha1_DashboardAccess(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardConversionStatus": schema_pkg_apis_dashboard_v1alpha1_DashboardConversionStatus(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardJSONCodec": schema_pkg_apis_dashboard_v1alpha1_DashboardJSONCodec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardList": schema_pkg_apis_dashboard_v1alpha1_DashboardList(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardMetadata": schema_pkg_apis_dashboard_v1alpha1_DashboardMetadata(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardStatus": schema_pkg_apis_dashboard_v1alpha1_DashboardStatus(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardVersionInfo": schema_pkg_apis_dashboard_v1alpha1_DashboardVersionInfo(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardVersionList": schema_pkg_apis_dashboard_v1alpha1_DashboardVersionList(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardWithAccessInfo": schema_pkg_apis_dashboard_v1alpha1_DashboardWithAccessInfo(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.LibraryPanel": schema_pkg_apis_dashboard_v1alpha1_LibraryPanel(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.LibraryPanelList": schema_pkg_apis_dashboard_v1alpha1_LibraryPanelList(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.LibraryPanelSpec": schema_pkg_apis_dashboard_v1alpha1_LibraryPanelSpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.LibraryPanelStatus": schema_pkg_apis_dashboard_v1alpha1_LibraryPanelStatus(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.VersionsQueryOptions": schema_pkg_apis_dashboard_v1alpha1_VersionsQueryOptions(ref), + "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1.Unstructured": v0alpha1.Unstructured{}.OpenAPIDefinition(), } } @@ -79,13 +79,13 @@ func schema_pkg_apis_dashboard_v1alpha1_AnnotationPermission(ref common.Referenc "dashboard": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.AnnotationActions"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.AnnotationActions"), }, }, "organization": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.AnnotationActions"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.AnnotationActions"), }, }, }, @@ -93,7 +93,7 @@ func schema_pkg_apis_dashboard_v1alpha1_AnnotationPermission(ref common.Referenc }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.AnnotationActions"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.AnnotationActions"}, } } @@ -132,7 +132,7 @@ func schema_pkg_apis_dashboard_v1alpha1_Dashboard(ref common.ReferenceCallback) "status": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardStatus"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardStatus"), }, }, }, @@ -140,7 +140,7 @@ func schema_pkg_apis_dashboard_v1alpha1_Dashboard(ref common.ReferenceCallback) }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1.Unstructured", "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardStatus", "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1.Unstructured", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, } } @@ -202,7 +202,7 @@ func schema_pkg_apis_dashboard_v1alpha1_DashboardAccess(ref common.ReferenceCall }, "annotationsPermissions": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.AnnotationPermission"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.AnnotationPermission"), }, }, }, @@ -210,7 +210,7 @@ func schema_pkg_apis_dashboard_v1alpha1_DashboardAccess(ref common.ReferenceCall }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.AnnotationPermission"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.AnnotationPermission"}, } } @@ -296,7 +296,7 @@ func schema_pkg_apis_dashboard_v1alpha1_DashboardList(ref common.ReferenceCallba Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.Dashboard"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.Dashboard"), }, }, }, @@ -307,7 +307,7 @@ func schema_pkg_apis_dashboard_v1alpha1_DashboardList(ref common.ReferenceCallba }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.Dashboard", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.Dashboard", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, } } @@ -416,14 +416,14 @@ func schema_pkg_apis_dashboard_v1alpha1_DashboardStatus(ref common.ReferenceCall "conversion": { SchemaProps: spec.SchemaProps{ Description: "Optional conversion status.", - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardConversionStatus"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardConversionStatus"), }, }, }, }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardConversionStatus"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardConversionStatus"}, } } @@ -510,7 +510,7 @@ func schema_pkg_apis_dashboard_v1alpha1_DashboardVersionList(ref common.Referenc Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardVersionInfo"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardVersionInfo"), }, }, }, @@ -520,7 +520,7 @@ func schema_pkg_apis_dashboard_v1alpha1_DashboardVersionList(ref common.Referenc }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardVersionInfo", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardVersionInfo", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, } } @@ -560,13 +560,13 @@ func schema_pkg_apis_dashboard_v1alpha1_DashboardWithAccessInfo(ref common.Refer "status": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardStatus"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardStatus"), }, }, "access": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardAccess"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardAccess"), }, }, }, @@ -574,7 +574,7 @@ func schema_pkg_apis_dashboard_v1alpha1_DashboardWithAccessInfo(ref common.Refer }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1.Unstructured", "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardAccess", "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardAccess", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardStatus", "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1.Unstructured", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, } } @@ -609,13 +609,13 @@ func schema_pkg_apis_dashboard_v1alpha1_LibraryPanel(ref common.ReferenceCallbac SchemaProps: spec.SchemaProps{ Description: "Panel properties", Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.LibraryPanelSpec"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.LibraryPanelSpec"), }, }, "status": { SchemaProps: spec.SchemaProps{ Description: "Status will show errors", - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.LibraryPanelStatus"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.LibraryPanelStatus"), }, }, }, @@ -623,7 +623,7 @@ func schema_pkg_apis_dashboard_v1alpha1_LibraryPanel(ref common.ReferenceCallbac }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.LibraryPanelSpec", "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.LibraryPanelStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.LibraryPanelSpec", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.LibraryPanelStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, } } @@ -660,7 +660,7 @@ func schema_pkg_apis_dashboard_v1alpha1_LibraryPanelList(ref common.ReferenceCal Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.LibraryPanel"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.LibraryPanel"), }, }, }, @@ -670,7 +670,7 @@ func schema_pkg_apis_dashboard_v1alpha1_LibraryPanelList(ref common.ReferenceCal }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.LibraryPanel", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.LibraryPanel", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, } } diff --git a/pkg/apis/dashboard/v1alpha1/zz_generated.openapi_violation_exceptions.list b/apps/dashboard/pkg/apis/dashboard/v1alpha1/zz_generated.openapi_violation_exceptions.list similarity index 62% rename from pkg/apis/dashboard/v1alpha1/zz_generated.openapi_violation_exceptions.list rename to apps/dashboard/pkg/apis/dashboard/v1alpha1/zz_generated.openapi_violation_exceptions.list index a34c29a7192..9a9b51f93c7 100644 --- a/pkg/apis/dashboard/v1alpha1/zz_generated.openapi_violation_exceptions.list +++ b/apps/dashboard/pkg/apis/dashboard/v1alpha1/zz_generated.openapi_violation_exceptions.list @@ -1,3 +1,3 @@ -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1,DashboardMetadata,Finalizers -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1,LibraryPanelStatus,Warnings +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1,DashboardMetadata,Finalizers +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1,LibraryPanelStatus,Warnings API rule violation: names_match,github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1,Unstructured,Object diff --git a/pkg/apis/dashboard/v2alpha1/constants.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/constants.go similarity index 100% rename from pkg/apis/dashboard/v2alpha1/constants.go rename to apps/dashboard/pkg/apis/dashboard/v2alpha1/constants.go diff --git a/pkg/apis/dashboard/v2alpha1/dashboard_codec_gen.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_codec_gen.go similarity index 100% rename from pkg/apis/dashboard/v2alpha1/dashboard_codec_gen.go rename to apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_codec_gen.go diff --git a/pkg/apis/dashboard/v2alpha1/dashboard_metadata_gen.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_metadata_gen.go similarity index 100% rename from pkg/apis/dashboard/v2alpha1/dashboard_metadata_gen.go rename to apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_metadata_gen.go diff --git a/pkg/apis/dashboard/v2alpha1/dashboard_object_gen.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_object_gen.go similarity index 100% rename from pkg/apis/dashboard/v2alpha1/dashboard_object_gen.go rename to apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_object_gen.go diff --git a/pkg/apis/dashboard/v2alpha1/dashboard_schema_gen.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_schema_gen.go similarity index 100% rename from pkg/apis/dashboard/v2alpha1/dashboard_schema_gen.go rename to apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_schema_gen.go diff --git a/pkg/apis/dashboard/v2alpha1/dashboard_spec_gen.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_spec_gen.go similarity index 100% rename from pkg/apis/dashboard/v2alpha1/dashboard_spec_gen.go rename to apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_spec_gen.go diff --git a/pkg/apis/dashboard/v2alpha1/dashboard_status_gen.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_status_gen.go similarity index 100% rename from pkg/apis/dashboard/v2alpha1/dashboard_status_gen.go rename to apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_status_gen.go diff --git a/pkg/apis/dashboard/v2alpha1/deepcopy.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/deepcopy.go similarity index 100% rename from pkg/apis/dashboard/v2alpha1/deepcopy.go rename to apps/dashboard/pkg/apis/dashboard/v2alpha1/deepcopy.go diff --git a/pkg/apis/dashboard/v0alpha1/doc.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/doc.go similarity index 63% rename from pkg/apis/dashboard/v0alpha1/doc.go rename to apps/dashboard/pkg/apis/dashboard/v2alpha1/doc.go index 748fa7fffd2..c4f1d65781e 100644 --- a/pkg/apis/dashboard/v0alpha1/doc.go +++ b/apps/dashboard/pkg/apis/dashboard/v2alpha1/doc.go @@ -1,10 +1,10 @@ // +k8s:openapi-gen=true // +k8s:defaulter-gen=TypeMeta -// +k8s:conversion-gen=github.com/grafana/grafana/pkg/apis/dashboard +// +k8s:conversion-gen=github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard // +groupName=dashboard.grafana.app // NOTE (@radiohead): we do not use package-wide deepcopy generation // because grafana-app-sdk already provides deepcopy functions. // Kinds which are not generated by the SDK are explicitly opted in to deepcopy generation. -package v0alpha1 // import "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1" +package v2alpha1 // import "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1" diff --git a/pkg/apis/dashboard/v2alpha1/register.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/register.go similarity index 100% rename from pkg/apis/dashboard/v2alpha1/register.go rename to apps/dashboard/pkg/apis/dashboard/v2alpha1/register.go diff --git a/pkg/apis/dashboard/v2alpha1/types.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/types.go similarity index 100% rename from pkg/apis/dashboard/v2alpha1/types.go rename to apps/dashboard/pkg/apis/dashboard/v2alpha1/types.go diff --git a/pkg/apis/dashboard/v2alpha1/zz_generated.conversion.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.conversion.go similarity index 99% rename from pkg/apis/dashboard/v2alpha1/zz_generated.conversion.go rename to apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.conversion.go index 10204d0a3b3..fe4c7479194 100644 --- a/pkg/apis/dashboard/v2alpha1/zz_generated.conversion.go +++ b/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.conversion.go @@ -11,7 +11,7 @@ import ( url "net/url" unsafe "unsafe" - dashboard "github.com/grafana/grafana/pkg/apis/dashboard" + dashboard "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard" conversion "k8s.io/apimachinery/pkg/conversion" runtime "k8s.io/apimachinery/pkg/runtime" ) diff --git a/pkg/apis/dashboard/v2alpha1/zz_generated.deepcopy.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.deepcopy.go similarity index 100% rename from pkg/apis/dashboard/v2alpha1/zz_generated.deepcopy.go rename to apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.deepcopy.go diff --git a/pkg/apis/dashboard/v2alpha1/zz_generated.defaults.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.defaults.go similarity index 100% rename from pkg/apis/dashboard/v2alpha1/zz_generated.defaults.go rename to apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.defaults.go diff --git a/pkg/apis/dashboard/v2alpha1/zz_generated.openapi.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi.go similarity index 66% rename from pkg/apis/dashboard/v2alpha1/zz_generated.openapi.go rename to apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi.go index 1025adcda86..5d0d6801fcb 100644 --- a/pkg/apis/dashboard/v2alpha1/zz_generated.openapi.go +++ b/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi.go @@ -14,113 +14,113 @@ import ( func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenAPIDefinition { return map[string]common.OpenAPIDefinition{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.AnnotationActions": schema_pkg_apis_dashboard_v2alpha1_AnnotationActions(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.AnnotationPermission": schema_pkg_apis_dashboard_v2alpha1_AnnotationPermission(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.Dashboard": schema_pkg_apis_dashboard_v2alpha1_Dashboard(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardAccess": schema_pkg_apis_dashboard_v2alpha1_DashboardAccess(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardAdHocFilterWithLabels": schema_pkg_apis_dashboard_v2alpha1_DashboardAdHocFilterWithLabels(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardAdhocVariableKind": schema_pkg_apis_dashboard_v2alpha1_DashboardAdhocVariableKind(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardAdhocVariableSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardAdhocVariableSpec(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardAnnotationPanelFilter": schema_pkg_apis_dashboard_v2alpha1_DashboardAnnotationPanelFilter(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardAnnotationQueryKind": schema_pkg_apis_dashboard_v2alpha1_DashboardAnnotationQueryKind(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardAnnotationQuerySpec": schema_pkg_apis_dashboard_v2alpha1_DashboardAnnotationQuerySpec(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardConstantVariableKind": schema_pkg_apis_dashboard_v2alpha1_DashboardConstantVariableKind(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardConstantVariableSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardConstantVariableSpec(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardConversionStatus": schema_pkg_apis_dashboard_v2alpha1_DashboardConversionStatus(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardCustomVariableKind": schema_pkg_apis_dashboard_v2alpha1_DashboardCustomVariableKind(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardCustomVariableSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardCustomVariableSpec(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDashboardLink": schema_pkg_apis_dashboard_v2alpha1_DashboardDashboardLink(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDataLink": schema_pkg_apis_dashboard_v2alpha1_DashboardDataLink(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDataQueryKind": schema_pkg_apis_dashboard_v2alpha1_DashboardDataQueryKind(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef": schema_pkg_apis_dashboard_v2alpha1_DashboardDataSourceRef(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDataTransformerConfig": schema_pkg_apis_dashboard_v2alpha1_DashboardDataTransformerConfig(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDatasourceVariableKind": schema_pkg_apis_dashboard_v2alpha1_DashboardDatasourceVariableKind(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDatasourceVariableSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardDatasourceVariableSpec(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDynamicConfigValue": schema_pkg_apis_dashboard_v2alpha1_DashboardDynamicConfigValue(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardElementReference": schema_pkg_apis_dashboard_v2alpha1_DashboardElementReference(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardFieldColor": schema_pkg_apis_dashboard_v2alpha1_DashboardFieldColor(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardFieldConfig": schema_pkg_apis_dashboard_v2alpha1_DashboardFieldConfig(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardFieldConfigSource": schema_pkg_apis_dashboard_v2alpha1_DashboardFieldConfigSource(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKind": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutItemKind(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKindOrGridLayoutRowKind": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutItemKindOrGridLayoutRowKind(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutItemSpec(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKind": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutKind(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutRowKind": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutRowKind(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutRowSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutRowSpec(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutSpec(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGroupByVariableKind": schema_pkg_apis_dashboard_v2alpha1_DashboardGroupByVariableKind(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGroupByVariableSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardGroupByVariableSpec(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardIntervalVariableKind": schema_pkg_apis_dashboard_v2alpha1_DashboardIntervalVariableKind(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardIntervalVariableSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardIntervalVariableSpec(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardJSONCodec": schema_pkg_apis_dashboard_v2alpha1_DashboardJSONCodec(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardLibraryPanelKind": schema_pkg_apis_dashboard_v2alpha1_DashboardLibraryPanelKind(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardLibraryPanelKindSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardLibraryPanelKindSpec(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardLibraryPanelRef": schema_pkg_apis_dashboard_v2alpha1_DashboardLibraryPanelRef(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardList": schema_pkg_apis_dashboard_v2alpha1_DashboardList(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardMatcherConfig": schema_pkg_apis_dashboard_v2alpha1_DashboardMatcherConfig(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardMetadata": schema_pkg_apis_dashboard_v2alpha1_DashboardMetadata(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardMetricFindValue": schema_pkg_apis_dashboard_v2alpha1_DashboardMetricFindValue(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardPanelKind": schema_pkg_apis_dashboard_v2alpha1_DashboardPanelKind(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardPanelKindOrLibraryPanelKind": schema_pkg_apis_dashboard_v2alpha1_DashboardPanelKindOrLibraryPanelKind(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardPanelQueryKind": schema_pkg_apis_dashboard_v2alpha1_DashboardPanelQueryKind(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardPanelQuerySpec": schema_pkg_apis_dashboard_v2alpha1_DashboardPanelQuerySpec(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardPanelSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardPanelSpec(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardQueryGroupKind": schema_pkg_apis_dashboard_v2alpha1_DashboardQueryGroupKind(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardQueryGroupSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardQueryGroupSpec(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardQueryOptionsSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardQueryOptionsSpec(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardQueryVariableKind": schema_pkg_apis_dashboard_v2alpha1_DashboardQueryVariableKind(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind": schema_pkg_apis_dashboard_v2alpha1_DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardQueryVariableSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardQueryVariableSpec(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardRangeMap": schema_pkg_apis_dashboard_v2alpha1_DashboardRangeMap(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardRegexMap": schema_pkg_apis_dashboard_v2alpha1_DashboardRegexMap(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardRepeatOptions": schema_pkg_apis_dashboard_v2alpha1_DashboardRepeatOptions(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutItemKind": schema_pkg_apis_dashboard_v2alpha1_DashboardResponsiveGridLayoutItemKind(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutItemSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardResponsiveGridLayoutItemSpec(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutKind": schema_pkg_apis_dashboard_v2alpha1_DashboardResponsiveGridLayoutKind(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardResponsiveGridLayoutSpec(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridRepeatOptions": schema_pkg_apis_dashboard_v2alpha1_DashboardResponsiveGridRepeatOptions(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardRowRepeatOptions": schema_pkg_apis_dashboard_v2alpha1_DashboardRowRepeatOptions(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutKind": schema_pkg_apis_dashboard_v2alpha1_DashboardRowsLayoutKind(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutRowKind": schema_pkg_apis_dashboard_v2alpha1_DashboardRowsLayoutRowKind(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutRowSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardRowsLayoutRowSpec(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardRowsLayoutSpec(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardSpec(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardSpecialValueMap": schema_pkg_apis_dashboard_v2alpha1_DashboardSpecialValueMap(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardStatus": schema_pkg_apis_dashboard_v2alpha1_DashboardStatus(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardStringOrArrayOfString": schema_pkg_apis_dashboard_v2alpha1_DashboardStringOrArrayOfString(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardStringOrFloat64": schema_pkg_apis_dashboard_v2alpha1_DashboardStringOrFloat64(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutKind": schema_pkg_apis_dashboard_v2alpha1_DashboardTabsLayoutKind(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardTabsLayoutSpec(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutTabKind": schema_pkg_apis_dashboard_v2alpha1_DashboardTabsLayoutTabKind(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutTabSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardTabsLayoutTabSpec(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardTextVariableKind": schema_pkg_apis_dashboard_v2alpha1_DashboardTextVariableKind(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardTextVariableSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardTextVariableSpec(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardThreshold": schema_pkg_apis_dashboard_v2alpha1_DashboardThreshold(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardThresholdsConfig": schema_pkg_apis_dashboard_v2alpha1_DashboardThresholdsConfig(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardTimeRangeOption": schema_pkg_apis_dashboard_v2alpha1_DashboardTimeRangeOption(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardTimeSettingsSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardTimeSettingsSpec(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardTransformationKind": schema_pkg_apis_dashboard_v2alpha1_DashboardTransformationKind(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1FieldConfigSourceOverrides": schema_pkg_apis_dashboard_v2alpha1_DashboardV2alpha1FieldConfigSourceOverrides(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1RangeMapOptions": schema_pkg_apis_dashboard_v2alpha1_DashboardV2alpha1RangeMapOptions(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1RegexMapOptions": schema_pkg_apis_dashboard_v2alpha1_DashboardV2alpha1RegexMapOptions(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1SpecialValueMapOptions": schema_pkg_apis_dashboard_v2alpha1_DashboardV2alpha1SpecialValueMapOptions(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardValueMap": schema_pkg_apis_dashboard_v2alpha1_DashboardValueMap(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap": schema_pkg_apis_dashboard_v2alpha1_DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardValueMappingResult": schema_pkg_apis_dashboard_v2alpha1_DashboardValueMappingResult(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardVariableOption": schema_pkg_apis_dashboard_v2alpha1_DashboardVariableOption(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardVersionInfo": schema_pkg_apis_dashboard_v2alpha1_DashboardVersionInfo(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardVersionList": schema_pkg_apis_dashboard_v2alpha1_DashboardVersionList(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardVizConfigKind": schema_pkg_apis_dashboard_v2alpha1_DashboardVizConfigKind(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardVizConfigSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardVizConfigSpec(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardWithAccessInfo": schema_pkg_apis_dashboard_v2alpha1_DashboardWithAccessInfo(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.LibraryPanel": schema_pkg_apis_dashboard_v2alpha1_LibraryPanel(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.LibraryPanelList": schema_pkg_apis_dashboard_v2alpha1_LibraryPanelList(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.LibraryPanelSpec": schema_pkg_apis_dashboard_v2alpha1_LibraryPanelSpec(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.LibraryPanelStatus": schema_pkg_apis_dashboard_v2alpha1_LibraryPanelStatus(ref), - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.VersionsQueryOptions": schema_pkg_apis_dashboard_v2alpha1_VersionsQueryOptions(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.AnnotationActions": schema_pkg_apis_dashboard_v2alpha1_AnnotationActions(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.AnnotationPermission": schema_pkg_apis_dashboard_v2alpha1_AnnotationPermission(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.Dashboard": schema_pkg_apis_dashboard_v2alpha1_Dashboard(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAccess": schema_pkg_apis_dashboard_v2alpha1_DashboardAccess(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAdHocFilterWithLabels": schema_pkg_apis_dashboard_v2alpha1_DashboardAdHocFilterWithLabels(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAdhocVariableKind": schema_pkg_apis_dashboard_v2alpha1_DashboardAdhocVariableKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAdhocVariableSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardAdhocVariableSpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAnnotationPanelFilter": schema_pkg_apis_dashboard_v2alpha1_DashboardAnnotationPanelFilter(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAnnotationQueryKind": schema_pkg_apis_dashboard_v2alpha1_DashboardAnnotationQueryKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAnnotationQuerySpec": schema_pkg_apis_dashboard_v2alpha1_DashboardAnnotationQuerySpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConstantVariableKind": schema_pkg_apis_dashboard_v2alpha1_DashboardConstantVariableKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConstantVariableSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardConstantVariableSpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConversionStatus": schema_pkg_apis_dashboard_v2alpha1_DashboardConversionStatus(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardCustomVariableKind": schema_pkg_apis_dashboard_v2alpha1_DashboardCustomVariableKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardCustomVariableSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardCustomVariableSpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDashboardLink": schema_pkg_apis_dashboard_v2alpha1_DashboardDashboardLink(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataLink": schema_pkg_apis_dashboard_v2alpha1_DashboardDataLink(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataQueryKind": schema_pkg_apis_dashboard_v2alpha1_DashboardDataQueryKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef": schema_pkg_apis_dashboard_v2alpha1_DashboardDataSourceRef(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataTransformerConfig": schema_pkg_apis_dashboard_v2alpha1_DashboardDataTransformerConfig(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDatasourceVariableKind": schema_pkg_apis_dashboard_v2alpha1_DashboardDatasourceVariableKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDatasourceVariableSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardDatasourceVariableSpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDynamicConfigValue": schema_pkg_apis_dashboard_v2alpha1_DashboardDynamicConfigValue(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardElementReference": schema_pkg_apis_dashboard_v2alpha1_DashboardElementReference(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardFieldColor": schema_pkg_apis_dashboard_v2alpha1_DashboardFieldColor(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardFieldConfig": schema_pkg_apis_dashboard_v2alpha1_DashboardFieldConfig(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardFieldConfigSource": schema_pkg_apis_dashboard_v2alpha1_DashboardFieldConfigSource(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKind": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutItemKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKindOrGridLayoutRowKind": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutItemKindOrGridLayoutRowKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutItemSpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKind": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutRowKind": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutRowKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutRowSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutRowSpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutSpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGroupByVariableKind": schema_pkg_apis_dashboard_v2alpha1_DashboardGroupByVariableKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGroupByVariableSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardGroupByVariableSpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardIntervalVariableKind": schema_pkg_apis_dashboard_v2alpha1_DashboardIntervalVariableKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardIntervalVariableSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardIntervalVariableSpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardJSONCodec": schema_pkg_apis_dashboard_v2alpha1_DashboardJSONCodec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardLibraryPanelKind": schema_pkg_apis_dashboard_v2alpha1_DashboardLibraryPanelKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardLibraryPanelKindSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardLibraryPanelKindSpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardLibraryPanelRef": schema_pkg_apis_dashboard_v2alpha1_DashboardLibraryPanelRef(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardList": schema_pkg_apis_dashboard_v2alpha1_DashboardList(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardMatcherConfig": schema_pkg_apis_dashboard_v2alpha1_DashboardMatcherConfig(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardMetadata": schema_pkg_apis_dashboard_v2alpha1_DashboardMetadata(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardMetricFindValue": schema_pkg_apis_dashboard_v2alpha1_DashboardMetricFindValue(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardPanelKind": schema_pkg_apis_dashboard_v2alpha1_DashboardPanelKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardPanelKindOrLibraryPanelKind": schema_pkg_apis_dashboard_v2alpha1_DashboardPanelKindOrLibraryPanelKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardPanelQueryKind": schema_pkg_apis_dashboard_v2alpha1_DashboardPanelQueryKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardPanelQuerySpec": schema_pkg_apis_dashboard_v2alpha1_DashboardPanelQuerySpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardPanelSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardPanelSpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryGroupKind": schema_pkg_apis_dashboard_v2alpha1_DashboardQueryGroupKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryGroupSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardQueryGroupSpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryOptionsSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardQueryOptionsSpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryVariableKind": schema_pkg_apis_dashboard_v2alpha1_DashboardQueryVariableKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind": schema_pkg_apis_dashboard_v2alpha1_DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryVariableSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardQueryVariableSpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRangeMap": schema_pkg_apis_dashboard_v2alpha1_DashboardRangeMap(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRegexMap": schema_pkg_apis_dashboard_v2alpha1_DashboardRegexMap(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRepeatOptions": schema_pkg_apis_dashboard_v2alpha1_DashboardRepeatOptions(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutItemKind": schema_pkg_apis_dashboard_v2alpha1_DashboardResponsiveGridLayoutItemKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutItemSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardResponsiveGridLayoutItemSpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutKind": schema_pkg_apis_dashboard_v2alpha1_DashboardResponsiveGridLayoutKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardResponsiveGridLayoutSpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridRepeatOptions": schema_pkg_apis_dashboard_v2alpha1_DashboardResponsiveGridRepeatOptions(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowRepeatOptions": schema_pkg_apis_dashboard_v2alpha1_DashboardRowRepeatOptions(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutKind": schema_pkg_apis_dashboard_v2alpha1_DashboardRowsLayoutKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutRowKind": schema_pkg_apis_dashboard_v2alpha1_DashboardRowsLayoutRowKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutRowSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardRowsLayoutRowSpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardRowsLayoutSpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardSpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardSpecialValueMap": schema_pkg_apis_dashboard_v2alpha1_DashboardSpecialValueMap(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardStatus": schema_pkg_apis_dashboard_v2alpha1_DashboardStatus(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardStringOrArrayOfString": schema_pkg_apis_dashboard_v2alpha1_DashboardStringOrArrayOfString(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardStringOrFloat64": schema_pkg_apis_dashboard_v2alpha1_DashboardStringOrFloat64(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutKind": schema_pkg_apis_dashboard_v2alpha1_DashboardTabsLayoutKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardTabsLayoutSpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutTabKind": schema_pkg_apis_dashboard_v2alpha1_DashboardTabsLayoutTabKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutTabSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardTabsLayoutTabSpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTextVariableKind": schema_pkg_apis_dashboard_v2alpha1_DashboardTextVariableKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTextVariableSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardTextVariableSpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardThreshold": schema_pkg_apis_dashboard_v2alpha1_DashboardThreshold(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardThresholdsConfig": schema_pkg_apis_dashboard_v2alpha1_DashboardThresholdsConfig(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTimeRangeOption": schema_pkg_apis_dashboard_v2alpha1_DashboardTimeRangeOption(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTimeSettingsSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardTimeSettingsSpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTransformationKind": schema_pkg_apis_dashboard_v2alpha1_DashboardTransformationKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1FieldConfigSourceOverrides": schema_pkg_apis_dashboard_v2alpha1_DashboardV2alpha1FieldConfigSourceOverrides(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1RangeMapOptions": schema_pkg_apis_dashboard_v2alpha1_DashboardV2alpha1RangeMapOptions(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1RegexMapOptions": schema_pkg_apis_dashboard_v2alpha1_DashboardV2alpha1RegexMapOptions(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1SpecialValueMapOptions": schema_pkg_apis_dashboard_v2alpha1_DashboardV2alpha1SpecialValueMapOptions(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardValueMap": schema_pkg_apis_dashboard_v2alpha1_DashboardValueMap(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap": schema_pkg_apis_dashboard_v2alpha1_DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardValueMappingResult": schema_pkg_apis_dashboard_v2alpha1_DashboardValueMappingResult(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption": schema_pkg_apis_dashboard_v2alpha1_DashboardVariableOption(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVersionInfo": schema_pkg_apis_dashboard_v2alpha1_DashboardVersionInfo(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVersionList": schema_pkg_apis_dashboard_v2alpha1_DashboardVersionList(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVizConfigKind": schema_pkg_apis_dashboard_v2alpha1_DashboardVizConfigKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVizConfigSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardVizConfigSpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardWithAccessInfo": schema_pkg_apis_dashboard_v2alpha1_DashboardWithAccessInfo(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.LibraryPanel": schema_pkg_apis_dashboard_v2alpha1_LibraryPanel(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.LibraryPanelList": schema_pkg_apis_dashboard_v2alpha1_LibraryPanelList(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.LibraryPanelSpec": schema_pkg_apis_dashboard_v2alpha1_LibraryPanelSpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.LibraryPanelStatus": schema_pkg_apis_dashboard_v2alpha1_LibraryPanelStatus(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.VersionsQueryOptions": schema_pkg_apis_dashboard_v2alpha1_VersionsQueryOptions(ref), } } @@ -167,13 +167,13 @@ func schema_pkg_apis_dashboard_v2alpha1_AnnotationPermission(ref common.Referenc "dashboard": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.AnnotationActions"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.AnnotationActions"), }, }, "organization": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.AnnotationActions"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.AnnotationActions"), }, }, }, @@ -181,7 +181,7 @@ func schema_pkg_apis_dashboard_v2alpha1_AnnotationPermission(ref common.Referenc }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.AnnotationActions"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.AnnotationActions"}, } } @@ -215,13 +215,13 @@ func schema_pkg_apis_dashboard_v2alpha1_Dashboard(ref common.ReferenceCallback) SchemaProps: spec.SchemaProps{ Description: "Spec is the spec of the Dashboard", Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardSpec"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardSpec"), }, }, "status": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardStatus"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardStatus"), }, }, }, @@ -229,7 +229,7 @@ func schema_pkg_apis_dashboard_v2alpha1_Dashboard(ref common.ReferenceCallback) }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardSpec", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardSpec", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, } } @@ -291,7 +291,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardAccess(ref common.ReferenceCall }, "annotationsPermissions": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.AnnotationPermission"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.AnnotationPermission"), }, }, }, @@ -299,7 +299,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardAccess(ref common.ReferenceCall }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.AnnotationPermission"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.AnnotationPermission"}, } } @@ -402,7 +402,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardAdhocVariableKind(ref common.Re "spec": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardAdhocVariableSpec"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAdhocVariableSpec"), }, }, }, @@ -410,7 +410,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardAdhocVariableKind(ref common.Re }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardAdhocVariableSpec"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAdhocVariableSpec"}, } } @@ -430,7 +430,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardAdhocVariableSpec(ref common.Re }, "datasource": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef"), }, }, "baseFilters": { @@ -440,7 +440,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardAdhocVariableSpec(ref common.Re Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardAdHocFilterWithLabels"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAdHocFilterWithLabels"), }, }, }, @@ -453,7 +453,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardAdhocVariableSpec(ref common.Re Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardAdHocFilterWithLabels"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAdHocFilterWithLabels"), }, }, }, @@ -466,7 +466,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardAdhocVariableSpec(ref common.Re Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardMetricFindValue"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardMetricFindValue"), }, }, }, @@ -503,7 +503,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardAdhocVariableSpec(ref common.Re }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardAdHocFilterWithLabels", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardMetricFindValue"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAdHocFilterWithLabels", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardMetricFindValue"}, } } @@ -558,7 +558,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardAnnotationQueryKind(ref common. "spec": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardAnnotationQuerySpec"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAnnotationQuerySpec"), }, }, }, @@ -566,7 +566,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardAnnotationQueryKind(ref common. }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardAnnotationQuerySpec"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAnnotationQuerySpec"}, } } @@ -578,12 +578,12 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardAnnotationQuerySpec(ref common. Properties: map[string]spec.Schema{ "datasource": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef"), }, }, "query": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDataQueryKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataQueryKind"), }, }, "enable": { @@ -622,7 +622,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardAnnotationQuerySpec(ref common. }, "filter": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardAnnotationPanelFilter"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAnnotationPanelFilter"), }, }, }, @@ -630,7 +630,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardAnnotationQuerySpec(ref common. }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardAnnotationPanelFilter", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDataQueryKind", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAnnotationPanelFilter", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataQueryKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef"}, } } @@ -651,7 +651,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardConstantVariableKind(ref common "spec": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardConstantVariableSpec"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConstantVariableSpec"), }, }, }, @@ -659,7 +659,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardConstantVariableKind(ref common }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardConstantVariableSpec"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConstantVariableSpec"}, } } @@ -687,7 +687,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardConstantVariableSpec(ref common "current": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"), }, }, "label": { @@ -721,7 +721,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardConstantVariableSpec(ref common }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"}, } } @@ -780,7 +780,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardCustomVariableKind(ref common.R "spec": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardCustomVariableSpec"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardCustomVariableSpec"), }, }, }, @@ -788,7 +788,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardCustomVariableKind(ref common.R }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardCustomVariableSpec"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardCustomVariableSpec"}, } } @@ -816,7 +816,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardCustomVariableSpec(ref common.R "current": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"), }, }, "options": { @@ -826,7 +826,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardCustomVariableSpec(ref common.R Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"), }, }, }, @@ -883,7 +883,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardCustomVariableSpec(ref common.R }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"}, } } @@ -1106,7 +1106,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardDataTransformerConfig(ref commo "filter": { SchemaProps: spec.SchemaProps{ Description: "Optional frame matcher. When missing it will be applied to all results", - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardMatcherConfig"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardMatcherConfig"), }, }, "topic": { @@ -1128,7 +1128,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardDataTransformerConfig(ref commo }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardMatcherConfig"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardMatcherConfig"}, } } @@ -1149,7 +1149,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardDatasourceVariableKind(ref comm "spec": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDatasourceVariableSpec"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDatasourceVariableSpec"), }, }, }, @@ -1157,7 +1157,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardDatasourceVariableKind(ref comm }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDatasourceVariableSpec"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDatasourceVariableSpec"}, } } @@ -1199,7 +1199,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardDatasourceVariableSpec(ref comm "current": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"), }, }, "options": { @@ -1209,7 +1209,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardDatasourceVariableSpec(ref comm Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"), }, }, }, @@ -1266,7 +1266,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardDatasourceVariableSpec(ref comm }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"}, } } @@ -1443,7 +1443,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardFieldConfig(ref common.Referenc Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap"), }, }, }, @@ -1452,13 +1452,13 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardFieldConfig(ref common.Referenc "thresholds": { SchemaProps: spec.SchemaProps{ Description: "Map numeric values to states", - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardThresholdsConfig"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardThresholdsConfig"), }, }, "color": { SchemaProps: spec.SchemaProps{ Description: "Panel color configuration", - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardFieldColor"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardFieldColor"), }, }, "links": { @@ -1501,7 +1501,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardFieldConfig(ref common.Referenc }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardFieldColor", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardThresholdsConfig", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardFieldColor", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardThresholdsConfig", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap"}, } } @@ -1516,7 +1516,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardFieldConfigSource(ref common.Re SchemaProps: spec.SchemaProps{ Description: "Defaults are the options applied to all fields.", Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardFieldConfig"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardFieldConfig"), }, }, "overrides": { @@ -1527,7 +1527,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardFieldConfigSource(ref common.Re Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1FieldConfigSourceOverrides"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1FieldConfigSourceOverrides"), }, }, }, @@ -1538,7 +1538,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardFieldConfigSource(ref common.Re }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardFieldConfig", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1FieldConfigSourceOverrides"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardFieldConfig", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1FieldConfigSourceOverrides"}, } } @@ -1558,7 +1558,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutItemKind(ref common.R "spec": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemSpec"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemSpec"), }, }, }, @@ -1566,7 +1566,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutItemKind(ref common.R }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemSpec"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemSpec"}, } } @@ -1578,19 +1578,19 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutItemKindOrGridLayoutR Properties: map[string]spec.Schema{ "GridLayoutItemKind": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKind"), }, }, "GridLayoutRowKind": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutRowKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutRowKind"), }, }, }, }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKind", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutRowKind"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutRowKind"}, } } @@ -1632,12 +1632,12 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutItemSpec(ref common.R SchemaProps: spec.SchemaProps{ Description: "reference to a PanelKind from dashboard.spec.elements Expressed as JSON Schema reference", Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardElementReference"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardElementReference"), }, }, "repeat": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardRepeatOptions"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRepeatOptions"), }, }, }, @@ -1645,7 +1645,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutItemSpec(ref common.R }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardElementReference", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardRepeatOptions"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardElementReference", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRepeatOptions"}, } } @@ -1665,7 +1665,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutKind(ref common.Refer "spec": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutSpec"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutSpec"), }, }, }, @@ -1673,7 +1673,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutKind(ref common.Refer }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutSpec"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutSpec"}, } } @@ -1685,24 +1685,24 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutKindOrResponsiveGridL Properties: map[string]spec.Schema{ "GridLayoutKind": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKind"), }, }, "ResponsiveGridLayoutKind": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutKind"), }, }, "TabsLayoutKind": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutKind"), }, }, }, }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKind", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutKind", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutKind"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutKind"}, } } @@ -1714,24 +1714,24 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutKindOrRowsLayoutKindO Properties: map[string]spec.Schema{ "GridLayoutKind": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKind"), }, }, "RowsLayoutKind": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutKind"), }, }, "ResponsiveGridLayoutKind": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutKind"), }, }, }, }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKind", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutKind", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutKind"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutKind"}, } } @@ -1743,29 +1743,29 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutKindOrRowsLayoutKindO Properties: map[string]spec.Schema{ "GridLayoutKind": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKind"), }, }, "RowsLayoutKind": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutKind"), }, }, "ResponsiveGridLayoutKind": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutKind"), }, }, "TabsLayoutKind": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutKind"), }, }, }, }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKind", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutKind", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutKind", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutKind"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutKind"}, } } @@ -1785,7 +1785,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutRowKind(ref common.Re "spec": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutRowSpec"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutRowSpec"), }, }, }, @@ -1793,7 +1793,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutRowKind(ref common.Re }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutRowSpec"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutRowSpec"}, } } @@ -1832,7 +1832,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutRowSpec(ref common.Re Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKind"), }, }, }, @@ -1840,7 +1840,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutRowSpec(ref common.Re }, "repeat": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardRowRepeatOptions"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowRepeatOptions"), }, }, }, @@ -1848,7 +1848,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutRowSpec(ref common.Re }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKind", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardRowRepeatOptions"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowRepeatOptions"}, } } @@ -1864,7 +1864,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutSpec(ref common.Refer Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKindOrGridLayoutRowKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKindOrGridLayoutRowKind"), }, }, }, @@ -1875,7 +1875,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutSpec(ref common.Refer }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKindOrGridLayoutRowKind"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKindOrGridLayoutRowKind"}, } } @@ -1896,7 +1896,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardGroupByVariableKind(ref common. "spec": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGroupByVariableSpec"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGroupByVariableSpec"), }, }, }, @@ -1904,7 +1904,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardGroupByVariableKind(ref common. }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGroupByVariableSpec"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGroupByVariableSpec"}, } } @@ -1924,13 +1924,13 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardGroupByVariableSpec(ref common. }, "datasource": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef"), }, }, "current": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"), }, }, "options": { @@ -1940,7 +1940,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardGroupByVariableSpec(ref common. Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"), }, }, }, @@ -1984,7 +1984,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardGroupByVariableSpec(ref common. }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"}, } } @@ -2005,7 +2005,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardIntervalVariableKind(ref common "spec": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardIntervalVariableSpec"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardIntervalVariableSpec"), }, }, }, @@ -2013,7 +2013,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardIntervalVariableKind(ref common }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardIntervalVariableSpec"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardIntervalVariableSpec"}, } } @@ -2041,7 +2041,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardIntervalVariableSpec(ref common "current": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"), }, }, "options": { @@ -2051,7 +2051,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardIntervalVariableSpec(ref common Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"), }, }, }, @@ -2116,7 +2116,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardIntervalVariableSpec(ref common }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"}, } } @@ -2147,7 +2147,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardLibraryPanelKind(ref common.Ref "spec": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardLibraryPanelKindSpec"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardLibraryPanelKindSpec"), }, }, }, @@ -2155,7 +2155,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardLibraryPanelKind(ref common.Ref }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardLibraryPanelKindSpec"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardLibraryPanelKindSpec"}, } } @@ -2184,7 +2184,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardLibraryPanelKindSpec(ref common "libraryPanel": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardLibraryPanelRef"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardLibraryPanelRef"), }, }, }, @@ -2192,7 +2192,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardLibraryPanelKindSpec(ref common }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardLibraryPanelRef"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardLibraryPanelRef"}, } } @@ -2259,7 +2259,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardList(ref common.ReferenceCallba Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.Dashboard"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.Dashboard"), }, }, }, @@ -2270,7 +2270,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardList(ref common.ReferenceCallba }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.Dashboard", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.Dashboard", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, } } @@ -2415,7 +2415,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardMetricFindValue(ref common.Refe }, "value": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardStringOrFloat64"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardStringOrFloat64"), }, }, "group": { @@ -2435,7 +2435,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardMetricFindValue(ref common.Refe }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardStringOrFloat64"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardStringOrFloat64"}, } } @@ -2455,7 +2455,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardPanelKind(ref common.ReferenceC "spec": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardPanelSpec"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardPanelSpec"), }, }, }, @@ -2463,7 +2463,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardPanelKind(ref common.ReferenceC }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardPanelSpec"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardPanelSpec"}, } } @@ -2475,19 +2475,19 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardPanelKindOrLibraryPanelKind(ref Properties: map[string]spec.Schema{ "PanelKind": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardPanelKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardPanelKind"), }, }, "LibraryPanelKind": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardLibraryPanelKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardLibraryPanelKind"), }, }, }, }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardLibraryPanelKind", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardPanelKind"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardLibraryPanelKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardPanelKind"}, } } @@ -2507,7 +2507,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardPanelQueryKind(ref common.Refer "spec": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardPanelQuerySpec"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardPanelQuerySpec"), }, }, }, @@ -2515,7 +2515,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardPanelQueryKind(ref common.Refer }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardPanelQuerySpec"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardPanelQuerySpec"}, } } @@ -2528,12 +2528,12 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardPanelQuerySpec(ref common.Refer "query": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDataQueryKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataQueryKind"), }, }, "datasource": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef"), }, }, "refId": { @@ -2555,7 +2555,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardPanelQuerySpec(ref common.Refer }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDataQueryKind", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataQueryKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef"}, } } @@ -2593,7 +2593,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardPanelSpec(ref common.ReferenceC Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDataLink"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataLink"), }, }, }, @@ -2602,13 +2602,13 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardPanelSpec(ref common.ReferenceC "data": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardQueryGroupKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryGroupKind"), }, }, "vizConfig": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardVizConfigKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVizConfigKind"), }, }, "transparent": { @@ -2622,7 +2622,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardPanelSpec(ref common.ReferenceC }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDataLink", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardQueryGroupKind", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardVizConfigKind"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataLink", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryGroupKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVizConfigKind"}, } } @@ -2642,7 +2642,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardQueryGroupKind(ref common.Refer "spec": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardQueryGroupSpec"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryGroupSpec"), }, }, }, @@ -2650,7 +2650,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardQueryGroupKind(ref common.Refer }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardQueryGroupSpec"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryGroupSpec"}, } } @@ -2667,7 +2667,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardQueryGroupSpec(ref common.Refer Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardPanelQueryKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardPanelQueryKind"), }, }, }, @@ -2680,7 +2680,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardQueryGroupSpec(ref common.Refer Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardTransformationKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTransformationKind"), }, }, }, @@ -2689,7 +2689,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardQueryGroupSpec(ref common.Refer "queryOptions": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardQueryOptionsSpec"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryOptionsSpec"), }, }, }, @@ -2697,7 +2697,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardQueryGroupSpec(ref common.Refer }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardPanelQueryKind", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardQueryOptionsSpec", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardTransformationKind"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardPanelQueryKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryOptionsSpec", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTransformationKind"}, } } @@ -2772,7 +2772,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardQueryVariableKind(ref common.Re "spec": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardQueryVariableSpec"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryVariableSpec"), }, }, }, @@ -2780,7 +2780,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardQueryVariableKind(ref common.Re }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardQueryVariableSpec"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryVariableSpec"}, } } @@ -2792,49 +2792,49 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardQueryVariableKindOrTextVariable Properties: map[string]spec.Schema{ "QueryVariableKind": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardQueryVariableKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryVariableKind"), }, }, "TextVariableKind": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardTextVariableKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTextVariableKind"), }, }, "ConstantVariableKind": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardConstantVariableKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConstantVariableKind"), }, }, "DatasourceVariableKind": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDatasourceVariableKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDatasourceVariableKind"), }, }, "IntervalVariableKind": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardIntervalVariableKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardIntervalVariableKind"), }, }, "CustomVariableKind": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardCustomVariableKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardCustomVariableKind"), }, }, "GroupByVariableKind": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGroupByVariableKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGroupByVariableKind"), }, }, "AdhocVariableKind": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardAdhocVariableKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAdhocVariableKind"), }, }, }, }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardAdhocVariableKind", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardConstantVariableKind", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardCustomVariableKind", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDatasourceVariableKind", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGroupByVariableKind", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardIntervalVariableKind", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardQueryVariableKind", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardTextVariableKind"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAdhocVariableKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConstantVariableKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardCustomVariableKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDatasourceVariableKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGroupByVariableKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardIntervalVariableKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryVariableKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTextVariableKind"}, } } @@ -2855,7 +2855,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardQueryVariableSpec(ref common.Re "current": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"), }, }, "label": { @@ -2893,13 +2893,13 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardQueryVariableSpec(ref common.Re }, "datasource": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef"), }, }, "query": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDataQueryKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataQueryKind"), }, }, "regex": { @@ -2929,7 +2929,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardQueryVariableSpec(ref common.Re Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"), }, }, }, @@ -2966,7 +2966,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardQueryVariableSpec(ref common.Re }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDataQueryKind", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataQueryKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"}, } } @@ -2989,7 +2989,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardRangeMap(ref common.ReferenceCa SchemaProps: spec.SchemaProps{ Description: "Range to match against and the result to apply when the value is within the range", Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1RangeMapOptions"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1RangeMapOptions"), }, }, }, @@ -2997,7 +2997,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardRangeMap(ref common.ReferenceCa }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1RangeMapOptions"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1RangeMapOptions"}, } } @@ -3020,7 +3020,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardRegexMap(ref common.ReferenceCa SchemaProps: spec.SchemaProps{ Description: "Regular expression to match against and the result to apply when the value matches the regex", Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1RegexMapOptions"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1RegexMapOptions"), }, }, }, @@ -3028,7 +3028,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardRegexMap(ref common.ReferenceCa }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1RegexMapOptions"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1RegexMapOptions"}, } } @@ -3087,7 +3087,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardResponsiveGridLayoutItemKind(re "spec": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutItemSpec"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutItemSpec"), }, }, }, @@ -3095,7 +3095,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardResponsiveGridLayoutItemKind(re }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutItemSpec"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutItemSpec"}, } } @@ -3108,12 +3108,12 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardResponsiveGridLayoutItemSpec(re "element": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardElementReference"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardElementReference"), }, }, "repeat": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridRepeatOptions"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridRepeatOptions"), }, }, }, @@ -3121,7 +3121,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardResponsiveGridLayoutItemSpec(re }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardElementReference", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridRepeatOptions"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardElementReference", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridRepeatOptions"}, } } @@ -3141,7 +3141,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardResponsiveGridLayoutKind(ref co "spec": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutSpec"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutSpec"), }, }, }, @@ -3149,7 +3149,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardResponsiveGridLayoutKind(ref co }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutSpec"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutSpec"}, } } @@ -3180,7 +3180,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardResponsiveGridLayoutSpec(ref co Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutItemKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutItemKind"), }, }, }, @@ -3191,7 +3191,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardResponsiveGridLayoutSpec(ref co }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutItemKind"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutItemKind"}, } } @@ -3265,7 +3265,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardRowsLayoutKind(ref common.Refer "spec": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutSpec"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutSpec"), }, }, }, @@ -3273,7 +3273,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardRowsLayoutKind(ref common.Refer }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutSpec"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutSpec"}, } } @@ -3293,7 +3293,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardRowsLayoutRowKind(ref common.Re "spec": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutRowSpec"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutRowSpec"), }, }, }, @@ -3301,7 +3301,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardRowsLayoutRowKind(ref common.Re }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutRowSpec"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutRowSpec"}, } } @@ -3326,12 +3326,12 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardRowsLayoutRowSpec(ref common.Re }, "repeat": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardRowRepeatOptions"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowRepeatOptions"), }, }, "layout": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind"), }, }, }, @@ -3339,7 +3339,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardRowsLayoutRowSpec(ref common.Re }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardRowRepeatOptions"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowRepeatOptions"}, } } @@ -3356,7 +3356,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardRowsLayoutSpec(ref common.Refer Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutRowKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutRowKind"), }, }, }, @@ -3367,7 +3367,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardRowsLayoutSpec(ref common.Refer }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutRowKind"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutRowKind"}, } } @@ -3385,7 +3385,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardSpec(ref common.ReferenceCallba Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardAnnotationQueryKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAnnotationQueryKind"), }, }, }, @@ -3420,7 +3420,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardSpec(ref common.ReferenceCallba Allows: true, Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardPanelKindOrLibraryPanelKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardPanelKindOrLibraryPanelKind"), }, }, }, @@ -3428,7 +3428,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardSpec(ref common.ReferenceCallba }, "layout": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind"), }, }, "links": { @@ -3439,7 +3439,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardSpec(ref common.ReferenceCallba Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDashboardLink"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDashboardLink"), }, }, }, @@ -3485,7 +3485,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardSpec(ref common.ReferenceCallba "timeSettings": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardTimeSettingsSpec"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTimeSettingsSpec"), }, }, "title": { @@ -3503,7 +3503,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardSpec(ref common.ReferenceCallba Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind"), }, }, }, @@ -3514,7 +3514,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardSpec(ref common.ReferenceCallba }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardAnnotationQueryKind", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDashboardLink", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardPanelKindOrLibraryPanelKind", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardTimeSettingsSpec"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAnnotationQueryKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDashboardLink", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardPanelKindOrLibraryPanelKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTimeSettingsSpec"}, } } @@ -3536,7 +3536,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardSpecialValueMap(ref common.Refe "options": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1SpecialValueMapOptions"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1SpecialValueMapOptions"), }, }, }, @@ -3544,7 +3544,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardSpecialValueMap(ref common.Refe }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1SpecialValueMapOptions"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1SpecialValueMapOptions"}, } } @@ -3557,14 +3557,14 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardStatus(ref common.ReferenceCall "conversion": { SchemaProps: spec.SchemaProps{ Description: "Optional conversion status.", - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardConversionStatus"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConversionStatus"), }, }, }, }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardConversionStatus"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConversionStatus"}, } } @@ -3640,7 +3640,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardTabsLayoutKind(ref common.Refer "spec": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutSpec"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutSpec"), }, }, }, @@ -3648,7 +3648,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardTabsLayoutKind(ref common.Refer }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutSpec"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutSpec"}, } } @@ -3665,7 +3665,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardTabsLayoutSpec(ref common.Refer Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutTabKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutTabKind"), }, }, }, @@ -3676,7 +3676,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardTabsLayoutSpec(ref common.Refer }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutTabKind"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutTabKind"}, } } @@ -3696,7 +3696,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardTabsLayoutTabKind(ref common.Re "spec": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutTabSpec"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutTabSpec"), }, }, }, @@ -3704,7 +3704,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardTabsLayoutTabKind(ref common.Re }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutTabSpec"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutTabSpec"}, } } @@ -3722,7 +3722,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardTabsLayoutTabSpec(ref common.Re }, "layout": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind"), }, }, }, @@ -3730,7 +3730,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardTabsLayoutTabSpec(ref common.Re }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind"}, } } @@ -3751,7 +3751,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardTextVariableKind(ref common.Ref "spec": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardTextVariableSpec"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTextVariableSpec"), }, }, }, @@ -3759,7 +3759,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardTextVariableKind(ref common.Ref }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardTextVariableSpec"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTextVariableSpec"}, } } @@ -3780,7 +3780,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardTextVariableSpec(ref common.Ref "current": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"), }, }, "query": { @@ -3821,7 +3821,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardTextVariableSpec(ref common.Ref }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"}, } } @@ -3872,7 +3872,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardThresholdsConfig(ref common.Ref Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardThreshold"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardThreshold"), }, }, }, @@ -3883,7 +3883,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardThresholdsConfig(ref common.Ref }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardThreshold"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardThreshold"}, } } @@ -3982,7 +3982,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardTimeSettingsSpec(ref common.Ref Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardTimeRangeOption"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTimeRangeOption"), }, }, }, @@ -4023,7 +4023,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardTimeSettingsSpec(ref common.Ref }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardTimeRangeOption"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTimeRangeOption"}, } } @@ -4044,7 +4044,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardTransformationKind(ref common.R "spec": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDataTransformerConfig"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataTransformerConfig"), }, }, }, @@ -4052,7 +4052,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardTransformationKind(ref common.R }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDataTransformerConfig"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataTransformerConfig"}, } } @@ -4065,7 +4065,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardV2alpha1FieldConfigSourceOverri "matcher": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardMatcherConfig"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardMatcherConfig"), }, }, "properties": { @@ -4075,7 +4075,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardV2alpha1FieldConfigSourceOverri Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDynamicConfigValue"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDynamicConfigValue"), }, }, }, @@ -4086,7 +4086,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardV2alpha1FieldConfigSourceOverri }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardDynamicConfigValue", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardMatcherConfig"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDynamicConfigValue", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardMatcherConfig"}, } } @@ -4114,7 +4114,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardV2alpha1RangeMapOptions(ref com SchemaProps: spec.SchemaProps{ Description: "Config to apply when the value is within the range", Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardValueMappingResult"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardValueMappingResult"), }, }, }, @@ -4122,7 +4122,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardV2alpha1RangeMapOptions(ref com }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardValueMappingResult"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardValueMappingResult"}, } } @@ -4144,7 +4144,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardV2alpha1RegexMapOptions(ref com SchemaProps: spec.SchemaProps{ Description: "Config to apply when the value matches the regex", Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardValueMappingResult"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardValueMappingResult"), }, }, }, @@ -4152,7 +4152,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardV2alpha1RegexMapOptions(ref com }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardValueMappingResult"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardValueMappingResult"}, } } @@ -4174,7 +4174,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardV2alpha1SpecialValueMapOptions( SchemaProps: spec.SchemaProps{ Description: "Config to apply when the value matches the special value", Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardValueMappingResult"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardValueMappingResult"), }, }, }, @@ -4182,7 +4182,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardV2alpha1SpecialValueMapOptions( }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardValueMappingResult"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardValueMappingResult"}, } } @@ -4210,7 +4210,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardValueMap(ref common.ReferenceCa Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardValueMappingResult"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardValueMappingResult"), }, }, }, @@ -4221,7 +4221,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardValueMap(ref common.ReferenceCa }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardValueMappingResult"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardValueMappingResult"}, } } @@ -4233,29 +4233,29 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardValueMapOrRangeMapOrRegexMapOrS Properties: map[string]spec.Schema{ "ValueMap": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardValueMap"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardValueMap"), }, }, "RangeMap": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardRangeMap"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRangeMap"), }, }, "RegexMap": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardRegexMap"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRegexMap"), }, }, "SpecialValueMap": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardSpecialValueMap"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardSpecialValueMap"), }, }, }, }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardRangeMap", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardRegexMap", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardSpecialValueMap", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardValueMap"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRangeMap", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRegexMap", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardSpecialValueMap", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardValueMap"}, } } @@ -4317,13 +4317,13 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardVariableOption(ref common.Refer "text": { SchemaProps: spec.SchemaProps{ Description: "Text to be displayed for the option", - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardStringOrArrayOfString"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardStringOrArrayOfString"), }, }, "value": { SchemaProps: spec.SchemaProps{ Description: "Value of the option", - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardStringOrArrayOfString"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardStringOrArrayOfString"), }, }, }, @@ -4331,7 +4331,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardVariableOption(ref common.Refer }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardStringOrArrayOfString"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardStringOrArrayOfString"}, } } @@ -4418,7 +4418,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardVersionList(ref common.Referenc Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardVersionInfo"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVersionInfo"), }, }, }, @@ -4428,7 +4428,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardVersionList(ref common.Referenc }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardVersionInfo", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVersionInfo", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, } } @@ -4449,7 +4449,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardVizConfigKind(ref common.Refere "spec": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardVizConfigSpec"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVizConfigSpec"), }, }, }, @@ -4457,7 +4457,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardVizConfigKind(ref common.Refere }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardVizConfigSpec"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVizConfigSpec"}, } } @@ -4492,7 +4492,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardVizConfigSpec(ref common.Refere "fieldConfig": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardFieldConfigSource"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardFieldConfigSource"), }, }, }, @@ -4500,7 +4500,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardVizConfigSpec(ref common.Refere }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardFieldConfigSource"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardFieldConfigSource"}, } } @@ -4535,19 +4535,19 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardWithAccessInfo(ref common.Refer SchemaProps: spec.SchemaProps{ Description: "Spec is the spec of the Dashboard", Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardSpec"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardSpec"), }, }, "status": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardStatus"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardStatus"), }, }, "access": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardAccess"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAccess"), }, }, }, @@ -4555,7 +4555,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardWithAccessInfo(ref common.Refer }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardAccess", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardSpec", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.DashboardStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAccess", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardSpec", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, } } @@ -4590,13 +4590,13 @@ func schema_pkg_apis_dashboard_v2alpha1_LibraryPanel(ref common.ReferenceCallbac SchemaProps: spec.SchemaProps{ Description: "Panel properties", Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.LibraryPanelSpec"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.LibraryPanelSpec"), }, }, "status": { SchemaProps: spec.SchemaProps{ Description: "Status will show errors", - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.LibraryPanelStatus"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.LibraryPanelStatus"), }, }, }, @@ -4604,7 +4604,7 @@ func schema_pkg_apis_dashboard_v2alpha1_LibraryPanel(ref common.ReferenceCallbac }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.LibraryPanelSpec", "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.LibraryPanelStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.LibraryPanelSpec", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.LibraryPanelStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, } } @@ -4641,7 +4641,7 @@ func schema_pkg_apis_dashboard_v2alpha1_LibraryPanelList(ref common.ReferenceCal Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.LibraryPanel"), + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.LibraryPanel"), }, }, }, @@ -4651,7 +4651,7 @@ func schema_pkg_apis_dashboard_v2alpha1_LibraryPanelList(ref common.ReferenceCal }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1.LibraryPanel", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.LibraryPanel", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, } } diff --git a/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi_violation_exceptions.list b/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi_violation_exceptions.list new file mode 100644 index 00000000000..66ecc8175bb --- /dev/null +++ b/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi_violation_exceptions.list @@ -0,0 +1,65 @@ +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardAdHocFilterWithLabels,ValueLabels +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardAdHocFilterWithLabels,Values +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardAdhocVariableSpec,BaseFilters +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardAdhocVariableSpec,DefaultKeys +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardAdhocVariableSpec,Filters +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardCustomVariableSpec,Options +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardDashboardLink,Tags +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardDatasourceVariableSpec,Options +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardFieldConfig,Links +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardFieldConfig,Mappings +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardFieldConfigSource,Overrides +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutRowSpec,Elements +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutSpec,Items +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGroupByVariableSpec,Options +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardIntervalVariableSpec,Options +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardMetadata,Finalizers +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardPanelSpec,Links +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardQueryGroupSpec,Queries +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardQueryGroupSpec,Transformations +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardQueryVariableSpec,Options +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardResponsiveGridLayoutSpec,Items +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardRowsLayoutSpec,Rows +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardSpec,Annotations +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardSpec,Links +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardSpec,Tags +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardSpec,Variables +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardStringOrArrayOfString,ArrayOfString +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardTabsLayoutSpec,Tabs +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardThresholdsConfig,Steps +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardTimeSettingsSpec,AutoRefreshIntervals +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardTimeSettingsSpec,QuickRanges +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardV2alpha1FieldConfigSourceOverrides,Properties +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,LibraryPanelStatus,Warnings +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutItemKindOrGridLayoutRowKind,GridLayoutItemKind +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutItemKindOrGridLayoutRowKind,GridLayoutRowKind +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind,GridLayoutKind +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind,ResponsiveGridLayoutKind +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind,TabsLayoutKind +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind,GridLayoutKind +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind,ResponsiveGridLayoutKind +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind,RowsLayoutKind +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind,GridLayoutKind +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind,ResponsiveGridLayoutKind +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind,RowsLayoutKind +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind,TabsLayoutKind +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardIntervalVariableSpec,AutoCount +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardIntervalVariableSpec,AutoMin +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardPanelKindOrLibraryPanelKind,LibraryPanelKind +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardPanelKindOrLibraryPanelKind,PanelKind +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind,AdhocVariableKind +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind,ConstantVariableKind +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind,CustomVariableKind +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind,DatasourceVariableKind +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind,GroupByVariableKind +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind,IntervalVariableKind +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind,QueryVariableKind +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind,TextVariableKind +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardStringOrArrayOfString,ArrayOfString +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardStringOrArrayOfString,String +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardStringOrFloat64,Float64 +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardStringOrFloat64,String +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap,RangeMap +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap,RegexMap +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap,SpecialValueMap +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap,ValueMap diff --git a/pkg/apis/dashboard_manifest.go b/apps/dashboard/pkg/apis/dashboard_manifest.go similarity index 99% rename from pkg/apis/dashboard_manifest.go rename to apps/dashboard/pkg/apis/dashboard_manifest.go index 9980594ef44..bc68fa86ca6 100644 --- a/pkg/apis/dashboard_manifest.go +++ b/apps/dashboard/pkg/apis/dashboard_manifest.go @@ -11,6 +11,8 @@ import ( "github.com/grafana/grafana-app-sdk/app" ) +var () + var appManifestData = app.ManifestData{ AppName: "dashboard", Group: "dashboard.grafana.app", diff --git a/apps/dashboard/pkg/migration/conversion/conversion.go b/apps/dashboard/pkg/migration/conversion/conversion.go new file mode 100644 index 00000000000..7058230eba2 --- /dev/null +++ b/apps/dashboard/pkg/migration/conversion/conversion.go @@ -0,0 +1,173 @@ +package conversion + +import ( + "k8s.io/apimachinery/pkg/conversion" + "k8s.io/apimachinery/pkg/runtime" + + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1" + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1" + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1" + "github.com/grafana/grafana/apps/dashboard/pkg/migration" + "github.com/grafana/grafana/apps/dashboard/pkg/migration/schemaversion" +) + +func RegisterConversions(s *runtime.Scheme) error { + if err := s.AddConversionFunc((*v0alpha1.Dashboard)(nil), (*v1alpha1.Dashboard)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_V0_to_V1(a.(*v0alpha1.Dashboard), b.(*v1alpha1.Dashboard), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*v0alpha1.Dashboard)(nil), (*v2alpha1.Dashboard)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_V0_to_V2(a.(*v0alpha1.Dashboard), b.(*v2alpha1.Dashboard), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*v1alpha1.Dashboard)(nil), (*v0alpha1.Dashboard)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_V1_to_V0(a.(*v1alpha1.Dashboard), b.(*v0alpha1.Dashboard), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*v1alpha1.Dashboard)(nil), (*v2alpha1.Dashboard)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_V1_to_V2(a.(*v1alpha1.Dashboard), b.(*v2alpha1.Dashboard), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*v2alpha1.Dashboard)(nil), (*v0alpha1.Dashboard)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_V2_to_V0(a.(*v2alpha1.Dashboard), b.(*v0alpha1.Dashboard), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*v2alpha1.Dashboard)(nil), (*v1alpha1.Dashboard)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_V2_to_V1(a.(*v2alpha1.Dashboard), b.(*v1alpha1.Dashboard), scope) + }); err != nil { + return err + } + return nil +} + +func Convert_V0_to_V1(in *v0alpha1.Dashboard, out *v1alpha1.Dashboard, scope conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + + out.Spec.Object = in.Spec.Object + + out.Status = v1alpha1.DashboardStatus{ + Conversion: &v1alpha1.DashboardConversionStatus{ + StoredVersion: v0alpha1.VERSION, + }, + } + + if err := migration.Migrate(out.Spec.Object, schemaversion.LATEST_VERSION); err != nil { + out.Status.Conversion.Failed = true + out.Status.Conversion.Error = err.Error() + } + + return nil +} + +func Convert_V0_to_V2(in *v0alpha1.Dashboard, out *v2alpha1.Dashboard, scope conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + + // TODO (@radiohead): implement V0 to V2 conversion + // This is the bare minimum conversion that is needed to make the dashboard servable. + + if v, ok := in.Spec.Object["title"]; ok { + if title, ok := v.(string); ok { + out.Spec.Title = title + } + } + + // We need to make sure the layout is set to some value, otherwise the JSON marshaling will fail. + out.Spec.Layout = v2alpha1.DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind{ + GridLayoutKind: &v2alpha1.DashboardGridLayoutKind{ + Kind: "GridLayout", + Spec: v2alpha1.DashboardGridLayoutSpec{}, + }, + } + + out.Status = v2alpha1.DashboardStatus{ + Conversion: &v2alpha1.DashboardConversionStatus{ + StoredVersion: v0alpha1.VERSION, + Failed: true, + Error: "backend conversion not yet implemented", + }, + } + + return nil +} + +func Convert_V1_to_V0(in *v1alpha1.Dashboard, out *v0alpha1.Dashboard, scope conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + + out.Spec.Object = in.Spec.Object + + out.Status = v0alpha1.DashboardStatus{ + Conversion: &v0alpha1.DashboardConversionStatus{ + StoredVersion: v1alpha1.VERSION, + }, + } + + return nil +} + +func Convert_V1_to_V2(in *v1alpha1.Dashboard, out *v2alpha1.Dashboard, scope conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + + // TODO (@radiohead): implement V1 to V2 conversion + // This is the bare minimum conversion that is needed to make the dashboard servable. + + if v, ok := in.Spec.Object["title"]; ok { + if title, ok := v.(string); ok { + out.Spec.Title = title + } + } + + // We need to make sure the layout is set to some value, otherwise the JSON marshaling will fail. + out.Spec.Layout = v2alpha1.DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind{ + GridLayoutKind: &v2alpha1.DashboardGridLayoutKind{ + Kind: "GridLayout", + Spec: v2alpha1.DashboardGridLayoutSpec{}, + }, + } + + out.Status = v2alpha1.DashboardStatus{ + Conversion: &v2alpha1.DashboardConversionStatus{ + StoredVersion: v1alpha1.VERSION, + Failed: true, + Error: "backend conversion not yet implemented", + }, + } + + return nil +} + +func Convert_V2_to_V0(in *v2alpha1.Dashboard, out *v0alpha1.Dashboard, scope conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + + // TODO: implement V2 to V0 conversion + + out.Status = v0alpha1.DashboardStatus{ + Conversion: &v0alpha1.DashboardConversionStatus{ + StoredVersion: v2alpha1.VERSION, + Failed: true, + Error: "backend conversion not yet implemented", + }, + } + + return nil +} + +func Convert_V2_to_V1(in *v2alpha1.Dashboard, out *v1alpha1.Dashboard, scope conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + + // TODO: implement V2 to V1 conversion + + out.Status = v1alpha1.DashboardStatus{ + Conversion: &v1alpha1.DashboardConversionStatus{ + StoredVersion: v2alpha1.VERSION, + Failed: true, + Error: "backend conversion not yet implemented", + }, + } + + return nil +} diff --git a/pkg/apis/dashboard/migration/conversion/conversion_test.go b/apps/dashboard/pkg/migration/conversion/conversion_test.go similarity index 60% rename from pkg/apis/dashboard/migration/conversion/conversion_test.go rename to apps/dashboard/pkg/migration/conversion/conversion_test.go index cddf508e9a3..23cbd9fc2ba 100644 --- a/pkg/apis/dashboard/migration/conversion/conversion_test.go +++ b/apps/dashboard/pkg/migration/conversion/conversion_test.go @@ -9,18 +9,18 @@ import ( v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" - "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1" + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1" + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1" + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1" + common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1" "github.com/grafana/grafana/pkg/apimachinery/utils" - dashboardV0 "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1" - dashboardV1 "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1" - dashboardV2 "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1" ) func TestConversionMatrixExist(t *testing.T) { versions := []v1.Object{ - &dashboardV0.Dashboard{Spec: v0alpha1.Unstructured{Object: map[string]any{"title": "dashboardV0"}}}, - &dashboardV1.Dashboard{Spec: v0alpha1.Unstructured{Object: map[string]any{"title": "dashboardV1"}}}, - &dashboardV2.Dashboard{Spec: dashboardV2.DashboardSpec{Title: "dashboardV2"}}, + &v0alpha1.Dashboard{Spec: common.Unstructured{Object: map[string]any{"title": "dashboardV0"}}}, + &v1alpha1.Dashboard{Spec: common.Unstructured{Object: map[string]any{"title": "dashboardV1"}}}, + &v2alpha1.Dashboard{Spec: v2alpha1.DashboardSpec{Title: "dashboardV2"}}, } scheme := runtime.NewScheme() diff --git a/pkg/apis/dashboard/migration/migrate.go b/apps/dashboard/pkg/migration/migrate.go similarity index 92% rename from pkg/apis/dashboard/migration/migrate.go rename to apps/dashboard/pkg/migration/migrate.go index 2a419596767..38def79b465 100644 --- a/pkg/apis/dashboard/migration/migrate.go +++ b/apps/dashboard/pkg/migration/migrate.go @@ -1,6 +1,6 @@ package migration -import "github.com/grafana/grafana/pkg/apis/dashboard/migration/schemaversion" +import "github.com/grafana/grafana/apps/dashboard/pkg/migration/schemaversion" func Migrate(dash map[string]interface{}, targetVersion int) error { if dash == nil { diff --git a/pkg/apis/dashboard/migration/migrate_test.go b/apps/dashboard/pkg/migration/migrate_test.go similarity index 96% rename from pkg/apis/dashboard/migration/migrate_test.go rename to apps/dashboard/pkg/migration/migrate_test.go index e037c37f00f..bc4080d43d3 100644 --- a/pkg/apis/dashboard/migration/migrate_test.go +++ b/apps/dashboard/pkg/migration/migrate_test.go @@ -11,8 +11,8 @@ import ( "github.com/stretchr/testify/require" - "github.com/grafana/grafana/pkg/apis/dashboard/migration" - "github.com/grafana/grafana/pkg/apis/dashboard/migration/schemaversion" + "github.com/grafana/grafana/apps/dashboard/pkg/migration" + "github.com/grafana/grafana/apps/dashboard/pkg/migration/schemaversion" ) const INPUT_DIR = "testdata/input" diff --git a/pkg/apis/dashboard/migration/schemaversion/errors.go b/apps/dashboard/pkg/migration/schemaversion/errors.go similarity index 100% rename from pkg/apis/dashboard/migration/schemaversion/errors.go rename to apps/dashboard/pkg/migration/schemaversion/errors.go diff --git a/pkg/apis/dashboard/migration/schemaversion/migrations.go b/apps/dashboard/pkg/migration/schemaversion/migrations.go similarity index 100% rename from pkg/apis/dashboard/migration/schemaversion/migrations.go rename to apps/dashboard/pkg/migration/schemaversion/migrations.go diff --git a/pkg/apis/dashboard/migration/schemaversion/migrations_test.go b/apps/dashboard/pkg/migration/schemaversion/migrations_test.go similarity index 95% rename from pkg/apis/dashboard/migration/schemaversion/migrations_test.go rename to apps/dashboard/pkg/migration/schemaversion/migrations_test.go index b20f7e4f561..02918b7b8fa 100644 --- a/pkg/apis/dashboard/migration/schemaversion/migrations_test.go +++ b/apps/dashboard/pkg/migration/schemaversion/migrations_test.go @@ -3,7 +3,7 @@ package schemaversion_test import ( "testing" - "github.com/grafana/grafana/pkg/apis/dashboard/migration/schemaversion" + "github.com/grafana/grafana/apps/dashboard/pkg/migration/schemaversion" "github.com/stretchr/testify/require" ) diff --git a/pkg/apis/dashboard/migration/schemaversion/v37.go b/apps/dashboard/pkg/migration/schemaversion/v37.go similarity index 100% rename from pkg/apis/dashboard/migration/schemaversion/v37.go rename to apps/dashboard/pkg/migration/schemaversion/v37.go diff --git a/pkg/apis/dashboard/migration/schemaversion/v37_test.go b/apps/dashboard/pkg/migration/schemaversion/v37_test.go similarity index 98% rename from pkg/apis/dashboard/migration/schemaversion/v37_test.go rename to apps/dashboard/pkg/migration/schemaversion/v37_test.go index e0b2f4c27cb..71bafee584c 100644 --- a/pkg/apis/dashboard/migration/schemaversion/v37_test.go +++ b/apps/dashboard/pkg/migration/schemaversion/v37_test.go @@ -3,7 +3,7 @@ package schemaversion_test import ( "testing" - "github.com/grafana/grafana/pkg/apis/dashboard/migration/schemaversion" + "github.com/grafana/grafana/apps/dashboard/pkg/migration/schemaversion" ) func TestV37(t *testing.T) { diff --git a/pkg/apis/dashboard/migration/schemaversion/v38.go b/apps/dashboard/pkg/migration/schemaversion/v38.go similarity index 100% rename from pkg/apis/dashboard/migration/schemaversion/v38.go rename to apps/dashboard/pkg/migration/schemaversion/v38.go diff --git a/pkg/apis/dashboard/migration/schemaversion/v38_test.go b/apps/dashboard/pkg/migration/schemaversion/v38_test.go similarity index 98% rename from pkg/apis/dashboard/migration/schemaversion/v38_test.go rename to apps/dashboard/pkg/migration/schemaversion/v38_test.go index f4bbb8c9cb6..9725fd3af66 100644 --- a/pkg/apis/dashboard/migration/schemaversion/v38_test.go +++ b/apps/dashboard/pkg/migration/schemaversion/v38_test.go @@ -3,7 +3,7 @@ package schemaversion_test import ( "testing" - "github.com/grafana/grafana/pkg/apis/dashboard/migration/schemaversion" + "github.com/grafana/grafana/apps/dashboard/pkg/migration/schemaversion" ) func TestV38(t *testing.T) { diff --git a/pkg/apis/dashboard/migration/schemaversion/v39.go b/apps/dashboard/pkg/migration/schemaversion/v39.go similarity index 100% rename from pkg/apis/dashboard/migration/schemaversion/v39.go rename to apps/dashboard/pkg/migration/schemaversion/v39.go diff --git a/pkg/apis/dashboard/migration/schemaversion/v39_test.go b/apps/dashboard/pkg/migration/schemaversion/v39_test.go similarity index 97% rename from pkg/apis/dashboard/migration/schemaversion/v39_test.go rename to apps/dashboard/pkg/migration/schemaversion/v39_test.go index d204d31f0cf..2eab71718cc 100644 --- a/pkg/apis/dashboard/migration/schemaversion/v39_test.go +++ b/apps/dashboard/pkg/migration/schemaversion/v39_test.go @@ -3,7 +3,7 @@ package schemaversion_test import ( "testing" - "github.com/grafana/grafana/pkg/apis/dashboard/migration/schemaversion" + "github.com/grafana/grafana/apps/dashboard/pkg/migration/schemaversion" ) func TestV39(t *testing.T) { diff --git a/pkg/apis/dashboard/migration/schemaversion/v40.go b/apps/dashboard/pkg/migration/schemaversion/v40.go similarity index 100% rename from pkg/apis/dashboard/migration/schemaversion/v40.go rename to apps/dashboard/pkg/migration/schemaversion/v40.go diff --git a/pkg/apis/dashboard/migration/schemaversion/v40_test.go b/apps/dashboard/pkg/migration/schemaversion/v40_test.go similarity index 94% rename from pkg/apis/dashboard/migration/schemaversion/v40_test.go rename to apps/dashboard/pkg/migration/schemaversion/v40_test.go index 179a2fbf655..041ac473f5d 100644 --- a/pkg/apis/dashboard/migration/schemaversion/v40_test.go +++ b/apps/dashboard/pkg/migration/schemaversion/v40_test.go @@ -3,7 +3,7 @@ package schemaversion_test import ( "testing" - "github.com/grafana/grafana/pkg/apis/dashboard/migration/schemaversion" + "github.com/grafana/grafana/apps/dashboard/pkg/migration/schemaversion" ) func TestV40(t *testing.T) { diff --git a/pkg/apis/dashboard/migration/schemaversion/v41.go b/apps/dashboard/pkg/migration/schemaversion/v41.go similarity index 100% rename from pkg/apis/dashboard/migration/schemaversion/v41.go rename to apps/dashboard/pkg/migration/schemaversion/v41.go diff --git a/pkg/apis/dashboard/migration/schemaversion/v41_test.go b/apps/dashboard/pkg/migration/schemaversion/v41_test.go similarity index 92% rename from pkg/apis/dashboard/migration/schemaversion/v41_test.go rename to apps/dashboard/pkg/migration/schemaversion/v41_test.go index d0f11d227f3..642d6ed41a3 100644 --- a/pkg/apis/dashboard/migration/schemaversion/v41_test.go +++ b/apps/dashboard/pkg/migration/schemaversion/v41_test.go @@ -3,7 +3,7 @@ package schemaversion_test import ( "testing" - "github.com/grafana/grafana/pkg/apis/dashboard/migration/schemaversion" + "github.com/grafana/grafana/apps/dashboard/pkg/migration/schemaversion" ) func TestV41(t *testing.T) { diff --git a/pkg/apis/dashboard/migration/testdata/input/36.legend_normalization.json b/apps/dashboard/pkg/migration/testdata/input/36.legend_normalization.json similarity index 100% rename from pkg/apis/dashboard/migration/testdata/input/36.legend_normalization.json rename to apps/dashboard/pkg/migration/testdata/input/36.legend_normalization.json diff --git a/pkg/apis/dashboard/migration/testdata/input/37.timeseries_table_display_mode.json b/apps/dashboard/pkg/migration/testdata/input/37.timeseries_table_display_mode.json similarity index 100% rename from pkg/apis/dashboard/migration/testdata/input/37.timeseries_table_display_mode.json rename to apps/dashboard/pkg/migration/testdata/input/37.timeseries_table_display_mode.json diff --git a/pkg/apis/dashboard/migration/testdata/input/38.transform_timeseries_table.json b/apps/dashboard/pkg/migration/testdata/input/38.transform_timeseries_table.json similarity index 100% rename from pkg/apis/dashboard/migration/testdata/input/38.transform_timeseries_table.json rename to apps/dashboard/pkg/migration/testdata/input/38.transform_timeseries_table.json diff --git a/pkg/apis/dashboard/migration/testdata/input/39.refresh_true.json b/apps/dashboard/pkg/migration/testdata/input/39.refresh_true.json similarity index 100% rename from pkg/apis/dashboard/migration/testdata/input/39.refresh_true.json rename to apps/dashboard/pkg/migration/testdata/input/39.refresh_true.json diff --git a/pkg/apis/dashboard/migration/testdata/input/40.time_picker_time_options.json b/apps/dashboard/pkg/migration/testdata/input/40.time_picker_time_options.json similarity index 100% rename from pkg/apis/dashboard/migration/testdata/input/40.time_picker_time_options.json rename to apps/dashboard/pkg/migration/testdata/input/40.time_picker_time_options.json diff --git a/pkg/apis/dashboard/migration/testdata/output/36.legend_normalization.37.json b/apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.37.json similarity index 100% rename from pkg/apis/dashboard/migration/testdata/output/36.legend_normalization.37.json rename to apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.37.json diff --git a/pkg/apis/dashboard/migration/testdata/output/36.legend_normalization.38.json b/apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.38.json similarity index 100% rename from pkg/apis/dashboard/migration/testdata/output/36.legend_normalization.38.json rename to apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.38.json diff --git a/pkg/apis/dashboard/migration/testdata/output/36.legend_normalization.39.json b/apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.39.json similarity index 100% rename from pkg/apis/dashboard/migration/testdata/output/36.legend_normalization.39.json rename to apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.39.json diff --git a/pkg/apis/dashboard/migration/testdata/output/36.legend_normalization.40.json b/apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.40.json similarity index 100% rename from pkg/apis/dashboard/migration/testdata/output/36.legend_normalization.40.json rename to apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.40.json diff --git a/pkg/apis/dashboard/migration/testdata/output/36.legend_normalization.41.json b/apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.41.json similarity index 100% rename from pkg/apis/dashboard/migration/testdata/output/36.legend_normalization.41.json rename to apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.41.json diff --git a/pkg/apis/dashboard/migration/testdata/output/37.timeseries_table_display_mode.38.json b/apps/dashboard/pkg/migration/testdata/output/37.timeseries_table_display_mode.38.json similarity index 100% rename from pkg/apis/dashboard/migration/testdata/output/37.timeseries_table_display_mode.38.json rename to apps/dashboard/pkg/migration/testdata/output/37.timeseries_table_display_mode.38.json diff --git a/pkg/apis/dashboard/migration/testdata/output/37.timeseries_table_display_mode.39.json b/apps/dashboard/pkg/migration/testdata/output/37.timeseries_table_display_mode.39.json similarity index 100% rename from pkg/apis/dashboard/migration/testdata/output/37.timeseries_table_display_mode.39.json rename to apps/dashboard/pkg/migration/testdata/output/37.timeseries_table_display_mode.39.json diff --git a/pkg/apis/dashboard/migration/testdata/output/37.timeseries_table_display_mode.40.json b/apps/dashboard/pkg/migration/testdata/output/37.timeseries_table_display_mode.40.json similarity index 100% rename from pkg/apis/dashboard/migration/testdata/output/37.timeseries_table_display_mode.40.json rename to apps/dashboard/pkg/migration/testdata/output/37.timeseries_table_display_mode.40.json diff --git a/pkg/apis/dashboard/migration/testdata/output/37.timeseries_table_display_mode.41.json b/apps/dashboard/pkg/migration/testdata/output/37.timeseries_table_display_mode.41.json similarity index 100% rename from pkg/apis/dashboard/migration/testdata/output/37.timeseries_table_display_mode.41.json rename to apps/dashboard/pkg/migration/testdata/output/37.timeseries_table_display_mode.41.json diff --git a/pkg/apis/dashboard/migration/testdata/output/38.transform_timeseries_table.39.json b/apps/dashboard/pkg/migration/testdata/output/38.transform_timeseries_table.39.json similarity index 100% rename from pkg/apis/dashboard/migration/testdata/output/38.transform_timeseries_table.39.json rename to apps/dashboard/pkg/migration/testdata/output/38.transform_timeseries_table.39.json diff --git a/pkg/apis/dashboard/migration/testdata/output/38.transform_timeseries_table.40.json b/apps/dashboard/pkg/migration/testdata/output/38.transform_timeseries_table.40.json similarity index 100% rename from pkg/apis/dashboard/migration/testdata/output/38.transform_timeseries_table.40.json rename to apps/dashboard/pkg/migration/testdata/output/38.transform_timeseries_table.40.json diff --git a/pkg/apis/dashboard/migration/testdata/output/38.transform_timeseries_table.41.json b/apps/dashboard/pkg/migration/testdata/output/38.transform_timeseries_table.41.json similarity index 100% rename from pkg/apis/dashboard/migration/testdata/output/38.transform_timeseries_table.41.json rename to apps/dashboard/pkg/migration/testdata/output/38.transform_timeseries_table.41.json diff --git a/pkg/apis/dashboard/migration/testdata/output/39.refresh_true.40.json b/apps/dashboard/pkg/migration/testdata/output/39.refresh_true.40.json similarity index 100% rename from pkg/apis/dashboard/migration/testdata/output/39.refresh_true.40.json rename to apps/dashboard/pkg/migration/testdata/output/39.refresh_true.40.json diff --git a/pkg/apis/dashboard/migration/testdata/output/39.refresh_true.41.json b/apps/dashboard/pkg/migration/testdata/output/39.refresh_true.41.json similarity index 100% rename from pkg/apis/dashboard/migration/testdata/output/39.refresh_true.41.json rename to apps/dashboard/pkg/migration/testdata/output/39.refresh_true.41.json diff --git a/pkg/apis/dashboard/migration/testdata/output/40.time_picker_time_options.41.json b/apps/dashboard/pkg/migration/testdata/output/40.time_picker_time_options.41.json similarity index 100% rename from pkg/apis/dashboard/migration/testdata/output/40.time_picker_time_options.41.json rename to apps/dashboard/pkg/migration/testdata/output/40.time_picker_time_options.41.json diff --git a/go.work b/go.work index 2d53f72c4df..ba234711baf 100644 --- a/go.work +++ b/go.work @@ -7,6 +7,7 @@ use ( . // skip:golangci-lint ./apps/advisor ./apps/alerting/notifications + ./apps/dashboard ./apps/investigations ./apps/playlist ./pkg/aggregator diff --git a/go.work.sum b/go.work.sum index 5a25a1d8f71..2062d7330a6 100644 --- a/go.work.sum +++ b/go.work.sum @@ -775,6 +775,7 @@ github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6 github.com/elastic/go-windows v1.0.1 h1:AlYZOldA+UJ0/2nBuqWdo90GFCgG9xuyw9SYzGUtJm0= github.com/elastic/go-windows v1.0.1/go.mod h1:FoVvqWSun28vaDQPbj2Elfc0JahhPB7WQEGa3c814Ss= github.com/elazarl/goproxy v1.3.0/go.mod h1:X/5W/t+gzDyLfHW4DrMdpjqYjpXsURlBt9lpBDxZZZQ= +github.com/elazarl/goproxy v1.7.1/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633 h1:H2pdYOb3KQ1/YsqVWoWNLQO+fusocsw354rqGTZtAgw= github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= @@ -906,6 +907,7 @@ github.com/grafana/cog v0.0.23/go.mod h1:jrS9indvWuDs60RHEZpLaAkmZdgyoLKMOEUT0ji github.com/grafana/go-gelf/v2 v2.0.1 h1:BOChP0h/jLeD+7F9mL7tq10xVkDG15he3T1zHuQaWak= github.com/grafana/go-gelf/v2 v2.0.1/go.mod h1:lexHie0xzYGwCgiRGcvZ723bSNyNI8ZRD4s0CLobh90= github.com/grafana/grafana-plugin-sdk-go v0.263.0/go.mod h1:U43Cnrj/9DNYyvFcNdeUWNjMXTKNB0jcTcQGpWKd2gw= +github.com/grafana/grafana-plugin-sdk-go v0.267.0/go.mod h1:OuwS4c/JYgn0rr/w5zhJBpLo4gKm/vw15RsfpYAvK9Q= github.com/grafana/grafana/apps/advisor v0.0.0-20250123151950-b066a6313173/go.mod h1:goSDiy3jtC2cp8wjpPZdUHRENcoSUHae1/Px/MDfddA= github.com/grafana/grafana/apps/advisor v0.0.0-20250220154326-6e5de80ef295/go.mod h1:9I1dKV3Dqr0NPR9Af0WJGxOytp5/6W3JLiNChOz8r+c= github.com/grafana/grafana/apps/alerting/notifications v0.0.0-20250121113133-e747350fee2d/go.mod h1:AvleS6icyPmcBjihtx5jYEvdzLmHGBp66NuE0AMR57A= @@ -1361,10 +1363,12 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.5 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0/go.mod h1:HDBUsEjOuRC0EzKZ1bSaRGZWUBAzo+MhAcUUORSr4D0= go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.58.0/go.mod h1:uosvgpqTcTXtcPQORTbEkZNDQTCDOgTz1fe6aLSyqrQ= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.59.0/go.mod h1:54CaSNqYEXvpzDh8KPjiMVoWm60t5R0dZRt0leEPgAs= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0/go.mod h1:umTcuxiv1n/s/S6/c2AT/g2CQ7u5C59sHDNmfSwgz7Q= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I= go.opentelemetry.io/contrib/propagators/b3 v1.27.0 h1:IjgxbomVrV9za6bRi8fWCNXENs0co37SZedQilP2hm0= go.opentelemetry.io/contrib/propagators/b3 v1.27.0/go.mod h1:Dv9obQz25lCisDvvs4dy28UPh974CxkahRDUPsY7y9E= go.opentelemetry.io/contrib/propagators/jaeger v1.33.0/go.mod h1:ku/EpGk44S5lyVMbtJRK2KFOnXEehxf6SDnhu1eZmjA= diff --git a/hack/update-codegen.sh b/hack/update-codegen.sh index 57841bbbeb2..661a588ca62 100755 --- a/hack/update-codegen.sh +++ b/hack/update-codegen.sh @@ -86,6 +86,7 @@ grafana:codegen:lsdirs() { grafana::codegen:run pkg grafana::codegen:run pkg/apimachinery grafana::codegen:run pkg/aggregator +grafana::codegen:run apps/dashboard/pkg if [ -d "pkg/extensions/apis" ]; then grafana::codegen:run pkg/extensions diff --git a/pkg/api/dashboard.go b/pkg/api/dashboard.go index 532e79c766c..c1c61753676 100644 --- a/pkg/api/dashboard.go +++ b/pkg/api/dashboard.go @@ -12,11 +12,11 @@ import ( "strings" claims "github.com/grafana/authlib/types" + dashboardsV0 "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1" "github.com/grafana/grafana/pkg/api/apierrors" "github.com/grafana/grafana/pkg/api/dtos" "github.com/grafana/grafana/pkg/api/response" "github.com/grafana/grafana/pkg/apimachinery/identity" - dashboardsV0 "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1" "github.com/grafana/grafana/pkg/components/dashdiffs" "github.com/grafana/grafana/pkg/components/simplejson" "github.com/grafana/grafana/pkg/infra/metrics" diff --git a/pkg/api/dtos/dashboard.go b/pkg/api/dtos/dashboard.go index 58d7b47cead..8bda1591b8b 100644 --- a/pkg/api/dtos/dashboard.go +++ b/pkg/api/dtos/dashboard.go @@ -3,7 +3,7 @@ package dtos import ( "time" - dashboardsV0 "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1" + dashboardsV0 "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1" "github.com/grafana/grafana/pkg/components/simplejson" ) diff --git a/pkg/apis/dashboard/migration/conversion/conversion.go b/pkg/apis/dashboard/migration/conversion/conversion.go deleted file mode 100644 index 830353ce1f2..00000000000 --- a/pkg/apis/dashboard/migration/conversion/conversion.go +++ /dev/null @@ -1,173 +0,0 @@ -package conversion - -import ( - "k8s.io/apimachinery/pkg/conversion" - "k8s.io/apimachinery/pkg/runtime" - - "github.com/grafana/grafana/pkg/apis/dashboard/migration" - "github.com/grafana/grafana/pkg/apis/dashboard/migration/schemaversion" - dashboardV0 "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1" - dashboardV1 "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1" - dashboardV2 "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1" -) - -func RegisterConversions(s *runtime.Scheme) error { - if err := s.AddConversionFunc((*dashboardV0.Dashboard)(nil), (*dashboardV1.Dashboard)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_V0_to_V1(a.(*dashboardV0.Dashboard), b.(*dashboardV1.Dashboard), scope) - }); err != nil { - return err - } - if err := s.AddConversionFunc((*dashboardV0.Dashboard)(nil), (*dashboardV2.Dashboard)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_V0_to_V2(a.(*dashboardV0.Dashboard), b.(*dashboardV2.Dashboard), scope) - }); err != nil { - return err - } - if err := s.AddConversionFunc((*dashboardV1.Dashboard)(nil), (*dashboardV0.Dashboard)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_V1_to_V0(a.(*dashboardV1.Dashboard), b.(*dashboardV0.Dashboard), scope) - }); err != nil { - return err - } - if err := s.AddConversionFunc((*dashboardV1.Dashboard)(nil), (*dashboardV2.Dashboard)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_V1_to_V2(a.(*dashboardV1.Dashboard), b.(*dashboardV2.Dashboard), scope) - }); err != nil { - return err - } - if err := s.AddConversionFunc((*dashboardV2.Dashboard)(nil), (*dashboardV0.Dashboard)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_V2_to_V0(a.(*dashboardV2.Dashboard), b.(*dashboardV0.Dashboard), scope) - }); err != nil { - return err - } - if err := s.AddConversionFunc((*dashboardV2.Dashboard)(nil), (*dashboardV1.Dashboard)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_V2_to_V1(a.(*dashboardV2.Dashboard), b.(*dashboardV1.Dashboard), scope) - }); err != nil { - return err - } - return nil -} - -func Convert_V0_to_V1(in *dashboardV0.Dashboard, out *dashboardV1.Dashboard, scope conversion.Scope) error { - out.ObjectMeta = in.ObjectMeta - - out.Spec.Object = in.Spec.Object - - out.Status = dashboardV1.DashboardStatus{ - Conversion: &dashboardV1.DashboardConversionStatus{ - StoredVersion: dashboardV0.VERSION, - }, - } - - if err := migration.Migrate(out.Spec.Object, schemaversion.LATEST_VERSION); err != nil { - out.Status.Conversion.Failed = true - out.Status.Conversion.Error = err.Error() - } - - return nil -} - -func Convert_V0_to_V2(in *dashboardV0.Dashboard, out *dashboardV2.Dashboard, scope conversion.Scope) error { - out.ObjectMeta = in.ObjectMeta - - // TODO (@radiohead): implement V0 to V2 conversion - // This is the bare minimum conversion that is needed to make the dashboard servable. - - if v, ok := in.Spec.Object["title"]; ok { - if title, ok := v.(string); ok { - out.Spec.Title = title - } - } - - // We need to make sure the layout is set to some value, otherwise the JSON marshaling will fail. - out.Spec.Layout = dashboardV2.DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind{ - GridLayoutKind: &dashboardV2.DashboardGridLayoutKind{ - Kind: "GridLayout", - Spec: dashboardV2.DashboardGridLayoutSpec{}, - }, - } - - out.Status = dashboardV2.DashboardStatus{ - Conversion: &dashboardV2.DashboardConversionStatus{ - StoredVersion: dashboardV0.VERSION, - Failed: true, - Error: "backend conversion not yet implemented", - }, - } - - return nil -} - -func Convert_V1_to_V0(in *dashboardV1.Dashboard, out *dashboardV0.Dashboard, scope conversion.Scope) error { - out.ObjectMeta = in.ObjectMeta - - out.Spec.Object = in.Spec.Object - - out.Status = dashboardV0.DashboardStatus{ - Conversion: &dashboardV0.DashboardConversionStatus{ - StoredVersion: dashboardV1.VERSION, - }, - } - - return nil -} - -func Convert_V1_to_V2(in *dashboardV1.Dashboard, out *dashboardV2.Dashboard, scope conversion.Scope) error { - out.ObjectMeta = in.ObjectMeta - - // TODO (@radiohead): implement V1 to V2 conversion - // This is the bare minimum conversion that is needed to make the dashboard servable. - - if v, ok := in.Spec.Object["title"]; ok { - if title, ok := v.(string); ok { - out.Spec.Title = title - } - } - - // We need to make sure the layout is set to some value, otherwise the JSON marshaling will fail. - out.Spec.Layout = dashboardV2.DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind{ - GridLayoutKind: &dashboardV2.DashboardGridLayoutKind{ - Kind: "GridLayout", - Spec: dashboardV2.DashboardGridLayoutSpec{}, - }, - } - - out.Status = dashboardV2.DashboardStatus{ - Conversion: &dashboardV2.DashboardConversionStatus{ - StoredVersion: dashboardV1.VERSION, - Failed: true, - Error: "backend conversion not yet implemented", - }, - } - - return nil -} - -func Convert_V2_to_V0(in *dashboardV2.Dashboard, out *dashboardV0.Dashboard, scope conversion.Scope) error { - out.ObjectMeta = in.ObjectMeta - - // TODO: implement V2 to V0 conversion - - out.Status = dashboardV0.DashboardStatus{ - Conversion: &dashboardV0.DashboardConversionStatus{ - StoredVersion: dashboardV2.VERSION, - Failed: true, - Error: "backend conversion not yet implemented", - }, - } - - return nil -} - -func Convert_V2_to_V1(in *dashboardV2.Dashboard, out *dashboardV1.Dashboard, scope conversion.Scope) error { - out.ObjectMeta = in.ObjectMeta - - // TODO: implement V2 to V1 conversion - - out.Status = dashboardV1.DashboardStatus{ - Conversion: &dashboardV1.DashboardConversionStatus{ - StoredVersion: dashboardV2.VERSION, - Failed: true, - Error: "backend conversion not yet implemented", - }, - } - - return nil -} diff --git a/pkg/apis/dashboard/v0alpha1/zz_generated.openapi_violation_exceptions.list b/pkg/apis/dashboard/v0alpha1/zz_generated.openapi_violation_exceptions.list deleted file mode 100644 index 7061b042725..00000000000 --- a/pkg/apis/dashboard/v0alpha1/zz_generated.openapi_violation_exceptions.list +++ /dev/null @@ -1,9 +0,0 @@ -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1,DashboardHit,Tags -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1,DashboardMetadata,Finalizers -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1,FacetResult,Terms -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1,LibraryPanelStatus,Warnings -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1,SearchResults,Hits -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1,SortableFields,Fields -API rule violation: names_match,github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1,Unstructured,Object -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1,SortBy,Descending -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1,SortableField,Field diff --git a/pkg/apis/dashboard/v2alpha1/zz_generated.openapi_violation_exceptions.list b/pkg/apis/dashboard/v2alpha1/zz_generated.openapi_violation_exceptions.list deleted file mode 100644 index 4914dd6343d..00000000000 --- a/pkg/apis/dashboard/v2alpha1/zz_generated.openapi_violation_exceptions.list +++ /dev/null @@ -1,65 +0,0 @@ -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardAdHocFilterWithLabels,ValueLabels -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardAdHocFilterWithLabels,Values -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardAdhocVariableSpec,BaseFilters -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardAdhocVariableSpec,DefaultKeys -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardAdhocVariableSpec,Filters -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardCustomVariableSpec,Options -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardDashboardLink,Tags -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardDatasourceVariableSpec,Options -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardFieldConfig,Links -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardFieldConfig,Mappings -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardFieldConfigSource,Overrides -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutRowSpec,Elements -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutSpec,Items -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardGroupByVariableSpec,Options -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardIntervalVariableSpec,Options -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardMetadata,Finalizers -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardPanelSpec,Links -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardQueryGroupSpec,Queries -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardQueryGroupSpec,Transformations -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardQueryVariableSpec,Options -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardResponsiveGridLayoutSpec,Items -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardRowsLayoutSpec,Rows -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardSpec,Annotations -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardSpec,Links -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardSpec,Tags -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardSpec,Variables -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardStringOrArrayOfString,ArrayOfString -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardTabsLayoutSpec,Tabs -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardThresholdsConfig,Steps -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardTimeSettingsSpec,AutoRefreshIntervals -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardTimeSettingsSpec,QuickRanges -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardV2alpha1FieldConfigSourceOverrides,Properties -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,LibraryPanelStatus,Warnings -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutItemKindOrGridLayoutRowKind,GridLayoutItemKind -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutItemKindOrGridLayoutRowKind,GridLayoutRowKind -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind,GridLayoutKind -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind,ResponsiveGridLayoutKind -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind,TabsLayoutKind -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind,GridLayoutKind -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind,ResponsiveGridLayoutKind -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind,RowsLayoutKind -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind,GridLayoutKind -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind,ResponsiveGridLayoutKind -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind,RowsLayoutKind -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind,TabsLayoutKind -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardIntervalVariableSpec,AutoCount -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardIntervalVariableSpec,AutoMin -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardPanelKindOrLibraryPanelKind,LibraryPanelKind -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardPanelKindOrLibraryPanelKind,PanelKind -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind,AdhocVariableKind -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind,ConstantVariableKind -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind,CustomVariableKind -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind,DatasourceVariableKind -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind,GroupByVariableKind -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind,IntervalVariableKind -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind,QueryVariableKind -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind,TextVariableKind -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardStringOrArrayOfString,ArrayOfString -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardStringOrArrayOfString,String -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardStringOrFloat64,Float64 -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardStringOrFloat64,String -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap,RangeMap -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap,RegexMap -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap,SpecialValueMap -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1,DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap,ValueMap diff --git a/pkg/cmd/grafana-cli/commands/datamigrations/to_unified_storage.go b/pkg/cmd/grafana-cli/commands/datamigrations/to_unified_storage.go index e052815cee8..5d39ee165c1 100644 --- a/pkg/cmd/grafana-cli/commands/datamigrations/to_unified_storage.go +++ b/pkg/cmd/grafana-cli/commands/datamigrations/to_unified_storage.go @@ -11,7 +11,7 @@ import ( "github.com/prometheus/client_golang/prometheus" "k8s.io/apimachinery/pkg/runtime/schema" - dashboard "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1" + dashboard "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1" folders "github.com/grafana/grafana/pkg/apis/folder/v0alpha1" authlib "github.com/grafana/authlib/types" diff --git a/pkg/registry/apis/dashboard/large.go b/pkg/registry/apis/dashboard/large.go index 5464d479dd6..f854c02afce 100644 --- a/pkg/registry/apis/dashboard/large.go +++ b/pkg/registry/apis/dashboard/large.go @@ -6,11 +6,11 @@ import ( "k8s.io/apimachinery/pkg/runtime" + dashboardV0 "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1" + dashboardV1 "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1" + dashboardV2 "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1" commonV0 "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1" "github.com/grafana/grafana/pkg/apimachinery/utils" - dashboardV0 "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1" - dashboardV1 "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1" - dashboardV2 "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1" "github.com/grafana/grafana/pkg/storage/unified/apistore" ) diff --git a/pkg/registry/apis/dashboard/large_test.go b/pkg/registry/apis/dashboard/large_test.go index 99ac282d9db..cd05b704c0c 100644 --- a/pkg/registry/apis/dashboard/large_test.go +++ b/pkg/registry/apis/dashboard/large_test.go @@ -10,7 +10,7 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" - dashboardv0alpha1 "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1" + dashboardv0alpha1 "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1" ) func TestLargeDashboardSupport(t *testing.T) { diff --git a/pkg/registry/apis/dashboard/legacy/migrate.go b/pkg/registry/apis/dashboard/legacy/migrate.go index 3d5046779ce..8d9519783b9 100644 --- a/pkg/registry/apis/dashboard/legacy/migrate.go +++ b/pkg/registry/apis/dashboard/legacy/migrate.go @@ -11,8 +11,8 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" authlib "github.com/grafana/authlib/types" + dashboard "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1" "github.com/grafana/grafana/pkg/apimachinery/utils" - dashboard "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1" folders "github.com/grafana/grafana/pkg/apis/folder/v0alpha1" "github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/services/provisioning" diff --git a/pkg/registry/apis/dashboard/legacy/sql_dashboards.go b/pkg/registry/apis/dashboard/legacy/sql_dashboards.go index 53adbb60f6a..6563300c354 100644 --- a/pkg/registry/apis/dashboard/legacy/sql_dashboards.go +++ b/pkg/registry/apis/dashboard/legacy/sql_dashboards.go @@ -15,11 +15,11 @@ import ( "k8s.io/utils/ptr" claims "github.com/grafana/authlib/types" + dashboardOG "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard" + dashboard "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1" "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1" "github.com/grafana/grafana/pkg/apimachinery/identity" "github.com/grafana/grafana/pkg/apimachinery/utils" - dashboardOG "github.com/grafana/grafana/pkg/apis/dashboard" - dashboard "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1" "github.com/grafana/grafana/pkg/components/simplejson" "github.com/grafana/grafana/pkg/registry/apis/dashboard/legacysearcher" "github.com/grafana/grafana/pkg/services/apiserver/endpoints/request" diff --git a/pkg/registry/apis/dashboard/legacy/storage.go b/pkg/registry/apis/dashboard/legacy/storage.go index fc787fe76fa..e24007813ed 100644 --- a/pkg/registry/apis/dashboard/legacy/storage.go +++ b/pkg/registry/apis/dashboard/legacy/storage.go @@ -9,8 +9,8 @@ import ( claims "github.com/grafana/authlib/types" + dashboard "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1" "github.com/grafana/grafana/pkg/apimachinery/utils" - dashboard "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1" "github.com/grafana/grafana/pkg/storage/unified/resource" ) diff --git a/pkg/registry/apis/dashboard/legacy/types.go b/pkg/registry/apis/dashboard/legacy/types.go index bc935c2a88d..3bd8786afd9 100644 --- a/pkg/registry/apis/dashboard/legacy/types.go +++ b/pkg/registry/apis/dashboard/legacy/types.go @@ -3,7 +3,7 @@ package legacy import ( "context" - dashboard "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1" + dashboard "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1" "github.com/grafana/grafana/pkg/storage/unified/resource" ) diff --git a/pkg/registry/apis/dashboard/legacysearcher/search_client.go b/pkg/registry/apis/dashboard/legacysearcher/search_client.go index c494f547427..682d8307aab 100644 --- a/pkg/registry/apis/dashboard/legacysearcher/search_client.go +++ b/pkg/registry/apis/dashboard/legacysearcher/search_client.go @@ -11,9 +11,9 @@ import ( "k8s.io/apimachinery/pkg/selection" claims "github.com/grafana/authlib/types" + dashboard "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1" "github.com/grafana/grafana/pkg/apimachinery/identity" "github.com/grafana/grafana/pkg/apimachinery/utils" - dashboard "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1" folderv0alpha1 "github.com/grafana/grafana/pkg/apis/folder/v0alpha1" "github.com/grafana/grafana/pkg/services/dashboards" "github.com/grafana/grafana/pkg/services/dashboards/dashboardaccess" diff --git a/pkg/registry/apis/dashboard/legacysearcher/search_client_test.go b/pkg/registry/apis/dashboard/legacysearcher/search_client_test.go index ffbc973ba07..b6fa56f318e 100644 --- a/pkg/registry/apis/dashboard/legacysearcher/search_client_test.go +++ b/pkg/registry/apis/dashboard/legacysearcher/search_client_test.go @@ -10,9 +10,9 @@ import ( "github.com/stretchr/testify/require" "k8s.io/apimachinery/pkg/selection" + dashboard "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1" "github.com/grafana/grafana/pkg/apimachinery/identity" "github.com/grafana/grafana/pkg/apimachinery/utils" - dashboard "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1" "github.com/grafana/grafana/pkg/services/dashboards" "github.com/grafana/grafana/pkg/services/search/model" "github.com/grafana/grafana/pkg/services/search/sort" diff --git a/pkg/registry/apis/dashboard/mutate.go b/pkg/registry/apis/dashboard/mutate.go index 560dcfbedba..57b25078848 100644 --- a/pkg/registry/apis/dashboard/mutate.go +++ b/pkg/registry/apis/dashboard/mutate.go @@ -6,10 +6,10 @@ import ( "k8s.io/apiserver/pkg/admission" + dashboardV0 "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1" + dashboardV1 "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1" + dashboardV2 "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1" "github.com/grafana/grafana/pkg/apimachinery/utils" - dashboardV0 "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1" - dashboardV1 "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1" - dashboardV2 "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1" ) func (b *DashboardsAPIBuilder) Mutate(ctx context.Context, a admission.Attributes, o admission.ObjectInterfaces) (err error) { diff --git a/pkg/registry/apis/dashboard/register.go b/pkg/registry/apis/dashboard/register.go index b141e027b03..d09af5df91c 100644 --- a/pkg/registry/apis/dashboard/register.go +++ b/pkg/registry/apis/dashboard/register.go @@ -20,12 +20,12 @@ import ( "k8s.io/kube-openapi/pkg/validation/spec" claims "github.com/grafana/authlib/types" + internal "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard" + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1" + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1" + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1" + "github.com/grafana/grafana/apps/dashboard/pkg/migration/conversion" "github.com/grafana/grafana/pkg/apimachinery/utils" - "github.com/grafana/grafana/pkg/apis/dashboard" - "github.com/grafana/grafana/pkg/apis/dashboard/migration/conversion" - dashboardv0alpha1 "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1" - dashboardv1alpha1 "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1" - dashboardv2alpha1 "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1" grafanaregistry "github.com/grafana/grafana/pkg/apiserver/registry/generic" "github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/infra/log" @@ -112,29 +112,29 @@ func (b *DashboardsAPIBuilder) GetGroupVersions() []schema.GroupVersion { if featuremgmt.AnyEnabled(b.features, featuremgmt.FlagDashboardNewLayouts) { // If dashboards v2 is enabled, we want to use v2alpha1 as the default API version. return []schema.GroupVersion{ - dashboardv2alpha1.DashboardResourceInfo.GroupVersion(), - dashboardv0alpha1.DashboardResourceInfo.GroupVersion(), - dashboardv1alpha1.DashboardResourceInfo.GroupVersion(), + v2alpha1.DashboardResourceInfo.GroupVersion(), + v0alpha1.DashboardResourceInfo.GroupVersion(), + v1alpha1.DashboardResourceInfo.GroupVersion(), } } // TODO (@radiohead): should we switch to v1alpha1 by default? return []schema.GroupVersion{ - dashboardv0alpha1.DashboardResourceInfo.GroupVersion(), - dashboardv1alpha1.DashboardResourceInfo.GroupVersion(), - dashboardv2alpha1.DashboardResourceInfo.GroupVersion(), + v0alpha1.DashboardResourceInfo.GroupVersion(), + v1alpha1.DashboardResourceInfo.GroupVersion(), + v2alpha1.DashboardResourceInfo.GroupVersion(), } } func (b *DashboardsAPIBuilder) InstallSchema(scheme *runtime.Scheme) error { b.scheme = scheme - if err := dashboardv0alpha1.AddToScheme(scheme); err != nil { + if err := v0alpha1.AddToScheme(scheme); err != nil { return err } - if err := dashboardv1alpha1.AddToScheme(scheme); err != nil { + if err := v1alpha1.AddToScheme(scheme); err != nil { return err } - if err := dashboardv2alpha1.AddToScheme(scheme); err != nil { + if err := v2alpha1.AddToScheme(scheme); err != nil { return err } @@ -193,15 +193,15 @@ func (b *DashboardsAPIBuilder) UpdateAPIGroupInfo(apiGroupInfo *genericapiserver largeObjects = NewDashboardLargeObjectSupport(opts.Scheme) storageOpts.LargeObjectSupport = largeObjects } - opts.StorageOptions(dashboardv0alpha1.DashboardResourceInfo.GroupResource(), storageOpts) + opts.StorageOptions(v0alpha1.DashboardResourceInfo.GroupResource(), storageOpts) // v0alpha1 if err := b.storageForVersion(apiGroupInfo, opts, largeObjects, - dashboardv0alpha1.DashboardResourceInfo, - dashboardv0alpha1.LibraryPanelResourceInfo, - func(obj runtime.Object, access *dashboard.DashboardAccess) (v runtime.Object, err error) { - dto := &dashboardv0alpha1.DashboardWithAccessInfo{} - dash, ok := obj.(*dashboardv0alpha1.Dashboard) + v0alpha1.DashboardResourceInfo, + v0alpha1.LibraryPanelResourceInfo, + func(obj runtime.Object, access *internal.DashboardAccess) (v runtime.Object, err error) { + dto := &v0alpha1.DashboardWithAccessInfo{} + dash, ok := obj.(*v0alpha1.Dashboard) if ok { dto.Dashboard = *dash } @@ -215,11 +215,11 @@ func (b *DashboardsAPIBuilder) UpdateAPIGroupInfo(apiGroupInfo *genericapiserver // v1alpha1 if err := b.storageForVersion(apiGroupInfo, opts, largeObjects, - dashboardv1alpha1.DashboardResourceInfo, - dashboardv1alpha1.LibraryPanelResourceInfo, - func(obj runtime.Object, access *dashboard.DashboardAccess) (v runtime.Object, err error) { - dto := &dashboardv1alpha1.DashboardWithAccessInfo{} - dash, ok := obj.(*dashboardv1alpha1.Dashboard) + v1alpha1.DashboardResourceInfo, + v1alpha1.LibraryPanelResourceInfo, + func(obj runtime.Object, access *internal.DashboardAccess) (v runtime.Object, err error) { + dto := &v1alpha1.DashboardWithAccessInfo{} + dash, ok := obj.(*v1alpha1.Dashboard) if ok { dto.Dashboard = *dash } @@ -233,11 +233,11 @@ func (b *DashboardsAPIBuilder) UpdateAPIGroupInfo(apiGroupInfo *genericapiserver // v2alpha1 if err := b.storageForVersion(apiGroupInfo, opts, largeObjects, - dashboardv2alpha1.DashboardResourceInfo, - dashboardv2alpha1.LibraryPanelResourceInfo, - func(obj runtime.Object, access *dashboard.DashboardAccess) (v runtime.Object, err error) { - dto := &dashboardv2alpha1.DashboardWithAccessInfo{} - dash, ok := obj.(*dashboardv2alpha1.Dashboard) + v2alpha1.DashboardResourceInfo, + v2alpha1.LibraryPanelResourceInfo, + func(obj runtime.Object, access *internal.DashboardAccess) (v runtime.Object, err error) { + dto := &v2alpha1.DashboardWithAccessInfo{} + dash, ok := obj.(*v2alpha1.Dashboard) if ok { dto.Dashboard = *dash } @@ -310,9 +310,9 @@ func (b *DashboardsAPIBuilder) storageForVersion( func (b *DashboardsAPIBuilder) GetOpenAPIDefinitions() common.GetOpenAPIDefinitions { return func(ref common.ReferenceCallback) map[string]common.OpenAPIDefinition { - defs := dashboardv0alpha1.GetOpenAPIDefinitions(ref) - maps.Copy(defs, dashboardv1alpha1.GetOpenAPIDefinitions(ref)) - maps.Copy(defs, dashboardv2alpha1.GetOpenAPIDefinitions(ref)) + defs := v0alpha1.GetOpenAPIDefinitions(ref) + maps.Copy(defs, v1alpha1.GetOpenAPIDefinitions(ref)) + maps.Copy(defs, v2alpha1.GetOpenAPIDefinitions(ref)) return defs } } @@ -324,11 +324,11 @@ func (b *DashboardsAPIBuilder) PostProcessOpenAPI(oas *spec3.OpenAPI) (*spec3.Op for _, gv := range b.GetGroupVersions() { version := gv.Version // Hide cluster-scoped resources - root := path.Join("/apis/", dashboardv0alpha1.GROUP, version) + root := path.Join("/apis/", v0alpha1.GROUP, version) delete(oas.Paths.Paths, path.Join(root, "dashboards")) delete(oas.Paths.Paths, path.Join(root, "watch", "dashboards")) - if version == dashboardv0alpha1.VERSION { + if version == v0alpha1.VERSION { sub := oas.Paths.Paths[path.Join(root, "search", "{name}")] oas.Paths.Paths[path.Join(root, "search")] = sub delete(oas.Paths.Paths, path.Join(root, "search", "{name}")) diff --git a/pkg/registry/apis/dashboard/register_test.go b/pkg/registry/apis/dashboard/register_test.go index 21f9f492a45..e4a0320a902 100644 --- a/pkg/registry/apis/dashboard/register_test.go +++ b/pkg/registry/apis/dashboard/register_test.go @@ -5,10 +5,10 @@ import ( "fmt" "testing" + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1" + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1" + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1" common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1" - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1" - "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1" - "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1" "github.com/grafana/grafana/pkg/services/dashboards" "github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/services/user" diff --git a/pkg/registry/apis/dashboard/search.go b/pkg/registry/apis/dashboard/search.go index ffa9de3b04c..33162ccabb6 100644 --- a/pkg/registry/apis/dashboard/search.go +++ b/pkg/registry/apis/dashboard/search.go @@ -21,8 +21,8 @@ import ( "github.com/grafana/grafana/pkg/storage/legacysql/dualwrite" "github.com/grafana/grafana/pkg/storage/unified/search" + dashboardv0alpha1 "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1" "github.com/grafana/grafana/pkg/apimachinery/identity" - dashboardv0alpha1 "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1" folderv0alpha1 "github.com/grafana/grafana/pkg/apis/folder/v0alpha1" "github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/services/apiserver/builder" @@ -53,8 +53,8 @@ func NewSearchHandler(tracer trace.Tracer, dual dualwrite.Service, legacyDashboa } func (s *SearchHandler) GetAPIRoutes(defs map[string]common.OpenAPIDefinition) *builder.APIRoutes { - searchResults := defs["github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.SearchResults"].Schema - sortableFields := defs["github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.SortableFields"].Schema + searchResults := defs["github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.SearchResults"].Schema + sortableFields := defs["github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.SortableFields"].Schema return &builder.APIRoutes{ Namespace: []builder.APIRouteHandler{ diff --git a/pkg/registry/apis/dashboard/search_test.go b/pkg/registry/apis/dashboard/search_test.go index 08fb919f86f..e393aabea62 100644 --- a/pkg/registry/apis/dashboard/search_test.go +++ b/pkg/registry/apis/dashboard/search_test.go @@ -11,8 +11,8 @@ import ( "github.com/stretchr/testify/require" "google.golang.org/grpc" + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1" "github.com/grafana/grafana/pkg/apimachinery/identity" - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1" "github.com/grafana/grafana/pkg/apiserver/rest" "github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/infra/tracing" diff --git a/pkg/registry/apis/dashboard/sub_dto.go b/pkg/registry/apis/dashboard/sub_dto.go index 33ffe2c8646..5768ce906d5 100644 --- a/pkg/registry/apis/dashboard/sub_dto.go +++ b/pkg/registry/apis/dashboard/sub_dto.go @@ -11,9 +11,9 @@ import ( claims "github.com/grafana/authlib/types" "github.com/grafana/grafana-app-sdk/logging" + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard" "github.com/grafana/grafana/pkg/apimachinery/identity" "github.com/grafana/grafana/pkg/apimachinery/utils" - "github.com/grafana/grafana/pkg/apis/dashboard" "github.com/grafana/grafana/pkg/infra/slugify" "github.com/grafana/grafana/pkg/registry/apis/dashboard/legacy" "github.com/grafana/grafana/pkg/services/accesscontrol" diff --git a/pkg/registry/apis/dashboardsnapshot/register.go b/pkg/registry/apis/dashboardsnapshot/register.go index 994ec4d4ce2..c4aabd92562 100644 --- a/pkg/registry/apis/dashboardsnapshot/register.go +++ b/pkg/registry/apis/dashboardsnapshot/register.go @@ -149,9 +149,9 @@ func (b *SnapshotsAPIBuilder) GetOpenAPIDefinitions() common.GetOpenAPIDefinitio func (b *SnapshotsAPIBuilder) GetAPIRoutes() *builder.APIRoutes { prefix := dashboardsnapshot.DashboardSnapshotResourceInfo.GroupResource().Resource defs := dashboardsnapshot.GetOpenAPIDefinitions(func(path string) spec.Ref { return spec.Ref{} }) - createCmd := defs["github.com/grafana/grafana/pkg/apis/dashboardsnapshot/v0alpha1.DashboardCreateCommand"].Schema + createCmd := defs["github.com/grafana/grafana/apps/dashboard/pkg/apissnapshot/v0alpha1.DashboardCreateCommand"].Schema createExample := `{"dashboard":{"annotations":{"list":[{"name":"Annotations & Alerts","enable":true,"iconColor":"rgba(0, 211, 255, 1)","snapshotData":[],"type":"dashboard","builtIn":1,"hide":true}]},"editable":true,"fiscalYearStartMonth":0,"graphTooltip":0,"id":203,"links":[],"liveNow":false,"panels":[{"datasource":null,"fieldConfig":{"defaults":{"color":{"mode":"palette-classic"},"custom":{"axisBorderShow":false,"axisCenteredZero":false,"axisColorMode":"text","axisLabel":"","axisPlacement":"auto","barAlignment":0,"drawStyle":"line","fillOpacity":43,"gradientMode":"opacity","hideFrom":{"legend":false,"tooltip":false,"viz":false},"insertNulls":false,"lineInterpolation":"smooth","lineWidth":1,"pointSize":5,"scaleDistribution":{"type":"linear"},"showPoints":"auto","spanNulls":false,"stacking":{"group":"A","mode":"none"},"thresholdsStyle":{"mode":"off"}},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"red","value":80}]},"unitScale":true},"overrides":[]},"gridPos":{"h":8,"w":12,"x":0,"y":0},"id":1,"options":{"legend":{"calcs":[],"displayMode":"list","placement":"bottom","showLegend":true},"tooltip":{"mode":"single","sort":"none"}},"pluginVersion":"10.4.0-pre","snapshotData":[{"fields":[{"config":{"color":{"mode":"palette-classic"},"custom":{"axisBorderShow":false,"axisCenteredZero":false,"axisColorMode":"text","axisPlacement":"auto","barAlignment":0,"drawStyle":"line","fillOpacity":43,"gradientMode":"opacity","hideFrom":{"legend":false,"tooltip":false,"viz":false},"lineInterpolation":"smooth","lineWidth":1,"pointSize":5,"showPoints":"auto","thresholdsStyle":{"mode":"off"}},"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"red","value":80}]},"unitScale":true},"name":"time","type":"time","values":[1706030536378,1706034856378,1706039176378,1706043496378,1706047816378,1706052136378]},{"config":{"color":{"mode":"palette-classic"},"custom":{"axisBorderShow":false,"axisCenteredZero":false,"axisColorMode":"text","axisLabel":"","axisPlacement":"auto","barAlignment":0,"drawStyle":"line","fillOpacity":43,"gradientMode":"opacity","hideFrom":{"legend":false,"tooltip":false,"viz":false},"insertNulls":false,"lineInterpolation":"smooth","lineWidth":1,"pointSize":5,"scaleDistribution":{"type":"linear"},"showPoints":"auto","spanNulls":false,"stacking":{"group":"A","mode":"none"},"thresholdsStyle":{"mode":"off"}},"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"red","value":80}]},"unitScale":true},"name":"A-series","type":"number","values":[1,20,90,30,50,0]}],"refId":"A"}],"targets":[],"title":"Simple example","type":"timeseries","links":[]}],"refresh":"","schemaVersion":39,"snapshot":{"timestamp":"2024-01-23T23:22:16.377Z"},"tags":[],"templating":{"list":[]},"time":{"from":"2024-01-23T17:22:20.380Z","to":"2024-01-23T23:22:20.380Z","raw":{"from":"now-6h","to":"now"}},"timepicker":{},"timezone":"","title":"simple and small","uid":"b22ec8db-399b-403b-b6c7-b0fb30ccb2a5","version":1,"weekStart":""},"name":"simple and small","expires":86400}` - createRsp := defs["github.com/grafana/grafana/pkg/apis/dashboardsnapshot/v0alpha1.DashboardCreateResponse"].Schema + createRsp := defs["github.com/grafana/grafana/apps/dashboard/pkg/apissnapshot/v0alpha1.DashboardCreateResponse"].Schema tags := []string{dashboardsnapshot.DashboardSnapshotResourceInfo.GroupVersionKind().Kind} routes := &builder.APIRoutes{ diff --git a/pkg/services/authz/zanzana/common/tuple.go b/pkg/services/authz/zanzana/common/tuple.go index 1259aadbefa..c238ac0f0f9 100644 --- a/pkg/services/authz/zanzana/common/tuple.go +++ b/pkg/services/authz/zanzana/common/tuple.go @@ -6,8 +6,8 @@ import ( openfgav1 "github.com/openfga/api/proto/openfga/v1" "google.golang.org/protobuf/types/known/structpb" + dashboardalpha1 "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1" "github.com/grafana/grafana/pkg/apimachinery/utils" - dashboardalpha1 "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1" authzextv1 "github.com/grafana/grafana/pkg/services/authz/proto/v1" ) diff --git a/pkg/services/authz/zanzana/server/server.go b/pkg/services/authz/zanzana/server/server.go index a0ae53af4d2..b0d17dc76d4 100644 --- a/pkg/services/authz/zanzana/server/server.go +++ b/pkg/services/authz/zanzana/server/server.go @@ -10,7 +10,7 @@ import ( authzv1 "github.com/grafana/authlib/authz/proto/v1" openfgav1 "github.com/openfga/api/proto/openfga/v1" - dashboardalpha1 "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1" + dashboardalpha1 "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1" "github.com/grafana/grafana/pkg/infra/localcache" "github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/infra/tracing" diff --git a/pkg/services/authz/zanzana/translations.go b/pkg/services/authz/zanzana/translations.go index 70bf8337c6c..993f48e3c6c 100644 --- a/pkg/services/authz/zanzana/translations.go +++ b/pkg/services/authz/zanzana/translations.go @@ -1,7 +1,7 @@ package zanzana import ( - dashboardalpha1 "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1" + dashboardalpha1 "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1" folderalpha1 "github.com/grafana/grafana/pkg/apis/folder/v0alpha1" ) diff --git a/pkg/services/dashboards/service/dashboard_service.go b/pkg/services/dashboards/service/dashboard_service.go index 31fbfcb428d..be4e3a5e2d3 100644 --- a/pkg/services/dashboards/service/dashboard_service.go +++ b/pkg/services/dashboards/service/dashboard_service.go @@ -23,10 +23,10 @@ import ( claims "github.com/grafana/authlib/types" "github.com/grafana/grafana-plugin-sdk-go/backend/gtime" + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard" + dashboardv0alpha1 "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1" "github.com/grafana/grafana/pkg/apimachinery/identity" "github.com/grafana/grafana/pkg/apimachinery/utils" - "github.com/grafana/grafana/pkg/apis/dashboard" - dashboardv0alpha1 "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1" folderv0alpha1 "github.com/grafana/grafana/pkg/apis/folder/v0alpha1" "github.com/grafana/grafana/pkg/components/simplejson" "github.com/grafana/grafana/pkg/infra/log" diff --git a/pkg/services/dashboards/service/dashboard_service_test.go b/pkg/services/dashboards/service/dashboard_service_test.go index c3593db643c..2dc45e6494e 100644 --- a/pkg/services/dashboards/service/dashboard_service_test.go +++ b/pkg/services/dashboards/service/dashboard_service_test.go @@ -15,9 +15,9 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + dashboardv0alpha1 "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1" "github.com/grafana/grafana/pkg/apimachinery/identity" "github.com/grafana/grafana/pkg/apimachinery/utils" - dashboardv0alpha1 "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1" "github.com/grafana/grafana/pkg/components/simplejson" "github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/services/accesscontrol" diff --git a/pkg/services/dashboards/service/search/search.go b/pkg/services/dashboards/service/search/search.go index 1352ec52776..7ff4acfcca2 100644 --- a/pkg/services/dashboards/service/search/search.go +++ b/pkg/services/dashboards/service/search/search.go @@ -7,7 +7,7 @@ import ( common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1" - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1" + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1" "github.com/grafana/grafana/pkg/storage/unified/resource" ) diff --git a/pkg/services/dashboardversion/dashverimpl/dashver.go b/pkg/services/dashboardversion/dashverimpl/dashver.go index dfa2d5444e7..12120bc9188 100644 --- a/pkg/services/dashboardversion/dashverimpl/dashver.go +++ b/pkg/services/dashboardversion/dashverimpl/dashver.go @@ -11,8 +11,8 @@ import ( v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1" "github.com/grafana/grafana/pkg/apimachinery/utils" - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1" "github.com/grafana/grafana/pkg/components/simplejson" "github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/infra/log" diff --git a/pkg/services/folder/folderimpl/folder.go b/pkg/services/folder/folderimpl/folder.go index 3996270a885..bac4edc1c59 100644 --- a/pkg/services/folder/folderimpl/folder.go +++ b/pkg/services/folder/folderimpl/folder.go @@ -18,8 +18,8 @@ import ( "github.com/grafana/dskit/concurrency" + dashboardalpha1 "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1" "github.com/grafana/grafana/pkg/apimachinery/identity" - dashboardalpha1 "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1" "github.com/grafana/grafana/pkg/apis/folder/v0alpha1" "github.com/grafana/grafana/pkg/bus" "github.com/grafana/grafana/pkg/events" diff --git a/pkg/services/provisioning/dashboards/dashboard.go b/pkg/services/provisioning/dashboards/dashboard.go index 5c3d955ad42..11bb29d169b 100644 --- a/pkg/services/provisioning/dashboards/dashboard.go +++ b/pkg/services/provisioning/dashboards/dashboard.go @@ -6,7 +6,7 @@ import ( "os" "time" - dashboard "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1" + dashboard "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1" "github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/services/dashboards" "github.com/grafana/grafana/pkg/services/folder" diff --git a/pkg/storage/legacysql/dualwrite/utils.go b/pkg/storage/legacysql/dualwrite/utils.go index 9855c8cac3a..971f0677561 100644 --- a/pkg/storage/legacysql/dualwrite/utils.go +++ b/pkg/storage/legacysql/dualwrite/utils.go @@ -4,7 +4,7 @@ import ( "golang.org/x/net/context" "k8s.io/apimachinery/pkg/runtime/schema" - dashboard "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1" + dashboard "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1" folders "github.com/grafana/grafana/pkg/apis/folder/v0alpha1" ) diff --git a/pkg/storage/unified/apistore/go.mod b/pkg/storage/unified/apistore/go.mod index 81eebd46fcc..02f195feed4 100644 --- a/pkg/storage/unified/apistore/go.mod +++ b/pkg/storage/unified/apistore/go.mod @@ -4,6 +4,7 @@ go 1.23.7 replace ( github.com/grafana/grafana => ../../../.. + github.com/grafana/grafana/apps/dashboard => ../../../../apps/dashboard github.com/grafana/grafana/pkg/apimachinery => ../../../apimachinery github.com/grafana/grafana/pkg/apiserver => ../../../apiserver github.com/grafana/grafana/pkg/storage/unified/resource => ../resource @@ -16,7 +17,8 @@ require ( github.com/google/uuid v1.6.0 github.com/grafana/authlib/types v0.0.0-20250224151205-5ef97131cc82 github.com/grafana/grafana v11.4.0-00010101000000-000000000000+incompatible - github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250220154326-6e5de80ef295 + github.com/grafana/grafana/apps/dashboard v0.0.0-20250220154326-6e5de80ef295 + github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250312121619-f64be062c432 github.com/grafana/grafana/pkg/apiserver v0.0.0-20250220154326-6e5de80ef295 github.com/grafana/grafana/pkg/storage/unified/resource v0.0.0-20250220154326-6e5de80ef295 github.com/stretchr/testify v1.10.0 diff --git a/pkg/storage/unified/apistore/prepare_test.go b/pkg/storage/unified/apistore/prepare_test.go index c71f18572f8..1bb9c06cd04 100644 --- a/pkg/storage/unified/apistore/prepare_test.go +++ b/pkg/storage/unified/apistore/prepare_test.go @@ -14,9 +14,9 @@ import ( "k8s.io/apiserver/pkg/storage" authtypes "github.com/grafana/authlib/types" + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1" "github.com/grafana/grafana/pkg/apimachinery/identity" "github.com/grafana/grafana/pkg/apimachinery/utils" - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1" ) var scheme = runtime.NewScheme() diff --git a/pkg/storage/unified/resource/go.mod b/pkg/storage/unified/resource/go.mod index 0bb4e887241..8bf1d427d11 100644 --- a/pkg/storage/unified/resource/go.mod +++ b/pkg/storage/unified/resource/go.mod @@ -4,6 +4,7 @@ go 1.23.7 replace ( github.com/grafana/grafana => ../../../.. + github.com/grafana/grafana/apps/dashboard => ../../../../apps/dashboard github.com/grafana/grafana/pkg/apimachinery => ../../../apimachinery github.com/grafana/grafana/pkg/apiserver => ../../../apiserver ) @@ -16,7 +17,8 @@ require ( github.com/grafana/dskit v0.0.0-20241105154643-a6b453a88040 github.com/grafana/grafana v11.4.0-00010101000000-000000000000+incompatible github.com/grafana/grafana-plugin-sdk-go v0.270.0 - github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250220154326-6e5de80ef295 + github.com/grafana/grafana/apps/dashboard v0.0.0-20250220154326-6e5de80ef295 + github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250312121619-f64be062c432 github.com/grafana/grafana/pkg/apiserver v0.0.0-20250220154326-6e5de80ef295 // indirect github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.1 github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 diff --git a/pkg/storage/unified/resource/go.sum b/pkg/storage/unified/resource/go.sum index 0ba9d1ae931..6df86ff30b9 100644 --- a/pkg/storage/unified/resource/go.sum +++ b/pkg/storage/unified/resource/go.sum @@ -1497,8 +1497,9 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304 h1:Jpy1PXuP99tXNrhbq2BaPz9B+jNAvH1JPQQpG/9GCXY= github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c h1:Ho+uVpkel/udgjbwB5Lktg9BtvJSh2DT0Hi6LPSyI2w= github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= diff --git a/pkg/storage/unified/resource/search.go b/pkg/storage/unified/resource/search.go index 3a85832c93b..63acc10be7c 100644 --- a/pkg/storage/unified/resource/search.go +++ b/pkg/storage/unified/resource/search.go @@ -16,7 +16,7 @@ import ( "golang.org/x/sync/errgroup" "k8s.io/apimachinery/pkg/runtime/schema" - dashboardv0alpha1 "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1" + dashboardv0alpha1 "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1" folderv0alpha1 "github.com/grafana/grafana/pkg/apis/folder/v0alpha1" "github.com/grafana/authlib/types" diff --git a/pkg/storage/unified/search/dashboard.go b/pkg/storage/unified/search/dashboard.go index 20daca89039..65655661fce 100644 --- a/pkg/storage/unified/search/dashboard.go +++ b/pkg/storage/unified/search/dashboard.go @@ -8,8 +8,8 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1" "github.com/grafana/grafana/pkg/apimachinery/utils" - "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1" "github.com/grafana/grafana/pkg/services/store/kind/dashboard" "github.com/grafana/grafana/pkg/storage/unified/resource" ) diff --git a/pkg/tests/apis/dashboard/dashboards_test.go b/pkg/tests/apis/dashboard/dashboards_test.go index acc43f31aef..d0e48414fd6 100644 --- a/pkg/tests/apis/dashboard/dashboards_test.go +++ b/pkg/tests/apis/dashboard/dashboards_test.go @@ -18,9 +18,9 @@ import ( "github.com/grafana/grafana/pkg/tests/testinfra" "github.com/grafana/grafana/pkg/tests/testsuite" - dashboardV0 "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1" - dashboardV1 "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1" - dashboardV2 "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1" + dashboardV0 "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1" + dashboardV1 "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1" + dashboardV2 "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1" ) func TestMain(m *testing.M) { diff --git a/pkg/tests/apis/openapi_snapshots/dashboard.grafana.app-v0alpha1.json b/pkg/tests/apis/openapi_snapshots/dashboard.grafana.app-v0alpha1.json index eec30bc3008..adc4b2ab676 100644 --- a/pkg/tests/apis/openapi_snapshots/dashboard.grafana.app-v0alpha1.json +++ b/pkg/tests/apis/openapi_snapshots/dashboard.grafana.app-v0alpha1.json @@ -141,27 +141,27 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.DashboardList" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.DashboardList" } }, "application/json;stream=watch": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.DashboardList" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.DashboardList" } }, "application/vnd.kubernetes.protobuf": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.DashboardList" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.DashboardList" } }, "application/vnd.kubernetes.protobuf;stream=watch": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.DashboardList" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.DashboardList" } }, "application/yaml": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.DashboardList" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.DashboardList" } } } @@ -213,17 +213,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.Dashboard" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.Dashboard" } }, "application/vnd.kubernetes.protobuf": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.Dashboard" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.Dashboard" } }, "application/yaml": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.Dashboard" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.Dashboard" } } }, @@ -235,17 +235,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.Dashboard" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.Dashboard" } }, "application/vnd.kubernetes.protobuf": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.Dashboard" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.Dashboard" } }, "application/yaml": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.Dashboard" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.Dashboard" } } } @@ -255,17 +255,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.Dashboard" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.Dashboard" } }, "application/vnd.kubernetes.protobuf": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.Dashboard" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.Dashboard" } }, "application/yaml": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.Dashboard" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.Dashboard" } } } @@ -275,17 +275,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.Dashboard" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.Dashboard" } }, "application/vnd.kubernetes.protobuf": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.Dashboard" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.Dashboard" } }, "application/yaml": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.Dashboard" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.Dashboard" } } } @@ -487,17 +487,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.Dashboard" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.Dashboard" } }, "application/vnd.kubernetes.protobuf": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.Dashboard" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.Dashboard" } }, "application/yaml": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.Dashboard" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.Dashboard" } } } @@ -549,17 +549,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.Dashboard" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.Dashboard" } }, "application/vnd.kubernetes.protobuf": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.Dashboard" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.Dashboard" } }, "application/yaml": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.Dashboard" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.Dashboard" } } }, @@ -571,17 +571,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.Dashboard" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.Dashboard" } }, "application/vnd.kubernetes.protobuf": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.Dashboard" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.Dashboard" } }, "application/yaml": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.Dashboard" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.Dashboard" } } } @@ -591,17 +591,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.Dashboard" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.Dashboard" } }, "application/vnd.kubernetes.protobuf": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.Dashboard" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.Dashboard" } }, "application/yaml": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.Dashboard" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.Dashboard" } } } @@ -791,17 +791,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.Dashboard" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.Dashboard" } }, "application/vnd.kubernetes.protobuf": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.Dashboard" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.Dashboard" } }, "application/yaml": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.Dashboard" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.Dashboard" } } } @@ -811,17 +811,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.Dashboard" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.Dashboard" } }, "application/vnd.kubernetes.protobuf": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.Dashboard" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.Dashboard" } }, "application/yaml": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.Dashboard" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.Dashboard" } } } @@ -879,7 +879,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.DashboardWithAccessInfo" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.DashboardWithAccessInfo" } } } @@ -928,27 +928,27 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.LibraryPanelList" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.LibraryPanelList" } }, "application/json;stream=watch": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.LibraryPanelList" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.LibraryPanelList" } }, "application/vnd.kubernetes.protobuf": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.LibraryPanelList" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.LibraryPanelList" } }, "application/vnd.kubernetes.protobuf;stream=watch": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.LibraryPanelList" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.LibraryPanelList" } }, "application/yaml": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.LibraryPanelList" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.LibraryPanelList" } } } @@ -1086,17 +1086,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.LibraryPanel" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.LibraryPanel" } }, "application/vnd.kubernetes.protobuf": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.LibraryPanel" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.LibraryPanel" } }, "application/yaml": { "schema": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.LibraryPanel" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.LibraryPanel" } } } @@ -1438,12 +1438,7 @@ "type": "object", "additionalProperties": true }, - "com.github.grafana.grafana.pkg.apimachinery.apis.common.v0alpha1.Unstructured": { - "type": "object", - "additionalProperties": true, - "x-kubernetes-preserve-unknown-fields": true - }, - "com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.AnnotationActions": { + "com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.AnnotationActions": { "type": "object", "required": [ "canAdd", @@ -1465,7 +1460,7 @@ } } }, - "com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.AnnotationPermission": { + "com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.AnnotationPermission": { "type": "object", "required": [ "dashboard", @@ -1476,7 +1471,7 @@ "default": {}, "allOf": [ { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.AnnotationActions" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.AnnotationActions" } ] }, @@ -1484,13 +1479,13 @@ "default": {}, "allOf": [ { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.AnnotationActions" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.AnnotationActions" } ] } } }, - "com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.Dashboard": { + "com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.Dashboard": { "type": "object", "required": [ "metadata", @@ -1526,7 +1521,7 @@ "default": {}, "allOf": [ { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.DashboardStatus" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.DashboardStatus" } ] } @@ -1539,7 +1534,7 @@ } ] }, - "com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.DashboardAccess": { + "com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.DashboardAccess": { "type": "object", "required": [ "canSave", @@ -1551,7 +1546,7 @@ ], "properties": { "annotationsPermissions": { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.AnnotationPermission" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.AnnotationPermission" }, "canAdmin": { "type": "boolean", @@ -1583,7 +1578,7 @@ } } }, - "com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.DashboardConversionStatus": { + "com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.DashboardConversionStatus": { "description": "ConversionStatus is the status of the conversion of the dashboard.", "type": "object", "required": [ @@ -1609,7 +1604,7 @@ } } }, - "com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.DashboardList": { + "com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.DashboardList": { "type": "object", "required": [ "metadata", @@ -1626,7 +1621,7 @@ "default": {}, "allOf": [ { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.Dashboard" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.Dashboard" } ] } @@ -1652,20 +1647,20 @@ } ] }, - "com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.DashboardStatus": { + "com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.DashboardStatus": { "type": "object", "properties": { "conversion": { "description": "Optional conversion status.", "allOf": [ { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.DashboardConversionStatus" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.DashboardConversionStatus" } ] } } }, - "com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.DashboardWithAccessInfo": { + "com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.DashboardWithAccessInfo": { "description": "This is like the legacy DTO where access and metadata are all returned in a single call", "type": "object", "required": [ @@ -1679,7 +1674,7 @@ "default": {}, "allOf": [ { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.DashboardAccess" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.DashboardAccess" } ] }, @@ -1711,7 +1706,7 @@ "default": {}, "allOf": [ { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.DashboardStatus" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.DashboardStatus" } ] } @@ -1724,7 +1719,7 @@ } ] }, - "com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.LibraryPanel": { + "com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.LibraryPanel": { "type": "object", "required": [ "spec" @@ -1752,7 +1747,7 @@ "default": {}, "allOf": [ { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.LibraryPanelSpec" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.LibraryPanelSpec" } ] }, @@ -1760,7 +1755,7 @@ "description": "Status will show errors", "allOf": [ { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.LibraryPanelStatus" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.LibraryPanelStatus" } ] } @@ -1773,7 +1768,7 @@ } ] }, - "com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.LibraryPanelList": { + "com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.LibraryPanelList": { "type": "object", "properties": { "apiVersion": { @@ -1786,7 +1781,7 @@ "default": {}, "allOf": [ { - "$ref": "#/components/schemas/com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.LibraryPanel" + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.LibraryPanel" } ] } @@ -1812,7 +1807,7 @@ } ] }, - "com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.LibraryPanelSpec": { + "com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.LibraryPanelSpec": { "type": "object", "required": [ "type", @@ -1871,7 +1866,7 @@ } } }, - "com.github.grafana.grafana.pkg.apis.dashboard.v0alpha1.LibraryPanelStatus": { + "com.github.grafana.grafana.apps.dashboard.pkg.apis.dashboard.v0alpha1.LibraryPanelStatus": { "type": "object", "properties": { "missing": { @@ -1892,6 +1887,11 @@ } } }, + "com.github.grafana.grafana.pkg.apimachinery.apis.common.v0alpha1.Unstructured": { + "type": "object", + "additionalProperties": true, + "x-kubernetes-preserve-unknown-fields": true + }, "io.k8s.apimachinery.pkg.apis.meta.v1.APIResource": { "description": "APIResource specifies the name of a resource and whether it is namespaced.", "type": "object", diff --git a/pkg/tests/apis/provisioning/provisioning_test.go b/pkg/tests/apis/provisioning/provisioning_test.go index 28916508f08..2199cea7041 100644 --- a/pkg/tests/apis/provisioning/provisioning_test.go +++ b/pkg/tests/apis/provisioning/provisioning_test.go @@ -5,7 +5,7 @@ import ( "encoding/json" "testing" - dashboard "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1" + dashboard "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1" folder "github.com/grafana/grafana/pkg/apis/folder/v0alpha1" provisioning "github.com/grafana/grafana/pkg/apis/provisioning/v0alpha1" "github.com/grafana/grafana/pkg/apiserver/rest" From 9cc6c596afc57d33fc1e0f2901bd35b74dd7422c Mon Sep 17 00:00:00 2001 From: Tobias Skarhed <1438972+tskarhed@users.noreply.github.com> Date: Thu, 13 Mar 2025 10:20:20 +0100 Subject: [PATCH 012/117] DataSourceHttpSettings: Replace legacy components and remove gf-form usage (#100583) * Refactor to remove gf-form * Change Select to Combobox * Fix label width * Add translations * Fix input and translation keys * Add aria expanded controls to help button * Fix dsiabled state for Input * Fix spacing * Remove unused import * Fix spacing for tag selectors * Change gf-form-label to section * Update addDataSource e2e flow * Betterer results * Use new form component * Update translations * Add deprecation notice * Extract translations * Update betterer --- .betterer.results | 34 - e2e/old-arch/utils/flows/addDataSource.ts | 2 +- e2e/utils/flows/addDataSource.ts | 2 +- .../DataSourceHttpSettings.story.tsx | 2 +- .../DataSourceHttpSettings.tsx | 423 +- .../DataSourceSettings/HttpProxySettings.tsx | 68 +- .../SecureSocksProxySettings.tsx | 4 +- .../src/components/FormField/FormField.tsx | 3 +- public/locales/en-US/grafana.json | 21 +- public/locales/pseudo-LOCALE/grafana.json | 3714 +++++++++++++++++ 10 files changed, 3981 insertions(+), 292 deletions(-) create mode 100644 public/locales/pseudo-LOCALE/grafana.json diff --git a/.betterer.results b/.betterer.results index 57d2b1cf765..4358fc331ee 100644 --- a/.betterer.results +++ b/.betterer.results @@ -555,11 +555,6 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"] ], - "packages/grafana-ui/src/components/DataSourceSettings/DataSourceHttpSettings.tsx:5381": [ - [0, 0, 0, "Do not use the t() function outside of a component or function", "0"], - [0, 0, 0, "Do not use the t() function outside of a component or function", "1"], - [0, 0, 0, "Do not use the t() function outside of a component or function", "2"] - ], "packages/grafana-ui/src/components/DataSourceSettings/types.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"] @@ -7635,12 +7630,6 @@ exports[`no undocumented stories`] = { exports[`no gf-form usage`] = { value: `{ - "e2e/old-arch/utils/flows/addDataSource.ts:5381": [ - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"] - ], - "e2e/utils/flows/addDataSource.ts:5381": [ - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"] - ], "packages/grafana-prometheus/src/components/PromExploreExtraField.tsx:5381": [ [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], @@ -7703,29 +7692,6 @@ exports[`no gf-form usage`] = { [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"] ], - "packages/grafana-ui/src/components/DataSourceSettings/DataSourceHttpSettings.tsx:5381": [ - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"] - ], - "packages/grafana-ui/src/components/DataSourceSettings/HttpProxySettings.tsx:5381": [ - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"] - ], "packages/grafana-ui/src/components/DataSourceSettings/SecureSocksProxySettings.tsx:5381": [ [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], diff --git a/e2e/old-arch/utils/flows/addDataSource.ts b/e2e/old-arch/utils/flows/addDataSource.ts index 777ed6caf31..002dddbd070 100644 --- a/e2e/old-arch/utils/flows/addDataSource.ts +++ b/e2e/old-arch/utils/flows/addDataSource.ts @@ -58,7 +58,7 @@ export const addDataSource = (config?: Partial) => { if (basicAuth) { cy.contains('label', 'Basic auth').scrollIntoView().click(); - cy.contains('.gf-form-group', 'Basic Auth Details') + cy.contains('section', 'Basic Auth Details') .should('be.visible') .scrollIntoView() .within(() => { diff --git a/e2e/utils/flows/addDataSource.ts b/e2e/utils/flows/addDataSource.ts index 777ed6caf31..002dddbd070 100644 --- a/e2e/utils/flows/addDataSource.ts +++ b/e2e/utils/flows/addDataSource.ts @@ -58,7 +58,7 @@ export const addDataSource = (config?: Partial) => { if (basicAuth) { cy.contains('label', 'Basic auth').scrollIntoView().click(); - cy.contains('.gf-form-group', 'Basic Auth Details') + cy.contains('section', 'Basic Auth Details') .should('be.visible') .scrollIntoView() .within(() => { diff --git a/packages/grafana-ui/src/components/DataSourceSettings/DataSourceHttpSettings.story.tsx b/packages/grafana-ui/src/components/DataSourceSettings/DataSourceHttpSettings.story.tsx index a1b51c6e78a..3557ef84dd6 100644 --- a/packages/grafana-ui/src/components/DataSourceSettings/DataSourceHttpSettings.story.tsx +++ b/packages/grafana-ui/src/components/DataSourceSettings/DataSourceHttpSettings.story.tsx @@ -32,7 +32,7 @@ const settingsMock: HttpSettingsProps['dataSourceConfig'] = { password: true, }, secureJsonFields: {}, - readOnly: true, + readOnly: false, }; const meta: Meta = { diff --git a/packages/grafana-ui/src/components/DataSourceSettings/DataSourceHttpSettings.tsx b/packages/grafana-ui/src/components/DataSourceSettings/DataSourceHttpSettings.tsx index e4f0b29f2bd..cfaaf990d37 100644 --- a/packages/grafana-ui/src/components/DataSourceSettings/DataSourceHttpSettings.tsx +++ b/packages/grafana-ui/src/components/DataSourceSettings/DataSourceHttpSettings.tsx @@ -1,5 +1,5 @@ -import { css, cx } from '@emotion/css'; -import { useState, useCallback, useId } from 'react'; +import { css } from '@emotion/css'; +import { useState, useCallback, useId, useMemo } from 'react'; import { SelectableValue } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; @@ -7,12 +7,13 @@ import { selectors } from '@grafana/e2e-selectors'; import { useTheme2 } from '../../themes'; import { t, Trans } from '../../utils/i18n'; import { Alert } from '../Alert/Alert'; -import { FormField } from '../FormField/FormField'; -import { InlineFormLabel } from '../FormLabel/FormLabel'; +import { Button } from '../Button'; +import { Field } from '../Forms/Field'; import { InlineField } from '../Forms/InlineField'; -import { Input } from '../Forms/Legacy/Input/Input'; +import { RadioButtonGroup } from '../Forms/RadioButtonGroup/RadioButtonGroup'; import { Icon } from '../Icon/Icon'; -import { Select } from '../Select/Select'; +import { Input } from '../Input/Input'; +import { Stack } from '../Layout/Stack/Stack'; import { InlineSwitch } from '../Switch/Switch'; import { TagsInput } from '../TagsInput/TagsInput'; import { Text } from '../Text/Text'; @@ -24,26 +25,16 @@ import { SecureSocksProxySettings } from './SecureSocksProxySettings'; import { TLSAuthSettings } from './TLSAuthSettings'; import { HttpSettingsProps } from './types'; -const ACCESS_OPTIONS: Array> = [ - { - label: t('grafana-ui.data-source-http-settings.access-options-proxy', 'Server (default)'), - value: 'proxy', - }, - { - label: t('grafana-ui.data-source-http-settings.access-options-browser', 'Browser'), - value: 'direct', - }, -]; - -const DEFAULT_ACCESS_OPTION = { - label: t('grafana-ui.data-source-http-settings.access-options-proxy', 'Server (default)'), - value: 'proxy', -}; +const ACCESS_HELP_ID = 'grafana-http-access-help'; const HttpAccessHelp = () => { return ( - // eslint-disable-next-line @grafana/no-untranslated-strings - +

Access mode controls how requests to the data source will be handled. @@ -79,6 +70,9 @@ const HttpAccessHelp = () => { const LABEL_WIDTH = 26; +/** + * @deprecated Use components from `@grafana/plugin-ui` instead, according to the [migration guide](https://github.com/grafana/plugin-ui/blob/main/src/components/ConfigEditor/migrating-from-datasource-http-settings.md). + */ export const DataSourceHttpSettings = (props: HttpSettingsProps) => { const { defaultUrl, @@ -94,6 +88,22 @@ export const DataSourceHttpSettings = (props: HttpSettingsProps) => { urlDocs, } = props; + const ACCESS_OPTIONS: Array> = useMemo( + () => [ + { + label: t('grafana-ui.data-source-http-settings.server-mode-label', 'Server (default)'), + value: 'proxy', + }, + { + label: t('grafana-ui.data-source-http-settings.browser-mode-label', 'Browser'), + value: 'direct', + }, + ], + [] + ); + + const DEFAULT_ACCESS_OPTION = useMemo(() => ACCESS_OPTIONS[0], [ACCESS_OPTIONS]); + const [isAccessHelpVisible, setIsAccessHelpVisible] = useState(false); const [azureAuthEnabled, setAzureAuthEnabled] = useState(false); const theme = useTheme2(); @@ -160,246 +170,235 @@ export const DataSourceHttpSettings = (props: HttpSettingsProps) => { ); } - const accessSelect = ( - onSettingsChange({ url: event.currentTarget.value })} - disabled={dataSourceConfig.readOnly} - /> - ); - return ( -

- <> + +

HTTP

-
-
- -
- {showAccessOptions && ( - <> -
-
- -
-
- -
-
- {isAccessHelpVisible && } - - )} - {dataSourceConfig.access === 'proxy' && ( -
-
- - Allowed cookies - - - onSettingsChange({ jsonData: { ...dataSourceConfig.jsonData, keepCookies: cookies } }) + + onSettingsChange({ url: event.currentTarget.value })} + /> + + + {showAccessOptions && ( + <> + + + o.value === dataSourceConfig.access)?.value || + DEFAULT_ACCESS_OPTION.value } - disabled={dataSourceConfig.readOnly} + onChange={(selectedValue) => onSettingsChange({ access: selectedValue })} /> -
-
- { - onSettingsChange({ - jsonData: { ...dataSourceConfig.jsonData, timeout: parseInt(event.currentTarget.value, 10) }, - }); - }} - disabled={dataSourceConfig.readOnly} - /> -
-
- )} -
- + + + - <> -

- Auth -

-
-
- } + + )} + {dataSourceConfig.access === 'proxy' && ( + <> + - { - onSettingsChange({ basicAuth: event!.currentTarget.checked }); - }} + + onSettingsChange({ jsonData: { ...dataSourceConfig.jsonData, keepCookies: cookies } }) + } + disabled={dataSourceConfig.readOnly} /> - + - - { - onSettingsChange({ withCredentials: event!.currentTarget.checked }); + onSettingsChange({ + jsonData: { ...dataSourceConfig.jsonData, timeout: parseInt(event.currentTarget.value, 10) }, + }); }} /> - -
+ + + )} +
- {azureAuthSettings?.azureAuthSupported && ( -
+
+

+ Auth +

+ +
+
{ - onSettingsChange( - azureAuthSettings.setAzureAuthEnabled(dataSourceConfig, event!.currentTarget.checked) - ); + onSettingsChange({ basicAuth: event!.currentTarget.checked }); }} /> -
- )} - {sigV4AuthToggleEnabled && ( -
{ - onSettingsChange({ - jsonData: { ...dataSourceConfig.jsonData, sigV4Auth: event!.currentTarget.checked }, - }); + onSettingsChange({ withCredentials: event!.currentTarget.checked }); }} /> + + {azureAuthSettings?.azureAuthSupported && ( + + { + onSettingsChange( + azureAuthSettings.setAzureAuthEnabled(dataSourceConfig, event!.currentTarget.checked) + ); + }} + /> + + )} + + {sigV4AuthToggleEnabled && ( + + { + onSettingsChange({ + jsonData: { ...dataSourceConfig.jsonData, sigV4Auth: event!.currentTarget.checked }, + }); + }} + /> + + )}
- )} - {dataSourceConfig.access === 'proxy' && ( - onSettingsChange({ jsonData })} - showForwardOAuthIdentityOption={azureAuthEnabled ? false : showForwardOAuthIdentityOption} - /> - )} -
- {dataSourceConfig.basicAuth && ( - <> -
- Basic Auth Details -
-
+ {dataSourceConfig.access === 'proxy' && ( + onSettingsChange({ jsonData })} + showForwardOAuthIdentityOption={azureAuthEnabled ? false : showForwardOAuthIdentityOption} + /> + )} +
+ + {dataSourceConfig.basicAuth && ( +
+ + Basic Auth Details + + -
- - )} + + )} - {azureAuthSettings?.azureAuthSupported && azureAuthEnabled && azureAuthSettings.azureSettingsUI && ( - - )} + {azureAuthSettings?.azureAuthSupported && azureAuthEnabled && azureAuthSettings.azureSettingsUI && ( + + )} - {dataSourceConfig.jsonData.sigV4Auth && sigV4AuthToggleEnabled && renderSigV4Editor} - {(dataSourceConfig.jsonData.tlsAuth || dataSourceConfig.jsonData.tlsAuthWithCACert) && ( - - )} + {dataSourceConfig.jsonData.sigV4Auth && sigV4AuthToggleEnabled && renderSigV4Editor} + {(dataSourceConfig.jsonData.tlsAuth || dataSourceConfig.jsonData.tlsAuthWithCACert) && ( + + )} - {dataSourceConfig.access === 'proxy' && ( - - )} - + {dataSourceConfig.access === 'proxy' && ( + + )} +
+ {secureSocksDSProxyEnabled && } -
+ ); }; diff --git a/packages/grafana-ui/src/components/DataSourceSettings/HttpProxySettings.tsx b/packages/grafana-ui/src/components/DataSourceSettings/HttpProxySettings.tsx index 8281c3b8ed0..ae570dc4769 100644 --- a/packages/grafana-ui/src/components/DataSourceSettings/HttpProxySettings.tsx +++ b/packages/grafana-ui/src/components/DataSourceSettings/HttpProxySettings.tsx @@ -1,5 +1,11 @@ +import { css } from '@emotion/css'; + +import { GrafanaTheme2 } from '@grafana/data'; + +import { useStyles2 } from '../../themes'; import { t } from '../../utils/i18n'; import { InlineField } from '../Forms/InlineField'; +import { Stack } from '../Layout/Stack/Stack'; import { InlineSwitch } from '../Switch/Switch'; import { HttpSettingsBaseProps } from './types'; @@ -11,9 +17,10 @@ export const HttpProxySettings = ({ onChange, showForwardOAuthIdentityOption = true, }: HttpSettingsBaseProps) => { + const gridLayout = useStyles2(getGridLayout); return ( - <> -
+
+ -
-
+ + + onChange({ ...dataSourceConfig.jsonData, tlsSkipVerify: event!.currentTarget.checked })} + /> + + {showForwardOAuthIdentityOption && ( - onChange({ ...dataSourceConfig.jsonData, tlsSkipVerify: event!.currentTarget.checked }) + onChange({ ...dataSourceConfig.jsonData, oauthPassThru: event!.currentTarget.checked }) } /> -
- {showForwardOAuthIdentityOption && ( -
- - - onChange({ ...dataSourceConfig.jsonData, oauthPassThru: event!.currentTarget.checked }) - } - /> - -
)} - +
); }; + +const getGridLayout = (theme: GrafanaTheme2) => + css({ + display: 'grid', + gridTemplateColumns: 'auto', + gap: 0, // Inline field has a margin + }); diff --git a/packages/grafana-ui/src/components/DataSourceSettings/SecureSocksProxySettings.tsx b/packages/grafana-ui/src/components/DataSourceSettings/SecureSocksProxySettings.tsx index 67a1d74d934..56e82d8a494 100644 --- a/packages/grafana-ui/src/components/DataSourceSettings/SecureSocksProxySettings.tsx +++ b/packages/grafana-ui/src/components/DataSourceSettings/SecureSocksProxySettings.tsx @@ -16,7 +16,7 @@ export function SecureSocksProxySettings({ onOptionsChange, }: Props): JSX.Element { return ( - <> +

Secure Socks Proxy

@@ -44,6 +44,6 @@ export function SecureSocksProxySettings({
- +
); } diff --git a/packages/grafana-ui/src/components/FormField/FormField.tsx b/packages/grafana-ui/src/components/FormField/FormField.tsx index 4de155dcfb2..a0bc181d284 100644 --- a/packages/grafana-ui/src/components/FormField/FormField.tsx +++ b/packages/grafana-ui/src/components/FormField/FormField.tsx @@ -21,8 +21,9 @@ export interface Props extends InputHTMLAttributes { /** * Default form field including label used in Grafana UI. Default input element is simple . You can also pass * custom inputEl if required in which case inputWidth and inputProps are ignored. - * @deprecated Please use the {@link Field} component, {@link https://developers.grafana.com/ui/latest/index.html?path=/story/forms-field--simple See Storybook}. + * * For inline fields, use {@link InlineField}, {@link https://developers.grafana.com/ui/latest/index.html?path=/story/forms-inlinefield--basic See Storybook}. + * @deprecated Please use the {@link Field} component, {@link https://developers.grafana.com/ui/latest/index.html?path=/story/forms-field--simple See Storybook}. */ export const FormField = ({ label, diff --git a/public/locales/en-US/grafana.json b/public/locales/en-US/grafana.json index 3d1bb21e1d3..cfd0d0f453d 100644 --- a/public/locales/en-US/grafana.json +++ b/public/locales/en-US/grafana.json @@ -1858,31 +1858,32 @@ "data-source-http-settings": { "access-help": "Help <1>", "access-help-details": "Access mode controls how requests to the data source will be handled.<1> <1>Server should be the preferred way if nothing else is stated.", + "access-help-title": "Access help", "access-label": "Access", - "access-options-browser": "Browser", - "access-options-proxy": "Server (default)", "allowed-cookies": "Allowed cookies", - "allowed-cookies-tooltip": "Grafana proxy deletes forwarded cookies by default. Specify cookies by name that should be forwarded to the data source.", + "allowed-cookies-description": "Grafana proxy deletes forwarded cookies by default. Specify cookies by name that should be forwarded to the data source.", "auth": "Auth", "azure-auth-label": "Azure Authentication", "azure-auth-tooltip": "Use Azure authentication for Azure endpoint.", "basic-auth": "Basic Auth Details", "basic-auth-label": "Basic auth", "browser-mode-description": "All requests will be made from the browser directly to the data source and may be subject to Cross-Origin Resource Sharing (CORS) requirements. The URL needs to be accessible from the browser if you select this access mode.", + "browser-mode-label": "Browser", "browser-mode-title": "<0>Browser access mode:", - "default-url-access-select": "Access", "default-url-tooltip": "Specify a complete HTTP URL (for example http://your_server:8080)", "direct-url-tooltip": "Your access method is <1>Browser, this means the URL needs to be accessible from the browser.", "heading": "HTTP", + "invalid-url-error": "Invalid URL", "proxy-url-tooltip": "Your access method is <1>Server, this means the URL needs to be accessible from the grafana backend/server.", "server-mode-description": "All requests will be made from the browser to Grafana backend/server which in turn will forward the requests to the data source and by that circumvent possible Cross-Origin Resource Sharing (CORS) requirements. The URL needs to be accessible from the grafana backend/server if you select this access mode.", + "server-mode-label": "Server (default)", "server-mode-title": "<0>Server access mode (Default):", - "timeout-form-label": "Timeout", - "timeout-label": "Timeout in seconds", - "timeout-tooltip": "HTTP request timeout in seconds", - "url-label": "URL", - "with-credential-label": "With Credentials", - "with-credential-tooltip": "Whether credentials such as cookies or auth headers should be sent with cross-site requests." + "sigv4-auth-label": "SigV4 auth", + "timeout-description": "HTTP request timeout in seconds", + "timeout-label": "Timeout", + "timeout-placeholder": "Timeout in seconds", + "with-credentials-label": "With Credentials", + "with-credentials-tooltip": "Whether credentials such as cookies or auth headers should be sent with cross-site requests." }, "data-source-settings": { "alerting-settings-heading": "Alerting", diff --git a/public/locales/pseudo-LOCALE/grafana.json b/public/locales/pseudo-LOCALE/grafana.json new file mode 100644 index 00000000000..3395a016219 --- /dev/null +++ b/public/locales/pseudo-LOCALE/grafana.json @@ -0,0 +1,3714 @@ +{ + "_comment": "Ŧĥę čőđę įş ŧĥę şőūřčę őƒ ŧřūŧĥ ƒőř Ēʼnģľįşĥ pĥřäşęş. Ŧĥęy şĥőūľđ þę ūpđäŧęđ įʼn ŧĥę čőmpőʼnęʼnŧş đįřęčŧľy, äʼnđ äđđįŧįőʼnäľ pľūřäľş şpęčįƒįęđ įʼn ŧĥįş ƒįľę.", + "access-control": { + "add-permission": { + "role-label": "Ŗőľę", + "serviceaccount-label": "Ŝęřvįčę Åččőūʼnŧ", + "team-label": "Ŧęäm", + "title": "Åđđ pęřmįşşįőʼn ƒőř", + "user-label": "Ůşęř" + }, + "add-permissions": { + "save": "Ŝävę" + }, + "permission-list": { + "permission": "Pęřmįşşįőʼn" + }, + "permission-list-item": { + "inherited": "Ĩʼnĥęřįŧęđ ƒřőm ƒőľđęř" + }, + "permissions": { + "add-label": "Åđđ ä pęřmįşşįőʼn", + "no-permissions": "Ŧĥęřę äřę ʼnő pęřmįşşįőʼnş", + "permissions-change-warning": "Ŧĥįş ŵįľľ čĥäʼnģę pęřmįşşįőʼnş ƒőř ŧĥįş ƒőľđęř äʼnđ äľľ įŧş đęşčęʼnđäʼnŧş. Ĩʼn ŧőŧäľ, ŧĥįş ŵįľľ 䃃ęčŧ:", + "role": "Ŗőľę", + "serviceaccount": "Ŝęřvįčę Åččőūʼnŧ", + "team": "Ŧęäm", + "title": "Pęřmįşşįőʼnş", + "user": "Ůşęř" + } + }, + "action-editor": { + "modal": { + "cancel-button": "Cäʼnčęľ", + "save-button": "Ŝävę" + } + }, + "admin": { + "anon-users": { + "not-found": "Ńő äʼnőʼnymőūş ūşęřş ƒőūʼnđ." + }, + "edit-org": { + "access-denied": "Ÿőū đő ʼnőŧ ĥävę pęřmįşşįőʼn ŧő şęę ūşęřş įʼn ŧĥįş őřģäʼnįžäŧįőʼn. Ŧő ūpđäŧę ŧĥįş őřģäʼnįžäŧįőʼn, čőʼnŧäčŧ yőūř şęřvęř äđmįʼnįşŧřäŧőř.", + "heading": "Ēđįŧ Øřģäʼnįžäŧįőʼn", + "update-button": "Ůpđäŧę", + "users-heading": "Øřģäʼnįžäŧįőʼn ūşęřş" + }, + "feature-toggles": { + "sub-title": "Vįęŵ äʼnđ ęđįŧ ƒęäŧūřę ŧőģģľęş. Ŗęäđ mőřę äþőūŧ ƒęäŧūřę ŧőģģľęş äŧ <2>ģřäƒäʼnä.čőm." + }, + "get-enterprise": { + "contact-us": "Cőʼnŧäčŧ ūş äʼnđ ģęŧ ä ƒřęę ŧřįäľ", + "description": "Ÿőū čäʼn ūşę ŧĥę ŧřįäľ vęřşįőʼn ƒőř ƒřęę ƒőř 30 đäyş. Ŵę ŵįľľ řęmįʼnđ yőū äþőūŧ įŧ ƒįvę đäyş þęƒőřę ŧĥę ŧřįäľ pęřįőđ ęʼnđş.", + "features-heading": "Ēʼnĥäʼnčęđ ƒūʼnčŧįőʼnäľįŧy", + "included-description": "Ĩʼnđęmʼnįƒįčäŧįőʼn, ŵőřĸįʼnģ ŵįŧĥ Ğřäƒäʼnä Ŀäþş őʼn ƒūŧūřę přįőřįŧįžäŧįőʼn, äʼnđ ŧřäįʼnįʼnģ ƒřőm ŧĥę čőřę Ğřäƒäʼnä ŧęäm.", + "included-heading": "Åľşő įʼnčľūđęđ:", + "service-title": "Åŧ yőūř şęřvįčę", + "team-sync-details": "ĿĐÅP, ĞįŧĦūþ ØÅūŧĥ, Åūŧĥ Přőχy, Øĸŧä", + "title": "Ğęŧ Ğřäƒäʼnä Ēʼnŧęřpřįşę" + }, + "ldap": { + "test-mapping-heading": "Ŧęşŧ ūşęř mäppįʼnģ", + "test-mapping-run-button": "Ŗūʼn" + }, + "ldap-permissions": { + "active": "<0> Åčŧįvę", + "admin": "<0> Ÿęş", + "inactive": "<0> Ĩʼnäčŧįvę" + }, + "ldap-status": { + "title": "ĿĐÅP Cőʼnʼnęčŧįőʼn" + }, + "ldap-sync": { + "debug-button": "Đęþūģ ĿĐÅP Mäppįʼnģ", + "external-sync-description": "Ůşęř şyʼnčęđ vįä ĿĐÅP. Ŝőmę čĥäʼnģęş mūşŧ þę đőʼnę įʼn ĿĐÅP őř mäppįʼnģş.", + "external-sync-label": "Ēχŧęřʼnäľ şyʼnč", + "next-sync-label": "Ńęχŧ şčĥęđūľęđ şyʼnčĥřőʼnįžäŧįőʼn", + "not-enabled": "Ńőŧ ęʼnäþľęđ", + "sync-button": "Ŝyʼnč ūşęř", + "title": "ĿĐÅP Ŝyʼnčĥřőʼnįşäŧįőʼn" + }, + "ldap-sync-info": { + "title": "ĿĐÅP Ŝyʼnčĥřőʼnįžäŧįőʼn" + }, + "ldap-user-groups": { + "no-org-found": "Ńő mäŧčĥ <2><0>" + }, + "ldap-user-info": { + "no-team": "Ńő ŧęämş ƒőūʼnđ vįä ĿĐÅP" + }, + "org-uers": { + "last-seen-never": "Ńęvęř" + }, + "org-users": { + "not-editable": "Ŧĥįş ūşęř'ş řőľę įş ʼnőŧ ęđįŧäþľę þęčäūşę įŧ įş şyʼnčĥřőʼnįžęđ ƒřőm yőūř äūŧĥ přővįđęř. Ŗęƒęř ŧő ŧĥę <1>Ğřäƒäʼnä äūŧĥęʼnŧįčäŧįőʼn đőčş ƒőř đęŧäįľş." + }, + "orgs": { + "delete-body": "Åřę yőū şūřę yőū ŵäʼnŧ ŧő đęľęŧę '{{deleteOrgName}}'?<3> <5>Åľľ đäşĥþőäřđş ƒőř ŧĥįş őřģäʼnįžäŧįőʼn ŵįľľ þę řęmővęđ!", + "id-header": "ĨĐ", + "name-header": "Ńämę", + "new-org-button": "Ńęŵ őřģ" + }, + "server-settings": { + "alerts-button": "Mäʼnäģę äľęřŧş", + "dashboards-button": "Mäʼnäģę đäşĥþőäřđş", + "data-sources-button": "Mäʼnäģę đäŧä şőūřčęş", + "not-found": "Ńő şŧäŧş ƒőūʼnđ.", + "title": "Ĩʼnşŧäʼnčę şŧäŧįşŧįčş", + "users-button": "Mäʼnäģę ūşęřş" + }, + "settings": { + "info-description": "Ŧĥęşę şyşŧęm şęŧŧįʼnģş äřę đęƒįʼnęđ įʼn ģřäƒäʼnä.įʼnį őř čūşŧőm.įʼnį (őř ővęřřįđđęʼn įʼn ĒŃV väřįäþľęş). Ŧő čĥäʼnģę ŧĥęşę yőū čūřřęʼnŧľy ʼnęęđ ŧő řęşŧäřŧ Ğřäƒäʼnä." + }, + "upgrade-info": { + "title": "Ēʼnŧęřpřįşę ľįčęʼnşę" + }, + "user-orgs": { + "add-button": "Åđđ ūşęř ŧő őřģäʼnįžäŧįőʼn", + "change-role-button": "Cĥäʼnģę řőľę", + "external-user-tooltip": "Ŧĥįş ūşęř'ş þūįľŧ-įʼn řőľę įş ʼnőŧ ęđįŧäþľę þęčäūşę įŧ įş şyʼnčĥřőʼnįžęđ ƒřőm yőūř äūŧĥ přővįđęř. Ŗęƒęř ŧő ŧĥę <1>Ğřäƒäʼnä äūŧĥęʼnŧįčäŧįőʼn đőčş ƒőř đęŧäįľş.", + "remove-button": "Ŗęmővę ƒřőm őřģäʼnįžäŧįőʼn", + "role-not-editable": "Ŧĥįş ūşęř'ş řőľę įş ʼnőŧ ęđįŧäþľę þęčäūşę įŧ įş şyʼnčĥřőʼnįžęđ ƒřőm yőūř äūŧĥ přővįđęř. Ŗęƒęř ŧő ŧĥę <1>Ğřäƒäʼnä äūŧĥęʼnŧįčäŧįőʼn đőčş ƒőř đęŧäįľş.", + "title": "Øřģäʼnįžäŧįőʼnş" + }, + "user-orgs-modal": { + "add-button": "Åđđ ŧő őřģäʼnįžäŧįőʼn", + "cancel-button": "Cäʼnčęľ" + }, + "user-permissions": { + "change-button": "Cĥäʼnģę", + "grafana-admin-key": "Ğřäƒäʼnä Åđmįʼn", + "grafana-admin-no": "Ńő", + "grafana-admin-yes": "Ÿęş", + "title": "Pęřmįşşįőʼnş" + }, + "user-profile": { + "delete-button": "Đęľęŧę ūşęř", + "disable-button": "Đįşäþľę ūşęř", + "edit-button": "Ēđįŧ", + "enable-button": "Ēʼnäþľę ūşęř", + "title": "Ůşęř įʼnƒőřmäŧįőʼn" + }, + "user-sessions": { + "browser-column": "ßřőŵşęř äʼnđ ØŜ", + "force-logout-all-button": "Főřčę ľőģőūŧ ƒřőm äľľ đęvįčęş", + "force-logout-button": "Főřčę ľőģőūŧ", + "ip-column": "ĨP äđđřęşş", + "last-seen-column": "Ŀäşŧ şęęʼn", + "logged-on-column": "Ŀőģģęđ őʼn", + "title": "Ŝęşşįőʼnş" + }, + "users-create": { + "create-button": "Cřęäŧę ūşęř" + }, + "users-list": { + "create-button": "Ńęŵ ūşęř" + }, + "users-table": { + "last-seen-never": "Ńęvęř", + "no-licensed-roles": "Ńőŧ äşşįģʼnęđ" + } + }, + "alert-labels": { + "button": { + "hide": "Ħįđę čőmmőʼn ľäþęľş", + "show": { + "tooltip": "Ŝĥőŵ čőmmőʼn ľäþęľş" + } + } + }, + "alerting": { + "alert": { + "alert-state": "Åľęřŧ şŧäŧę", + "annotations": "Åʼnʼnőŧäŧįőʼnş", + "evaluation": "Ēväľūäŧįőʼn", + "evaluation-paused": "Åľęřŧ ęväľūäŧįőʼn čūřřęʼnŧľy päūşęđ", + "evaluation-paused-description": "Ńőŧįƒįčäŧįőʼnş ƒőř ŧĥįş řūľę ŵįľľ ʼnőŧ ƒįřę äʼnđ ʼnő äľęřŧ įʼnşŧäʼnčęş ŵįľľ þę čřęäŧęđ ūʼnŧįľ ŧĥę řūľę įş ūʼn-päūşęđ.", + "last-evaluated": "Ŀäşŧ ęväľūäŧęđ", + "last-evaluation-duration": "Ŀäşŧ ęväľūäŧįőʼn đūřäŧįőʼn", + "last-updated-at": "Ŀäşŧ ūpđäŧęđ äŧ", + "last-updated-by": "Ŀäşŧ ūpđäŧęđ þy", + "no-annotations": "Ńő äʼnʼnőŧäŧįőʼnş", + "pending-period": "Pęʼnđįʼnģ pęřįőđ", + "rule": "Ŗūľę", + "rule-identifier": "Ŗūľę įđęʼnŧįƒįęř", + "rule-type": "Ŗūľę ŧypę", + "state-error-timeout": "Åľęřŧ şŧäŧę įƒ ęχęčūŧįőʼn ęřřőř őř ŧįmęőūŧ", + "state-no-data": "Åľęřŧ şŧäŧę įƒ ʼnő đäŧä őř äľľ väľūęş äřę ʼnūľľ" + }, + "alert-recording-rule-form": { + "evaluation-behaviour": { + "description": { + "text": "Đęƒįʼnę ĥőŵ ŧĥę řęčőřđįʼnģ řūľę įş ęväľūäŧęđ." + } + } + }, + "alert-rules": { + "firing-for": "Fįřįʼnģ ƒőř", + "next-evaluation": "Ńęχŧ ęväľūäŧįőʼn", + "next-evaluation-in": "ʼnęχŧ ęväľūäŧįőʼn įʼn", + "rule-definition": "Ŗūľę đęƒįʼnįŧįőʼn" + }, + "alertform": { + "labels": { + "alerting": "Åđđ ľäþęľş ŧő yőūř řūľę ƒőř şęäřčĥįʼnģ, şįľęʼnčįʼnģ, őř řőūŧįʼnģ ŧő ä ʼnőŧįƒįčäŧįőʼn pőľįčy.", + "recording": "Åđđ ľäþęľş ŧő yőūř řūľę." + } + }, + "annotations": { + "description": "Åđđ mőřę čőʼnŧęχŧ ŧő yőūř äľęřŧ ʼnőŧįƒįčäŧįőʼnş.", + "title": "Cőʼnƒįģūřę ʼnőŧįƒįčäŧįőʼn męşşäģę" + }, + "central-alert-history": { + "details": { + "error": "Ēřřőř ľőäđįʼnģ řūľę ƒőř ŧĥįş ęvęʼnŧ.", + "header": { + "alert-rule": "Åľęřŧ řūľę", + "instance": "Ĩʼnşŧäʼnčę", + "state": "Ŝŧäŧę", + "timestamp": "Ŧįmęşŧämp" + }, + "loading": "Ŀőäđįʼnģ...", + "no-recognized-state": "Ńő řęčőģʼnįžęđ şŧäŧę", + "no-values": "Ńő väľūęş", + "not-found": "Ŗūľę ʼnőŧ ƒőūʼnđ ƒőř ŧĥįş ęvęʼnŧ.", + "number-transitions": "Ŝŧäŧę ŧřäʼnşįŧįőʼnş ƒőř şęľęčŧęđ pęřįőđ:", + "state": { + "alerting": "Åľęřŧįʼnģ", + "error": "Ēřřőř", + "no-data": "Ńő đäŧä", + "normal": "Ńőřmäľ", + "pending": "Pęʼnđįʼnģ" + }, + "state-transitions": "Ŝŧäŧę ŧřäʼnşįŧįőʼn", + "unknown-event-state": "Ůʼnĸʼnőŵʼn", + "unknown-rule": "Ůʼnĸʼnőŵʼn", + "value-in-transition": "Väľūę įʼn ŧřäʼnşįŧįőʼn" + }, + "error": "Ŝőmęŧĥįʼnģ ŵęʼnŧ ŵřőʼnģ ľőäđįʼnģ ŧĥę äľęřŧ şŧäŧę ĥįşŧőřy", + "filter": { + "clear": "Cľęäř ƒįľŧęřş", + "info": { + "label1": "Fįľŧęř ęvęʼnŧş ūşįʼnģ ľäþęľ qūęřyįʼnģ ŵįŧĥőūŧ şpäčęş, ęχ:", + "label2": "Ĩʼnväľįđ ūşę őƒ şpäčęş:", + "label3": "Väľįđ ūşę őƒ şpäčęş:", + "label4": "Fįľŧęř äľęřŧş ūşįʼnģ ľäþęľ qūęřyįʼnģ ŵįŧĥőūŧ þřäčęş, ęχ:" + } + }, + "filterBy": "Fįľŧęř þy:", + "too-many-events": { + "text": "Ŧĥę şęľęčŧęđ ŧįmę pęřįőđ ĥäş ŧőő mäʼny ęvęʼnŧş ŧő đįşpľäy. Đįpľäyįʼnģ ŧĥę ľäŧęşŧ 5000 ęvęʼnŧş. Ŧřy ūşįʼnģ ä şĥőřŧęř ŧįmę pęřįőđ.", + "title": "Ůʼnäþľę ŧő đįşpľäy äľľ ęvęʼnŧş" + } + }, + "common": { + "cancel": "Cäʼnčęľ", + "clear-filters": "Cľęäř ƒįľŧęřş", + "delete": "Đęľęŧę", + "edit": "Ēđįŧ", + "export": "Ēχpőřŧ", + "export-all": "Ēχpőřŧ äľľ", + "loading": "Ŀőäđįʼnģ...", + "search-by-matchers": "Ŝęäřčĥ þy mäŧčĥęřş", + "view": "Vįęŵ" + }, + "contact-points": { + "create": "Cřęäŧę čőʼnŧäčŧ pőįʼnŧ", + "custom-template-value": "Cūşŧőm ŧęmpľäŧę väľūę", + "delete-reasons": { + "heading": "Cőʼnŧäčŧ pőįʼnŧ čäʼnʼnőŧ þę đęľęŧęđ ƒőř ŧĥę ƒőľľőŵįʼnģ řęäşőʼnş:", + "no-permissions": "Ÿőū đő ʼnőŧ ĥävę ŧĥę řęqūįřęđ pęřmįşşįőʼn ŧő đęľęŧę ŧĥįş čőʼnŧäčŧ pőįʼnŧ", + "policies": "Cőʼnŧäčŧ pőįʼnŧ įş řęƒęřęʼnčęđ þy őʼnę őř mőřę ʼnőŧįƒįčäŧįőʼn pőľįčįęş", + "provisioned": "Cőʼnŧäčŧ pőįʼnŧ įş přővįşįőʼnęđ äʼnđ čäʼnʼnőŧ þę đęľęŧęđ vįä ŧĥę ŮĨ", + "rules": "Cőʼnŧäčŧ pőįʼnŧ įş řęƒęřęʼnčęđ þy őʼnę őř mőřę äľęřŧ řūľęş" + }, + "delivered-to": "Đęľįvęřęđ ŧő", + "delivery-duration": "Ŀäşŧ đęľįvęřy ŧőőĸ <1>", + "empty-state": { + "title": "Ÿőū đőʼn'ŧ ĥävę äʼny čőʼnŧäčŧ pőįʼnŧş yęŧ" + }, + "last-delivery-attempt": "Ŀäşŧ đęľįvęřy äŧŧęmpŧ", + "last-delivery-failed": "Ŀäşŧ đęľįvęřy äŧŧęmpŧ ƒäįľęđ", + "no-contact-points-found": "Ńő čőʼnŧäčŧ pőįʼnŧş ƒőūʼnđ", + "no-delivery-attempts": "Ńő đęľįvęřy äŧŧęmpŧş", + "no-integrations": "Ńő įʼnŧęģřäŧįőʼnş čőʼnƒįģūřęđ", + "only-firing": "Đęľįvęřįʼnģ <1>őʼnľy ƒįřįʼnģ ʼnőŧįƒįčäŧįőʼnş", + "receiver-summary": { + "jira": "Cřęäŧęş ä \"{{issueType}}\" įşşūę įʼn ŧĥę \"{{project}}\" přőĵęčŧ" + }, + "telegram": { + "parse-mode-warning-body": "Ĩƒ yőū ūşę ä <1>päřşę_mőđę őpŧįőʼn őŧĥęř ŧĥäʼn <3>Ńőʼnę, ŧřūʼnčäŧįőʼn mäy řęşūľŧ įʼn äʼn įʼnväľįđ męşşäģę, čäūşįʼnģ ŧĥę ʼnőŧįƒįčäŧįőʼn ŧő ƒäįľ. Főř ľőʼnģęř męşşäģęş, ŵę řęčőmmęʼnđ ūşįʼnģ äʼn äľŧęřʼnäŧįvę čőʼnŧäčŧ męŧĥőđ.", + "parse-mode-warning-title": "Ŧęľęģřäm męşşäģęş äřę ľįmįŧęđ ŧő 4096 ŮŦF-8 čĥäřäčŧęřş." + }, + "used-by_one": "Ůşęđ þy {{ count }} ʼnőŧįƒįčäŧįőʼn pőľįčy", + "used-by_other": "Ůşęđ þy {{ count }} ʼnőŧįƒįčäŧįőʼn pőľįčy", + "used-by-rules_one": "Ůşęđ þy {{ count }} äľęřŧ řūľę", + "used-by-rules_other": "Ůşęđ þy {{ count }} äľęřŧ řūľę" + }, + "contactPointFilter": { + "label": "Cőʼnŧäčŧ pőįʼnŧ" + }, + "copy-to-clipboard": "Cőpy \"{{label}}\" ŧő čľįpþőäřđ", + "export": { + "subtitle": { + "formats": "Ŝęľęčŧ ŧĥę ƒőřmäŧ äʼnđ đőŵʼnľőäđ ŧĥę ƒįľę őř čőpy ŧĥę čőʼnŧęʼnŧş ŧő čľįpþőäřđ", + "one-format": "Đőŵʼnľőäđ ŧĥę ƒįľę őř čőpy ŧĥę čőʼnŧęʼnŧş ŧő čľįpþőäřđ" + } + }, + "folderAndGroup": { + "evaluation": { + "modal": { + "text": { + "alerting": "Cřęäŧę ä ʼnęŵ ęväľūäŧįőʼn ģřőūp ŧő ūşę ƒőř ŧĥįş äľęřŧ řūľę.", + "recording": "Cřęäŧę ä ʼnęŵ ęväľūäŧįőʼn ģřőūp ŧő ūşę ƒőř ŧĥįş řęčőřđįʼnģ řūľę." + } + } + } + }, + "group-actions": { + "actions-trigger": "Ŗūľę ģřőūp äčŧįőʼnş", + "delete": "Đęľęŧę", + "edit": "Ēđįŧ", + "export": "Ēχpőřŧ", + "reorder": "Ŗę-őřđęř řūľęş" + }, + "list-view": { + "empty": { + "new-alert-rule": "Ńęŵ äľęřŧ řūľę", + "new-recording-rule": "Ńęŵ řęčőřđįʼnģ řūľę", + "provisioning": "Ÿőū čäʼn äľşő đęƒįʼnę řūľęş ŧĥřőūģĥ ƒįľę přővįşįőʼnįʼnģ őř Ŧęřřäƒőřm. <2>Ŀęäřʼn mőřę" + }, + "section": { + "dataSourceManaged": { + "title": "Đäŧä şőūřčę-mäʼnäģęđ" + }, + "grafanaManaged": { + "export-new-rule": "Ēχpőřŧ řūľę đęƒįʼnįŧįőʼn", + "export-rules": "Ēχpőřŧ řūľęş", + "loading": "Ŀőäđįʼnģ...", + "new-recording-rule": "Ńęŵ řęčőřđįʼnģ řūľę", + "title": "Ğřäƒäʼnä-mäʼnäģęđ" + } + } + }, + "manage-permissions": { + "button": "Mäʼnäģę pęřmįşşįőʼnş", + "title": "Mäʼnäģę pęřmįşşįőʼnş" + }, + "mute_timings": { + "error-loading": { + "description": "Cőūľđ ʼnőŧ ľőäđ mūŧę ŧįmįʼnģş. Pľęäşę ŧřy äģäįʼn ľäŧęř.", + "title": "Ēřřőř ľőäđįʼnģ mūŧę ŧįmįʼnģş" + } + }, + "mute-timings": { + "add-mute-timing": "Åđđ mūŧę ŧįmįʼnģ", + "description": "Ēʼnŧęř şpęčįƒįč ŧįmę įʼnŧęřväľş ŵĥęʼn ʼnőŧ ŧő şęʼnđ ʼnőŧįƒįčäŧįőʼnş őř ƒřęęžę ʼnőŧįƒįčäŧįőʼnş ƒőř řęčūřřįʼnģ pęřįőđş őƒ ŧįmę.", + "save": "Ŝävę mūŧę ŧįmįʼnģ", + "saving": "Ŝävįʼnģ mūŧę ŧįmįʼnģ" + }, + "notification-preview": { + "alertmanager": "Åľęřŧmäʼnäģęř:", + "error": "Cőūľđ ʼnőŧ ľőäđ řőūŧįʼnģ přęvįęŵ ƒőř {{alertmanager}}", + "initialized": "ßäşęđ őʼn ŧĥę ľäþęľş äđđęđ, äľęřŧ įʼnşŧäʼnčęş äřę řőūŧęđ ŧő ŧĥę ƒőľľőŵįʼnģ ʼnőŧįƒįčäŧįőʼn pőľįčįęş. Ēχpäʼnđ ęäčĥ ʼnőŧįƒįčäŧįőʼn pőľįčy þęľőŵ ŧő vįęŵ mőřę đęŧäįľş.", + "preview-routing": "Přęvįęŵ řőūŧįʼnģ", + "title": "Åľęřŧ įʼnşŧäʼnčę řőūŧįʼnģ přęvįęŵ", + "uninitialized": "Ŵĥęʼn yőū ĥävę yőūř ƒőľđęř şęľęčŧęđ äʼnđ yőūř qūęřy äʼnđ ľäþęľş äřę čőʼnƒįģūřęđ, čľįčĸ \"Přęvįęŵ řőūŧįʼnģ\" ŧő şęę ŧĥę řęşūľŧş ĥęřę." + }, + "policies": { + "default-policy": { + "description": "Åľľ äľęřŧ įʼnşŧäʼnčęş ŵįľľ þę ĥäʼnđľęđ þy ŧĥę đęƒäūľŧ pőľįčy įƒ ʼnő őŧĥęř mäŧčĥįʼnģ pőľįčįęş äřę ƒőūʼnđ.", + "title": "Đęƒäūľŧ pőľįčy", + "update": "Ůpđäŧę đęƒäūľŧ pőľįčy" + }, + "delete": { + "confirm": "Ÿęş, đęľęŧę pőľįčy", + "warning-1": "Đęľęŧįʼnģ ŧĥįş ʼnőŧįƒįčäŧįőʼn pőľįčy ŵįľľ pęřmäʼnęʼnŧľy řęmővę įŧ.", + "warning-2": "Åřę yőū şūřę yőū ŵäʼnŧ ŧő đęľęŧę ŧĥįş pőľįčy?" + }, + "filter-description": "Fįľŧęř ʼnőŧįƒįčäŧįőʼn pőľįčįęş þy ūşįʼnģ ä čőmmä şępäřäŧęđ ľįşŧ őƒ mäŧčĥęřş, ę.ģ.:<1>şęvęřįŧy=čřįŧįčäľ, řęģįőʼn=ĒMĒÅ", + "generated-policies": "Åūŧő-ģęʼnęřäŧęđ pőľįčįęş", + "matchers": "Mäŧčĥęřş", + "metadata": { + "active-time": "Åčŧįvę ŵĥęʼn", + "delivered-to": "Đęľįvęřęđ ŧő", + "grouped-by": "Ğřőūpęđ þy", + "grouping": { + "none": "Ńőŧ ģřőūpįʼnģ", + "single-group": "Ŝįʼnģľę ģřőūp" + }, + "inherited": "Ĩʼnĥęřįŧęđ", + "mute-time": "Mūŧęđ ŵĥęʼn", + "n-instances_one": "įʼnşŧäʼnčę", + "n-instances_other": "įʼnşŧäʼnčę", + "timingOptions": { + "groupInterval": { + "description": "Ħőŵ ľőʼnģ ŧő ŵäįŧ þęƒőřę şęʼnđįʼnģ ä ʼnőŧįƒįčäŧįőʼn äþőūŧ ʼnęŵ äľęřŧş ŧĥäŧ äřę äđđęđ ŧő ä ģřőūp őƒ äľęřŧş ƒőř ŵĥįčĥ äʼn įʼnįŧįäľ ʼnőŧįƒįčäŧįőʼn ĥäş äľřęäđy þęęʼn şęʼnŧ.", + "label": "Ŵäįŧ <1> þęƒőřę şęʼnđįʼnģ ūpđäŧęş" + }, + "groupWait": { + "description": "Ħőŵ ľőʼnģ ŧő įʼnįŧįäľľy ŵäįŧ ŧő şęʼnđ ä ʼnőŧįƒįčäŧįőʼn ƒőř ä ģřőūp őƒ äľęřŧ įʼnşŧäʼnčęş.", + "label": "Ŵäįŧ <1> ŧő ģřőūp įʼnşŧäʼnčęş" + }, + "repeatInterval": { + "description": "Ħőŵ őƒŧęʼn ʼnőŧįƒįčäŧįőʼnş äřę şęʼnŧ įƒ ŧĥę ģřőūp őƒ äľęřŧş ĥäş ʼnőŧ čĥäʼnģęđ şįʼnčę ŧĥę ľäşŧ ʼnőŧįƒįčäŧįőʼn.", + "label": "Ŗępęäŧęđ ęvęřy <1>" + } + } + }, + "n-more-policies_one": "{{count}} äđđįŧįőʼnäľ pőľįčįęş", + "n-more-policies_other": "{{count}} äđđįŧįőʼnäľ pőľįčįęş", + "new-child": "Ńęŵ čĥįľđ pőľįčy", + "new-policy": "Åđđ ʼnęŵ pőľįčy", + "no-matchers": "Ńő mäŧčĥęřş", + "reload-policies": "Ŗęľőäđ pőľįčįęş", + "save-policy": "Ŝävę pőľįčy", + "update": { + "please-wait": "Pľęäşę ŵäįŧ ŵĥįľę ŵę ūpđäŧę yőūř ʼnőŧįƒįčäŧįőʼn pőľįčįęş.", + "update-policy": "Ůpđäŧę pőľįčy", + "updating": "Ůpđäŧįʼnģ..." + }, + "update-errors": { + "conflict": "Ŧĥę ʼnőŧįƒįčäŧįőʼn pőľįčy ŧřęę ĥäş þęęʼn ūpđäŧęđ þy äʼnőŧĥęř ūşęř.", + "error-code": "Ēřřőř męşşäģę: \"{{error}}\"", + "fallback": "Ŝőmęŧĥįʼnģ ŵęʼnŧ ŵřőʼnģ ŵĥęʼn ūpđäŧįʼnģ yőūř ʼnőŧįƒįčäŧįőʼn pőľįčįęş.", + "suffix": "Pľęäşę řęƒřęşĥ ŧĥę päģę äʼnđ ŧřy äģäįʼn.", + "title": "Ēřřőř şävįʼnģ ʼnőŧįƒįčäŧįőʼn pőľįčy" + } + }, + "provisioning": { + "badge-tooltip-provenance": "Ŧĥįş řęşőūřčę ĥäş þęęʼn přővįşįőʼnęđ vįä {{provenance}} äʼnđ čäʼnʼnőŧ þę ęđįŧęđ ŧĥřőūģĥ ŧĥę ŮĨ", + "badge-tooltip-standard": "Ŧĥįş řęşőūřčę ĥäş þęęʼn přővįşįőʼnęđ äʼnđ čäʼnʼnőŧ þę ęđįŧęđ ŧĥřőūģĥ ŧĥę ŮĨ" + }, + "queryAndExpressionsStep": { + "disableAdvancedOptions": { + "text": "Ŧĥę şęľęčŧęđ qūęřįęş äʼnđ ęχpřęşşįőʼnş čäʼnʼnőŧ þę čőʼnvęřŧęđ ŧő đęƒäūľŧ. Ĩƒ yőū đęäčŧįväŧę äđväʼnčęđ őpŧįőʼnş, yőūř qūęřy äʼnđ čőʼnđįŧįőʼn ŵįľľ þę řęşęŧ ŧő đęƒäūľŧ şęŧŧįʼnģş." + }, + "preview": "Přęvįęŵ", + "previewCondition": "Přęvįęŵ äľęřŧ řūľę čőʼnđįŧįőʼn" + }, + "rule-form": { + "evaluation": { + "evaluation-group-and-interval": "Ēväľūäŧįőʼn ģřőūp äʼnđ įʼnŧęřväľ", + "group": { + "cancel": "Cäʼnčęľ", + "create": "Cřęäŧę", + "interval": "Ēväľūäŧįőʼn įʼnŧęřväľ" + }, + "group-name": "Ēväľūäŧįőʼn ģřőūp ʼnämę", + "group-text": "Åľľ řūľęş įʼn ŧĥę şęľęčŧęđ ģřőūp äřę ęväľūäŧęđ ęvęřy {{evaluateEvery}}.", + "new-group": "Ńęŵ ęväľūäŧįőʼn ģřőūp", + "pause": { + "alerting": "Ŧūřʼn őʼn ŧő päūşę ęväľūäŧįőʼn ƒőř ŧĥįş äľęřŧ řūľę.", + "recording": "Ŧūřʼn őʼn ŧő päūşę ęväľūäŧįőʼn ƒőř ŧĥįş řęčőřđįʼnģ řūľę." + }, + "select-folder-before": "Ŝęľęčŧ ä ƒőľđęř þęƒőřę şęŧŧįʼnģ ęväľūäŧįőʼn ģřőūp äʼnđ įʼnŧęřväľ" + }, + "evaluation-behaviour": { + "description": { + "text": "Đęƒįʼnę ĥőŵ ŧĥę äľęřŧ řūľę įş ęväľūäŧęđ." + }, + "info-help": { + "text": "Đęƒįʼnę ŧĥę äľęřŧ þęĥävįőř ŵĥęʼn ŧĥę ęväľūäŧįőʼn ƒäįľş őř ŧĥę qūęřy řęŧūřʼnş ʼnő đäŧä." + }, + "pending-period": "Pęʼnđįʼnģ pęřįőđ" + }, + "evaluation-behaviour-description1": "Ēväľūäŧįőʼn ģřőūpş äřę čőʼnŧäįʼnęřş ƒőř ęväľūäŧįʼnģ äľęřŧ äʼnđ řęčőřđįʼnģ řūľęş.", + "evaluation-behaviour-description2": "Åʼn ęväľūäŧįőʼn ģřőūp đęƒįʼnęş äʼn ęväľūäŧįőʼn įʼnŧęřväľ - ĥőŵ őƒŧęʼn ä řūľę įş ęväľūäŧęđ. Åľęřŧ řūľęş ŵįŧĥįʼn ŧĥę şämę ęväľūäŧįőʼn ģřőūp äřę ęväľūäŧęđ ővęř ŧĥę şämę ęväľūäŧįőʼn įʼnŧęřväľ.", + "evaluation-behaviour-description3": "Pęʼnđįʼnģ pęřįőđ şpęčįƒįęş ĥőŵ ľőʼnģ ŧĥę ŧĥřęşĥőľđ čőʼnđįŧįőʼn mūşŧ þę męŧ þęƒőřę ŧĥę äľęřŧ şŧäřŧş ƒįřįʼnģ. Ŧĥįş őpŧįőʼn ĥęľpş přęvęʼnŧ äľęřŧş ƒřőm þęįʼnģ ŧřįģģęřęđ þy ŧęmpőřäřy įşşūęş.", + "evaluation-behaviour-for": { + "error-parsing": "Fäįľęđ ŧő päřşę đūřäŧįőʼn", + "validation": "Pęʼnđįʼnģ pęřįőđ mūşŧ þę ģřęäŧęř ŧĥäʼn őř ęqūäľ ŧő ŧĥę ęväľūäŧįőʼn įʼnŧęřväľ." + }, + "folder": { + "cancel": "Cäʼnčęľ", + "create": "Cřęäŧę", + "create-folder": "Cřęäŧę ä ʼnęŵ ƒőľđęř ŧő şŧőřę yőūř äľęřŧ řūľę įʼn.", + "creating-new-folder": "Cřęäŧįʼnģ ʼnęŵ ƒőľđęř", + "label": "Főľđęř", + "name": "Főľđęř ʼnämę", + "new-folder": "Ńęŵ ƒőľđęř", + "new-folder-or": "őř" + }, + "folder-and-labels": "Øřģäʼnįžę yőūř äľęřŧ řūľę ŵįŧĥ ä ƒőľđęř äʼnđ şęŧ őƒ ľäþęľş.", + "folders": { + "help-info": "Főľđęřş äřę ūşęđ ƒőř şŧőřįʼnģ äľęřŧ řūľęş. Ÿőū čäʼn ęχŧęʼnđ ŧĥę äččęşş přővįđęđ þy ä řőľę ŧő äľęřŧ řūľęş äʼnđ äşşįģʼn pęřmįşşįőʼnş ŧő įʼnđįvįđūäľ ƒőľđęřş." + }, + "labels": { + "help-info": "Ŀäþęľş äřę ūşęđ ŧő đįƒƒęřęʼnŧįäŧę äʼn äľęřŧ ƒřőm äľľ őŧĥęř äľęřŧş.Ÿőū čäʼn ūşę ŧĥęm ƒőř şęäřčĥįʼnģ, şįľęʼnčįʼnģ, äʼnđ řőūŧįʼnģ ʼnőŧįƒįčäŧįőʼnş." + }, + "pause": { + "label": "Päūşę ęväľūäŧįőʼn" + } + }, + "rule-groups": { + "delete": { + "success": "Ŝūččęşşƒūľľy đęľęŧęđ řūľę ģřőūp" + }, + "move": { + "success": "Ŝūččęşşƒūľľy mővęđ řūľę ģřőūp" + }, + "rename": { + "success": "Ŝūččęşşƒūľľy řęʼnämęđ řūľę ģřőūp" + }, + "update": { + "success": "Ŝūččęşşƒūľľy ūpđäŧęđ řūľę ģřőūp" + } + }, + "rule-list": { + "configure-datasource": "Cőʼnƒįģūřę", + "ds-error-boundary": { + "description": "Cĥęčĸ ŧĥę đäŧä şőūřčę čőʼnƒįģūřäŧįőʼn. Đőęş ŧĥę đäŧä şőūřčę şūppőřŧ Přőmęŧĥęūş ÅPĨ?", + "title": "Ůʼnäþľę ŧő ľőäđ řūľęş ƒřőm ŧĥįş đäŧä şőūřčę" + }, + "filter-view": { + "no-more-results": "Ńő mőřę řęşūľŧş – şĥőŵįʼnģ {{numberOfRules}} řūľęş", + "no-rules-found": "Ńő äľęřŧ őř řęčőřđįʼnģ řūľęş mäŧčĥęđ yőūř čūřřęʼnŧ şęŧ őƒ ƒįľŧęřş." + }, + "new-alert-rule": "Ńęŵ äľęřŧ řūľę", + "pagination": { + "next-page": "ʼnęχŧ päģę", + "previous-page": "přęvįőūş päģę" + }, + "return-button": { + "title": "Åľęřŧ řūľęş" + }, + "rulerrule-loading-error": "Fäįľęđ ŧő ľőäđ ŧĥę řūľę" + }, + "rule-state": { + "creating": "Cřęäŧįʼnģ", + "deleting": "Đęľęŧįʼnģ", + "paused": "Päūşęđ", + "recording-rule": "Ŗęčőřđįʼnģ řūľę" + }, + "rule-viewer": { + "prometheus-consistency-check": { + "alert-message": "Åľęřŧ řūľę ĥäş þęęʼn ūpđäŧęđ. Cĥäʼnģęş mäy ŧäĸę ūp ŧő ä mįʼnūŧę ŧő äppęäř őʼn ŧĥę Åľęřŧ řūľęş ľįşŧ vįęŵ.", + "alert-title": "Ůpđäŧę įʼn přőģřęşş" + } + }, + "rules": { + "add-rule": { + "success": "Ŗūľę äđđęđ şūččęşşƒūľľy" + }, + "delete-rule": { + "success": "Ŗūľę şūččęşşƒūľľy đęľęŧęđ" + }, + "pause-rule": { + "success": "Ŗūľę ęväľūäŧįőʼn päūşęđ" + }, + "resume-rule": { + "success": "Ŗūľę ęväľūäŧįőʼn řęşūmęđ" + }, + "update-rule": { + "success": "Ŗūľę ūpđäŧęđ şūččęşşƒūľľy" + } + }, + "search": { + "property": { + "data-source": "Đäŧä şőūřčę", + "evaluation-group": "Ēväľūäŧįőʼn ģřőūp", + "labels": "Ŀäþęľş", + "namespace": "Főľđęř / Ńämęşpäčę", + "rule-health": "Ħęäľŧĥ", + "rule-name": "Åľęřŧįʼnģ řūľę ʼnämę", + "rule-type": "Ŧypę", + "state": "Ŝŧäŧę" + }, + "save-query": "Ŝävę čūřřęʼnŧ şęäřčĥ" + }, + "silences": { + "affected-instances": "Ńƒęčŧęđ äľęřŧ įʼnşŧäʼnčęş", + "only-firing-instances": "Øʼnľy äľęřŧ įʼnşŧäʼnčęş įʼn ŧĥę ƒįřįʼnģ şŧäŧę äřę đįşpľäyęđ.", + "preview-affected-instances": "Přęvįęŵ ŧĥę äľęřŧ įʼnşŧäʼnčęş äƒƒęčŧęđ þy ŧĥįş şįľęʼnčę." + }, + "simpleCondition": { + "alertCondition": "Åľęřŧ čőʼnđįŧįőʼn" + }, + "templates": { + "editor": { + "add-example": "Åđđ ęχämpľę", + "auto-complete": "Főř äūŧő-čőmpľęŧįőʼn őƒ čőmmőʼn ŧęmpľäŧįʼnģ čőđę, ŧypę ŧĥę ƒőľľőŵįʼnģ ĸęyŵőřđş įʼn ŧĥę čőʼnŧęʼnŧ ęđįŧőř:", + "goto-docs": "Ńőŧįƒįčäŧįőʼn ŧęmpľäŧęş đőčūmęʼnŧäŧįőʼn" + }, + "help": { + "intro": "Ńőŧįƒįčäŧįőʼn ŧęmpľäŧęş ūşę Ğő ŧęmpľäŧįʼnģ ľäʼnģūäģę ŧő čřęäŧę ʼnőŧįƒįčäŧįőʼn męşşäģęş.\n\nĨʼn Ğřäƒäʼnä, ä ŧęmpľäŧę ģřőūp čäʼn đęƒįʼnę mūľŧįpľę ʼnőŧįƒįčäŧįőʼn ŧęmpľäŧęş ūşįʼnģ {{ define \"\" }}.\nŦĥęşę ŧęmpľäŧęş čäʼn ŧĥęʼn þę ūşęđ įʼn čőʼnŧäčŧ pőįʼnŧş äʼnđ ŵįŧĥįʼn őŧĥęř ʼnőŧįƒįčäŧįőʼn ŧęmpľäŧęş þy čäľľįʼnģ {{ template \"\" }}.\nFőř đęŧäįľęđ įʼnƒőřmäŧįőʼn äþőūŧ ʼnőŧįƒįčäŧįőʼn ŧęmpľäŧęş, řęƒęř ŧő őūř đőčūmęʼnŧäŧįőʼn." + }, + "misconfigured-badge-text": "Mįşčőʼnƒįģūřęđ", + "misconfigured-warning": "Ŧĥįş ŧęmpľäŧę įş mįşčőʼnƒįģūřęđ.", + "misconfigured-warning-details": "Ŧęmpľäŧęş mūşŧ þę đęƒįʼnęđ įʼn þőŧĥ ŧĥę <1> äʼnđ <4> şęčŧįőʼnş őƒ yőūř äľęřŧmäʼnäģęř čőʼnƒįģūřäŧįőʼn." + }, + "threshold": { + "to": "ŦØ" + } + }, + "annotations": { + "empty-state": { + "button-title": "Åđđ äʼnʼnőŧäŧįőʼn qūęřy", + "info-box-content": "<0>Åʼnʼnőŧäŧįőʼnş přővįđę ä ŵäy ŧő įʼnŧęģřäŧę ęvęʼnŧ đäŧä įʼnŧő yőūř ģřäpĥş. Ŧĥęy äřę vįşūäľįžęđ äş vęřŧįčäľ ľįʼnęş äʼnđ įčőʼnş őʼn äľľ ģřäpĥ päʼnęľş. Ŵĥęʼn yőū ĥővęř ővęř äʼn äʼnʼnőŧäŧįőʼn įčőʼn yőū čäʼn ģęŧ ęvęʼnŧ ŧęχŧ & ŧäģş ƒőř ŧĥę ęvęʼnŧ. Ÿőū čäʼn äđđ äʼnʼnőŧäŧįőʼn ęvęʼnŧş đįřęčŧľy ƒřőm ģřäƒäʼnä þy ĥőľđįʼnģ CŦŖĿ őř CMĐ + čľįčĸ őʼn ģřäpĥ (őř đřäģ řęģįőʼn). Ŧĥęşę ŵįľľ þę şŧőřęđ įʼn Ğřäƒäʼnä'ş äʼnʼnőŧäŧįőʼn đäŧäþäşę.", + "info-box-content-2": "Cĥęčĸőūŧ ŧĥę <2>Åʼnʼnőŧäŧįőʼnş đőčūmęʼnŧäŧįőʼn ƒőř mőřę įʼnƒőřmäŧįőʼn.", + "title": "Ŧĥęřę äřę ʼnő čūşŧőm äʼnʼnőŧäŧįőʼn qūęřįęş äđđęđ yęŧ" + } + }, + "api-keys": { + "empty-state": { + "message": "Ńő ÅPĨ ĸęyş ƒőūʼnđ" + } + }, + "app-chrome": { + "skip-content-button": "Ŝĸįp ŧő mäįʼn čőʼnŧęʼnŧ", + "top-bar": { + "sign-in": "Ŝįģʼn įʼn" + } + }, + "app-notification": { + "item": { + "trace-id": "Ŧřäčę ĨĐ: {{traceId}}" + } + }, + "bookmarks-page": { + "empty": { + "message": "Ĩŧ ľőőĸş ľįĸę yőū ĥävęʼn’ŧ čřęäŧęđ äʼny þőőĸmäřĸş yęŧ", + "tip": "Ħővęř ővęř äʼny įŧęm įʼn ŧĥę ʼnäv męʼnū äʼnđ čľįčĸ őʼn ŧĥę þőőĸmäřĸ įčőʼn ŧő äđđ įŧ ĥęřę." + } + }, + "bouncing-loader": { + "label": "Ŀőäđįʼnģ" + }, + "browse-dashboards": { + "action": { + "cancel-button": "Cäʼnčęľ", + "cannot-move-folders": "Főľđęřş čäʼnʼnőŧ þę mővęđ", + "confirmation-text": "Đęľęŧę", + "delete-button": "Đęľęŧę", + "delete-modal-invalid-text": "Øʼnę őř mőřę ƒőľđęřş čőʼnŧäįʼn ľįþřäřy päʼnęľş őř äľęřŧ řūľęş. Đęľęŧę ŧĥęşę ƒįřşŧ įʼn őřđęř ŧő přőčęęđ.", + "delete-modal-invalid-title": "Cäʼnʼnőŧ đęľęŧę ƒőľđęř", + "delete-modal-restore-dashboards-text": "Ŧĥįş äčŧįőʼn ŵįľľ đęľęŧę ŧĥę şęľęčŧęđ ƒőľđęřş įmmęđįäŧęľy þūŧ ŧĥę şęľęčŧęđ đäşĥþőäřđş ŵįľľ þę mäřĸęđ ƒőř đęľęŧįőʼn įʼn 30 đäyş. Ÿőūř őřģäʼnįžäŧįőʼn äđmįʼnįşŧřäŧőř čäʼn řęşŧőřę ŧĥę đäşĥþőäřđş äʼnyŧįmę þęƒőřę ŧĥę 30 đäyş ęχpįřę. Főľđęřş čäʼnʼnőŧ þę řęşŧőřęđ.", + "delete-modal-text": "Ŧĥįş äčŧįőʼn ŵįľľ đęľęŧę ŧĥę ƒőľľőŵįʼnģ čőʼnŧęʼnŧ:", + "delete-modal-title": "Đęľęŧę", + "deleting": "Đęľęŧįʼnģ...", + "manage-permissions-button": "Mäʼnäģę pęřmįşşįőʼnş", + "move-button": "Mővę", + "move-modal-alert": "Mővįʼnģ ŧĥįş įŧęm mäy čĥäʼnģę įŧş pęřmįşşįőʼnş.", + "move-modal-field-label": "Főľđęř ʼnämę", + "move-modal-text": "Ŧĥįş äčŧįőʼn ŵįľľ mővę ŧĥę ƒőľľőŵįʼnģ čőʼnŧęʼnŧ:", + "move-modal-title": "Mővę", + "moving": "Mővįʼnģ...", + "new-folder-name-required-phrase": "Főľđęř ʼnämę įş řęqūįřęđ." + }, + "actions": { + "button-to-recently-deleted": "Ŗęčęʼnŧľy đęľęŧęđ" + }, + "counts": { + "alertRule_one": "{{count}} äľęřŧ řūľę", + "alertRule_other": "{{count}} äľęřŧ řūľę", + "dashboard_one": "{{count}} đäşĥþőäřđ", + "dashboard_other": "{{count}} đäşĥþőäřđ", + "folder_one": "{{count}} ƒőľđęř", + "folder_other": "{{count}} ƒőľđęř", + "libraryPanel_one": "{{count}} ľįþřäřy päʼnęľ", + "libraryPanel_other": "{{count}} ľįþřäřy päʼnęľ", + "total_one": "{{count}} įŧęm", + "total_other": "{{count}} įŧęm" + }, + "dashboards-tree": { + "collapse-folder-button": "Cőľľäpşę ƒőľđęř {{title}}", + "expand-folder-button": "Ēχpäʼnđ ƒőľđęř {{title}}", + "name-column": "Ńämę", + "select-all-header-checkbox": "Ŝęľęčŧ äľľ", + "select-checkbox": "Ŝęľęčŧ", + "tags-column": "Ŧäģş" + }, + "empty-state": { + "button-title": "Cřęäŧę đäşĥþőäřđ", + "pro-tip": "Åđđ/mővę đäşĥþőäřđş ŧő yőūř ƒőľđęř äŧ <2>ßřőŵşę đäşĥþőäřđş", + "title": "Ÿőū ĥävęʼn'ŧ čřęäŧęđ äʼny đäşĥþőäřđş yęŧ", + "title-folder": "Ŧĥįş ƒőľđęř đőęşʼn'ŧ ĥävę äʼny đäşĥþőäřđş yęŧ" + }, + "folder-actions-button": { + "delete": "Đęľęŧę", + "folder-actions": "Főľđęř äčŧįőʼnş", + "manage-permissions": "Mäʼnäģę pęřmįşşįőʼnş", + "move": "Mővę" + }, + "folder-picker": { + "accessible-label": "Ŝęľęčŧ ƒőľđęř: {{ label }} čūřřęʼnŧľy şęľęčŧęđ", + "button-label": "Ŝęľęčŧ ƒőľđęř", + "clear-selection": "Cľęäř şęľęčŧįőʼn", + "empty-message": "Ńő ƒőľđęřş ƒőūʼnđ", + "error-title": "Ēřřőř ľőäđįʼnģ ƒőľđęřş", + "non-folder-item": "Ńőʼn-ƒőľđęř {{itemKind}} {{itemUID}}", + "search-placeholder": "Ŝęäřčĥ ƒőľđęřş", + "unknown-error": "Ůʼnĸʼnőŵʼn ęřřőř" + }, + "hard-delete": { + "success": "Đäşĥþőäřđ {{name}} đęľęŧęđ" + }, + "manage-folder-nav": { + "alert-rules": "Åľęřŧ řūľęş", + "dashboards": "Đäşĥþőäřđş", + "panels": "Päʼnęľş" + }, + "new-folder-form": { + "cancel-label": "Cäʼnčęľ", + "create-label": "Cřęäŧę", + "name-label": "Főľđęř ʼnämę" + }, + "no-results": { + "clear": "Cľęäř şęäřčĥ äʼnđ ƒįľŧęřş", + "text": "Ńő řęşūľŧş ƒőūʼnđ ƒőř yőūř qūęřy" + }, + "soft-delete": { + "success": "Đäşĥþőäřđ {{name}} mővęđ ŧő Ŗęčęʼnŧľy đęľęŧęđ" + } + }, + "clipboard-button": { + "inline-toast": { + "success": "Cőpįęđ" + } + }, + "combobox": { + "async": { + "error": "Åʼn ęřřőř őččūřřęđ ŵĥįľę ľőäđįʼnģ őpŧįőʼnş." + }, + "clear": { + "title": "Cľęäř väľūę" + }, + "custom-value": { + "description": "Ůşę čūşŧőm väľūę" + }, + "group": { + "undefined": "Ńő ģřőūp" + }, + "options": { + "no-found": "Ńő őpŧįőʼnş ƒőūʼnđ." + } + }, + "command-palette": { + "action": { + "change-theme": "Cĥäʼnģę ŧĥęmę...", + "dark-theme": "Đäřĸ", + "light-theme": "Ŀįģĥŧ" + }, + "empty-state": { + "message": "Ńő řęşūľŧş ƒőūʼnđ" + }, + "search-box": { + "placeholder": "Ŝęäřčĥ őř ĵūmp ŧő..." + }, + "section": { + "actions": "Åčŧįőʼnş", + "dashboard-search-results": "Đäşĥþőäřđş", + "folder-search-results": "Főľđęřş", + "pages": "Päģęş", + "preferences": "Přęƒęřęʼnčęş", + "recent-dashboards": "Ŗęčęʼnŧ đäşĥþőäřđş" + } + }, + "common": { + "apply": "Åppľy", + "cancel": "Cäʼnčęľ", + "clear": "Cľęäř", + "close": "Cľőşę", + "collapse": "Cőľľäpşę", + "edit": "Ēđįŧ", + "help": "Ħęľp", + "locale": { + "default": "Đęƒäūľŧ" + }, + "save": "Ŝävę", + "search": "Ŝęäřčĥ", + "view": "Vįęŵ" + }, + "configuration-tracker": { + "config-card": { + "complete": "čőmpľęŧę" + } + }, + "connections": { + "connect-data": { + "category-header-label": "Đäŧä şőūřčęş", + "empty-message": "Ńő řęşūľŧş mäŧčĥįʼnģ yőūř qūęřy ŵęřę ƒőūʼnđ", + "request-data-source": "Ŗęqūęşŧ ä ʼnęŵ đäŧä şőūřčę", + "roadmap": "Vįęŵ řőäđmäp" + }, + "search": { + "placeholder": "Ŝęäřčĥ äľľ" + } + }, + "correlations": { + "add-new": "Åđđ ʼnęŵ", + "alert": { + "error-message": "Åʼn ūʼnĸʼnőŵʼn ęřřőř őččūřřęđ ŵĥįľę ƒęŧčĥįʼnģ čőřřęľäŧįőʼn đäŧä. Pľęäşę ŧřy äģäįʼn.", + "title": "Ēřřőř ƒęŧčĥįʼnģ čőřřęľäŧįőʼn đäŧä" + }, + "basic-info-form": { + "description-description": "Øpŧįőʼnäľ đęşčřįpŧįőʼn ŵįŧĥ mőřę įʼnƒőřmäŧįőʼn äþőūŧ ŧĥę ľįʼnĸ", + "description-label": "Đęşčřįpŧįőʼn", + "label-description": "Ŧĥįş ʼnämę ŵįľľ þę ūşęđ äş ŧĥę ľäþęľ ƒőř ŧĥę čőřřęľäŧįőʼn. Ŧĥįş ŵįľľ şĥőŵ äş þūŧŧőʼn ŧęχŧ, ä męʼnū įŧęm, őř ĥővęř ŧęχŧ őʼn ä ľįʼnĸ.", + "label-label": "Ŀäþęľ", + "label-placeholder": "ę.ģ. Ŧęmpő ŧřäčęş", + "label-required": "Ŧĥįş ƒįęľđ įş řęqūįřęđ.", + "sub-text": "<0>Đęƒįʼnę ŧęχŧ ŧĥäŧ ŵįľľ đęşčřįþę ŧĥę čőřřęľäŧįőʼn.", + "title": "Đęƒįʼnę čőřřęľäŧįőʼn ľäþęľ (Ŝŧęp 1 őƒ 3)" + }, + "empty-state": { + "button-title": "Åđđ čőřřęľäŧįőʼn", + "pro-tip": "Ÿőū čäʼn äľşő đęƒįʼnę čőřřęľäŧįőʼnş vįä đäŧäşőūřčę přővįşįőʼnįʼnģ", + "title": "Ÿőū ĥävęʼn'ŧ đęƒįʼnęđ äʼny čőřřęľäŧįőʼnş yęŧ" + }, + "list": { + "delete": "đęľęŧę čőřřęľäŧįőʼn", + "label": "Ŀäþęľ", + "loading": "ľőäđįʼnģ...", + "read-only": "Ŗęäđ őʼnľy", + "source": "Ŝőūřčę", + "target": "Ŧäřģęŧ" + }, + "navigation-form": { + "add-button": "Åđđ", + "back-button": "ßäčĸ", + "next-button": "Ńęχŧ", + "save-button": "Ŝävę" + }, + "page-content": "Ŧő ęʼnäþľę Cőřřęľäŧįőʼnş, äđđ įŧ įʼn ŧĥę Ğřäƒäʼnä čőʼnƒįģ:", + "page-heading": "Cőřřęľäŧįőʼnş äřę đįşäþľęđ", + "query-editor": { + "control-rules": "Ŧĥę şęľęčŧęđ ŧäřģęŧ đäŧä şőūřčę mūşŧ ęχpőřŧ ä qūęřy ęđįŧőř.", + "data-source-text": "Pľęäşę şęľęčŧ ä ŧäřģęŧ đäŧä şőūřčę ƒįřşŧ.", + "data-source-title": "Ńő đäŧä şőūřčę şęľęčŧęđ", + "error-text": "Ŧĥę şęľęčŧęđ đäŧä şőūřčę čőūľđ ʼnőŧ þę ľőäđęđ.", + "error-title": "Ēřřőř ľőäđįʼnģ đäŧä şőūřčę", + "loading": "Ŀőäđįʼnģ qūęřy ęđįŧőř...", + "query-description": "Đęƒįʼnę ŧĥę qūęřy ŧĥäŧ įş řūʼn ŵĥęʼn ŧĥę ľįʼnĸ įş čľįčĸęđ. Ÿőū čäʼn ūşę <2>väřįäþľęş ŧő äččęşş şpęčįƒįč ƒįęľđ väľūęş.", + "query-editor-title": "Đäŧä şőūřčę đőęş ʼnőŧ ęχpőřŧ ä qūęřy ęđįŧőř.", + "query-label": "Qūęřy" + }, + "source-form": { + "control-required": "Ŧĥįş ƒįęľđ įş řęqūįřęđ.", + "description": "Å đäŧä pőįʼnŧ ʼnęęđş ŧő přővįđę väľūęş ŧő äľľ väřįäþľęş äş ƒįęľđş őř äş ŧřäʼnşƒőřmäŧįőʼnş őūŧpūŧ ŧő mäĸę ŧĥę čőřřęľäŧįőʼn þūŧŧőʼn äppęäř įʼn ŧĥę vįşūäľįžäŧįőʼn.<1>Ńőŧę: Ńőŧ ęvęřy väřįäþľę ʼnęęđş ŧő þę ęχpľįčįŧľy đęƒįʼnęđ þęľőŵ. Å ŧřäʼnşƒőřmäŧįőʼn şūčĥ äş <4>ľőģƒmŧ ŵįľľ čřęäŧę väřįäþľęş ƒőř ęvęřy ĸęy/väľūę päįř.", + "description-external-pre": "Ÿőū ĥävę ūşęđ ƒőľľőŵįʼnģ väřįäþľęş įʼn ŧĥę ŧäřģęŧ ŮŖĿ:", + "description-query-pre": "Ÿőū ĥävę ūşęđ ƒőľľőŵįʼnģ väřįäþľęş įʼn ŧĥę ŧäřģęŧ qūęřy:", + "external-title": "Cőʼnƒįģūřę ŧĥę đäŧä şőūřčę ŧĥäŧ ŵįľľ ūşę ŧĥę ŮŖĿ (Ŝŧęp 3 őƒ 3)", + "heading-external": "Väřįäþľęş ūşęđ įʼn ŧĥę ŧäřģęŧ ŮŖĿ", + "heading-query": "Väřįäþľęş ūşęđ įʼn ŧĥę ŧäřģęŧ qūęřy", + "query-title": "Cőʼnƒįģūřę ŧĥę đäŧä şőūřčę ŧĥäŧ ŵįľľ ľįʼnĸ ŧő {{dataSourceName}} (Ŝŧęp 3 őƒ 3)", + "results-description": "Ŧĥę ľįʼnĸ ŵįľľ þę şĥőŵʼn ʼnęχŧ ŧő ŧĥę väľūę őƒ ŧĥįş ƒįęľđ", + "results-label": "Ŗęşūľŧş ƒįęľđ", + "results-required": "Ŧĥįş ƒįęľđ įş řęqūįřęđ.", + "source-description": "Ŗęşūľŧş ƒřőm şęľęčŧęđ şőūřčę đäŧä şőūřčę ĥävę ľįʼnĸş đįşpľäyęđ įʼn ŧĥę päʼnęľ", + "source-label": "Ŝőūřčę", + "sub-text": "<0>Đęƒįʼnę ŵĥäŧ đäŧä şőūřčę ŵįľľ đįşpľäy ŧĥę čőřřęľäŧįőʼn, äʼnđ ŵĥäŧ đäŧä ŵįľľ řępľäčę přęvįőūşľy đęƒįʼnęđ väřįäþľęş." + }, + "sub-title": "Đęƒįʼnę ĥőŵ đäŧä ľįvįʼnģ įʼn đįƒƒęřęʼnŧ đäŧä şőūřčęş řęľäŧęş ŧő ęäčĥ őŧĥęř. Ŗęäđ mőřę įʼn ŧĥę <2>đőčūmęʼnŧäŧįőʼn<1>", + "target-form": { + "control-rules": "Ŧĥįş ƒįęľđ įş řęqūįřęđ.", + "sub-text": "<0>Đęƒįʼnę ŵĥäŧ ŧĥę čőřřęľäŧįőʼn ŵįľľ ľįʼnĸ ŧő. Ŵįŧĥ ŧĥę qūęřy ŧypę, ä qūęřy ŵįľľ řūʼn ŵĥęʼn ŧĥę čőřřęľäŧįőʼn įş čľįčĸęđ. Ŵįŧĥ ŧĥę ęχŧęřʼnäľ ŧypę, čľįčĸįʼnģ ŧĥę čőřřęľäŧįőʼn ŵįľľ őpęʼn ä ŮŖĿ.", + "target-description-external": "Ŝpęčįƒy ŧĥę ŮŖĿ ŧĥäŧ ŵįľľ őpęʼn ŵĥęʼn ŧĥę ľįʼnĸ įş čľįčĸęđ", + "target-description-query": "Ŝpęčįƒy ŵĥįčĥ đäŧä şőūřčę įş qūęřįęđ ŵĥęʼn ŧĥę ľįʼnĸ įş čľįčĸęđ", + "target-label": "Ŧäřģęŧ", + "target-type-description": "Ŝpęčįƒy ŧĥę ŧypę őƒ čőřřęľäŧįőʼn", + "title": "Ŝęŧūp ŧĥę ŧäřģęŧ ƒőř ŧĥę čőřřęľäŧįőʼn (Ŝŧęp 2 őƒ 3)", + "type-label": "Ŧypę" + }, + "trans-details": { + "logfmt-description": "Päřşę přővįđęđ ƒįęľđ ŵįŧĥ ľőģƒmŧ ŧő ģęŧ väřįäþľęş", + "logfmt-label": "Ŀőģƒmŧ", + "regex-description": "Fįęľđ ŵįľľ þę päřşęđ ŵįŧĥ řęģęχ. Ůşę ʼnämęđ čäpŧūřę ģřőūpş ŧő řęŧūřʼn mūľŧįpľę väřįäþľęş, őř ä şįʼnģľę ūʼnʼnämęđ čäpŧūřę ģřőūp ŧő äđđ väřįäþľę ŧő ʼnämęđ mäp väľūę. Ŗęģęχ įş čäşę įʼnşęʼnşįŧįvę.", + "regex-expression": "Ůşę čäpŧūřę ģřőūpş ŧő ęχŧřäčŧ ä pőřŧįőʼn őƒ ŧĥę ƒįęľđ.", + "regex-label": "Ŗęģūľäř ęχpřęşşįőʼn", + "regex-map-values": "Đęƒįʼnęş ŧĥę ʼnämę őƒ ŧĥę väřįäþľę įƒ ŧĥę čäpŧūřę ģřőūp įş ʼnőŧ ʼnämęđ." + }, + "transform": { + "add-button": "Åđđ ŧřäʼnşƒőřmäŧįőʼn", + "heading": "Ŧřäʼnşƒőřmäŧįőʼnş", + "no-transform": "Ńő ŧřäʼnşƒőřmäŧįőʼnş đęƒįʼnęđ." + }, + "transform-row": { + "expression-label": "Ēχpřęşşįőʼn", + "expression-required": "Pľęäşę đęƒįʼnę äʼn ęχpřęşşįőʼn", + "expression-tooltip": "Ŗęqūįřęđ ƒőř řęģūľäř ęχpřęşşįőʼn. Ŧĥę ęχpřęşşįőʼn ŧĥę ŧřäʼnşƒőřmäŧįőʼn ŵįľľ ūşę. Ŀőģƒmŧ đőęş ʼnőŧ ūşę ƒūřŧĥęř şpęčįƒįčäŧįőʼnş.", + "field-input": "ƒįęľđ", + "field-label": "Fįęľđ", + "field-tooltip": "Øpŧįőʼnäľ. Ŧĥę ƒįęľđ ŧő ŧřäʼnşƒőřm. Ĩƒ ʼnőŧ şpęčįƒįęđ, ŧĥę ŧřäʼnşƒőřmäŧįőʼn ŵįľľ þę äppľįęđ ŧő ŧĥę řęşūľŧş ƒįęľđ.", + "map-value-label": "Mäp väľūę", + "map-value-tooltip": "Øpŧįőʼnäľ. Đęƒįʼnęş ŧĥę ʼnämę őƒ ŧĥę väřįäþľę. Ŧĥįş įş čūřřęʼnŧľy őʼnľy väľįđ ƒőř řęģūľäř ęχpřęşşįőʼnş ŵįŧĥ ä şįʼnģľę, ūʼnʼnämęđ čäpŧūřę ģřőūp.", + "remove-button": "Ŗęmővę", + "remove-tooltip": "Ŗęmővę ŧřäʼnşƒőřmäŧįőʼn", + "transform-required": "Pľęäşę şęľęčŧ ä ŧřäʼnşƒőřmäŧįőʼn ŧypę", + "type-label": "Ŧypę", + "type-tooltip": "Ŧĥę ŧypę őƒ ŧřäʼnşƒőřmäŧįőʼn ŧĥäŧ ŵįľľ þę äppľįęđ ŧő ŧĥę şőūřčę đäŧä." + } + }, + "dashboard": { + "add-menu": { + "import": "Ĩmpőřŧ ƒřőm ľįþřäřy", + "paste-panel": "Päşŧę päʼnęľ", + "row": "Ŗőŵ", + "visualization": "Vįşūäľįžäŧįőʼn" + }, + "alert-rules-drawer": { + "redirect-link": "Ŀįşŧ įʼn Ğřäƒäʼnä Åľęřŧįʼnģ", + "subtitle": "Åľęřŧ řūľęş řęľäŧęđ ŧő ŧĥįş đäşĥþőäřđ" + }, + "default-layout": { + "description": "Ŧĥę đęƒäūľŧ ģřįđ ľäyőūŧ", + "item-options": { + "repeat": { + "direction": { + "horizontal": "Ħőřįžőʼnŧäľ", + "title": "Ŗępęäŧ đįřęčŧįőʼn", + "vertical": "Vęřŧįčäľ" + }, + "max": "Mäχ pęř řőŵ", + "title": "Ŗępęäŧ őpŧįőʼnş", + "variable": { + "description": "Ŗępęäŧ ŧĥįş päʼnęľ ƒőř ęäčĥ väľūę įʼn ŧĥę şęľęčŧęđ väřįäþľę. Ŧĥįş įş ʼnőŧ vįşįþľę ŵĥįľę įʼn ęđįŧ mőđę. Ÿőū ʼnęęđ ŧő ģő þäčĸ ŧő đäşĥþőäřđ äʼnđ ŧĥęʼn ūpđäŧę ŧĥę väřįäþľę őř řęľőäđ ŧĥę đäşĥþőäřđ.", + "title": "Ŗępęäŧ þy väřįäþľę" + } + } + }, + "name": "Đęƒäūľŧ ģřįđ", + "row-actions": { + "delete": "Đęľęŧę řőŵ", + "modal": { + "alt-action": "Đęľęŧę řőŵ őʼnľy", + "text": "Åřę yőū şūřę yőū ŵäʼnŧ ŧő řęmővę ŧĥįş řőŵ äʼnđ äľľ įŧş päʼnęľş?", + "title": "Đęľęŧę řőŵ" + } + }, + "row-options": { + "button": { + "label": "Ŗőŵ őpŧįőʼnş" + }, + "form": { + "cancel": "Cäʼnčęľ", + "repeat-for": { + "label": "Ŗępęäŧ ƒőř", + "learn-more": "Ŀęäřʼn mőřę", + "warning": { + "text": "Päʼnęľş įʼn ŧĥįş řőŵ ūşę ŧĥę {{SHARED_DASHBOARD_QUERY}} đäŧä şőūřčę. Ŧĥęşę päʼnęľş ŵįľľ řęƒęřęʼnčę ŧĥę päʼnęľ įʼn ŧĥę őřįģįʼnäľ řőŵ, ʼnőŧ ŧĥę őʼnęş įʼn ŧĥę řępęäŧęđ řőŵş." + } + }, + "title": "Ŧįŧľę", + "update": "Ůpđäŧę" + }, + "modal": { + "title": "Ŗőŵ őpŧįőʼnş" + } + } + }, + "edit-pane": { + "objects": { + "multi-select": { + "selection-number": "Ńő. őƒ őþĵęčŧş şęľęčŧęđ: {{length}}" + } + }, + "open": "Øpęʼn őpŧįőʼnş päʼnę", + "panels": { + "multi-select": { + "selection-number": "Ńő. őƒ päʼnęľş şęľęčŧęđ: {{length}}" + } + }, + "row": { + "header": { + "hide": "Ħįđę", + "title": "Ŗőŵ ĥęäđęř" + }, + "multi-select": { + "options-header": "Mūľŧį-şęľęčŧęđ Ŗőŵ őpŧįőʼnş", + "selection-number": "Ńő. őƒ řőŵş şęľęčŧęđ: {{length}}" + } + }, + "tab": { + "multi-select": { + "options-header": "Mūľŧį-şęľęčŧęđ Ŧäþ őpŧįőʼnş", + "selection-number": "Ńő. őƒ ŧäþş şęľęčŧęđ: " + } + } + }, + "empty": { + "add-library-panel-body": "Åđđ vįşūäľįžäŧįőʼnş ŧĥäŧ äřę şĥäřęđ ŵįŧĥ őŧĥęř đäşĥþőäřđş.", + "add-library-panel-button": "Åđđ ľįþřäřy päʼnęľ", + "add-library-panel-header": "Ĩmpőřŧ päʼnęľ", + "add-visualization-body": "Ŝęľęčŧ ä đäŧä şőūřčę äʼnđ ŧĥęʼn qūęřy äʼnđ vįşūäľįžę yőūř đäŧä ŵįŧĥ čĥäřŧş, şŧäŧş äʼnđ ŧäþľęş őř čřęäŧę ľįşŧş, mäřĸđőŵʼnş äʼnđ őŧĥęř ŵįđģęŧş.", + "add-visualization-button": "Åđđ vįşūäľįžäŧįőʼn", + "add-visualization-header": "Ŝŧäřŧ yőūř ʼnęŵ đäşĥþőäřđ þy äđđįʼnģ ä vįşūäľįžäŧįőʼn", + "import-a-dashboard-body": "Ĩmpőřŧ đäşĥþőäřđş ƒřőm ƒįľęş őř <1>ģřäƒäʼnä.čőm.", + "import-a-dashboard-header": "Ĩmpőřŧ ä đäşĥþőäřđ", + "import-dashboard-button": "Ĩmpőřŧ đäşĥþőäřđ" + }, + "errors": { + "failed-to-load": "Fäįľęđ ŧő ľőäđ đäşĥþőäřđ" + }, + "inspect": { + "data-tab": "Đäŧä", + "error-tab": "Ēřřőř", + "json-tab": "ĴŜØŃ", + "meta-tab": "Męŧä đäŧä", + "query-tab": "Qūęřy", + "stats-tab": "Ŝŧäŧş", + "subtitle": "{{queryCount}} qūęřįęş ŵįŧĥ ŧőŧäľ qūęřy ŧįmę őƒ {{formatted}}", + "title": "Ĩʼnşpęčŧ: {{panelTitle}}" + }, + "inspect-data": { + "data-options": "Đäŧä őpŧįőʼnş", + "dataframe-aria-label": "Ŝęľęčŧ đäŧäƒřämę", + "dataframe-label": "Ŝĥőŵ đäŧä ƒřämę", + "download-csv": "Đőŵʼnľőäđ CŜV", + "download-excel-description": "Åđđş ĥęäđęř ŧő CŜV ƒőř ūşę ŵįŧĥ Ēχčęľ", + "download-excel-label": "Đőŵʼnľőäđ ƒőř Ēχčęľ", + "download-logs": "Đőŵʼnľőäđ ľőģş", + "download-service": "Đőŵʼnľőäđ şęřvįčę ģřäpĥ", + "download-traces": "Đőŵʼnľőäđ ŧřäčęş", + "excel-header": "Ēχčęľ ĥęäđęř", + "formatted": "Főřmäŧŧęđ đäŧä", + "formatted-data-description": "Ŧäþľę đäŧä įş ƒőřmäŧŧęđ ŵįŧĥ őpŧįőʼnş đęƒįʼnęđ įʼn ŧĥę Fįęľđ äʼnđ Øvęřřįđę ŧäþş.", + "formatted-data-label": "Főřmäŧŧęđ đäŧä", + "panel-transforms": "Päʼnęľ ŧřäʼnşƒőřmş", + "series-to-columns": "Ŝęřįęş ĵőįʼnęđ þy ŧįmę", + "transformation": "Ŝęřįęş ĵőįʼnęđ þy ŧįmę", + "transformations-description": "Ŧäþľę đäŧä įş đįşpľäyęđ ŵįŧĥ ŧřäʼnşƒőřmäŧįőʼnş đęƒįʼnęđ įʼn ŧĥę päʼnęľ Ŧřäʼnşƒőřm ŧäþ.", + "transformations-label": "Åppľy päʼnęľ ŧřäʼnşƒőřmäŧįőʼnş" + }, + "inspect-json": { + "dataframe-description": "Ŗäŵ đäŧä ŵįŧĥőūŧ ŧřäʼnşƒőřmäŧįőʼnş äʼnđ ƒįęľđ čőʼnƒįģ äppľįęđ. ", + "dataframe-label": "ĐäŧäFřämę ĴŜØŃ (ƒřőm Qūęřy)", + "panel-data-description": "Ŧĥę řäŵ mőđęľ päşşęđ ŧő ŧĥę päʼnęľ vįşūäľįžäŧįőʼn", + "panel-data-label": "Päʼnęľ đäŧä", + "panel-json-description": "Ŧĥę mőđęľ şävęđ įʼn ŧĥę đäşĥþőäřđ ĴŜØŃ ŧĥäŧ čőʼnƒįģūřęş ĥőŵ ęvęřyŧĥįʼnģ ŵőřĸş.", + "panel-json-label": "Päʼnęľ ĴŜØŃ", + "select-source": "Ŝęľęčŧ şőūřčę", + "unknown": "Ůʼnĸʼnőŵʼn Øþĵęčŧ: {{show}}" + }, + "inspect-meta": { + "no-inspector": "Ńő Męŧäđäŧä Ĩʼnşpęčŧőř" + }, + "inspect-stats": { + "data-title": "Đäŧä şőūřčę şŧäŧş", + "data-traceids": "Ŧřäčę ĨĐş", + "processing-time": "Đäŧä přőčęşşįʼnģ ŧįmę", + "queries": "Ńūmþęř őƒ qūęřįęş", + "request-time": "Ŧőŧäľ řęqūęşŧ ŧįmę", + "rows": "Ŧőŧäľ ʼnūmþęř řőŵş", + "table-title": "Ŝŧäŧş" + }, + "options": { + "description": "Đęşčřįpŧįőʼn", + "title": "Đäşĥþőäřđ őpŧįőʼnş", + "title-option": "Ŧįŧľę" + }, + "panel-edit": { + "alerting-tab": { + "dashboard-not-saved": "Đäşĥþőäřđ mūşŧ þę şävęđ þęƒőřę äľęřŧş čäʼn þę äđđęđ.", + "no-rules": "Ŧĥęřę äřę ʼnő äľęřŧ řūľęş ľįʼnĸęđ ŧő ŧĥįş päʼnęľ." + } + }, + "responsive-layout": { + "description": "CŜŜ ľäyőūŧ ŧĥäŧ äđĵūşŧş ŧő ŧĥę äväįľäþľę şpäčę", + "item-options": { + "hide-no-data": "Ħįđę ŵĥęʼn ʼnő đäŧä", + "title": "Ŀäyőūŧ őpŧįőʼnş" + }, + "name": "Ŗęşpőʼnşįvę ģřįđ", + "options": { + "columns": "Cőľūmʼnş", + "fixed": "Fįχęđ: {{size}}pχ", + "min": "Mįʼn: {{size}}pχ", + "one-column": "1 čőľūmʼn", + "rows": "Ŗőŵş", + "three-columns": "3 čőľūmʼnş", + "two-columns": "2 čőľūmʼnş" + } + }, + "rows-layout": { + "description": "Ŗőŵş ľäyőūŧ", + "name": "Ŗőŵş", + "row": { + "collapse": "Cőľľäpşę řőŵ", + "expand": "Ēχpäʼnđ řőŵ", + "new": "Ńęŵ řőŵ", + "repeat": { + "learn-more": "Ŀęäřʼn mőřę", + "warning": "Päʼnęľş įʼn ŧĥįş řőŵ ūşę ŧĥę {{SHARED_DASHBOARD_QUERY}} đäŧä şőūřčę. Ŧĥęşę päʼnęľş ŵįľľ řęƒęřęʼnčę ŧĥę päʼnęľ įʼn ŧĥę őřįģįʼnäľ řőŵ, ʼnőŧ ŧĥę őʼnęş įʼn ŧĥę řępęäŧęđ řőŵş." + } + }, + "row-options": { + "height": { + "expand": "Ēχpäʼnđ", + "hide-row-header": "Ħįđę řőŵ ĥęäđęř", + "min": "Mįʼn", + "title": "Ħęįģĥŧ" + }, + "repeat": { + "title": "Ŗępęäŧ őpŧįőʼnş", + "variable": { + "title": "Väřįäþľę" + } + }, + "title": "Ŗőŵ őpŧįőʼnş", + "title-option": "Ŧįŧľę" + } + }, + "tabs-layout": { + "description": "Ŧäþş ľäyőūŧ", + "name": "Ŧäþş", + "tab": { + "new": "Ńęŵ ŧäþ" + }, + "tab-options": { + "title": "Ŧäþ őpŧįőʼnş", + "title-option": "Ŧįŧľę" + } + }, + "toolbar": { + "add": "Åđđ", + "add-panel": "Päʼnęľ", + "add-panel-lib": "Ĩmpőřŧ", + "add-row": "Ŗőŵ", + "add-tab": "Ŧäþ", + "alert-rules": "Åľęřŧ řūľęş", + "back-to-dashboard": "ßäčĸ ŧő đäşĥþőäřđ", + "dashboard-settings": { + "label": "Ŝęŧŧįʼnģş", + "tooltip": "Đäşĥþőäřđ şęŧŧįʼnģş" + }, + "discard-library-panel-changes": "Đįşčäřđ ľįþřäřy päʼnęľ čĥäʼnģęş", + "discard-panel": "Đįşčäřđ päʼnęľ čĥäʼnģęş", + "discard-panel-new": "Đįşčäřđ päʼnęľ", + "edit": { + "label": "Ēđįŧ", + "tooltip": "Ēʼnŧęř ęđįŧ mőđę" + }, + "edit-dashboard-v2-schema": "Ēđįŧ đäşĥþőäřđ v2 şčĥęmä", + "enter-edit-mode": { + "label": "Mäĸę ęđįŧäþľę", + "tooltip": "Ŧĥįş đäşĥþőäřđ ŵäş mäřĸęđ äş řęäđ őʼnľy" + }, + "exit-edit-mode": { + "label": "Ēχįŧ ęđįŧ", + "tooltip": "Ēχįŧş ęđįŧ mőđę äʼnđ đįşčäřđş ūʼnşävęđ čĥäʼnģęş" + }, + "mark-favorite": "Mäřĸ äş ƒävőřįŧę", + "more-save-options": "Mőřę şävę őpŧįőʼnş", + "open-original": "Øpęʼn őřįģįʼnäľ đäşĥþőäřđ", + "playlist-next": "Ğő ŧő ʼnęχŧ đäşĥþőäřđ", + "playlist-previous": "Ğő ŧő přęvįőūş đäşĥþőäřđ", + "playlist-stop": "Ŝŧőp pľäyľįşŧ", + "public-dashboard": "Pūþľįč", + "refresh": "Ŗęƒřęşĥ đäşĥþőäřđ", + "save": "Ŝävę đäşĥþőäřđ", + "save-dashboard": { + "label": "Ŝävę đäşĥþőäřđ", + "tooltip": "Ŝävę čĥäʼnģęş" + }, + "save-dashboard-copy": { + "label": "Ŝävę äş čőpy", + "tooltip": "Ŝävę äş čőpy" + }, + "save-dashboard-short": "Ŝävę", + "save-library-panel": "Ŝävę ľįþřäřy päʼnęľ", + "settings": "Đäşĥþőäřđ şęŧŧįʼnģş", + "share": { + "label": "Ŝĥäřę", + "tooltip": "Ŝĥäřę đäşĥþőäřđ" + }, + "share-button": "Ŝĥäřę", + "show-hidden-elements": "Ŝĥőŵ ĥįđđęʼn", + "switch-old-dashboard": "Ŝŵįŧčĥ ŧő őľđ đäşĥþőäřđ päģę", + "unlink-library-panel": "Ůʼnľįʼnĸ ľįþřäřy päʼnęľ", + "unmark-favorite": "Ůʼnmäřĸ äş ƒävőřįŧę" + }, + "validation": { + "invalid-dashboard-id": "Cőūľđ ʼnőŧ ƒįʼnđ ä väľįđ Ğřäƒäʼnä.čőm ĨĐ", + "invalid-json": "Ńőŧ väľįđ ĴŜØŃ", + "tags-expected-array": "ŧäģş ęχpęčŧęđ äřřäy", + "tags-expected-strings": "ŧäģş ęχpęčŧęđ äřřäy őƒ şŧřįʼnģş" + }, + "viz-panel": { + "options": { + "description": "Đęşčřįpŧįőʼn", + "title": "Päʼnęľ őpŧįőʼnş", + "title-option": "Ŧįŧľę", + "transparent-background": "Ŧřäʼnşpäřęʼnŧ þäčĸģřőūʼnđ" + } + } + }, + "dashboard-import": { + "file-dropzone": { + "primary-text": "Ůpľőäđ đäşĥþőäřđ ĴŜØŃ ƒįľę", + "secondary-text": "Đřäģ äʼnđ đřőp ĥęřę őř čľįčĸ ŧő þřőŵşę" + }, + "form-actions": { + "cancel": "Cäʼnčęľ", + "load": "Ŀőäđ" + }, + "gcom-field": { + "label": "Fįʼnđ äʼnđ įmpőřŧ đäşĥþőäřđş ƒőř čőmmőʼn äppľįčäŧįőʼnş äŧ <1>", + "load-button": "Ŀőäđ", + "placeholder": "Ğřäƒäʼnä.čőm đäşĥþőäřđ ŮŖĿ őř ĨĐ", + "validation-required": "Å Ğřäƒäʼnä đäşĥþőäřđ ŮŖĿ őř ĨĐ įş řęqūįřęđ" + }, + "json-field": { + "label": "Ĩmpőřŧ vįä đäşĥþőäřđ ĴŜØŃ mőđęľ", + "validation-required": "Ńęęđ ä đäşĥþőäřđ ĴŜØŃ mőđęľ" + } + }, + "dashboard-links": { + "empty-state": { + "button-title": "Åđđ đäşĥþőäřđ ľįʼnĸ", + "info-box-content": "Đäşĥþőäřđ ľįʼnĸş äľľőŵ yőū ŧő pľäčę ľįʼnĸş ŧő őŧĥęř đäşĥþőäřđş äʼnđ ŵęþ şįŧęş đįřęčŧľy þęľőŵ ŧĥę đäşĥþőäřđ ĥęäđęř. <2>Ŀęäřʼn mőřę", + "title": "Ŧĥęřę äřę ʼnő đäşĥþőäřđ ľįʼnĸş äđđęđ yęŧ" + } + }, + "dashboard-settings": { + "annotations": { + "title": "Åʼnʼnőŧäŧįőʼnş" + }, + "dashboard-delete-button": "Đęľęŧę đäşĥþőäřđ", + "delete-modal": { + "confirmation-text": "Đęľęŧę", + "delete-button": "Đęľęŧę", + "title": "Đęľęŧę" + }, + "delete-modal-restore-dashboards-text": "Ŧĥįş äčŧįőʼn ŵįľľ mäřĸ ŧĥę đäşĥþőäřđ ƒőř đęľęŧįőʼn įʼn 30 đäyş. Ÿőūř őřģäʼnįžäŧįőʼn äđmįʼnįşŧřäŧőř čäʼn řęşŧőřę įŧ äʼnyŧįmę þęƒőřę ŧĥę 30 đäyş ęχpįřę.", + "delete-modal-text": "Đő yőū ŵäʼnŧ ŧő đęľęŧę ŧĥįş đäşĥþőäřđ?", + "general": { + "auto-refresh-description": "Đęƒįʼnę ŧĥę äūŧő řęƒřęşĥ įʼnŧęřväľş ŧĥäŧ şĥőūľđ þę äväįľäþľę įʼn ŧĥę äūŧő řęƒřęşĥ ľįşŧ. Ůşę ŧĥę ƒőřmäŧ '5ş' ƒőř şęčőʼnđş, '1m' ƒőř mįʼnūŧęş, '1ĥ' ƒőř ĥőūřş, äʼnđ '1đ' ƒőř đäyş (ę.ģ.: '5ş,10ş,30ş,1m,5m,15m,30m,1ĥ,2ĥ,1đ').", + "auto-refresh-label": "Åūŧő řęƒřęşĥ", + "description-label": "Đęşčřįpŧįőʼn", + "editable-description": "Ŝęŧ ŧő řęäđ-őʼnľy ŧő đįşäþľę äľľ ęđįŧįʼnģ. Ŗęľőäđ ŧĥę đäşĥþőäřđ ƒőř čĥäʼnģęş ŧő ŧäĸę ęƒƒęčŧ", + "editable-label": "Ēđįŧäþľę", + "folder-label": "Főľđęř", + "panel-options-graph-tooltip-description": "Cőʼnŧřőľş ŧőőľŧįp äʼnđ ĥővęř ĥįģĥľįģĥŧ þęĥävįőř äčřőşş đįƒƒęřęʼnŧ päʼnęľş. Ŗęľőäđ ŧĥę đäşĥþőäřđ ƒőř čĥäʼnģęş ŧő ŧäĸę ęƒƒęčŧ", + "panel-options-graph-tooltip-label": "Ğřäpĥ ŧőőľŧįp", + "panel-options-label": "Päʼnęľ őpŧįőʼnş", + "panels-preload-description": "Ŵĥęʼn ęʼnäþľęđ äľľ päʼnęľş ŵįľľ şŧäřŧ ľőäđįʼnģ äş şőőʼn äş ŧĥę đäşĥþőäřđ ĥäş þęęʼn ľőäđęđ.", + "panels-preload-label": "Přęľőäđ päʼnęľş", + "tags-label": "Ŧäģş", + "title": "Ğęʼnęřäľ", + "title-label": "Ŧįŧľę" + }, + "json-editor": { + "save-button": "Ŝävę čĥäʼnģęş", + "subtitle": "Ŧĥę ĴŜØŃ mőđęľ þęľőŵ įş ŧĥę đäŧä şŧřūčŧūřę ŧĥäŧ đęƒįʼnęş ŧĥę đäşĥþőäřđ. Ŧĥįş įʼnčľūđęş đäşĥþőäřđ şęŧŧįʼnģş, päʼnęľ şęŧŧįʼnģş, ľäyőūŧ, qūęřįęş, äʼnđ şő őʼn.", + "title": "ĴŜØŃ Mőđęľ" + }, + "links": { + "title": "Ŀįʼnĸş" + }, + "permissions": { + "title": "Pęřmįşşįőʼnş" + }, + "provisioned-delete-modal": { + "confirm-button": "ØĶ", + "text-1": "Ŧĥįş đäşĥþőäřđ įş mäʼnäģęđ þy Ğřäƒäʼnä přővįşįőʼnįʼnģ äʼnđ čäʼnʼnőŧ þę đęľęŧęđ. Ŗęmővę ŧĥę đäşĥþőäřđ ƒřőm ŧĥę čőʼnƒįģ ƒįľę ŧő đęľęŧę įŧ.", + "text-2": "Ŝęę ģřäƒäʼnä đőčūmęʼnŧäŧįőʼn ƒőř mőřę įʼnƒőřmäŧįőʼn äþőūŧ přővįşįőʼnįʼnģ. ", + "text-3": "Fįľę päŧĥ: {{provisionedId}}", + "text-link": "Ğő ŧő đőčş päģę", + "title": "Cäʼnʼnőŧ đęľęŧę přővįşįőʼnęđ đäşĥþőäřđ" + }, + "settings": { + "title": "Ŝęŧŧįʼnģş" + }, + "time-picker": { + "hide-time-picker": "Ħįđę ŧįmę pįčĸęř", + "now-delay-description": "Ēχčľūđę řęčęʼnŧ đäŧä ŧĥäŧ mäy þę įʼnčőmpľęŧę.", + "now-delay-label": "Ńőŵ đęľäy", + "refresh-live-dashboards-description": "Cőʼnŧįʼnūőūşľy řę-đřäŵ päʼnęľş ŵĥęřę ŧĥę ŧįmę řäʼnģę řęƒęřęʼnčęş 'ʼnőŵ'", + "refresh-live-dashboards-label": "Ŗęƒřęşĥ ľįvę đäşĥþőäřđş", + "time-options-label": "Ŧįmę őpŧįőʼnş", + "time-zone-label": "Ŧįmę žőʼnę", + "week-start-label": "Ŵęęĸ şŧäřŧ" + }, + "variables": { + "title": "Väřįäþľęş" + }, + "versions": { + "title": "Vęřşįőʼnş" + } + }, + "dashboards": { + "panel-edit": { + "angular-deprecation-button-open-panel-json": "Øpęʼn ĴŜØŃ ęđįŧőř", + "angular-deprecation-description": "Åʼnģūľäř päʼnęľş őpŧįőʼnş čäʼn őʼnľy þę ęđįŧęđ ūşįʼnģ ŧĥę ĴŜØŃ ęđįŧőř.", + "angular-deprecation-heading": "Päʼnęľ őpŧįőʼnş" + }, + "panel-queries": { + "add-query-from-library": "Åđđ qūęřy ƒřőm ľįþřäřy" + }, + "settings": { + "variables": { + "dependencies": { + "button": "Ŝĥőŵ đępęʼnđęʼnčįęş", + "title": "Đępęʼnđęʼnčįęş" + } + } + } + }, + "data-source-list": { + "empty-state": { + "button-title": "Åđđ đäŧä şőūřčę", + "pro-tip": "Ÿőū čäʼn äľşő đęƒįʼnę đäŧä şőūřčęş ŧĥřőūģĥ čőʼnƒįģūřäŧįőʼn ƒįľęş. <2>Ŀęäřʼn mőřę", + "title": "Ńő đäŧä şőūřčęş đęƒįʼnęđ" + } + }, + "data-source-picker": { + "add-new-data-source": "Cőʼnƒįģūřę ä ʼnęŵ đäŧä şőūřčę", + "built-in-list": { + "description-dashboard": "Ŗęūşę qūęřy řęşūľŧş ƒřőm őŧĥęř vįşūäľįžäŧįőʼnş", + "description-grafana": "Đįşčővęř vįşūäľįžäŧįőʼnş ūşįʼnģ mőčĸ đäŧä", + "description-mixed": "Ůşę mūľŧįpľę đäŧä şőūřčęş" + }, + "list": { + "no-data-source-message": "Ńő đäŧä şőūřčęş ƒőūʼnđ" + }, + "modal": { + "configure-new-data-source": "Øpęʼn ä ʼnęŵ ŧäþ äʼnđ čőʼnƒįģūřę ä đäŧä şőūřčę", + "input-placeholder": "Ŝęľęčŧ đäŧä şőūřčę", + "title": "Ŝęľęčŧ đäŧä şőūřčę" + }, + "open-advanced-button": "Øpęʼn äđväʼnčęđ đäŧä şőūřčę pįčĸęř" + }, + "data-source-testing-status-page": { + "error-more-details-link": "Cľįčĸ <2>ĥęřę ŧő ľęäřʼn mőřę äþőūŧ ŧĥįş ęřřőř.", + "success-more-details-links": "Ńęχŧ, yőū čäʼn şŧäřŧ ŧő vįşūäľįžę đäŧä þy <2>þūįľđįʼnģ ä đäşĥþőäřđ, őř þy qūęřyįʼnģ đäŧä įʼn ŧĥę <5>Ēχpľőřę vįęŵ." + }, + "data-sources": { + "datasource-add-button": { + "label": "Åđđ ʼnęŵ đäŧä şőūřčę" + }, + "empty-state": { + "message": "Ńő đäŧä şőūřčęş ƒőūʼnđ" + } + }, + "embed": { + "share": { + "time-range-description": "Cĥäʼnģę ŧĥę čūřřęʼnŧ řęľäŧįvę ŧįmę řäʼnģę ŧő äʼn äþşőľūŧę ŧįmę řäʼnģę", + "time-range-label": "Ŀőčĸ ŧįmę řäʼnģę" + } + }, + "empty-list-cta": { + "pro-tip": "PřőŦįp: {{proTip}}" + }, + "entity-not-found": { + "description": "Ŵę'řę ľőőĸįʼnģ þūŧ čäʼn'ŧ şęęm ŧő ƒįʼnđ ŧĥįş {{lowerCaseEntity}}. Ŧřy řęŧūřʼnįʼnģ <4>ĥőmę őř şęęĸįʼnģ ĥęľp őʼn ŧĥę <7>čőmmūʼnįŧy şįŧę." + }, + "errors": { + "dashboard-settings": { + "annotations": { + "datasource": "Ŧĥę şęľęčŧęđ đäŧä şőūřčę đőęş ʼnőŧ şūppőřŧ äʼnʼnőŧäŧįőʼnş. Pľęäşę şęľęčŧ ä đįƒƒęřęʼnŧ đäŧä şőūřčę." + } + } + }, + "explore": { + "add-to-dashboard": "Åđđ ŧő đäşĥþőäřđ", + "logs": { + "logs-volume": { + "add-filters": "Åđđ mőřę ľäþęľş ŧő yőūř qūęřy ŧő ʼnäřřőŵ đőŵʼn yőūř şęäřčĥ.", + "decrease-timerange": "Đęčřęäşę ŧĥę ŧįmę řäʼnģę őƒ yőūř qūęřy.", + "much-data": "Ŧĥę qūęřy įş ŧřyįʼnģ ŧő äččęşş ŧőő mūčĥ đäŧä. Ŧřy őʼnę őř mőřę őƒ ŧĥę ƒőľľőŵįʼnģ:" + }, + "maximum-pinned-logs": "Mäχįmūm őƒ {{PINNED_LOGS_LIMIT}} pįʼnʼnęđ ľőģş řęäčĥęđ. Ůʼnpįʼn ä ľőģ ŧő äđđ äʼnőŧĥęř.", + "no-logs-found": "Ńő ľőģş ƒőūʼnđ.", + "scan-for-older-logs": "Ŝčäʼn ƒőř őľđęř ľőģş", + "stop-scan": "Ŝŧőp şčäʼn" + }, + "rich-history": { + "close-tooltip": "Cľőşę qūęřy ĥįşŧőřy", + "datasource-a-z": "Đäŧä şőūřčę Å-Ż", + "datasource-z-a": "Đäŧä şőūřčę Ż-Å", + "newest-first": "Ńęŵęşŧ ƒįřşŧ", + "oldest-first": "Øľđęşŧ ƒįřşŧ", + "query-history": "Qūęřy ĥįşŧőřy", + "query-library": "Qūęřy ľįþřäřy", + "settings": "Ŝęŧŧįʼnģş", + "starred": "Ŝŧäřřęđ" + }, + "rich-history-card": { + "add-comment-form": "Åđđ čőmmęʼnŧ ƒőřm", + "add-comment-tooltip": "Åđđ čőmmęʼnŧ", + "add-to-library": "Åđđ ŧő ľįþřäřy", + "cancel": "Cäʼnčęľ", + "confirm-delete": "Đęľęŧę", + "copy-query-tooltip": "Cőpy qūęřy ŧő čľįpþőäřđ", + "copy-shortened-link-tooltip": "Cőpy şĥőřŧęʼnęđ ľįʼnĸ ŧő čľįpþőäřđ", + "datasource-icon-label": "Đäŧä şőūřčę įčőʼn", + "datasource-name-label": "Đäŧä şőūřčę ʼnämę", + "datasource-not-exist": "Đäŧä şőūřčę đőęş ʼnőŧ ęχįşŧ äʼnymőřę", + "delete-query-confirmation-title": "Đęľęŧę", + "delete-query-title": "Đęľęŧę qūęřy", + "delete-query-tooltip": "Đęľęŧę qūęřy", + "delete-starred-query-confirmation-text": "Åřę yőū şūřę yőū ŵäʼnŧ ŧő pęřmäʼnęʼnŧľy đęľęŧę yőūř şŧäřřęđ qūęřy?", + "edit-comment-tooltip": "Ēđįŧ čőmmęʼnŧ", + "optional-description": "Åʼn őpŧįőʼnäľ đęşčřįpŧįőʼn őƒ ŵĥäŧ ŧĥę qūęřy đőęş.", + "query-comment-label": "Qūęřy čőmmęʼnŧ", + "query-text-label": "Qūęřy ŧęχŧ", + "save-comment": "Ŝävę čőmmęʼnŧ", + "star-query-tooltip": "Ŝŧäř qūęřy", + "unstar-query-tooltip": "Ůʼnşŧäř qūęřy", + "update-comment-form": "Ůpđäŧę čőmmęʼnŧ ƒőřm" + }, + "rich-history-container": { + "loading": "Ŀőäđįʼnģ..." + }, + "rich-history-notification": { + "query-copied": "Qūęřy čőpįęđ ŧő čľįpþőäřđ", + "query-deleted": "Qūęřy đęľęŧęđ" + }, + "rich-history-queries-tab": { + "displaying-partial-queries": "Đįşpľäyįʼnģ {{ count }} qūęřįęş", + "displaying-queries": "{{ count }} qūęřįęş", + "filter-aria-label": "Fįľŧęř qūęřįęş ƒőř đäŧä şőūřčęş(ş)", + "filter-history": "Fįľŧęř ĥįşŧőřy", + "filter-placeholder": "Fįľŧęř qūęřįęş ƒőř đäŧä şőūřčęş(ş)", + "history-local": "Ŧĥę ĥįşŧőřy įş ľőčäľ ŧő yőūř þřőŵşęř äʼnđ įş ʼnőŧ şĥäřęđ ŵįŧĥ őŧĥęřş.", + "loading": "Ŀőäđįʼnģ...", + "loading-results": "Ŀőäđįʼnģ řęşūľŧş...", + "search-placeholder": "Ŝęäřčĥ qūęřįęş", + "showing-queries": "Ŝĥőŵįʼnģ {{ shown }} őƒ {{ total }} <0>Ŀőäđ mőřę", + "sort-aria-label": "Ŝőřŧ qūęřįęş", + "sort-placeholder": "Ŝőřŧ qūęřįęş þy" + }, + "rich-history-settings-tab": { + "alert-info": "Ğřäƒäʼnä ŵįľľ ĸęęp ęʼnŧřįęş ūp ŧő {{optionLabel}}.Ŝŧäřřęđ ęʼnŧřįęş ŵőʼn'ŧ þę đęľęŧęđ.", + "change-default-tab": "Cĥäʼnģę ŧĥę đęƒäūľŧ äčŧįvę ŧäþ ƒřőm “Qūęřy ĥįşŧőřy” ŧő “Ŝŧäřřęđ”", + "clear-history-info": "Đęľęŧę äľľ őƒ yőūř qūęřy ĥįşŧőřy, pęřmäʼnęʼnŧľy.", + "clear-query-history": "Cľęäř qūęřy ĥįşŧőřy", + "clear-query-history-button": "Cľęäř qūęřy ĥįşŧőřy", + "delete-confirm": "Đęľęŧę", + "delete-confirm-text": "Åřę yőū şūřę yőū ŵäʼnŧ ŧő pęřmäʼnęʼnŧľy đęľęŧę yőūř qūęřy ĥįşŧőřy?", + "delete-title": "Đęľęŧę", + "history-time-span": "Ħįşŧőřy ŧįmę şpäʼn", + "history-time-span-description": "Ŝęľęčŧ ŧĥę pęřįőđ őƒ ŧįmę ƒőř ŵĥįčĥ Ğřäƒäʼnä ŵįľľ şävę yőūř qūęřy ĥįşŧőřy. Ůp ŧő {{MAX_HISTORY_ITEMS}} ęʼnŧřįęş ŵįľľ þę şŧőřęđ.", + "only-show-active-datasource": "Øʼnľy şĥőŵ qūęřįęş ƒőř đäŧä şőūřčę čūřřęʼnŧľy äčŧįvę įʼn Ēχpľőřę", + "query-history-deleted": "Qūęřy ĥįşŧőřy đęľęŧęđ", + "retention-period": { + "1-week": "1 ŵęęĸ", + "2-days": "2 đäyş", + "2-weeks": "2 ŵęęĸş", + "5-days": "5 đäyş" + } + }, + "rich-history-starred-tab": { + "filter-queries-aria-label": "Fįľŧęř qūęřįęş ƒőř đäŧä şőūřčęş(ş)", + "filter-queries-placeholder": "Fįľŧęř qūęřįęş ƒőř đäŧä şőūřčęş(ş)", + "loading": "Ŀőäđįʼnģ...", + "loading-results": "Ŀőäđįʼnģ řęşūľŧş...", + "local-history-message": "Ŧĥę ĥįşŧőřy įş ľőčäľ ŧő yőūř þřőŵşęř äʼnđ įş ʼnőŧ şĥäřęđ ŵįŧĥ őŧĥęřş.", + "search-queries-placeholder": "Ŝęäřčĥ qūęřįęş", + "showing-queries": "Ŝĥőŵįʼnģ {{ shown }} őƒ {{ total }} <0>Ŀőäđ mőřę", + "sort-queries-aria-label": "Ŝőřŧ qūęřįęş", + "sort-queries-placeholder": "Ŝőřŧ qūęřįęş þy" + }, + "rich-history-utils": { + "a-week-ago": "ä ŵęęĸ äģő", + "days-ago": "{{num}} đäyş äģő", + "default-from": "ʼnőŵ-1ĥ", + "default-to": "ʼnőŵ", + "today": "ŧőđäy", + "two-weeks-ago": "ŧŵő ŵęęĸş äģő", + "yesterday": "yęşŧęřđäy" + }, + "rich-history-utils-notification": { + "saving-failed": "Ŝävįʼnģ řįčĥ ĥįşŧőřy ƒäįľęđ", + "update-failed": "Ŗįčĥ Ħįşŧőřy ūpđäŧę ƒäįľęđ" + }, + "run-query": { + "left-pane": "Ŀęƒŧ päʼnę", + "right-pane": "Ŗįģĥŧ päʼnę", + "run-query-button": "Ŗūʼn qūęřy", + "switch-datasource-button": "Ŝŵįŧčĥ đäŧä şőūřčę äʼnđ řūʼn qūęřy" + }, + "secondary-actions": { + "add-from-query-library": "Åđđ qūęřy ƒřőm ľįþřäřy", + "query-add-button": "Åđđ qūęřy", + "query-add-button-aria-label": "Åđđ qūęřy", + "query-history-button": "Qūęřy ĥįşŧőřy", + "query-history-button-aria-label": "Qūęřy ĥįşŧőřy", + "query-inspector-button": "Qūęřy įʼnşpęčŧőř", + "query-inspector-button-aria-label": "Qūęřy įʼnşpęčŧőř" + }, + "table": { + "no-data": "0 şęřįęş řęŧūřʼnęđ", + "title": "Ŧäþľę", + "title-with-name": "Ŧäþľę - {{name}}" + }, + "toolbar": { + "add-to-extensions": "Åđđ", + "add-to-queryless-extensions": "Ğő qūęřyľęşş", + "aria-label": "Ēχpľőřę ŧőőľþäř", + "copy-link": "Cőpy ŮŖĿ", + "copy-link-abs-time": "Cőpy äþşőľūŧę ŮŖĿ", + "copy-links-absolute-category": "Ŧįmę-şyʼnč ŮŖĿ ľįʼnĸş (şĥäřę ŵįŧĥ ŧįmę řäʼnģę įʼnŧäčŧ)", + "copy-links-normal-category": "Ńőřmäľ ŮŖĿ ľįʼnĸş", + "copy-shortened-link": "Cőpy şĥőřŧęʼnęđ ŮŖĿ", + "copy-shortened-link-abs-time": "Cőpy äþşőľūŧę şĥőřŧęʼnęđ ŮŖĿ", + "copy-shortened-link-label": "Ŝĥäřę", + "copy-shortened-link-menu": "Øpęʼn čőpy ľįʼnĸ őpŧįőʼnş", + "refresh-picker-cancel": "Cäʼnčęľ", + "refresh-picker-run": "Ŗūʼn qūęřy", + "split-close": " Cľőşę ", + "split-close-tooltip": "Cľőşę şpľįŧ päʼnę", + "split-narrow": "Ńäřřőŵ päʼnę", + "split-title": "Ŝpľįŧ", + "split-tooltip": "Ŝpľįŧ ŧĥę päʼnę", + "split-widen": "Ŵįđęʼn päʼnę" + } + }, + "explore-metrics": { + "breakdown": { + "clearFilter": "Cľęäř ƒįľŧęř", + "labelSelect": "Ŝęľęčŧ", + "missing-otel-labels": "Ŧĥįş męŧřįč ĥäş ŧőő mäʼny ĵőþ äʼnđ įʼnşŧäʼnčę ľäþęľ väľūęş ŧő čäľľ ŧĥę Přőmęŧĥęūş ľäþęľ_väľūęş ęʼnđpőįʼnŧ ŵįŧĥ ŧĥę mäŧčĥ[] päřämęŧęř. Ŧĥęşę ľäþęľ väľūęş äřę ūşęđ ŧő ĵőįʼn ŧĥę męŧřįč ŵįŧĥ ŧäřģęŧ_įʼnƒő, ŵĥįčĥ čőʼnŧäįʼnş ŧĥę řęşőūřčę äŧŧřįþūŧęş. Pľęäşę įʼnčľūđę mőřę řęşőūřčę äŧŧřįþūŧęş ƒįľŧęřş.", + "noMatchingValue": "Ńő väľūęş ƒőūʼnđ mäŧčĥįʼnģ; {{filter}}", + "sortBy": "Ŝőřŧ þy" + }, + "related-logs": { + "LrrDocsLink": "Ŀőĸį Ŗęčőřđįʼnģ Ŗūľę", + "openExploreLogs": "Øpęʼn Ēχpľőřę Ŀőģş", + "relatedLogsUnavailable": "Ńő řęľäŧęđ ľőģş ƒőūʼnđ. Ŧő şęę řęľäŧęđ ľőģş, yőū čäʼn ęįŧĥęř:<1><0>äđĵūşŧ ŧĥę ľäþęľ ƒįľŧęř ŧő ƒįʼnđ ľőģş ŵįŧĥ ŧĥę şämę ľäþęľş äş ŧĥę čūřřęʼnŧľy-şęľęčŧęđ męŧřįč<1>şęľęčŧ ä męŧřįč čřęäŧęđ þy ä <2><0>Ŀőĸį Ŗęčőřđįʼnģ Ŗūľę", + "warnExperimentalFeature": "Ŗęľäŧęđ ľőģş įş äʼn ęχpęřįmęʼnŧäľ ƒęäŧūřę." + }, + "viewBy": "Vįęŵ þy" + }, + "export": { + "json": { + "cancel-button": "Cäʼnčęľ", + "copy-button": "Cőpy ŧő čľįpþőäřđ", + "download-button": "Đőŵʼnľőäđ ƒįľę", + "download-successful_toast_message": "Ÿőūř ĴŜØŃ ĥäş þęęʼn đőŵʼnľőäđęđ", + "export-externally-label": "Ēχpőřŧ ŧĥę đäşĥþőäřđ ŧő ūşę įʼn äʼnőŧĥęř įʼnşŧäʼnčę", + "info-text": "Cőpy őř đőŵʼnľőäđ ä ĴŜØŃ ƒįľę čőʼnŧäįʼnįʼnģ ŧĥę ĴŜØŃ őƒ yőūř đäşĥþőäřđ", + "title": "Ēχpőřŧ đäşĥþőäřđ ĴŜØŃ" + }, + "menu": { + "export-as-json-label": "Ēχpőřŧ", + "export-as-json-tooltip": "Ēχpőřŧ" + } + }, + "folder-filter": { + "clear-folder-button": "Cľęäř ƒőľđęřş" + }, + "folder-picker": { + "create-instructions": "Přęşş ęʼnŧęř ŧő čřęäŧę ŧĥę ʼnęŵ ƒőľđęř.", + "loading": "Ŀőäđįʼnģ ƒőľđęřş..." + }, + "forgot-password": { + "back-button": "ßäčĸ ŧő ľőģįʼn", + "change-password": { + "skip-button": "Ŝĸįp", + "submit-button": "Ŝūþmįŧ" + }, + "contact-admin": "Đįđ yőū ƒőřģęŧ yőūř ūşęřʼnämę őř ęmäįľ? Cőʼnŧäčŧ yőūř Ğřäƒäʼnä äđmįʼnįşŧřäŧőř.", + "email-sent": "Åʼn ęmäįľ ŵįŧĥ ä řęşęŧ ľįʼnĸ ĥäş þęęʼn şęʼnŧ ŧő ŧĥę ęmäįľ äđđřęşş. Ÿőū şĥőūľđ řęčęįvę įŧ şĥőřŧľy.", + "reset-password-header": "Ŗęşęŧ päşşŵőřđ", + "send-email-button": "Ŝęʼnđ řęşęŧ ęmäįľ" + }, + "form-prompt": { + "continue-button": "Cőʼnŧįʼnūę ęđįŧįʼnģ", + "description": "Cĥäʼnģęş ŧĥäŧ yőū mäđę mäy ʼnőŧ þę şävęđ.", + "discard-button": "Đįşčäřđ ūʼnşävęđ čĥäʼnģęş" + }, + "gen-ai": { + "apply-suggestion": "Åppľy", + "incomplete-request-error": "Ŝőřřy, Ĩ ŵäş ūʼnäþľę ŧő čőmpľęŧę yőūř řęqūęşŧ. Pľęäşę ŧřy äģäįʼn.", + "send-custom-feedback": "Ŝęʼnđ" + }, + "grafana-ui": { + "action-editor": { + "button": { + "confirm": "Cőʼnƒįřm", + "confirm-action": "Cőʼnƒįřm äčŧįőʼn" + }, + "inline": { + "add-action": "Åđđ äčŧįőʼn", + "edit-action": "Ēđįŧ äčŧįőʼn" + }, + "modal": { + "action-body": "ßőđy", + "action-method": "Męŧĥőđ", + "action-query-params": "Qūęřy päřämęŧęřş", + "action-title": "Ŧįŧľę", + "action-title-placeholder": "Åčŧįőʼn ŧįŧľę", + "one-click-description": "Øʼnľy őʼnę ľįʼnĸ {{ action }} čäʼn ĥävę őʼnę čľįčĸ ęʼnäþľęđ äŧ ä ŧįmę" + } + }, + "auto-save-field": { + "saved": "Ŝävęđ!", + "saving": "Ŝävįʼnģ <1>" + }, + "color-picker-popover": { + "palette-tab": "Cőľőřş", + "spectrum-tab": "Cūşŧőm" + }, + "confirm-button": { + "cancel": "Cäʼnčęľ" + }, + "data-link-editor": { + "info": "Ŵįŧĥ đäŧä ľįʼnĸş yőū čäʼn řęƒęřęʼnčę đäŧä väřįäþľęş ľįĸę şęřįęş ʼnämę, ľäþęľş äʼnđ väľūęş. Ŧypę CMĐ+Ŝpäčę, CŦŖĿ+Ŝpäčę, őř $ ŧő őpęʼn väřįäþľę şūģģęşŧįőʼnş." + }, + "data-link-editor-modal": { + "cancel": "Cäʼnčęľ", + "one-click-description": "Øʼnľy őʼnę ľįʼnĸ čäʼn ĥävę őʼnę čľįčĸ ęʼnäþľęđ äŧ ä ŧįmę", + "save": "Ŝävę" + }, + "data-link-inline-editor": { + "one-click": "Øʼnę čľįčĸ" + }, + "data-links-inline-editor": { + "add-link": "Åđđ ľįʼnĸ", + "edit-link": "Ēđįŧ ľįʼnĸ", + "one-click": "Øʼnę čľįčĸ", + "one-click-enabled": "Øʼnę čľįčĸ ęʼnäþľęđ", + "title-not-provided": "Ŧįŧľę ʼnőŧ přővįđęđ", + "tooltip-edit": "Ēđįŧ", + "tooltip-remove": "Ŗęmővę", + "url-not-provided": "Đäŧä ľįʼnĸ ūřľ ʼnőŧ přővįđęđ" + }, + "data-source-http-settings": { + "access-help": "Ħęľp <1>", + "access-help-details": "Åččęşş mőđę čőʼnŧřőľş ĥőŵ řęqūęşŧş ŧő ŧĥę đäŧä şőūřčę ŵįľľ þę ĥäʼnđľęđ.<1> <1>Ŝęřvęř şĥőūľđ þę ŧĥę přęƒęřřęđ ŵäy įƒ ʼnőŧĥįʼnģ ęľşę įş şŧäŧęđ.", + "allowed-cookies": "Åľľőŵęđ čőőĸįęş", + "allowed-cookies-description": "Ğřäƒäʼnä přőχy đęľęŧęş ƒőřŵäřđęđ čőőĸįęş þy đęƒäūľŧ. Ŝpęčįƒy čőőĸįęş þy ʼnämę ŧĥäŧ şĥőūľđ þę ƒőřŵäřđęđ ŧő ŧĥę đäŧä şőūřčę.", + "auth": "Åūŧĥ", + "basic-auth": "ßäşįč Åūŧĥ Đęŧäįľş", + "browser-mode-description": "Åľľ řęqūęşŧş ŵįľľ þę mäđę ƒřőm ŧĥę þřőŵşęř đįřęčŧľy ŧő ŧĥę đäŧä şőūřčę äʼnđ mäy þę şūþĵęčŧ ŧő Cřőşş-Øřįģįʼn Ŗęşőūřčę Ŝĥäřįʼnģ (CØŖŜ) řęqūįřęmęʼnŧş. Ŧĥę ŮŖĿ ʼnęęđş ŧő þę äččęşşįþľę ƒřőm ŧĥę þřőŵşęř įƒ yőū şęľęčŧ ŧĥįş äččęşş mőđę.", + "browser-mode-label": "ßřőŵşęř", + "browser-mode-title": "<0>ßřőŵşęř äččęşş mőđę:", + "default-url-tooltip": "Ŝpęčįƒy ä čőmpľęŧę ĦŦŦP ŮŖĿ (ƒőř ęχämpľę ĥŧŧp://yőūř_şęřvęř:8080)", + "direct-url-tooltip": "Ÿőūř äččęşş męŧĥőđ įş <1>ßřőŵşęř, ŧĥįş męäʼnş ŧĥę ŮŖĿ ʼnęęđş ŧő þę äččęşşįþľę ƒřőm ŧĥę þřőŵşęř.", + "heading": "ĦŦŦP", + "invalid-url-error": "Ĩʼnväľįđ ŮŖĿ", + "proxy-url-tooltip": "Ÿőūř äččęşş męŧĥőđ įş <1>Ŝęřvęř, ŧĥįş męäʼnş ŧĥę ŮŖĿ ʼnęęđş ŧő þę äččęşşįþľę ƒřőm ŧĥę ģřäƒäʼnä þäčĸęʼnđ/şęřvęř.", + "server-mode-description": "Åľľ řęqūęşŧş ŵįľľ þę mäđę ƒřőm ŧĥę þřőŵşęř ŧő Ğřäƒäʼnä þäčĸęʼnđ/şęřvęř ŵĥįčĥ įʼn ŧūřʼn ŵįľľ ƒőřŵäřđ ŧĥę řęqūęşŧş ŧő ŧĥę đäŧä şőūřčę äʼnđ þy ŧĥäŧ čįřčūmvęʼnŧ pőşşįþľę Cřőşş-Øřįģįʼn Ŗęşőūřčę Ŝĥäřįʼnģ (CØŖŜ) řęqūįřęmęʼnŧş. Ŧĥę ŮŖĿ ʼnęęđş ŧő þę äččęşşįþľę ƒřőm ŧĥę ģřäƒäʼnä þäčĸęʼnđ/şęřvęř įƒ yőū şęľęčŧ ŧĥįş äččęşş mőđę.", + "server-mode-label": "Ŝęřvęř (đęƒäūľŧ)", + "server-mode-title": "<0>Ŝęřvęř äččęşş mőđę (Đęƒäūľŧ):" + }, + "data-source-settings": { + "alerting-settings-heading": "Åľęřŧįʼnģ", + "cert-key-reset": "Ŗęşęŧ", + "custom-headers-add": "Åđđ ĥęäđęř", + "custom-headers-title": "Cūşŧőm ĦŦŦP Ħęäđęřş", + "secure-socks-heading": "Ŝęčūřę Ŝőčĸş Přőχy", + "tls-heading": "ŦĿŜ/ŜŜĿ Åūŧĥ Đęŧäįľş" + }, + "date-time-picker": { + "apply": "Åppľy", + "cancel": "Cäʼnčęľ" + }, + "drawer": { + "close": "Cľőşę" + }, + "field-link-list": { + "external-links-heading": "Ēχŧęřʼnäľ ľįʼnĸş" + }, + "file-dropzone": { + "cancel-upload": "Cäʼnčęľ ūpľőäđ", + "file-too-large": "Fįľę įş ľäřģęř ŧĥäʼn {{size}}" + }, + "filter-input": { + "clear": "Cľęäř" + }, + "modal": { + "close-tooltip": "Cľőşę" + }, + "secret-form-field": { + "reset": "Ŗęşęŧ" + }, + "segment-async": { + "error": "Fäįľęđ ŧő ľőäđ őpŧįőʼnş", + "loading": "Ŀőäđįʼnģ őpŧįőʼnş...", + "no-options": "Ńő őpŧįőʼnş ƒőūʼnđ" + }, + "select": { + "default-create-label": "Ħįŧ ęʼnŧęř ŧő äđđ", + "no-options-label": "Ńő őpŧįőʼnş ƒőūʼnđ", + "placeholder": "Cĥőőşę" + }, + "spinner": { + "aria-label": "Ŀőäđįʼnģ" + }, + "table": { + "copy": "Cőpy ŧő Cľįpþőäřđ", + "csv-counts": "Ŗőŵş:{{rows}}, Cőľūmʼnş:{{columns}} <5>", + "filter-popup-apply": "Øĸ", + "filter-popup-cancel": "Cäʼnčęľ", + "filter-popup-clear": "Cľęäř ƒįľŧęř", + "filter-popup-heading": "Fįľŧęř þy väľūęş:", + "no-values-label": "Ńő väľūęş", + "pagination-summary": "{{itemsRangeStart}} - {{displayedEnd}} őƒ {{numRows}} řőŵş" + }, + "tags-input": { + "add": "Åđđ" + }, + "user-icon": { + "active-text": "Åčŧįvę ľäşŧ 15m" + }, + "viz-legend": { + "right-axis-indicator": "(řįģĥŧ y-äχįş)" + }, + "viz-tooltip": { + "actions-confirmation-input-placeholder": "Åřę yőū şūřę yőū ŵäʼnŧ ŧő {{ actionTitle }}?", + "actions-confirmation-label": "Cőʼnƒįřmäŧįőʼn męşşäģę", + "actions-confirmation-message": "Přővįđę ä đęşčřįpŧįvę přőmpŧ ŧő čőʼnƒįřm őř čäʼnčęľ ŧĥę äčŧįőʼn.", + "footer-add-annotation": "Åđđ äʼnʼnőŧäŧįőʼn", + "footer-click-to-action": "Cľįčĸ ŧő {{actionTitle}}", + "footer-click-to-navigate": "Cľįčĸ ŧő őpęʼn {{linkTitle}}" + } + }, + "graph": { + "container": { + "content": "Ŗęʼnđęřįʼnģ ŧőő mäʼny şęřįęş įʼn ä şįʼnģľę päʼnęľ mäy įmpäčŧ pęřƒőřmäʼnčę äʼnđ mäĸę đäŧä ĥäřđęř ŧő řęäđ. Cőʼnşįđęř řęƒįʼnįʼnģ yőūř qūęřįęş.", + "show-all-series": "Ŝĥőŵ äľľ {{length}}", + "show-only-series": "Ŝĥőŵįʼnģ őʼnľy {{MAX_NUMBER_OF_TIME_SERIES}} şęřįęş", + "title": "Ğřäpĥ" + } + }, + "help-modal": { + "column-headers": { + "description": "Đęşčřįpŧįőʼn", + "keys": "Ķęyş" + }, + "shortcuts-category": { + "dashboard": "Đäşĥþőäřđ", + "focused-panel": "Főčūşęđ päʼnęľ", + "global": "Ğľőþäľ", + "time-range": "Ŧįmę řäʼnģę" + }, + "shortcuts-description": { + "change-theme": "Cĥäʼnģę ŧĥęmę", + "collapse-all-rows": "Cőľľäpşę äľľ řőŵş", + "copy-time-range": "Cőpy ŧįmę řäʼnģę", + "dashboard-settings": "Đäşĥþőäřđ şęŧŧįʼnģş", + "duplicate-panel": "Đūpľįčäŧę Päʼnęľ", + "exit-edit/setting-views": "Ēχįŧ ęđįŧ/şęŧŧįʼnģ vįęŵş", + "expand-all-rows": "Ēχpäʼnđ äľľ řőŵş", + "go-to-dashboards": "Ğő ŧő Đäşĥþőäřđş", + "go-to-explore": "Ğő ŧő Ēχpľőřę", + "go-to-home-dashboard": "Ğő ŧő Ħőmę Đäşĥþőäřđ", + "go-to-profile": "Ğő ŧő Přőƒįľę", + "make-time-range-permanent": "Mäĸę ŧįmę řäʼnģę äþşőľūŧę/pęřmäʼnęʼnŧ", + "move-time-range-back": "Mővę ŧįmę řäʼnģę þäčĸ", + "move-time-range-forward": "Mővę ŧįmę řäʼnģę ƒőřŵäřđ", + "open-search": "Øpęʼn şęäřčĥ", + "open-shared-modal": "Øpęʼn Päʼnęľ Ŝĥäřę Mőđäľ", + "paste-time-range": "Päşŧę ŧįmę řäʼnģę", + "refresh-all-panels": "Ŗęƒřęşĥ äľľ päʼnęľş", + "remove-panel": "Ŗęmővę Päʼnęľ", + "save-dashboard": "Ŝävę đäşĥþőäřđ", + "show-all-shortcuts": "Ŝĥőŵ äľľ ĸęyþőäřđ şĥőřŧčūŧş", + "toggle-active-mode": "Ŧőģģľę įʼn-äčŧįvę / vįęŵ mőđę", + "toggle-all-panel-legends": "Ŧőģģľę äľľ päʼnęľ ľęģęʼnđş", + "toggle-auto-fit": "Ŧőģģľę äūŧő ƒįŧ päʼnęľş (ęχpęřįmęʼnŧäľ ƒęäŧūřę)", + "toggle-exemplars": "Ŧőģģľę ęχęmpľäřş įʼn äľľ päʼnęľ", + "toggle-graph-crosshair": "Ŧőģģľę şĥäřęđ ģřäpĥ čřőşşĥäįř", + "toggle-kiosk": "Ŧőģģľę ĸįőşĸ mőđę (ĥįđęş ŧőp ʼnäv)", + "toggle-panel-edit": "Ŧőģģľę päʼnęľ ęđįŧ vįęŵ", + "toggle-panel-fullscreen": "Ŧőģģľę päʼnęľ ƒūľľşčřęęʼn vįęŵ", + "toggle-panel-legend": "Ŧőģģľę päʼnęľ ľęģęʼnđ", + "zoom-out-time-range": "Żőőm őūŧ ŧįmę řäʼnģę" + }, + "title": "Ŝĥőřŧčūŧş" + }, + "help-wizard": { + "download-snapshot": "Đőŵʼnľőäđ şʼnäpşĥőŧ", + "github-comment": "Cőpy Ğįŧĥūþ čőmmęʼnŧ", + "support-bundle": "Ÿőū čäʼn äľşő řęŧřįęvę ä şūppőřŧ þūʼnđľę čőʼnŧäįʼnįʼnģ įʼnƒőřmäŧįőʼn čőʼnčęřʼnįʼnģ yőūř Ğřäƒäʼnä įʼnşŧäʼnčę äʼnđ čőʼnƒįģūřęđ đäŧäşőūřčęş įʼn ŧĥę <1>şūppőřŧ þūʼnđľęş şęčŧįőʼn.", + "troubleshooting-help": "Ŧő řęqūęşŧ ŧřőūþľęşĥőőŧįʼnģ ĥęľp, şęʼnđ ä şʼnäpşĥőŧ őƒ ŧĥįş päʼnęľ ŧő Ğřäƒäʼnä Ŀäþş Ŧęčĥʼnįčäľ Ŝūppőřŧ. Ŧĥę şʼnäpşĥőŧ čőʼnŧäįʼnş qūęřy řęşpőʼnşę đäŧä äʼnđ päʼnęľ şęŧŧįʼnģş." + }, + "inspector": { + "query": { + "collapse-all": "Cőľľäpşę äľľ", + "copy-to-clipboard": "Cőpy ŧő čľįpþőäřđ", + "description": "Qūęřy įʼnşpęčŧőř äľľőŵş yőū ŧő vįęŵ řäŵ řęqūęşŧ äʼnđ řęşpőʼnşę. Ŧő čőľľęčŧ ŧĥįş đäŧä Ğřäƒäʼnä ʼnęęđş ŧő įşşūę ä ʼnęŵ qūęřy. Cľįčĸ řęƒřęşĥ þūŧŧőʼn þęľőŵ ŧő ŧřįģģęř ä ʼnęŵ qūęřy.", + "expand-all": "Ēχpäʼnđ äľľ", + "no-data": "Ńő řęqūęşŧ äʼnđ řęşpőʼnşę čőľľęčŧęđ yęŧ. Ħįŧ řęƒřęşĥ þūŧŧőʼn", + "refresh": "Ŗęƒřęşĥ" + } + }, + "ldap-drawer": { + "attributes-section": { + "description": "Ŝpęčįƒy ŧĥę ĿĐÅP äŧŧřįþūŧęş ŧĥäŧ mäp ŧő ŧĥę ūşęř'ş ģįvęʼn ʼnämę, şūřʼnämę, äʼnđ ęmäįľ äđđřęşş, ęʼnşūřįʼnģ ŧĥę äppľįčäŧįőʼn čőřřęčŧľy řęŧřįęvęş äʼnđ đįşpľäyş ūşęř įʼnƒőřmäŧįőʼn.", + "email-label": "Ēmäįľ", + "label": "Åŧŧřįþūŧęş", + "member-of-label": "Męmþęř ؃", + "name-label": "Ńämę", + "surname-label": "Ŝūřʼnämę", + "username-label": "Ůşęřʼnämę" + }, + "extra-security-section": { + "client-cert-label": "Cľįęʼnŧ čęřŧįƒįčäŧę päŧĥ", + "client-cert-placeholder": "/päŧĥ/ŧő/čľįęʼnŧ_čęřŧ.pęm", + "client-cert-value-label": "Cľįęʼnŧ čęřŧįƒįčäŧę čőʼnŧęʼnŧ", + "client-cert-value-placeholder": "Cľįęʼnŧ čęřŧįƒįčäŧę čőʼnŧęʼnŧ įʼn þäşę64", + "client-key-label": "Cľįęʼnŧ ĸęy päŧĥ", + "client-key-placeholder": "/päŧĥ/ŧő/čľįęʼnŧ_ĸęy.pęm", + "client-key-value-label": "Cľįęʼnŧ ĸęy čőʼnŧęʼnŧ", + "client-key-value-placeholder": "Cľįęʼnŧ ĸęy čőʼnŧęʼnŧ įʼn þäşę64", + "encryption-provider-base-64": "ßäşę64-ęʼnčőđęđ čőʼnŧęʼnŧ", + "encryption-provider-description": "X.509 čęřŧįƒįčäŧę přővįđęş ŧĥę pūþľįč päřŧ, ŵĥįľę ŧĥę přįväŧę ĸęy įşşūęđ įʼn ä PĶCŜ#8 ƒőřmäŧ přővįđęş ŧĥę přįväŧę päřŧ őƒ ŧĥę äşymmęŧřįč ęʼnčřypŧįőʼn.", + "encryption-provider-file-path": "Päŧĥ ŧő ƒįľęş", + "encryption-provider-label": "Ēʼnčřypŧįőʼn ĸęy äʼnđ čęřŧįƒįčäŧę přővįşįőʼn şpęčįƒįčäŧįőʼn.", + "label": "Ēχŧřä şęčūřįŧy męäşūřęş", + "min-tls-version-description": "Ŧĥįş įş ŧĥę mįʼnįmūm ŦĿŜ vęřşįőʼn äľľőŵęđ. Åččępŧęđ väľūęş äřę: ŦĿŜ1.2, ŦĿŜ1.3.", + "min-tls-version-label": "Mįʼn ŦĿŜ vęřşįőʼn", + "root-ca-cert-label": "Ŗőőŧ CÅ čęřŧįƒįčäŧę päŧĥ", + "root-ca-cert-placeholder": "/päŧĥ/ŧő/řőőŧ_čä_čęřŧ.pęm", + "root-ca-cert-value-label": "Ŗőőŧ CÅ čęřŧįƒįčäŧę čőʼnŧęʼnŧ", + "root-ca-cert-value-placeholder": "ęχämpľę: ĿŜ0ŧĿŜ1CŖŮđĴŦįßĐŖVĴŮŜŮŻĴQ0FŮŖŜ0ŧĿŜ0ŧ", + "start-tls-description": "Ĩƒ şęŧ ŧő ŧřūę, ūşę ĿĐÅP ŵįŧĥ ŜŦÅŖŦŦĿŜ įʼnşŧęäđ őƒ ĿĐÅPŜ", + "start-tls-label": "Ŝŧäřŧ ŦĿŜ", + "tls-ciphers-label": "ŦĿŜ čįpĥęřş", + "tls-ciphers-placeholder": "ęχämpľę: ŦĿŜ_ÅĒŜ_256_ĞCM_ŜĦÅ384", + "use-ssl-description": "Ŝęŧ ŧő ŧřūę įƒ ĿĐÅP şęřvęř şĥőūľđ ūşę ŦĿŜ čőʼnʼnęčŧįőʼn (ęįŧĥęř ŵįŧĥ ŜŦÅŖŦŦĿŜ őř ĿĐÅPŜ)", + "use-ssl-label": "Ůşę ŜŜĿ", + "use-ssl-tooltip": "Főř ä čőmpľęŧę ľįşŧ őƒ şūppőřŧęđ čįpĥęřş äʼnđ ŦĿŜ vęřşįőʼnş, řęƒęř ŧő:" + }, + "group-mapping": { + "grafana-admin": { + "description": "Ĩƒ ęʼnäþľęđ, äľľ ūşęřş ƒřőm ŧĥįş ģřőūp ŵįľľ þę Ğřäƒäʼnä Åđmįʼnş", + "label": "Ğřäƒäʼnä Åđmįʼn" + }, + "group-dn": { + "description": "Ŧĥę ʼnämę őƒ ŧĥę ĸęy ūşęđ ŧő ęχŧřäčŧ ŧĥę ĨĐ ŧőĸęʼn ƒřőm ŧĥę řęŧūřʼnęđ ØÅūŧĥ2 ŧőĸęʼn.", + "label": "Ğřőūp ĐŃ" + }, + "org-id": { + "description": "Ŧĥę Ğřäƒäʼnä őřģäʼnįžäŧįőʼn đäŧäþäşę įđ. Đęƒäūľŧ őřģ (ĨĐ 1) ŵįľľ þę ūşęđ įƒ ľęƒŧ őūŧ", + "label": "Øřģ ĨĐ" + }, + "org-role": { + "label": "Øřģ řőľę *" + }, + "remove": { + "button": "Ŗęmővę ģřőūp mäppįʼnģ" + } + }, + "group-mapping-section": { + "add": { + "button": "Åđđ ģřőūp mäppįʼnģ" + }, + "description": "Mäp ĿĐÅP ģřőūpş ŧő Ğřäƒäʼnä őřģ řőľęş", + "group-search-base-dns-label": "Ğřőūp şęäřčĥ þäşę ĐŃŜ", + "group-search-base-dns-placeholder": "ęχämpľę: őū=ģřőūpş,đč=ęχämpľę,đč=čőm", + "group-search-filter-description": "Ůşęđ ŧő ƒįľŧęř äʼnđ įđęʼnŧįƒy ģřőūp ęʼnŧřįęş ŵįŧĥįʼn ŧĥę đįřęčŧőřy", + "group-search-filter-label": "Ğřőūp şęäřčĥ ƒįľŧęř", + "group-search-filter-user-attribute-description": "Ĩđęʼnŧįƒįęş ūşęřş ŵįŧĥįʼn ģřőūp ęʼnŧřįęş ƒőř ƒįľŧęřįʼnģ pūřpőşęş", + "group-search-filter-user-attribute-label": "Ğřőūp ʼnämę äŧŧřįþūŧę", + "label": "Ğřőūp mäppįʼnģ", + "skip-org-role-sync-description": "Přęvęʼnŧ şyʼnčĥřőʼnįžįʼnģ ūşęřş’ őřģäʼnįžäŧįőʼn řőľęş ƒřőm yőūř ĨđP", + "skip-org-role-sync-label": "Ŝĸįp őřģäʼnįžäŧįőʼn řőľę şyʼnč" + }, + "misc-section": { + "allow-sign-up-descrition": "Ĩƒ ʼnőŧ ęʼnäþľęđ, őʼnľy ęχįşŧįʼnģ Ğřäƒäʼnä ūşęřş čäʼn ľőģ įʼn ūşįʼnģ ĿĐÅP", + "allow-sign-up-label": "Åľľőŵ şįģʼn-ūp", + "label": "Mįşč", + "port-description": "Đęƒäūľŧ pőřŧ įş 389 ŵįŧĥőūŧ ŜŜĿ őř 636 ŵįŧĥ ŜŜĿ", + "port-label": "Pőřŧ", + "timeout-description": "Ŧįmęőūŧ įʼn şęčőʼnđş ƒőř ŧĥę čőʼnʼnęčŧįőʼn ŧő ŧĥę ĿĐÅP şęřvęř", + "timeout-label": "Ŧįmęőūŧ" + }, + "title": "Åđväʼnčęđ şęŧŧįʼnģş" + }, + "ldap-settings-page": { + "advanced-settings-section": { + "edit-button": "Ēđįŧ", + "subtitle": "Mäppįʼnģş, ęχŧřä şęčūřįŧy męäşūřęş, äʼnđ mőřę.", + "title": "Åđväʼnčęđ Ŝęŧŧįʼnģş" + }, + "alert": { + "discard-success": "ĿĐÅP şęŧŧįʼnģş đįşčäřđęđ", + "error-fetching": "Ēřřőř ƒęŧčĥįʼnģ ĿĐÅP şęŧŧįʼnģş", + "error-saving": "Ēřřőř şävįʼnģ ĿĐÅP şęŧŧįʼnģş", + "error-validate-form": "Ēřřőř väľįđäŧįʼnģ ĿĐÅP şęŧŧįʼnģş", + "feature-flag-disabled": "Ŧĥįş päģę įş őʼnľy äččęşşįþľę þy ęʼnäþľįʼnģ ŧĥę <1>şşőŜęŧŧįʼnģşĿĐÅP ƒęäŧūřę ƒľäģ.", + "saved": "ĿĐÅP şęŧŧįʼnģş şävęđ" + }, + "bind-dn": { + "description": "Đįşŧįʼnģūįşĥęđ ʼnämę őƒ ŧĥę äččőūʼnŧ ūşęđ ŧő þįʼnđ äʼnđ äūŧĥęʼnŧįčäŧę ŧő ŧĥę ĿĐÅP şęřvęř.", + "label": "ßįʼnđ ĐŃ", + "placeholder": "ęχämpľę: čʼn=äđmįʼn,đč=ģřäƒäʼnä,đč=őřģ" + }, + "bind-password": { + "label": "ßįʼnđ päşşŵőřđ" + }, + "buttons-section": { + "disable-button": "Đįşäþľę", + "discard-button": "Đįşčäřđ", + "save-and-enable-button": "Ŝävę äʼnđ ęʼnäþľę", + "save-button": "Ŝävę" + }, + "documentation": "đőčūmęʼnŧäŧįőʼn", + "host": { + "description": "Ħőşŧʼnämę őř ĨP äđđřęşş őƒ ŧĥę ĿĐÅP şęřvęř yőū ŵįşĥ ŧő čőʼnʼnęčŧ ŧő.", + "error": "Ŝęřvęř ĥőşŧ įş ä řęqūįřęđ ƒįęľđ", + "label": "Ŝęřvęř ĥőşŧ", + "placeholder": "ęχämpľę: 127.0.0.1" + }, + "login-form-alert": { + "description": "Ÿőūř ĿĐÅP čőʼnƒįģūřäŧįőʼn įş ʼnőŧ ŵőřĸįʼnģ þęčäūşę ŧĥę þäşįč ľőģįʼn ƒőřm įş čūřřęʼnŧľy đįşäþľęđ. Pľęäşę ęʼnäþľę ŧĥę ľőģįʼn ƒőřm ŧő ūşę ĿĐÅP äūŧĥęʼnŧįčäŧįőʼn. Ÿőū čäʼn ęʼnäþľę įŧ őʼn ŧĥę Åūŧĥęʼnŧįčäŧįőʼn päģę ūʼnđęř “Åūŧĥ şęŧŧįʼnģş”.", + "title": "ßäşįč ľőģįʼn đįşäþľęđ" + }, + "search_filter": { + "description": "ĿĐÅP şęäřčĥ ƒįľŧęř ūşęđ ŧő ľőčäŧę şpęčįƒįč ęʼnŧřįęş ŵįŧĥįʼn ŧĥę đįřęčŧőřy.", + "error": "Ŝęäřčĥ ƒįľŧęř įş ä řęqūįřęđ ƒįęľđ", + "label": "Ŝęäřčĥ ƒįľŧęř", + "placeholder": "ęχämpľę: čʼn=%ş" + }, + "search-base-dns": { + "description": "Åʼn äřřäy őƒ þäşę đʼnş ŧő şęäřčĥ ŧĥřőūģĥ.", + "error": "Ŝęäřčĥ þäşę ĐŃŜ įş ä řęqūįřęđ ƒįęľđ", + "label": "Ŝęäřčĥ þäşę ĐŃŜ", + "placeholder": "ęχämpľę: đč=ģřäƒäʼnä,đč=őřģ" + }, + "subtitle": "Ŧĥę ĿĐÅP įʼnŧęģřäŧįőʼn įʼn Ğřäƒäʼnä äľľőŵş yőūř Ğřäƒäʼnä ūşęřş ŧő ľőģ įʼn ŵįŧĥ ŧĥęįř ĿĐÅP čřęđęʼnŧįäľş. Fįʼnđ őūŧ mőřę įʼn őūř <2><0>đőčūmęʼnŧäŧįőʼn.", + "title": "ßäşįč Ŝęŧŧįʼnģş" + }, + "library-panel": { + "add-modal": { + "cancel": "Cäʼnčęľ", + "create": "Cřęäŧę ľįþřäřy päʼnęľ", + "error": "Ŀįþřäřy päʼnęľ ŵįŧĥ ŧĥįş ʼnämę äľřęäđy ęχįşŧş", + "folder": "Ŝävę įʼn ƒőľđęř", + "folder-description": "Ŀįþřäřy päʼnęľ pęřmįşşįőʼnş äřę đęřįvęđ ƒřőm ŧĥę ƒőľđęř pęřmįşşįőʼnş", + "name": "Ŀįþřäřy päʼnęľ ʼnämę" + }, + "add-widget": { + "title": "Åđđ päʼnęľ ƒřőm päʼnęľ ľįþřäřy" + }, + "empty-state": { + "message": "Ÿőū ĥävęʼn'ŧ čřęäŧęđ äʼny ľįþřäřy päʼnęľş yęŧ", + "more-info": "Cřęäŧę ä ľįþřäřy päʼnęľ ƒřőm äʼny ęχįşŧįʼnģ đäşĥþőäřđ päʼnęľ ŧĥřőūģĥ ŧĥę päʼnęľ čőʼnŧęχŧ męʼnū. <2>Ŀęäřʼn mőřę" + } + }, + "library-panels": { + "empty-state": { + "message": "Ńő ľįþřäřy päʼnęľş ƒőūʼnđ" + }, + "loading-panel-text": "Ŀőäđįʼnģ ľįþřäřy päʼnęľ", + "modal": { + "body_one": "Ŧĥįş päʼnęľ įş þęįʼnģ ūşęđ įʼn {{count}} đäşĥþőäřđ. Pľęäşę čĥőőşę ŵĥįčĥ đäşĥþőäřđ ŧő vįęŵ ŧĥę päʼnęľ įʼn:", + "body_other": "Ŧĥįş päʼnęľ įş þęįʼnģ ūşęđ įʼn {{count}} đäşĥþőäřđ. Pľęäşę čĥőőşę ŵĥįčĥ đäşĥþőäřđ ŧő vįęŵ ŧĥę päʼnęľ įʼn:", + "button-cancel": "Cäʼnčęľ", + "button-view-panel1": "Vįęŵ päʼnęľ įʼn {{label}}...", + "button-view-panel2": "Vįęŵ päʼnęľ įʼn đäşĥþőäřđ...", + "panel-not-linked": "Päʼnęľ įş ʼnőŧ ľįʼnĸęđ ŧő ä đäşĥþőäřđ. Åđđ ŧĥę päʼnęľ ŧő ä đäşĥþőäřđ äʼnđ řęŧřy.", + "select-no-options-message": "Ńő đäşĥþőäřđş ƒőūʼnđ", + "select-placeholder": "Ŝŧäřŧ ŧypįʼnģ ŧő şęäřčĥ ƒőř đäşĥþőäřđ", + "title": "Vįęŵ päʼnęľ įʼn đäşĥþőäřđ" + }, + "save": { + "error": "Ēřřőř şävįʼnģ ľįþřäřy päʼnęľ: \"{{errorMsg}}\"", + "success": "Ŀįþřäřy päʼnęľ şävęđ" + } + }, + "link": { + "share": { + "config-alert-description": "Ůpđäŧįʼnģ yőūř şęŧŧįʼnģş ŵįľľ mőđįƒy ŧĥę đęƒäūľŧ čőpy ľįʼnĸ ŧő įʼnčľūđę ŧĥęşę čĥäʼnģęş. Pľęäşę ʼnőŧę ŧĥäŧ ŧĥęşę şęŧŧįʼnģş äřę şävęđ ŵįŧĥįʼn yőūř čūřřęʼnŧ þřőŵşęř şčőpę.", + "config-alert-title": "Ŀįʼnĸ şęŧŧįʼnģş", + "config-description": "Cřęäŧę ä pęřşőʼnäľįžęđ, đįřęčŧ ľįʼnĸ ŧő şĥäřę yőūř đäşĥþőäřđ ŵįŧĥįʼn yőūř őřģäʼnįžäŧįőʼn, ŵįŧĥ ŧĥę ƒőľľőŵįʼnģ čūşŧőmįžäŧįőʼn şęŧŧįʼnģş:", + "copy-link-button": "Cőpy ľįʼnĸ", + "copy-to-clipboard": "Ŀįʼnĸ čőpįęđ ŧő čľįpþőäřđ", + "short-url-label": "Ŝĥőřŧęʼn ľįʼnĸ", + "time-range-description": "Cĥäʼnģę ŧĥę čūřřęʼnŧ řęľäŧįvę ŧįmę řäʼnģę ŧő äʼn äþşőľūŧę ŧįmę řäʼnģę", + "time-range-label": "Ŀőčĸ ŧįmę řäʼnģę" + }, + "share-panel": { + "config-description": "Cřęäŧę ä pęřşőʼnäľįžęđ, đįřęčŧ ľįʼnĸ ŧő şĥäřę yőūř päʼnęľ ŵįŧĥįʼn yőūř őřģäʼnįžäŧįőʼn, ŵįŧĥ ŧĥę ƒőľľőŵįʼnģ čūşŧőmįžäŧįőʼn şęŧŧįʼnģş:", + "download-image": "Đőŵʼnľőäđ įmäģę", + "render-image": "Ğęʼnęřäŧę įmäģę", + "render-image-error": "Fäįľęđ ŧő řęʼnđęř päʼnęľ įmäģę", + "render-image-error-description": "Åʼn ęřřőř őččūřřęđ ŵĥęʼn ģęʼnęřäŧįʼnģ ŧĥę įmäģę" + } + }, + "login": { + "divider": { + "connecting-text": "őř" + }, + "error": { + "blocked": "Ÿőū ĥävę ęχčęęđęđ ŧĥę ʼnūmþęř őƒ ľőģįʼn äŧŧęmpŧş ƒőř ŧĥįş ūşęř. Pľęäşę ŧřy äģäįʼn ľäŧęř.", + "invalid-user-or-password": "Ĩʼnväľįđ ūşęřʼnämę őř päşşŵőřđ", + "title": "Ŀőģįʼn ƒäįľęđ", + "unknown": "Ůʼnĸʼnőŵʼn ęřřőř őččūřřęđ" + }, + "forgot-password": "Főřģőŧ yőūř päşşŵőřđ?", + "form": { + "confirmation-code": "Cőʼnƒįřmäŧįőʼn čőđę įş řęqūįřęđ", + "confirmation-code-label": "Cőʼnƒįřmäŧįőʼn čőđę", + "confirmation-code-placeholder": "čőʼnƒįřmäŧįőʼn čőđę", + "email-label": "Ēmäįľ", + "email-placeholder": "ęmäįľ", + "email-required": "Ēmäįľ įş řęqūįřęđ", + "name-label": "Ńämę", + "name-placeholder": "ʼnämę", + "password-label": "Päşşŵőřđ", + "password-placeholder": "päşşŵőřđ", + "password-required": "Päşşŵőřđ įş řęqūįřęđ", + "submit-label": "Ŀőģ įʼn", + "submit-loading-label": "Ŀőģģįʼnģ įʼn...", + "username-label": "Ēmäįľ őř ūşęřʼnämę", + "username-placeholder": "ęmäįľ őř ūşęřʼnämę", + "username-required": "Ēmäįľ őř ūşęřʼnämę įş řęqūįřęđ", + "verify-email-label": "Ŝęʼnđ ä vęřįƒįčäŧįőʼn ęmäįľ", + "verify-email-loading-label": "Ŝęʼnđįʼnģ ęmäįľ..." + }, + "layout": { + "update-password": "Ůpđäŧę yőūř päşşŵőřđ" + }, + "services": { + "sing-in-with-prefix": "Ŝįģʼn įʼn ŵįŧĥ {{serviceName}}" + }, + "signup": { + "button-label": "Ŝįģʼn ūp", + "new-to-question": "Ńęŵ ŧő Ğřäƒäʼnä?" + } + }, + "logs": { + "infinite-scroll": { + "end-of-range": "Ēʼnđ őƒ ŧĥę şęľęčŧęđ ŧįmę řäʼnģę.", + "load-more": "Ŝčřőľľ ŧő ľőäđ mőřę", + "load-newer": "Ŀőäđįʼnģ ʼnęŵęř ľőģş...", + "load-older": "Ŀőäđįʼnģ őľđęř ľőģş...", + "older-logs": "Øľđęř ľőģş" + }, + "log-details": { + "fields": "Fįęľđş", + "links": "Ŀįʼnĸş", + "log-line": "Ŀőģ ľįʼnę", + "no-details": "Ńő đęŧäįľş äväįľäþľę" + }, + "log-row-message": { + "ellipsis": "… ", + "more": "mőřę", + "see-details": "Ŝęę ľőģ đęŧäįľş" + }, + "log-rows": { + "disable-popover": { + "confirm": "Cőʼnƒįřm", + "message": "Ÿőū äřę äþőūŧ ŧő đįşäþľę ŧĥę ľőģş ƒįľŧęř męʼnū. Ŧő řę-ęʼnäþľę įŧ, şęľęčŧ ŧęχŧ įʼn ä ľőģ ľįʼnę ŵĥįľę ĥőľđįʼnģ ŧĥę äľŧ ĸęy.", + "title": "Đįşäþľę męʼnū" + }, + "disable-popover-message": { + "shortcut": "äľŧ+şęľęčŧ ŧő ęʼnäþľę äģäįʼn" + } + }, + "logs-navigation": { + "newer-logs": "Ńęŵęř ľőģş", + "older-logs": "Øľđęř ľőģş", + "scroll-bottom": "Ŝčřőľľ ŧő þőŧŧőm", + "scroll-top": "Ŝčřőľľ ŧő ŧőp", + "start-of-range": "Ŝŧäřŧ őƒ řäʼnģę" + }, + "popover-menu": { + "copy": "Cőpy şęľęčŧįőʼn", + "disable-menu": "Đįşäþľę męʼnū", + "line-contains": "Åđđ äş ľįʼnę čőʼnŧäįʼnş ƒįľŧęř", + "line-contains-not": "Åđđ äş ľįʼnę đőęş ʼnőŧ čőʼnŧäįʼn ƒįľŧęř" + } + }, + "migrate-to-cloud": { + "build-snapshot": { + "description": "Ŧĥįş ŧőőľ čäʼn mįģřäŧę şőmę řęşőūřčęş ƒřőm ŧĥįş įʼnşŧäľľäŧįőʼn ŧő yőūř čľőūđ şŧäčĸ. Ŧő ģęŧ şŧäřŧęđ, yőū'ľľ ʼnęęđ ŧő čřęäŧę ä şʼnäpşĥőŧ őƒ ŧĥįş įʼnşŧäľľäŧįőʼn. Cřęäŧįʼnģ ä şʼnäpşĥőŧ ŧypįčäľľy ŧäĸęş ľęşş ŧĥäʼn ŧŵő mįʼnūŧęş. Ŧĥę şʼnäpşĥőŧ įş şŧőřęđ äľőʼnģşįđę ŧĥįş Ğřäƒäʼnä įʼnşŧäľľäŧįőʼn.", + "title": "Ńő şʼnäpşĥőŧ ęχįşŧş", + "when-complete": "Øʼnčę ŧĥę şʼnäpşĥőŧ įş čőmpľęŧę, yőū ŵįľľ þę äþľę ŧő ūpľőäđ įŧ ŧő yőūř čľőūđ şŧäčĸ." + }, + "building-snapshot": { + "description": "Ŵę'řę čřęäŧįʼnģ ä pőįʼnŧ-įʼn-ŧįmę şʼnäpşĥőŧ őƒ ŧĥę čūřřęʼnŧ şŧäŧę őƒ ŧĥįş įʼnşŧäľľäŧįőʼn. Øʼnčę ŧĥę şʼnäpşĥőŧ įş čőmpľęŧę. yőū'ľľ þę äþľę ŧő ūpľőäđ įŧ ŧő Ğřäƒäʼnä Cľőūđ.", + "description-eta": "Cřęäŧįʼnģ ä şʼnäpşĥőŧ ŧypįčäľľy ŧäĸęş ľęşş ŧĥäʼn ŧŵő mįʼnūŧęş.", + "title": "ßūįľđįʼnģ įʼnşŧäľľäŧįőʼn şʼnäpşĥőŧ" + }, + "can-i-move": { + "body": "Øʼnčę yőū čőʼnʼnęčŧ ŧĥįş įʼnşŧäľľäŧįőʼn ŧő ä čľőūđ şŧäčĸ, yőū'ľľ þę äþľę ŧő ūpľőäđ đäŧä şőūřčęş äʼnđ đäşĥþőäřđş.", + "link-title": "Ŀęäřʼn äþőūŧ mįģřäŧįʼnģ őŧĥęř şęŧŧįʼnģş", + "title": "Cäʼn Ĩ mővę ŧĥįş įʼnşŧäľľäŧįőʼn ŧő Ğřäƒäʼnä Cľőūđ?" + }, + "connect-modal": { + "body-cloud-stack": "Ÿőū'ľľ äľşő ʼnęęđ ä čľőūđ şŧäčĸ. Ĩƒ yőū ĵūşŧ şįģʼnęđ ūp, ŵę'ľľ äūŧőmäŧįčäľľy čřęäŧę yőūř ƒįřşŧ şŧäčĸ. Ĩƒ yőū ĥävę äʼn äččőūʼnŧ, yőū'ľľ ʼnęęđ ŧő şęľęčŧ őř čřęäŧę ä şŧäčĸ.", + "body-get-started": "Ŧő ģęŧ şŧäřŧęđ, yőū'ľľ ʼnęęđ ä Ğřäƒäʼnä.čőm äččőūʼnŧ.", + "body-sign-up": "Ŝįģʼn ūp ƒőř ä Ğřäƒäʼnä.čőm äččőūʼnŧ", + "body-token": "Ÿőūř şęľƒ-mäʼnäģęđ Ğřäƒäʼnä įʼnşŧäľľäŧįőʼn ʼnęęđş şpęčįäľ äččęşş ŧő şęčūřęľy mįģřäŧę čőʼnŧęʼnŧ. Ÿőū'ľľ ʼnęęđ ŧő čřęäŧę ä mįģřäŧįőʼn ŧőĸęʼn őʼn yőūř čĥőşęʼn čľőūđ şŧäčĸ.", + "body-token-field": "Mįģřäŧįőʼn ŧőĸęʼn", + "body-token-field-placeholder": "Päşŧę ŧőĸęʼn ĥęřę", + "body-token-instructions": "Ŀőģ įʼnŧő yőūř čľőūđ şŧäčĸ äʼnđ ʼnävįģäŧę ŧő Åđmįʼnįşŧřäŧįőʼn, Ğęʼnęřäľ, Mįģřäŧę ŧő Ğřäƒäʼnä Cľőūđ. Cřęäŧę ä mįģřäŧįőʼn ŧőĸęʼn őʼn ŧĥäŧ şčřęęʼn äʼnđ päşŧę ŧĥę ŧőĸęʼn ĥęřę.", + "body-view-stacks": "Vįęŵ my čľőūđ şŧäčĸş", + "cancel": "Cäʼnčęľ", + "connect": "Cőʼnʼnęčŧ ŧő ŧĥįş şŧäčĸ", + "connecting": "Cőʼnʼnęčŧįʼnģ ŧő ŧĥįş şŧäčĸ...", + "title": "Cőʼnʼnęčŧ ŧő ä čľőūđ şŧäčĸ", + "token-error-title": "Ēřřőř şävįʼnģ ŧőĸęʼn", + "token-errors": { + "instance-request-error": "Åʼn ęřřőř őččūřřęđ ŵĥįľę äŧŧęmpŧįʼnģ ŧő vęřįƒy ŧĥę čľőūđ įʼnşŧäʼnčę'ş čőʼnʼnęčŧįvįŧy. Pľęäşę čĥęčĸ ŧĥę ʼnęŧŵőřĸ şęŧŧįʼnģş őř čľőūđ įʼnşŧäʼnčę şŧäŧūş.", + "instance-unreachable": "Ŧĥę čľőūđ įʼnşŧäʼnčę čäʼnʼnőŧ þę řęäčĥęđ. Mäĸę şūřę ŧĥę įʼnşŧäʼnčę įş řūʼnʼnįʼnģ äʼnđ ŧřy äģäįʼn.", + "migration-disabled": "Cľőūđ mįģřäŧįőʼnş äřę đįşäþľęđ őʼn ŧĥįş įʼnşŧäʼnčę.", + "session-creation-failure": "Ŧĥęřę ŵäş äʼn ęřřőř čřęäŧįʼnģ ŧĥę mįģřäŧįőʼn. Pľęäşę ŧřy äģäįʼn.", + "token-invalid": "Ŧőĸęʼn įş ʼnőŧ väľįđ. Ğęʼnęřäŧę ä ʼnęŵ ŧőĸęʼn őʼn yőūř čľőūđ įʼnşŧäʼnčę äʼnđ ŧřy äģäįʼn.", + "token-not-saved": "Ŧĥęřę ŵäş äʼn ęřřőř şävįʼnģ ŧĥę ŧőĸęʼn. Ŝęę ŧĥę Ğřäƒäʼnä şęřvęř ľőģş ƒőř mőřę đęŧäįľş.", + "token-request-error": "Åʼn ęřřőř őččūřřęđ ŵĥįľę väľįđäŧįʼnģ ŧĥę ŧőĸęʼn. Pľęäşę čĥęčĸ ŧĥę Ğřäƒäʼnä įʼnşŧäʼnčę ľőģş.", + "token-validation-failure": "Ŧőĸęʼn įş ʼnőŧ väľįđ. Pľęäşę ęʼnşūřę ŧĥę ŧőĸęʼn mäŧčĥęş ŧĥę mįģřäŧįőʼn ŧőĸęʼn őʼn yőūř čľőūđ įʼnşŧäʼnčę." + }, + "token-required-error": "Mįģřäŧįőʼn ŧőĸęʼn įş řęqūįřęđ" + }, + "cta": { + "button": "Mįģřäŧę ŧĥįş įʼnşŧäʼnčę ŧő Cľőūđ", + "header": "Ŀęŧ ūş mäʼnäģę yőūř Ğřäƒäʼnä şŧäčĸ" + }, + "delete-migration-token-confirm": { + "body": "Ĩƒ yőū'vę äľřęäđy ūşęđ ŧĥįş ŧőĸęʼn ŵįŧĥ ä şęľƒ-mäʼnäģęđ įʼnşŧäľľäŧįőʼn, ŧĥäŧ įʼnşŧäľľäŧįőʼn ŵįľľ ʼnő ľőʼnģęř þę äþľę ŧő ūpľőäđ čőʼnŧęʼnŧ.", + "confirm-button": "Đęľęŧę ŧőĸęʼn", + "error-title": "Ēřřőř đęľęŧįʼnģ ŧőĸęʼn", + "title": "Đęľęŧę mįģřäŧįőʼn ŧőĸęʼn" + }, + "disconnect-modal": { + "body": "Ŧĥįş ŵįľľ řęmővę ŧĥę mįģřäŧįőʼn ŧőĸęʼn ƒřőm ŧĥįş įʼnşŧäľľäŧįőʼn. Ĩƒ yőū ŵįşĥ ŧő ūpľőäđ mőřę řęşőūřčęş įʼn ŧĥę ƒūŧūřę, yőū ŵįľľ ʼnęęđ ŧő ęʼnŧęř ä ʼnęŵ mįģřäŧįőʼn ŧőĸęʼn.", + "cancel": "Cäʼnčęľ", + "disconnect": "Đįşčőʼnʼnęčŧ", + "disconnecting": "Đįşčőʼnʼnęčŧįʼnģ...", + "error": "Ŧĥęřę ŵäş äʼn ęřřőř đįşčőʼnʼnęčŧįʼnģ", + "title": "Đįşčőʼnʼnęčŧ ƒřőm čľőūđ şŧäčĸ" + }, + "get-started": { + "body": "Ŧĥę mįģřäŧįőʼn přőčęşş mūşŧ þę şŧäřŧęđ ƒřőm yőūř şęľƒ-mäʼnäģęđ Ğřäƒäʼnä įʼnşŧäʼnčę.", + "configure-pdc-link": "Cőʼnƒįģūřę PĐC ƒőř ŧĥįş şŧäčĸ", + "link-title": "Ŀęäřʼn mőřę äþőūŧ Přįväŧę Đäŧä Ŝőūřčę Cőʼnʼnęčŧ", + "step-1": "Ŀőģ įʼn ŧő yőūř şęľƒ-mäʼnäģęđ įʼnşŧäʼnčę äʼnđ ʼnävįģäŧę ŧő Åđmįʼnįşŧřäŧįőʼn, Ğęʼnęřäľ, Mįģřäŧę ŧő Ğřäƒäʼnä Cľőūđ.", + "step-2": "Ŝęľęčŧ \"Mįģřäŧę ŧĥįş įʼnşŧäʼnčę ŧő Cľőūđ\".", + "step-3": "Ÿőū'ľľ þę přőmpŧęđ ƒőř ä mįģřäŧįőʼn ŧőĸęʼn. Ğęʼnęřäŧę őʼnę ƒřőm ŧĥįş şčřęęʼn.", + "step-4": "Ĩʼn yőūř şęľƒ-mäʼnäģęđ įʼnşŧäʼnčę, şęľęčŧ \"Ůpľőäđ ęvęřyŧĥįʼnģ\" ŧő ūpľőäđ đäŧä şőūřčęş äʼnđ đäşĥþőäřđş ŧő ŧĥįş čľőūđ şŧäčĸ.", + "step-5": "Ĩƒ şőmę őƒ yőūř đäŧä şőūřčęş ŵįľľ ʼnőŧ ŵőřĸ ővęř ŧĥę pūþľįč įʼnŧęřʼnęŧ, yőū’ľľ ʼnęęđ ŧő įʼnşŧäľľ Přįväŧę Đäŧä Ŝőūřčę Cőʼnʼnęčŧ įʼn yőūř şęľƒ-mäʼnäģęđ ęʼnvįřőʼnmęʼnŧ.", + "title": "Pęřƒőřmįʼnģ ä mįģřäŧįőʼn" + }, + "is-it-secure": { + "body": "Ğřäƒäʼnä Ŀäþş įş čőmmįŧŧęđ ŧő mäįʼnŧäįʼnįʼnģ ŧĥę ĥįģĥęşŧ şŧäʼnđäřđş őƒ đäŧä přįväčy äʼnđ şęčūřįŧy. ßy įmpľęmęʼnŧįʼnģ įʼnđūşŧřy-şŧäʼnđäřđ şęčūřįŧy ŧęčĥʼnőľőģįęş äʼnđ přőčęđūřęş, ŵę ĥęľp přőŧęčŧ őūř čūşŧőmęřş' đäŧä ƒřőm ūʼnäūŧĥőřįžęđ äččęşş, ūşę, őř đįşčľőşūřę.", + "link-title": "Ğřäƒäʼnä Ŀäþş Ŧřūşŧ Cęʼnŧęř", + "title": "Ĩş įŧ şęčūřę?" + }, + "migrate-to-this-stack": { + "body": "Ÿőū čäʼn mįģřäŧę şőmę řęşőūřčęş ƒřőm yőūř şęľƒ-mäʼnäģęđ Ğřäƒäʼnä įʼnşŧäľľäŧįőʼn ŧő ŧĥįş čľőūđ şŧäčĸ. Ŧő đő ŧĥįş şęčūřęľy, yőū'ľľ ʼnęęđ ŧő ģęʼnęřäŧę ä mįģřäŧįőʼn ŧőĸęʼn. Ÿőūř şęľƒ-mäʼnäģęđ įʼnşŧäʼnčę ŵįľľ ūşę ŧĥę ŧőĸęʼn ŧő äūŧĥęʼnŧįčäŧę ŵįŧĥ ŧĥįş čľőūđ şŧäčĸ.", + "link-title": "Vįęŵ ŧĥę ƒūľľ mįģřäŧįőʼn ģūįđę", + "title": "Ŀęŧ ūş ĥęľp yőū mįģřäŧę ŧő ŧĥįş şŧäčĸ" + }, + "migrated-counts": { + "alert_rule_groups": "äľęřŧ řūľę ģřőūpş", + "alert_rules": "äľęřŧ řūľęş", + "contact_points": "čőʼnŧäčŧ pőįʼnŧş", + "dashboards": "đäşĥþőäřđş", + "datasources": "đäŧä şőūřčęş", + "folders": "ƒőľđęřş", + "library_elements": "ľįþřäřy ęľęmęʼnŧş", + "mute_timings": "mūŧę ŧįmįʼnģş", + "notification_policies": "ʼnőŧįƒįčäŧįőʼn pőľįčįęş", + "notification_templates": "ʼnőŧįƒįčäŧįőʼn ŧęmpľäŧęş", + "plugins": "pľūģįʼnş" + }, + "migration-token": { + "delete-button": "Đęľęŧę ŧőĸęʼn", + "delete-modal-body": "Ĩƒ yőū'vę äľřęäđy ūşęđ ŧĥįş ŧőĸęʼn ŵįŧĥ ä şęľƒ-mäʼnäģęđ įʼnşŧäľľäŧįőʼn, ŧĥäŧ įʼnşŧäľľäŧįőʼn ŵįľľ ʼnő ľőʼnģęř þę äþľę ŧő ūpľőäđ čőʼnŧęʼnŧ.", + "delete-modal-cancel": "Cäʼnčęľ", + "delete-modal-confirm": "Đęľęŧę", + "delete-modal-deleting": "Đęľęŧįʼnģ...", + "delete-modal-title": "Đęľęŧę mįģřäŧįőʼn ŧőĸęʼn", + "error-body": "Ůʼnäþľę ŧő ģęʼnęřäŧę ä mįģřäŧįőʼn ŧőĸęʼn. Pľęäşę ŧřy äģäįʼn ľäŧęř.", + "error-title": "Ŝőmęŧĥįʼnģ ŵęʼnŧ ŵřőʼnģ", + "generate-button": "Ğęʼnęřäŧę ä mįģřäŧįőʼn ŧőĸęʼn", + "generate-button-loading": "Ğęʼnęřäŧįʼnģ ä mįģřäŧįőʼn ŧőĸęʼn...", + "modal-close": "Cľőşę", + "modal-copy-and-close": "Cőpy ŧő čľįpþőäřđ äʼnđ čľőşę", + "modal-copy-button": "Cőpy ŧő čľįpþőäřđ", + "modal-field-description": "Cőpy ŧĥę ŧőĸęʼn ʼnőŵ äş yőū ŵįľľ ʼnőŧ þę äþľę ŧő şęę įŧ äģäįʼn. Ŀőşįʼnģ ä ŧőĸęʼn řęqūįřęş čřęäŧįʼnģ ä ʼnęŵ őʼnę.", + "modal-field-label": "Ŧőĸęʼn", + "modal-title": "Mįģřäŧįőʼn ŧőĸęʼn čřęäŧęđ", + "status": "Cūřřęʼnŧ şŧäŧūş: <2>" + }, + "onprem": { + "cancel-snapshot-error-title": "Ēřřőř čäʼnčęľľįʼnģ čřęäŧįʼnģ şʼnäpşĥőŧ", + "create-snapshot-error-title": "Ēřřőř čřęäŧįʼnģ şʼnäpşĥőŧ", + "disconnect-error-title": "Ēřřőř đįşčőʼnʼnęčŧįʼnģ", + "error-see-server-logs": "Ŝęę ŧĥę Ğřäƒäʼnä şęřvęř ľőģş ƒőř mőřę đęŧäįľş", + "get-session-error-title": "Ēřřőř ľőäđįʼnģ mįģřäŧįőʼn čőʼnƒįģūřäŧįőʼn", + "get-snapshot-error-title": "Ēřřőř ľőäđįʼnģ şʼnäpşĥőŧ", + "migration-finished-with-caveat-title": "Ŗęşőūřčę mįģřäŧįőʼn čőmpľęŧę", + "migration-finished-with-errors-body": "Ŧĥę mįģřäŧįőʼn ĥäş čőmpľęŧęđ, þūŧ şőmę įŧęmş čőūľđ ʼnőŧ þę mįģřäŧęđ ŧő ŧĥę čľőūđ şŧäčĸ. Cĥęčĸ ŧĥę ƒäįľęđ řęşőūřčęş ƒőř mőřę đęŧäįľş", + "migration-finished-with-warnings-body": "Ŧĥę mįģřäŧįőʼn ĥäş čőmpľęŧęđ ŵįŧĥ şőmę ŵäřʼnįʼnģş. Cĥęčĸ įʼnđįvįđūäľ řęşőūřčęş ƒőř mőřę đęŧäįľş", + "snapshot-error-status-body": "Ŧĥęřę ŵäş äʼn ęřřőř čřęäŧįʼnģ ŧĥę şʼnäpşĥőŧ őř şŧäřŧįʼnģ ŧĥę mįģřäŧįőʼn přőčęşş. Ŝęę ŧĥę Ğřäƒäʼnä şęřvęř ľőģş ƒőř mőřę đęŧäįľş", + "snapshot-error-status-title": "Ēřřőř mįģřäŧįʼnģ řęşőūřčęş", + "success-message": "Ŝūččęşşƒūľľy mįģřäŧęđ {{successCount}} {{types, list}} ŧő yőūř Ğřäƒäʼnä Cľőūđ įʼnşŧäʼnčę.", + "success-message-generic": "Ŝūččęşşƒūľľy mįģřäŧęđ {{successCount}} řęşőūřčęş ŧő yőūř Ğřäƒäʼnä Cľőūđ įʼnşŧäʼnčę.", + "success-title": "Mįģřäŧįőʼn čőmpľęŧęđ!", + "upload-snapshot-error-title": "Ēřřőř ūpľőäđįʼnģ şʼnäpşĥőŧ" + }, + "pdc": { + "body": "Ēχpőşįʼnģ yőūř đäŧä şőūřčęş ŧő ŧĥę įʼnŧęřʼnęŧ čäʼn řäįşę şęčūřįŧy čőʼnčęřʼnş. Přįväŧę đäŧä şőūřčę čőʼnʼnęčŧ (PĐC) äľľőŵş Ğřäƒäʼnä Cľőūđ ŧő äččęşş yőūř ęχįşŧįʼnģ đäŧä şőūřčęş ővęř ä şęčūřę ʼnęŧŵőřĸ ŧūʼnʼnęľ.", + "link-title": "Ŀęäřʼn äþőūŧ PĐC", + "title": "Ńőŧ äľľ my đäŧä şőūřčęş äřę őʼn ŧĥę pūþľįč įʼnŧęřʼnęŧ" + }, + "pricing": { + "body": "Ğřäƒäʼnä Cľőūđ ĥäş ä ģęʼnęřőūş ƒřęę pľäʼn äʼnđ ä 14 đäy ūʼnľįmįŧęđ ūşäģę ŧřįäľ. Ńŧęř yőūř ŧřįäľ ęχpįřęş, yőū'ľľ þę þįľľęđ þäşęđ őʼn ūşäģę ővęř ŧĥę ƒřęę pľäʼn ľįmįŧş.", + "link-title": "Ğřäƒäʼnä Cľőūđ přįčįʼnģ", + "title": "Ħőŵ mūčĥ đőęş įŧ čőşŧ?" + }, + "public-preview": { + "button-text": "Ğįvę ƒęęđþäčĸ", + "message": "<0>Vįşįŧ őūř đőčş ŧő ľęäřʼn mőřę äþőūŧ ŧĥįş ƒęäŧūřę!", + "message-cloud": "Ÿőūř şęľƒ-mäʼnäģęđ įʼnşŧäʼnčę őƒ Ğřäƒäʼnä řęqūįřęş vęřşįőʼn 11.5+, őř 11.2+ ŵįŧĥ ŧĥę őʼnPřęmŦőCľőūđMįģřäŧįőʼnş ƒęäŧūřę ƒľäģ ęʼnäþľęđ.", + "title": "Mįģřäŧę ŧő Ğřäƒäʼnä Cľőūđ įş įʼn pūþľįč přęvįęŵ" + }, + "resource-details": { + "dismiss-button": "ØĶ", + "error-messages": { + "dashboard-already-managed": "Đäşĥþőäřđ įş äľřęäđy přővįşįőʼnęđ äʼnđ mäʼnäģęđ þy Ğřäƒäʼnä įʼn ŧĥę čľőūđ įʼnşŧäʼnčę. Ŵę řęčőmmęʼnđ ūşįʼnģ ŧĥę přővįşįőʼnęđ đäşĥþőäřđ ģőįʼnģ ƒőřŵäřđ. Ĩƒ yőū şŧįľľ ŵįşĥ ŧő čőpy ŧĥę đäşĥþőäřđ ŧő ŧĥę čľőūđ įʼnşŧäʼnčę, ŧĥęʼn čĥäʼnģę ŧĥę đäşĥþőäřđ ĨĐ įʼn ŧĥę đäşĥþőäřđ ĴŜØŃ, şävę ä ʼnęŵ şʼnäpşĥőŧ äʼnđ ūpľőäđ äģäįʼn.", + "datasource-already-managed": "Đäŧä şőūřčę įş äľřęäđy přővįşįőʼnęđ äʼnđ mäʼnäģęđ þy Ğřäƒäʼnä įʼn ŧĥę čľőūđ įʼnşŧäʼnčę. Ĩƒ ŧĥįş įş ä đįƒƒęřęʼnŧ řęşőūřčę, şęŧ äʼnőŧĥęř ŮĨĐ äʼnđ ŧřy äģäįʼn.", + "datasource-invalid-url": "Ŧĥęřę įş ä đäŧä şőūřčę ŵĥįčĥ ĥäş äʼn įʼnväľįđ ŮŖĿ. Přővįđę ä väľįđ ŮŖĿ äʼnđ ŧřy äģäįʼn.", + "datasource-name-conflict": "Ŧĥęřę įş ä đäŧä şőūřčę ŵįŧĥ ŧĥę şämę ʼnämę įʼn ŧĥę ŧäřģęŧ įʼnşŧäʼnčę. Ŗęʼnämę őʼnę őƒ ŧĥęm äʼnđ ŧřy äģäįʼn.", + "folder-name-conflict": "Ŧĥęřę įş ä ƒőľđęř ŵįŧĥ ŧĥę şämę ʼnämę įʼn ŧĥę ŧäřģęŧ įʼnşŧäʼnčę. Ŗęʼnämę őʼnę őƒ ŧĥęm äʼnđ ŧřy äģäįʼn.", + "generic-error": "Ŧĥęřę ĥäş þęęʼn äʼn ęřřőř ŵĥįľę mįģřäŧįʼnģ. Pľęäşę čĥęčĸ ŧĥę čľőūđ mįģřäŧįőʼn ľőģş ƒőř mőřę įʼnƒőřmäŧįőʼn.", + "internal-service-error": "Ŧĥęřę ĥäş þęęʼn äʼn ęřřőř ŵĥįľę mįģřäŧįʼnģ. Pľęäşę čĥęčĸ ŧĥę Ğřäƒäʼnä şęřvęř ľőģş ƒőř mőřę đęŧäįľş.", + "library-element-name-conflict": "Ŧĥęřę įş ä ľįþřäřy ęľęmęʼnŧ ŵįŧĥ ŧĥę şämę ʼnämę įʼn ŧĥę ŧäřģęŧ įʼnşŧäʼnčę. Ŗęʼnämę őʼnę őƒ ŧĥęm äʼnđ ŧřy äģäįʼn.", + "resource-conflict": "Ŧĥęřę įş ä řęşőūřčę čőʼnƒľįčŧ ŵįŧĥ ŧĥę ŧäřģęŧ įʼnşŧäʼnčę. Pľęäşę čĥęčĸ ŧĥę Ğřäƒäʼnä şęřvęř ľőģş ƒőř mőřę đęŧäįľş.", + "unexpected-error": "Ŧĥęřę ĥäş þęęʼn äʼn ęřřőř ŵĥįľę mįģřäŧįʼnģ. Pľęäşę čĥęčĸ ŧĥę Ğřäƒäʼnä şęřvęř ľőģş ƒőř mőřę đęŧäįľş.", + "unsupported-data-type": "Mįģřäŧįőʼn őƒ ŧĥįş đäŧä ŧypę įş ʼnőŧ čūřřęʼnŧľy şūppőřŧęđ." + }, + "error-title": "Ůʼnäþľę ŧő mįģřäŧę ŧĥįş řęşőūřčę:", + "generic-title": "Ŗęşőūřčę mįģřäŧįőʼn đęŧäįľş:", + "missing-message": "Ńő męşşäģę přővįđęđ.", + "resource-summary": "{{refId}} ({{typeName}})", + "title": "Mįģřäŧįőʼn řęşőūřčę đęŧäįľş", + "warning-title": "Ŗęşőūřčę mįģřäŧęđ ŵįŧĥ ä ŵäřʼnįʼnģ:" + }, + "resource-status": { + "error-details-button": "Đęŧäįľş", + "failed": "Ēřřőř", + "migrated": "Ůpľőäđęđ ŧő čľőūđ", + "migrating": "Ůpľőäđįʼnģ...", + "not-migrated": "Ńőŧ yęŧ ūpľőäđęđ", + "unknown": "Ůʼnĸʼnőŵʼn", + "warning": "Ůpľőäđęđ ŵįŧĥ ŵäřʼnįʼnģ", + "warning-details-button": "Đęŧäįľş" + }, + "resource-table": { + "dashboard-load-error": "Ůʼnäþľę ŧő ľőäđ đäşĥþőäřđ", + "error-library-element-sub": "Ŀįþřäřy Ēľęmęʼnŧ {ūįđ}", + "error-library-element-title": "Ůʼnäþľę ŧő ľőäđ ľįþřäřy ęľęmęʼnŧ", + "unknown-datasource-title": "Đäŧä şőūřčę {{datasourceUID}}", + "unknown-datasource-type": "Ůʼnĸʼnőŵʼn đäŧä şőūřčę" + }, + "resource-type": { + "alert_rule": "Åľęřŧ Ŗūľę", + "alert_rule_group": "Åľęřŧ Ŗūľę Ğřőūp", + "contact_point": "Cőʼnŧäčŧ Pőįʼnŧ", + "dashboard": "Đäşĥþőäřđ", + "datasource": "Đäŧä şőūřčę", + "folder": "Főľđęř", + "library_element": "Ŀįþřäřy Ēľęmęʼnŧ", + "mute_timing": "Mūŧę Ŧįmįʼnģ", + "notification_policy": "Ńőŧįƒįčäŧįőʼn Pőľįčy", + "notification_template": "Ńőŧįƒįčäŧįőʼn Ŧęmpľäŧę", + "plugin": "Pľūģįʼn", + "unknown": "Ůʼnĸʼnőŵʼn" + }, + "summary": { + "cancel-snapshot": "Cäʼnčęľ şʼnäpşĥőŧ", + "disconnect": "Đįşčőʼnʼnęčŧ", + "errored-resource-count": "Ēřřőřş", + "page-loading": "Ŀőäđįʼnģ...", + "rebuild-snapshot": "Ŗęþūįľđ şʼnäpşĥőŧ", + "snapshot-date": "Ŝʼnäpşĥőŧ ŧįmęşŧämp", + "snapshot-not-created": "Ńőŧ yęŧ čřęäŧęđ", + "start-migration": "ßūįľđ şʼnäpşĥőŧ", + "successful-resource-count": "Ŝūččęşşƒūľľy mįģřäŧęđ", + "target-stack-title": "Ůpľőäđįʼnģ ŧő", + "total-resource-count": "Ŧőŧäľ řęşőūřčęş", + "upload-migration": "Ůpľőäđ şʼnäpşĥőŧ" + }, + "support-types-disclosure": { + "text": "Đäşĥþőäřđş, Főľđęřş, äʼnđ þūįľŧ-įʼn čőřę đäŧä şőūřčęş äřę mįģřäŧęđ ŧő yőūř Ğřäƒäʼnä Cľőūđ şŧäčĸ. <2>Ŀęäřʼn äþőūŧ mįģřäŧįʼnģ őŧĥęř şęŧŧįʼnģş." + }, + "token-status": { + "active": "Ŧőĸęʼn čřęäŧęđ äʼnđ äčŧįvę", + "no-active": "Ńő äčŧįvę ŧőĸęʼn", + "unknown": "Ůʼnĸʼnőŵʼn", + "unknown-error": "Ēřřőř řęŧřįęvįʼnģ ŧőĸęʼn" + }, + "what-is-cloud": { + "body": "Ğřäƒäʼnä čľőūđ įş ä ƒūľľy mäʼnäģęđ čľőūđ-ĥőşŧęđ őþşęřväþįľįŧy pľäŧƒőřm įđęäľ ƒőř čľőūđ ʼnäŧįvę ęʼnvįřőʼnmęʼnŧş. Ĩŧ'ş ęvęřyŧĥįʼnģ yőū ľővę äþőūŧ Ğřäƒäʼnä ŵįŧĥőūŧ ŧĥę ővęřĥęäđ őƒ mäįʼnŧäįʼnįʼnģ, ūpģřäđįʼnģ, äʼnđ şūppőřŧįʼnģ äʼn įʼnşŧäľľäŧįőʼn.", + "link-title": "Ŀęäřʼn äþőūŧ čľőūđ ƒęäŧūřęş", + "title": "Ŵĥäŧ įş Ğřäƒäʼnä Cľőūđ?" + }, + "why-host": { + "body": "Ĩʼn äđđįŧįőʼn ŧő ŧĥę čőʼnvęʼnįęʼnčę őƒ mäʼnäģęđ ĥőşŧįʼnģ, Ğřäƒäʼnä Cľőūđ įʼnčľūđęş mäʼny čľőūđ-ęχčľūşįvę ƒęäŧūřęş ľįĸę ŜĿØş, įʼnčįđęʼnŧ mäʼnäģęmęʼnŧ, mäčĥįʼnę ľęäřʼnįʼnģ, äʼnđ pőŵęřƒūľ őþşęřväþįľįŧy įʼnŧęģřäŧįőʼnş.", + "link-title": "Mőřę qūęşŧįőʼnş? Ŧäľĸ ŧő äʼn ęχpęřŧ", + "title": "Ŵĥy ĥőşŧ ŵįŧĥ Ğřäƒäʼnä?" + } + }, + "multicombobox": { + "all": { + "title": "Åľľ", + "title-filtered": "Åľľ (ƒįľŧęřęđ)" + }, + "clear": { + "title": "Cľęäř äľľ" + } + }, + "nav": { + "add-new-connections": { + "title": "Åđđ ʼnęŵ čőʼnʼnęčŧįőʼn" + }, + "admin": { + "subtitle": "Mäʼnäģę şęřvęř-ŵįđę şęŧŧįʼnģş äʼnđ äččęşş ŧő řęşőūřčęş şūčĥ äş őřģäʼnįžäŧįőʼnş, ūşęřş, äʼnđ ľįčęʼnşęş", + "title": "Ŝęřvęř äđmįʼn" + }, + "alert-list-legacy": { + "title": "Åľęřŧ řūľęş" + }, + "alerting": { + "subtitle": "Ŀęäřʼn äþőūŧ přőþľęmş įʼn yőūř şyşŧęmş mőmęʼnŧş äƒŧęř ŧĥęy őččūř", + "title": "Åľęřŧįʼnģ" + }, + "alerting-admin": { + "subtitle": "Mäʼnäģę Åľęřŧmäʼnäģęř čőʼnƒįģūřäŧįőʼnş äʼnđ ęʼnäþľę řęčęįvįʼnģ Ğřäƒäʼnä-mäʼnäģęđ äľęřŧş", + "title": "Ŝęŧŧįʼnģş" + }, + "alerting-am-routes": { + "subtitle": "Đęŧęřmįʼnę ĥőŵ äľęřŧş äřę řőūŧęđ ŧő čőʼnŧäčŧ pőįʼnŧş", + "title": "Ńőŧįƒįčäŧįőʼn pőľįčįęş" + }, + "alerting-channels": { + "title": "Ńőŧįƒįčäŧįőʼn čĥäʼnʼnęľş" + }, + "alerting-groups": { + "subtitle": "Ŝęę ģřőūpęđ äľęřŧş ŵįŧĥ äčŧįvę ʼnőŧįƒįčäŧįőʼnş", + "title": "Åčŧįvę ʼnőŧįƒįčäŧįőʼnş" + }, + "alerting-home": { + "title": "Ħőmę" + }, + "alerting-legacy": { + "title": "Åľęřŧįʼnģ (ľęģäčy)" + }, + "alerting-list": { + "subtitle": "Ŗūľęş ŧĥäŧ đęŧęřmįʼnę ŵĥęŧĥęř äʼn äľęřŧ ŵįľľ ƒįřę", + "title": "Åľęřŧ řūľęş" + }, + "alerting-receivers": { + "subtitle": "Cĥőőşę ĥőŵ ŧő ʼnőŧįƒy yőūř čőʼnŧäčŧ pőįʼnŧş ŵĥęʼn äʼn äľęřŧ įʼnşŧäʼnčę ƒįřęş", + "title": "Cőʼnŧäčŧ pőįʼnŧş" + }, + "alerting-silences": { + "subtitle": "Ŝŧőp ʼnőŧįƒįčäŧįőʼnş ƒřőm őʼnę őř mőřę äľęřŧįʼnģ řūľęş", + "title": "Ŝįľęʼnčęş" + }, + "alerting-upgrade": { + "subtitle": "Ůpģřäđę yőūř ęχįşŧįʼnģ ľęģäčy äľęřŧş äʼnđ ʼnőŧįƒįčäŧįőʼn čĥäʼnʼnęľş ŧő ŧĥę ʼnęŵ Ğřäƒäʼnä Åľęřŧįʼnģ", + "title": "Åľęřŧįʼnģ ūpģřäđę" + }, + "alerts-and-incidents": { + "subtitle": "Åľęřŧįʼnģ äʼnđ įʼnčįđęʼnŧ mäʼnäģęmęʼnŧ äppş", + "title": "Åľęřŧş & ĨŖM" + }, + "api-keys": { + "subtitle": "Mäʼnäģę äʼnđ čřęäŧę ÅPĨ ĸęyş ŧĥäŧ äřę ūşęđ ŧő įʼnŧęřäčŧ ŵįŧĥ Ğřäƒäʼnä ĦŦŦP ÅPĨş", + "title": "ÅPĨ ĸęyş" + }, + "application": { + "title": "Åppľįčäŧįőʼn" + }, + "apps": { + "subtitle": "Åpp pľūģįʼnş ŧĥäŧ ęχŧęʼnđ ŧĥę Ğřäƒäʼnä ęχpęřįęʼnčę", + "title": "Mőřę äppş" + }, + "authentication": { + "title": "Åūŧĥęʼnŧįčäŧįőʼn" + }, + "bookmarks": { + "title": "ßőőĸmäřĸş" + }, + "bookmarks-empty": { + "title": "ßőőĸmäřĸ päģęş ƒőř ŧĥęm ŧő äppęäř ĥęřę" + }, + "collector": { + "title": "Cőľľęčŧőř" + }, + "config": { + "title": "Åđmįʼnįşŧřäŧįőʼn" + }, + "config-access": { + "subtitle": "Cőʼnƒįģūřę äččęşş ƒőř įʼnđįvįđūäľ ūşęřş, ŧęämş, äʼnđ şęřvįčę äččőūʼnŧş", + "title": "Ůşęřş äʼnđ äččęşş" + }, + "config-general": { + "subtitle": "Mäʼnäģę đęƒäūľŧ přęƒęřęʼnčęş äʼnđ şęŧŧįʼnģş äčřőşş Ğřäƒäʼnä", + "title": "Ğęʼnęřäľ" + }, + "config-plugins": { + "subtitle": "Ĩʼnşŧäľľ pľūģįʼnş äʼnđ đęƒįʼnę ŧĥę řęľäŧįőʼnşĥįpş þęŧŵęęʼn đäŧä", + "title": "Pľūģįʼnş äʼnđ đäŧä" + }, + "connect-data": { + "title": "Cőʼnʼnęčŧ đäŧä" + }, + "connections": { + "subtitle": "ßřőŵşę äʼnđ čřęäŧę ʼnęŵ čőʼnʼnęčŧįőʼnş", + "title": "Cőʼnʼnęčŧįőʼnş" + }, + "correlations": { + "subtitle": "Åđđ äʼnđ čőʼnƒįģūřę čőřřęľäŧįőʼnş", + "title": "Cőřřęľäŧįőʼnş" + }, + "create": { + "title": "Cřęäŧę" + }, + "create-alert": { + "title": "Ńęŵ äľęřŧ řūľę" + }, + "create-dashboard": { + "title": "Đäşĥþőäřđ" + }, + "create-folder": { + "title": "Főľđęř" + }, + "create-import": { + "title": "Ĩmpőřŧ đäşĥþőäřđ" + }, + "dashboards": { + "subtitle": "Cřęäŧę äʼnđ mäʼnäģę đäşĥþőäřđş ŧő vįşūäľįžę yőūř đäŧä", + "title": "Đäşĥþőäřđş" + }, + "data-sources": { + "subtitle": "Vįęŵ äʼnđ mäʼnäģę yőūř čőʼnʼnęčŧęđ đäŧä şőūřčę čőʼnʼnęčŧįőʼnş", + "title": "Đäŧä şőūřčęş" + }, + "databases": { + "title": "Đäŧäþäşęş" + }, + "datasources": { + "subtitle": "Åđđ äʼnđ čőʼnƒįģūřę đäŧä şőūřčęş", + "title": "Đäŧä şőūřčęş" + }, + "detect": { + "title": "Đęŧęčŧ" + }, + "explore": { + "title": "Ēχpľőřę" + }, + "frontend": { + "subtitle": "Ğäįʼn řęäľ ūşęř mőʼnįŧőřįʼnģ įʼnşįģĥŧş", + "title": "Fřőʼnŧęʼnđ" + }, + "frontend-app": { + "title": "Fřőʼnŧęʼnđ" + }, + "global-orgs": { + "subtitle": "Ĩşőľäŧęđ įʼnşŧäʼnčęş őƒ Ğřäƒäʼnä řūʼnʼnįʼnģ őʼn ŧĥę şämę şęřvęř", + "title": "Øřģäʼnįžäŧįőʼnş" + }, + "global-users": { + "subtitle": "Mäʼnäģę ūşęřş įʼn Ğřäƒäʼnä", + "title": "Ůşęřş" + }, + "grafana-quaderno": { + "title": "Ğřäƒäʼnä Qūäđęřʼnő" + }, + "groupsync": { + "subtitle": "Mäʼnäģę mäppįʼnģş őƒ Ĩđęʼnŧįŧy Přővįđęř ģřőūpş ŧő Ğřäƒäʼnä Ŗőľęş" + }, + "help": { + "title": "Ħęľp" + }, + "help/community": "Cőmmūʼnįŧy", + "help/documentation": "Đőčūmęʼnŧäŧįőʼn", + "help/keyboard-shortcuts": "Ķęyþőäřđ şĥőřŧčūŧş", + "help/support": "Ŝūppőřŧ", + "history-container": { + "drawer-tittle": "Ħįşŧőřy" + }, + "history-wrapper": { + "collapse": "Cőľľäpşę", + "expand": "Ēχpäʼnđ", + "show-more": "Ŝĥőŵ mőřę", + "today": "Ŧőđäy", + "yesterday": "Ÿęşŧęřđäy" + }, + "home": { + "title": "Ħőmę" + }, + "incidents": { + "title": "Ĩʼnčįđęʼnŧ" + }, + "infrastructure": { + "subtitle": "Ůʼnđęřşŧäʼnđ yőūř įʼnƒřäşŧřūčŧūřę'ş ĥęäľŧĥ", + "title": "Ĩʼnƒřäşŧřūčŧūřę" + }, + "integrations": { + "title": "Ĩʼnŧęģřäŧįőʼnş" + }, + "k6": { + "title": "Pęřƒőřmäʼnčę" + }, + "kubernetes": { + "title": "Ķūþęřʼnęŧęş" + }, + "library-panels": { + "subtitle": "Ŗęūşäþľę päʼnęľş ŧĥäŧ čäʼn þę äđđęđ ŧő mūľŧįpľę đäşĥþőäřđş", + "title": "Ŀįþřäřy päʼnęľş" + }, + "machine-learning": { + "title": "Mäčĥįʼnę ľęäřʼnįʼnģ" + }, + "manage-folder": { + "subtitle": "Mäʼnäģę ƒőľđęř đäşĥþőäřđş äʼnđ pęřmįşşįőʼnş" + }, + "migrate-to-cloud": { + "subtitle": "Cőpy čőʼnƒįģūřäŧįőʼn ƒřőm yőūř şęľƒ-mäʼnäģęđ įʼnşŧäľľäŧįőʼn ŧő ä čľőūđ şŧäčĸ", + "title": "Mįģřäŧę ŧő Ğřäƒäʼnä Cľőūđ" + }, + "monitoring": { + "subtitle": "Øūŧ-őƒ-ŧĥę-þőχ őþşęřväþįľįŧy şőľūŧįőʼnş", + "title": "Øþşęřväþįľįŧy" + }, + "new": { + "title": "Ńęŵ" + }, + "new-dashboard": { + "title": "Ńęŵ đäşĥþőäřđ" + }, + "new-folder": { + "title": "Ńęŵ ƒőľđęř" + }, + "oncall": { + "title": "ØʼnCäľľ" + }, + "org-settings": { + "subtitle": "Mäʼnäģę přęƒęřęʼnčęş äčřőşş äʼn őřģäʼnįžäŧįőʼn", + "title": "Đęƒäūľŧ přęƒęřęʼnčęş" + }, + "playlists": { + "subtitle": "Ğřőūpş őƒ đäşĥþőäřđş ŧĥäŧ äřę đįşpľäyęđ įʼn ä şęqūęʼnčę", + "title": "Pľäyľįşŧş" + }, + "plugins": { + "subtitle": "Ēχŧęʼnđ ŧĥę Ğřäƒäʼnä ęχpęřįęʼnčę ŵįŧĥ pľūģįʼnş", + "title": "Pľūģįʼnş" + }, + "private-data-source-connections": { + "subtitle": "Qūęřy đäŧä ŧĥäŧ ľįvęş ŵįŧĥįʼn ä şęčūřęđ ʼnęŧŵőřĸ ŵįŧĥőūŧ őpęʼnįʼnģ ŧĥę ʼnęŧŵőřĸ ŧő įʼnþőūʼnđ ŧř䃃įč ƒřőm Ğřäƒäʼnä Cľőūđ. Ŀęäřʼn mőřę įʼn őūř đőčş.", + "title": "Přįväŧę đäŧä şőūřčę čőʼnʼnęčŧ" + }, + "profile/notifications": { + "title": "Ńőŧįƒįčäŧįőʼn ĥįşŧőřy" + }, + "profile/password": { + "title": "Cĥäʼnģę päşşŵőřđ" + }, + "profile/settings": { + "title": "Přőƒįľę" + }, + "profiles": { + "title": "Přőƒįľęş" + }, + "public": { + "title": "Pūþľįč đäşĥþőäřđş" + }, + "recently-deleted": { + "subtitle": "Åʼny įŧęmş ľįşŧęđ ĥęřę ƒőř mőřę ŧĥäʼn 30 đäyş ŵįľľ þę äūŧőmäŧįčäľľy đęľęŧęđ.", + "title": "Ŗęčęʼnŧľy đęľęŧęđ" + }, + "recorded-queries": { + "title": "Ŗęčőřđęđ qūęřįęş" + }, + "reporting": { + "title": "Ŗępőřŧįʼnģ" + }, + "scenes": { + "title": "Ŝčęʼnęş" + }, + "search": { + "placeholderCommandPalette": "Ŝęäřčĥ őř ĵūmp ŧő..." + }, + "search-dashboards": { + "title": "Ŝęäřčĥ đäşĥþőäřđş" + }, + "server-settings": { + "subtitle": "Vįęŵ ŧĥę şęŧŧįʼnģş đęƒįʼnęđ įʼn yőūř Ğřäƒäʼnä čőʼnƒįģ", + "title": "Ŝęŧŧįʼnģş" + }, + "service-accounts": { + "subtitle": "Ůşę şęřvįčę äččőūʼnŧş ŧő řūʼn äūŧőmäŧęđ ŵőřĸľőäđş įʼn Ğřäƒäʼnä", + "title": "Ŝęřvįčę äččőūʼnŧş" + }, + "setup-guide": { + "title": "Ŝęŧūp ģūįđę" + }, + "shared-dashboard": { + "subtitle": "Mäʼnäģę yőūř őřģäʼnįžäŧįőʼn'ş ęχŧęřʼnäľľy şĥäřęđ đäşĥþőäřđş", + "title": "Ŝĥäřęđ đäşĥþőäřđş" + }, + "sign-out": { + "title": "Ŝįģʼn őūŧ" + }, + "slo": { + "title": "ŜĿØ" + }, + "snapshots": { + "subtitle": "Ĩʼnŧęřäčŧįvę, pūþľįčäľľy äväįľäþľę, pőįʼnŧ-įʼn-ŧįmę řępřęşęʼnŧäŧįőʼnş őƒ đäşĥþőäřđş äʼnđ päʼnęľş", + "title": "Ŝʼnäpşĥőŧş" + }, + "starred": { + "title": "Ŝŧäřřęđ" + }, + "starred-empty": { + "title": "Ÿőūř şŧäřřęđ đäşĥþőäřđş ŵįľľ äppęäř ĥęřę" + }, + "statistics-and-licensing": { + "title": "Ŝŧäŧįşŧįčş äʼnđ ľįčęʼnşįʼnģ" + }, + "storage": { + "subtitle": "Mäʼnäģę ƒįľę şŧőřäģę", + "title": "Ŝŧőřäģę" + }, + "support-bundles": { + "subtitle": "Đőŵʼnľőäđ şūppőřŧ þūʼnđľęş", + "title": "Ŝūppőřŧ þūʼnđľęş" + }, + "synthetics": { + "title": "Ŝyʼnŧĥęŧįčş" + }, + "teams": { + "subtitle": "Ğřőūpş őƒ ūşęřş ŧĥäŧ ĥävę čőmmőʼn đäşĥþőäřđ äʼnđ pęřmįşşįőʼn ʼnęęđş", + "title": "Ŧęämş" + }, + "testing-and-synthetics": { + "subtitle": "Øpŧįmįžę pęřƒőřmäʼnčę ŵįŧĥ ĸ6 äʼnđ Ŝyʼnŧĥęŧįč Mőʼnįŧőřįʼnģ įʼnşįģĥŧş", + "title": "Ŧęşŧįʼnģ & şyʼnŧĥęŧįčş" + }, + "upgrading": { + "title": "Ŝŧäŧş äʼnđ ľįčęʼnşę" + }, + "users": { + "subtitle": "Ĩʼnvįŧę äʼnđ äşşįģʼn řőľęş ŧő ūşęřş", + "title": "Ůşęřş" + } + }, + "navigation": { + "item": { + "add-bookmark": "Åđđ ŧő ßőőĸmäřĸş", + "remove-bookmark": "Ŗęmővę ƒřőm ßőőĸmäřĸş" + }, + "kiosk": { + "tv-alert": "Přęşş ĒŜC ŧő ęχįŧ ĸįőşĸ mőđę" + }, + "megamenu": { + "close": "Cľőşę męʼnū", + "dock": "Đőčĸ męʼnū", + "list-label": "Ńävįģäŧįőʼn", + "open": "Øpęʼn męʼnū", + "undock": "Ůʼnđőčĸ męʼnū" + }, + "rss-button": "Ŀäŧęşŧ ƒřőm ŧĥę þľőģ" + }, + "news": { + "drawer": { + "close": "Cľőşę Đřäŵęř" + }, + "title": "Ŀäŧęşŧ ƒřőm ŧĥę þľőģ" + }, + "notifications": { + "empty-state": { + "description": "Ńőŧįƒįčäŧįőʼnş yőū ĥävę řęčęįvęđ ŵįľľ äppęäř ĥęřę", + "title": "Ÿőū'řę äľľ čäūģĥŧ ūp!" + }, + "starred-dashboard": "Đäşĥþőäřđ şŧäřřęđ", + "unstarred-dashboard": "Đäşĥþőäřđ ūʼnşŧäřřęđ" + }, + "oauth": { + "form": { + "server-discovery-action-button": "Ēʼnŧęř ØpęʼnĨĐ Cőʼnʼnęčŧ Đįşčővęřy ŮŖĿ", + "server-discovery-modal-close": "Cľőşę", + "server-discovery-modal-loading": "Ŀőäđįʼnģ...", + "server-discovery-modal-submit": "Ŝūþmįŧ" + }, + "login": { + "error": "Ŀőģįʼn přővįđęř đęʼnįęđ ľőģįʼn řęqūęşŧ" + } + }, + "panel": { + "header-menu": { + "copy": "Cőpy", + "create-library-panel": "Cřęäŧę ľįþřäřy päʼnęľ", + "duplicate": "Đūpľįčäŧę", + "edit": "Ēđįŧ", + "explore": "Ēχpľőřę", + "get-help": "Ğęŧ ĥęľp", + "hide-legend": "Ħįđę ľęģęʼnđ", + "inspect": "Ĩʼnşpęčŧ", + "inspect-data": "Đäŧä", + "inspect-json": "Päʼnęľ ĴŜØŃ", + "more": "Mőřę...", + "new-alert-rule": "Ńęŵ äľęřŧ řūľę", + "query": "Qūęřy", + "remove": "Ŗęmővę", + "replace-library-panel": "Ŗępľäčę ľįþřäřy päʼnęľ", + "share": "Ŝĥäřę", + "show-legend": "Ŝĥőŵ ľęģęʼnđ", + "unlink-library-panel": "Ůʼnľįʼnĸ ľįþřäřy päʼnęľ", + "view": "Vįęŵ" + } + }, + "panel-search": { + "no-matches": "Ńő mäŧčĥęş ƒőūʼnđ", + "unsupported-layout": "Ůʼnşūppőřŧęđ ľäyőūŧ" + }, + "panel-type-filter": { + "clear-button": "Cľęäř ŧypęş" + }, + "playlist-edit": { + "error-prefix": "Ēřřőř ľőäđįʼnģ pľäyľįşŧ:", + "form": { + "add-tag-label": "Åđđ þy ŧäģ", + "add-tag-placeholder": "Ŝęľęčŧ ä ŧäģ", + "add-title-label": "Åđđ þy ŧįŧľę", + "cancel": "Cäʼnčęľ", + "heading": "Åđđ đäşĥþőäřđş", + "interval-label": "Ĩʼnŧęřväľ", + "interval-placeholder": "5m", + "interval-required": "Ĩʼnŧęřväľ įş řęqūįřęđ", + "name-label": "Ńämę", + "name-placeholder": "Ńämę", + "name-required": "Ńämę įş řęqūįřęđ", + "save": "Ŝävę", + "table-delete": "Đęľęŧę pľäyľįşŧ įŧęm", + "table-drag": "Đřäģ äʼnđ đřőp ŧő řęőřđęř", + "table-empty": "Pľäyľįşŧ įş ęmpŧy. Åđđ đäşĥþőäřđş þęľőŵ.", + "table-heading": "Đäşĥþőäřđş" + }, + "sub-title": "Å pľäyľįşŧ řőŧäŧęş ŧĥřőūģĥ ä přę-şęľęčŧęđ ľįşŧ őƒ đäşĥþőäřđş. Å pľäyľįşŧ čäʼn þę ä ģřęäŧ ŵäy ŧő þūįľđ şįŧūäŧįőʼnäľ äŵäřęʼnęşş, őř ĵūşŧ şĥőŵ őƒƒ yőūř męŧřįčş ŧő yőūř ŧęäm őř vįşįŧőřş.", + "title": "Ēđįŧ pľäyľįşŧ" + }, + "playlist-page": { + "card": { + "delete": "Đęľęŧę pľäyľįşŧ", + "edit": "Ēđįŧ pľäyľįşŧ", + "start": "Ŝŧäřŧ pľäyľįşŧ", + "tooltip": "Ŝĥäřę pľäyľįşŧ" + }, + "create-button": { + "title": "Ńęŵ pľäyľįşŧ" + }, + "delete-modal": { + "body": "Åřę yőū şūřę yőū ŵäʼnŧ ŧő đęľęŧę {{name}} pľäyľįşŧ?", + "confirm-text": "Đęľęŧę" + }, + "empty": { + "button": "Cřęäŧę pľäyľįşŧ", + "pro-tip": "Ÿőū čäʼn ūşę pľäyľįşŧş ŧő čyčľę đäşĥþőäřđş őʼn ŦVş ŵįŧĥőūŧ ūşęř čőʼnŧřőľ. <2>Ŀęäřʼn mőřę", + "title": "Ŧĥęřę äřę ʼnő pľäyľįşŧş čřęäŧęđ yęŧ" + } + }, + "playlists": { + "empty-state": { + "message": "Ńő pľäyľįşŧş ƒőūʼnđ" + } + }, + "plugins": { + "catalog": { + "update-all": { + "all-plugins-updated": "Åľľ pľūģįʼnş ūpđäŧęđ!", + "available-header": "Åväįľäþľę", + "button": "Ůpđäŧę äľľ", + "cloud-update-message": "* Ĩŧ mäy ŧäĸę ä ƒęŵ mįʼnūŧęş ƒőř ŧĥę pľūģįʼnş ŧő þę äväįľäþľę ƒőř ūşäģę.", + "error": "Ēřřőř ūpđäŧįʼnģ pľūģįʼn:", + "error-status-text": "ƒäįľęđ - şęę ęřřőř męşşäģęş", + "header": "Ŧĥę ƒőľľőŵįʼnģ pľūģįʼnş ĥävę ūpđäŧę äväįľäþľę", + "installed-header": "Ĩʼnşŧäľľęđ", + "modal-confirmation": "Ůpđäŧę", + "modal-dismiss": "Cľőşę", + "modal-in-progress": "Ůpđäŧįʼnģ...", + "modal-title": "Ůpđäŧę Pľūģįʼnş", + "name-header": "Ńämę", + "update-header": "Ůpđäŧę", + "update-status-text": "pľūģįʼnş ūpđäŧęđ" + }, + "versions": { + "confirmation-text-1": "Åřę yőū řęäľľy şūřę yőū ŵäʼnŧ ŧő đőŵʼnģřäđę ŧő vęřşįőʼn", + "confirmation-text-2": "Ÿőū şĥőūľđ ʼnőřmäľľy ʼnőŧ þę đőįʼnģ ŧĥįş", + "downgrade-confirm": "Đőŵʼnģřäđę", + "downgrade-title": "Đőŵʼnģřäđę pľūģįʼn vęřşįőʼn" + } + }, + "details": { + "connections-tab": { + "description": "Ŧĥę đäŧä şőūřčę čőʼnʼnęčŧįőʼnş þęľőŵ äřę äľľ {{pluginName}}. Ÿőū čäʼn ƒįʼnđ äľľ őƒ yőūř đäŧä şőūřčę čőʼnʼnęčŧįőʼnş őƒ äľľ ŧypęş įʼn <4><0>Cőʼnʼnęčŧįőʼnş - <3>Đäŧä şőūřčęş." + }, + "labels": { + "contactGrafanaLabs": "Cőʼnŧäčŧ Ğřäƒäʼnä Ŀäþş", + "customLinks": "Cūşŧőm ľįʼnĸş ", + "customLinksTooltip": "Ŧĥęşę ľįʼnĸş äřę přővįđęđ þy ŧĥę pľūģįʼn đęvęľőpęř ŧő őƒƒęř äđđįŧįőʼnäľ, đęvęľőpęř-şpęčįƒįč řęşőūřčęş äʼnđ įʼnƒőřmäŧįőʼn", + "dependencies": "Đępęʼnđęʼnčįęş", + "documentation": "Đőčūmęʼnŧäŧįőʼn", + "downloads": "Đőŵʼnľőäđş", + "from": "Fřőm", + "installedVersion": "Ĩʼnşŧäľľęđ Vęřşįőʼn", + "lastCommitDate": "Ŀäşŧ čőmmįŧ đäŧę:", + "latestVersion": "Ŀäŧęşŧ Vęřşįőʼn", + "license": "Ŀįčęʼnşę", + "raiseAnIssue": "Ŗäįşę äʼn įşşūę", + "reportAbuse": "Ŗępőřŧ ä čőʼnčęřʼn ", + "reportAbuseTooltip": "Ŗępőřŧ įşşūęş řęľäŧęđ ŧő mäľįčįőūş őř ĥäřmƒūľ pľūģįʼnş đįřęčŧľy ŧő Ğřäƒäʼnä Ŀäþş.", + "repository": "Ŗępőşįŧőřy", + "signature": "Ŝįģʼnäŧūřę", + "status": "Ŝŧäŧūş", + "updatedAt": "Ŀäşŧ ūpđäŧęđ:" + }, + "modal": { + "cancel": "Cäʼnčęľ", + "copyEmail": "Cőpy ęmäįľ äđđřęşş", + "description": "Ŧĥįş ƒęäŧūřę įş ƒőř řępőřŧįʼnģ mäľįčįőūş őř ĥäřmƒūľ þęĥävįőūř ŵįŧĥįʼn pľūģįʼnş. Főř pľūģįʼn čőʼnčęřʼnş, ęmäįľ ūş äŧ: ", + "node": "Ńőŧę: Főř ģęʼnęřäľ pľūģįʼn įşşūęş ľįĸę þūģş őř ƒęäŧūřę řęqūęşŧş, pľęäşę čőʼnŧäčŧ ŧĥę pľūģįʼn äūŧĥőř ūşįʼnģ ŧĥę přővįđęđ ľįʼnĸş. ", + "title": "Ŗępőřŧ ä pľūģįʼn čőʼnčęřʼn" + } + }, + "empty-state": { + "message": "Ńő pľūģįʼnş ƒőūʼnđ" + }, + "plugin-help": { + "error": "Åʼn ęřřőř őččūřřęđ ŵĥęʼn ľőäđįʼnģ ĥęľp.", + "not-found": "Ńő qūęřy ĥęľp čőūľđ þę ƒőūʼnđ." + } + }, + "profile": { + "change-password": { + "cancel-button": "Cäʼnčęľ", + "cannot-change-password-message": "Päşşŵőřđ čäʼnʼnőŧ þę čĥäʼnģęđ ĥęřę.", + "change-password-button": "Cĥäʼnģę Päşşŵőřđ", + "confirm-password-label": "Cőʼnƒįřm päşşŵőřđ", + "confirm-password-required": "Ńęŵ päşşŵőřđ čőʼnƒįřmäŧįőʼn įş řęqūįřęđ", + "ldap-auth-proxy-message": "Ÿőū čäʼnʼnőŧ čĥäʼnģę päşşŵőřđ ŵĥęʼn şįģʼnęđ įʼn ŵįŧĥ ĿĐÅP őř äūŧĥ přőχy.", + "new-password-label": "Ńęŵ päşşŵőřđ", + "new-password-required": "Ńęŵ päşşŵőřđ įş řęqūįřęđ", + "new-password-same-as-old": "Ńęŵ päşşŵőřđ čäʼn'ŧ þę ŧĥę şämę äş ŧĥę őľđ őʼnę.", + "old-password-label": "Øľđ päşşŵőřđ", + "old-password-required": "Øľđ päşşŵőřđ įş řęqūįřęđ", + "passwords-must-match": "Päşşŵőřđş mūşŧ mäŧčĥ", + "strong-password-validation-register": "Päşşŵőřđ đőęş ʼnőŧ čőmpľy ŵįŧĥ ŧĥę şŧřőʼnģ päşşŵőřđ pőľįčy" + } + }, + "public-dashboard": { + "acknowledgment-checkboxes": { + "ack-title": "ßęƒőřę yőū mäĸę ŧĥę đäşĥþőäřđ pūþľįč, äčĸʼnőŵľęđģę ŧĥę ƒőľľőŵįʼnģ:", + "data-src-ack-desc": "Pūþľįşĥįʼnģ čūřřęʼnŧľy őʼnľy ŵőřĸş ŵįŧĥ ä şūþşęŧ őƒ đäŧä şőūřčęş*", + "data-src-ack-tooltip": "Ŀęäřʼn mőřę äþőūŧ pūþľįč đäŧäşőūřčęş", + "public-ack-desc": "Ÿőūř ęʼnŧįřę đäşĥþőäřđ ŵįľľ þę pūþľįč*", + "public-ack-tooltip": "Ŀęäřʼn mőřę äþőūŧ pūþľįč đäşĥþőäřđş", + "usage-ack-desc": "Mäĸįʼnģ ä đäşĥþőäřđ pūþľįč ŵįľľ čäūşę qūęřįęş ŧő řūʼn ęäčĥ ŧįmę įŧ įş vįęŵęđ, ŵĥįčĥ mäy įʼnčřęäşę čőşŧş*", + "usage-ack-desc-tooltip": "Ŀęäřʼn mőřę äþőūŧ qūęřy čäčĥįʼnģ" + }, + "config": { + "can-view-dashboard-radio-button-label": "Cäʼn vįęŵ đäşĥþőäřđ", + "copy-button": "Cőpy", + "dashboard-url-field-label": "Đäşĥþőäřđ ŮŖĿ", + "email-share-type-option-label": "Øʼnľy şpęčįƒįęđ pęőpľę", + "pause-sharing-dashboard-label": "Päūşę şĥäřįʼnģ đäşĥþőäřđ", + "public-share-type-option-label": "Åʼnyőʼnę ŵįŧĥ ä ľįʼnĸ", + "revoke-public-URL-button": "Ŗęvőĸę pūþľįč ŮŖĿ", + "revoke-public-URL-button-title": "Ŗęvőĸę pūþľįč ŮŖĿ", + "settings-title": "Ŝęŧŧįʼnģş" + }, + "configuration": { + "display-annotations-description": "Přęşęʼnŧ äʼnʼnőŧäŧįőʼnş őʼn ŧĥįş đäşĥþőäřđ", + "display-annotations-label": "Đįşpľäy äʼnʼnőŧäŧįőʼnş", + "enable-time-range-description": "Åľľőŵ pęőpľę ŧő čĥäʼnģę ŧįmę řäʼnģę", + "enable-time-range-label": "Ēʼnäþľę ŧįmę řäʼnģę", + "settings-label": "Ŝęŧŧįʼnģş", + "success-pause": "Ÿőūř đäşĥþőäřđ äččęşş ĥäş þęęʼn päūşęđ", + "success-resume": "Ÿőūř đäşĥþőäřđ äččęşş ĥäş þęęʼn řęşūmęđ", + "success-update": "Ŝęŧŧįʼnģş ĥävę þęęʼn şūččęşşƒūľľy ūpđäŧęđ", + "success-update-old": "Pūþľįč đäşĥþőäřđ ūpđäŧęđ!", + "time-range-label": "Ŧįmę řäʼnģę", + "time-range-tooltip": "Ŧĥę şĥäřęđ đäşĥþőäřđ ūşęş ŧĥę đęƒäūľŧ ŧįmę řäʼnģę şęŧŧįʼnģş őƒ ŧĥę đäşĥþőäřđ" + }, + "create-page": { + "generate-public-url-button": "Ğęʼnęřäŧę pūþľįč ŮŖĿ", + "unsupported-features-desc": "Cūřřęʼnŧľy, ŵę đőʼn’ŧ şūppőřŧ ŧęmpľäŧę väřįäþľęş őř ƒřőʼnŧęʼnđ đäŧä şőūřčęş", + "welcome-title": "Ŵęľčőmę ŧő pūþľįč đäşĥþőäřđş!" + }, + "delete-modal": { + "revoke-body-text": "Åřę yőū şūřę yőū ŵäʼnŧ ŧő řęvőĸę ŧĥįş ŮŖĿ? Ŧĥę đäşĥþőäřđ ŵįľľ ʼnő ľőʼnģęř þę pūþľįč.", + "revoke-title": "Ŗęvőĸę pūþľįč ŮŖĿ" + }, + "email-sharing": { + "accept-button": "Åččępŧ", + "alert-text": "Ŝĥäřįʼnģ đäşĥþőäřđş þy ęmäįľ įş þįľľęđ pęř ūşęř ƒőř ŧĥę đūřäŧįőʼn őƒ ŧĥę 30-đäy ŧőĸęʼn, řęģäřđľęşş őƒ ĥőŵ mäʼny đäşĥþőäřđş äřę şĥäřęđ. ßįľľįʼnģ şŧőpş äƒŧęř 30 đäyş ūʼnľęşş yőū řęʼnęŵ ŧĥę ŧőĸęʼn.", + "bill-ack": "Ĩ ūʼnđęřşŧäʼnđ ŧĥäŧ äđđįʼnģ ūşęřş řęqūįřęş päymęʼnŧ.*", + "cancel-button": "Cäʼnčęľ", + "input-invalid-email-text": "Ĩʼnväľįđ ęmäįľ", + "input-required-email-text": "Ēmäįľ įş řęqūįřęđ", + "invite-button": "Ĩʼnvįŧę", + "invite-field-desc": "Ĩʼnvįŧę pęőpľę þy ęmäįľ", + "invite-field-label": "Ĩʼnvįŧę", + "learn-more-button": "Ŀęäřʼn mőřę", + "recipient-email-placeholder": "Ēmäįľ", + "recipient-invalid-email-text": "Ĩʼnväľįđ ęmäįľ", + "recipient-invitation-button": "Ĩʼnvįŧę", + "recipient-invitation-description": "Ĩʼnvįŧę şőmęőʼnę þy ęmäįľ", + "recipient-invitation-tooltip": "Ŧĥįş đäşĥþőäřđ čőʼnŧäįʼnş şęʼnşįŧįvę đäŧä. ßy ūşįʼnģ ŧĥįş ƒęäŧūřę yőū ŵįľľ þę şĥäřįʼnģ ŵįŧĥ ęχŧęřʼnäľ pęőpľę.", + "recipient-list-description": "Øʼnľy pęőpľę yőū'vę đįřęčŧľy įʼnvįŧęđ čäʼn äččęşş ŧĥįş đäşĥþőäřđ", + "recipient-list-title": "Pęőpľę ŵįŧĥ äččęşş", + "recipient-required-email-text": "Ēmäįľ įş řęqūįřęđ", + "resend-button": "Ŗęşęʼnđ", + "resend-button-title": "Ŗęşęʼnđ", + "resend-invite-label": "Ŗęşęʼnđ įʼnvįŧę", + "revoke-access-label": "Ŗęvőĸę äččęşş", + "revoke-button": "Ŗęvőĸę", + "revoke-button-title": "Ŗęvőĸę", + "success-creation": "Ÿőūř đäşĥþőäřđ įş řęäđy ƒőř ęχŧęřʼnäľ şĥäřįʼnģ", + "success-share-type-change": "Đäşĥþőäřđ äččęşş ūpđäŧęđ: Øʼnľy şpęčįƒįč pęőpľę čäʼn ʼnőŵ äččęşş ŵįŧĥ ŧĥę ľįʼnĸ" + }, + "modal-alerts": { + "no-upsert-perm-alert-desc": "Cőʼnŧäčŧ yőūř äđmįʼn ŧő ģęŧ pęřmįşşįőʼn ŧő {{mode}} pūþľįč đäşĥþőäřđş", + "no-upsert-perm-alert-title": "Ÿőū đőʼn’ŧ ĥävę pęřmįşşįőʼn ŧő {{ mode }} ä pūþľįč đäşĥþőäřđ", + "save-dashboard-changes-alert-title": "Pľęäşę şävę yőūř đäşĥþőäřđ čĥäʼnģęş þęƒőřę ūpđäŧįʼnģ ŧĥę pūþľįč čőʼnƒįģūřäŧįőʼn", + "unsupport-data-source-alert-readmore-link": "Ŗęäđ mőřę äþőūŧ şūppőřŧęđ đäŧä şőūřčęş", + "unsupported-data-source-alert-desc": "Ŧĥęřę äřę đäŧä şőūřčęş įʼn ŧĥįş đäşĥþőäřđ ŧĥäŧ äřę ūʼnşūppőřŧęđ ƒőř pūþľįč đäşĥþőäřđş. Päʼnęľş ŧĥäŧ ūşę ŧĥęşę đäŧä şőūřčęş mäy ʼnőŧ ƒūʼnčŧįőʼn přőpęřľy: {{unsupportedDataSources}}.", + "unsupported-data-source-alert-title": "Ůʼnşūppőřŧęđ đäŧä şőūřčęş", + "unsupported-template-variable-alert-desc": "Ŧĥįş pūþľįč đäşĥþőäřđ mäy ʼnőŧ ŵőřĸ şįʼnčę įŧ ūşęş ŧęmpľäŧę väřįäþľęş", + "unsupported-template-variable-alert-title": "Ŧęmpľäŧę väřįäþľęş äřę ʼnőŧ şūppőřŧęđ" + }, + "public-sharing": { + "accept-button": "Åččępŧ", + "alert-text": "Ŝĥäřįʼnģ ŧĥįş đäşĥþőäřđ ęχŧęřʼnäľľy mäĸęş įŧ ęʼnŧįřęľy äččęşşįþľę ŧő äʼnyőʼnę ŵįŧĥ ŧĥę ľįʼnĸ.", + "cancel-button": "Cäʼnčęľ", + "learn-more-button": "Ŀęäřʼn mőřę", + "public-ack": "Ĩ ūʼnđęřşŧäʼnđ ŧĥäŧ ŧĥįş ęʼnŧįřę đäşĥþőäřđ ŵįľľ þę pūþľįč.*", + "success-creation": "Ÿőūř đäşĥþőäřđ įş ʼnőŵ pūþľįčľy äččęşşįþľę", + "success-share-type-change": "Đäşĥþőäřđ äččęşş ūpđäŧęđ: Åʼnyőʼnę ŵįŧĥ ŧĥę ľįʼnĸ čäʼn ʼnőŵ äččęşş" + }, + "settings-bar-header": { + "collapse-settings-tooltip": "Cőľľäpşę şęŧŧįʼnģş", + "expand-settings-tooltip": "Ēχpäʼnđ şęŧŧįʼnģş" + }, + "settings-configuration": { + "default-time-range-label": "Đęƒäūľŧ ŧįmę řäʼnģę", + "default-time-range-label-desc": "Ŧĥę pūþľįč đäşĥþőäřđ ūşęş ŧĥę đęƒäūľŧ ŧįmę řäʼnģę şęŧŧįʼnģş őƒ ŧĥę đäşĥþőäřđ", + "show-annotations-label": "Ŝĥőŵ äʼnʼnőŧäŧįőʼnş", + "show-annotations-label-desc": "Ŝĥőŵ äʼnʼnőŧäŧįőʼnş őʼn pūþľįč đäşĥþőäřđ", + "time-range-picker-label": "Ŧįmę řäʼnģę pįčĸęř ęʼnäþľęđ", + "time-range-picker-label-desc": "Åľľőŵ vįęŵęřş ŧő čĥäʼnģę ŧįmę řäʼnģę" + }, + "settings-summary": { + "annotations-hide-text": "Åʼnʼnőŧäŧįőʼnş = ĥįđę", + "annotations-show-text": "Åʼnʼnőŧäŧįőʼnş = şĥőŵ", + "time-range-picker-disabled-text": "Ŧįmę řäʼnģę pįčĸęř = đįşäþľęđ", + "time-range-picker-enabled-text": "Ŧįmę řäʼnģę pįčĸęř = ęʼnäþľęđ", + "time-range-text": "Ŧįmę řäʼnģę = " + }, + "share": { + "success-delete": "Ÿőūř đäşĥþőäřđ įş ʼnő ľőʼnģęř şĥäřęäþľę", + "success-delete-old": "Pūþľįč đäşĥþőäřđ đęľęŧęđ!" + }, + "share-configuration": { + "share-type-label": "Ŀįʼnĸ äččęşş" + }, + "share-externally": { + "copy-link-button": "Cőpy ęχŧęřʼnäľ ľįʼnĸ", + "email-share-type-option-description": "Øʼnľy pęőpľę ŵįŧĥ ŧĥę ľįʼnĸ čäʼn äččęşş đäşĥþőäřđ", + "email-share-type-option-label": "Øʼnľy şpęčįƒįč pęőpľę", + "no-upsert-perm-alert-desc": "Cőʼnŧäčŧ yőūř äđmįʼn ŧő ģęŧ pęřmįşşįőʼn ŧő {{mode}} şĥäřęđ đäşĥþőäřđş", + "no-upsert-perm-alert-title": "Ÿőū đőʼn’ŧ ĥävę pęřmįşşįőʼn ŧő {{ mode }} ä şĥäřęđ đäşĥþőäřđ", + "pause-access-button": "Päūşę äččęşş", + "pause-access-tooltip": "Päūşįʼnģ ŵįľľ ŧęmpőřäřįľy đįşäþľę äččęşş ŧő ŧĥįş đäşĥþőäřđ ƒőř äľľ ūşęřş", + "public-share-type-option-description": "Åʼnyőʼnę ŵįŧĥ ŧĥę ľįʼnĸ čäʼn äččęşş đäşĥþőäřđ", + "public-share-type-option-label": "Åʼnyőʼnę ŵįŧĥ ŧĥę ľįʼnĸ", + "resume-access-button": "Ŗęşūmę äččęşş", + "revoke-access-button": "Ŗęvőĸę äččęşş", + "revoke-access-description": "Åřę yőū şūřę yőū ŵäʼnŧ ŧő řęvőĸę ŧĥįş äččęşş? Ŧĥę đäşĥþőäřđ čäʼn ʼnő ľőʼnģęř þę şĥäřęđ.", + "unsupported-data-source-alert-desc": "Ŧĥęřę äřę đäŧä şőūřčęş įʼn ŧĥįş đäşĥþőäřđ ŧĥäŧ äřę ūʼnşūppőřŧęđ ƒőř şĥäřęđ đäşĥþőäřđş. Päʼnęľş ŧĥäŧ ūşę ŧĥęşę đäŧä şőūřčęş mäy ʼnőŧ ƒūʼnčŧįőʼn přőpęřľy: {{unsupportedDataSources}}." + }, + "sharing": { + "success-creation": "Đäşĥþőäřđ įş pūþľįč!" + } + }, + "public-dashboard-list": { + "button": { + "config-button-tooltip": "Cőʼnƒįģūřę pūþľįč đäşĥþőäřđ", + "revoke-button-text": "Ŗęvőĸę pūþľįč ŮŖĿ", + "revoke-button-tooltip": "Ŗęvőĸę pūþľįč đäşĥþőäřđ ŮŖĿ", + "view-button-tooltip": "Vįęŵ pūþľįč đäşĥþőäřđ" + }, + "empty-state": { + "message": "Ÿőū ĥävęʼn'ŧ čřęäŧęđ äʼny pūþľįč đäşĥþőäřđş yęŧ", + "more-info": "Cřęäŧę ä pūþľįč đäşĥþőäřđ ƒřőm äʼny ęχįşŧįʼnģ đäşĥþőäřđ ŧĥřőūģĥ ŧĥę <1>Ŝĥäřę mőđäľ. <4>Ŀęäřʼn mőřę" + }, + "toggle": { + "pause-sharing-toggle-text": "Päūşę şĥäřįʼnģ" + } + }, + "public-dashboard-users-access-list": { + "dashboard-modal": { + "external-link": "Ēχŧęřʼnäľ ľįʼnĸ", + "loading-text": "Ŀőäđįʼnģ...", + "open-dashboard-list-text": "Øpęʼn đäşĥþőäřđş ľįşŧ", + "public-dashboard-link": "Pūþľįč đäşĥþőäřđ ŮŖĿ", + "public-dashboard-setting": "Pūþľįč đäşĥþőäřđ şęŧŧįʼnģş", + "sharing-setting": "Ŝĥäřįʼnģ şęŧŧįʼnģş" + }, + "delete-user-modal": { + "delete-user-button-text": "Đęľęŧę ūşęř", + "delete-user-cancel-button": "Cäʼnčęľ", + "delete-user-revoke-access-button": "Ŗęvőĸę äččęşş", + "revoke-access-title": "Ŗęvőĸę äččęşş", + "revoke-user-access-modal-desc-line1": "Åřę yőū şūřę yőū ŵäʼnŧ ŧő řęvőĸę äččęşş ƒőř {{email}}?", + "revoke-user-access-modal-desc-line2": "Ŧĥįş äčŧįőʼn ŵįľľ įmmęđįäŧęľy řęvőĸę {{email}}&äpőş;ş äččęşş ŧő äľľ pūþľįč đäşĥþőäřđş." + }, + "delete-user-shared-dashboards-modal": { + "revoke-user-access-modal-desc-line2": "Ŧĥįş äčŧįőʼn ŵįľľ įmmęđįäŧęľy řęvőĸę {{email}}&äpőş;ş äččęşş ŧő äľľ şĥäřęđ đäşĥþőäřđş." + }, + "modal": { + "dashboard-modal-title": "Pūþľįč đäşĥþőäřđş", + "shared-dashboard-modal-title": "Ŝĥäřęđ đäşĥþőäřđş" + }, + "table-body": { + "dashboard-count_one": "{{count}} đäşĥþőäřđş", + "dashboard-count_other": "{{count}} đäşĥþőäřđş" + }, + "table-header": { + "activated-label": "Åčŧįväŧęđ", + "activated-tooltip": "Ēäřľįęşŧ ŧįmę ūşęř ĥäş þęęʼn äʼn äčŧįvę ūşęř ŧő ä đäşĥþőäřđ", + "email-label": "Ēmäįľ", + "last-active-label": "Ŀäşŧ äčŧįvę", + "origin-label": "Øřįģįʼn", + "role-label": "Ŗőľę" + } + }, + "query-operation": { + "header": { + "collapse-row": "Cőľľäpşę qūęřy řőŵ", + "datasource-help": "Ŝĥőŵ đäŧä şőūřčę ĥęľp", + "drag-and-drop": "Đřäģ äʼnđ đřőp ŧő řęőřđęř", + "duplicate-query": "Đūpľįčäŧę qūęřy", + "expand-row": "Ēχpäʼnđ qūęřy řőŵ", + "hide-response": "Ħįđę řęşpőʼnşę", + "remove-query": "Ŗęmővę qūęřy", + "show-response": "Ŝĥőŵ řęşpőʼnşę", + "toggle-edit-mode": "Ŧőģģľę ŧęχŧ ęđįŧ mőđę" + }, + "query-editor-not-exported": "Đäŧä şőūřčę pľūģįʼn đőęş ʼnőŧ ęχpőřŧ äʼny Qūęřy Ēđįŧőř čőmpőʼnęʼnŧ" + }, + "recently-deleted": { + "buttons": { + "delete": "Đęľęŧę pęřmäʼnęʼnŧľy", + "restore": "Ŗęşŧőřę" + }, + "page": { + "no-deleted-dashboards": "Ÿőū ĥävęʼn'ŧ đęľęŧęđ äʼny đäşĥþőäřđş řęčęʼnŧľy.", + "no-deleted-dashboards-text": "Ŵĥęʼn yőū đęľęŧę ä đäşĥþőäřđ, įŧ ŵįľľ äppęäř ĥęřę ƒőř 30 đäyş þęƒőřę þęįʼnģ pęřmäʼnęʼnŧľy đęľęŧęđ. Ÿőūř őřģäʼnįžäŧįőʼn äđmįʼnįşŧřäŧőř čäʼn řęşŧőřę řęčęʼnŧľy-đęľęŧęđ đäşĥþőäřđş.", + "no-search-result": "Ńő řęşūľŧş ƒőūʼnđ ƒőř yőūř qūęřy" + }, + "permanently-delete-modal": { + "confirm-text": "Đęľęŧę", + "delete-button": "Đęľęŧę", + "delete-loading": "Đęľęŧįʼnģ...", + "text_one": "Ŧĥįş äčŧįőʼn ŵįľľ đęľęŧę {{numberOfDashboards}} đäşĥþőäřđş.", + "text_other": "Ŧĥįş äčŧįőʼn ŵįľľ đęľęŧę {{numberOfDashboards}} đäşĥþőäřđş.", + "title": "Pęřmäʼnęʼnŧľy Đęľęŧę Đäşĥþőäřđş" + }, + "restore-modal": { + "folder-picker-text_one": "Pľęäşę čĥőőşę ä ƒőľđęř ŵĥęřę yőūř đäşĥþőäřđş ŵįľľ þę řęşŧőřęđ.", + "folder-picker-text_other": "Pľęäşę čĥőőşę ä ƒőľđęř ŵĥęřę yőūř đäşĥþőäřđş ŵįľľ þę řęşŧőřęđ.", + "restore-button": "Ŗęşŧőřę", + "restore-loading": "Ŗęşŧőřįʼnģ...", + "text_one": "Ŧĥįş äčŧįőʼn ŵįľľ řęşŧőřę {{numberOfDashboards}} đäşĥþőäřđş.", + "text_other": "Ŧĥįş äčŧįőʼn ŵįľľ řęşŧőřę {{numberOfDashboards}} đäşĥþőäřđş.", + "title": "Ŗęşŧőřę Đäşĥþőäřđş" + } + }, + "recentlyDeleted": { + "filter": { + "placeholder": "Ŝęäřčĥ ƒőř đäşĥþőäřđş" + } + }, + "reduce": { + "strictMode": { + "description": "Ŵĥęʼn <1>Ŗęđūčę Ŝŧřįčŧ mőđę įş ūşęđ, ŧĥę <3>ƒįľľ(ʼnūľľ) ƒūʼnčŧįőʼn (ĨʼnƒľūχQĿ) ŵįľľ řęşūľŧ įʼn <6>ŃäŃ. <9>Ŝęę ŧĥę đőčūmęʼnŧäŧįőʼn ƒőř mőřę đęŧäįľş.", + "title": "Ŝŧřįčŧ Mőđę ßęĥävįőūř" + } + }, + "refresh-picker": { + "aria-label": { + "choose-interval": "Åūŧő řęƒřęşĥ ŧūřʼnęđ őƒƒ. Cĥőőşę řęƒřęşĥ ŧįmę įʼnŧęřväľ", + "duration-selected": "Cĥőőşę řęƒřęşĥ ŧįmę įʼnŧęřväľ ŵįŧĥ čūřřęʼnŧ įʼnŧęřväľ {{durationAriaLabel}} şęľęčŧęđ" + }, + "auto-option": { + "aria-label": "", + "label": "" + }, + "live-option": { + "aria-label": "Ŧūřʼn őʼn ľįvę şŧřęämįʼnģ", + "label": "Ŀįvę" + }, + "off-option": { + "aria-label": "Ŧūřʼn őƒƒ äūŧő řęƒřęşĥ", + "label": "؃ƒ" + }, + "tooltip": { + "interval-selected": "Ŝęŧ äūŧő řęƒřęşĥ įʼnŧęřväľ", + "turned-off": "Åūŧő řęƒřęşĥ őƒƒ" + } + }, + "return-to-previous": { + "button": { + "label": "ßäčĸ ŧő {{title}}" + }, + "dismissable-button": "Cľőşę" + }, + "role-picker": { + "built-in": { + "basic-roles": "ßäşįč řőľęş" + }, + "input": { + "no-roles": "Ńő řőľęş äşşįģʼnęđ" + }, + "menu": { + "clear-button": "Cľęäř äľľ", + "tooltip": "Ÿőū čäʼn ʼnőŵ şęľęčŧ ŧĥę \"Ńő þäşįč řőľę\" őpŧįőʼn äʼnđ äđđ pęřmįşşįőʼnş ŧő yőūř čūşŧőm ʼnęęđş. Ÿőū čäʼn ƒįʼnđ mőřę įʼnƒőřmäŧįőʼn įʼn <1>őūř đőčūmęʼnŧäŧįőʼn." + }, + "sub-menu": { + "clear-button": "Cľęäř" + }, + "title": { + "description": "Åşşįģʼn řőľęş ŧő ūşęřş ŧő ęʼnşūřę ģřäʼnūľäř čőʼnŧřőľ ővęř äččęşş ŧő Ğřäƒäʼnä&ľşqūő;ş ƒęäŧūřęş äʼnđ řęşőūřčęş. Fįʼnđ őūŧ mőřę įʼn őūř <2>đőčūmęʼnŧäŧįőʼn." + } + }, + "role-picker-drawer": { + "basic-roles": { + "label": "ßäşįč Ŗőľęş" + } + }, + "route-error": { + "description": "Ğřäƒäʼnä ĥäş ľįĸęľy þęęʼn ūpđäŧęđ. Pľęäşę ŧřy řęľőäđįʼnģ ŧĥę päģę.", + "reload-button": "Ŗęľőäđ", + "title": "Ůʼnäþľę ŧő ƒįʼnđ äppľįčäŧįőʼn ƒįľę" + }, + "save-dashboards": { + "message-length": { + "info": "Ŧĥę męşşäģę įş {{messageLength}} čĥäřäčŧęřş, ŵĥįčĥ ęχčęęđş ŧĥę mäχįmūm ľęʼnģŧĥ őƒ 500 čĥäřäčŧęřş. Pľęäşę şĥőřŧęʼn įŧ þęƒőřę şävįʼnģ.", + "title": "Męşşäģę ŧőő ľőʼnģ" + }, + "name-exists": { + "message-info": "Å đäşĥþőäřđ ŵįŧĥ ŧĥę şämę ʼnämę įʼn ŧĥę şęľęčŧęđ ƒőľđęř äľřęäđy ęχįşŧş, įʼnčľūđįʼnģ řęčęʼnŧľy đęľęŧęđ đäşĥþőäřđş.", + "message-suggestion": "Pľęäşę čĥőőşę ä đįƒƒęřęʼnŧ ʼnämę őř ƒőľđęř.", + "title": "Đäşĥþőäřđ ʼnämę äľřęäđy ęχįşŧş" + } + }, + "scopes": { + "dashboards": { + "collapse": "Cőľľäpşę", + "expand": "Ēχpäʼnđ", + "loading": "Ŀőäđįʼnģ đäşĥþőäřđş", + "noResultsForFilter": "Ńő řęşūľŧş ƒőūʼnđ ƒőř yőūř qūęřy", + "noResultsForFilterClear": "Cľęäř şęäřčĥ", + "noResultsForScopes": "Ńő đäşĥþőäřđş ƒőūʼnđ ƒőř ŧĥę şęľęčŧęđ şčőpęş", + "noResultsNoScopes": "Ńő şčőpęş şęľęčŧęđ", + "search": "Ŝęäřčĥ", + "toggle": { + "collapse": "Cőľľäpşę şūģģęşŧęđ đäşĥþőäřđş ľįşŧ", + "disabled": "Ŝūģģęşŧęđ đäşĥþőäřđş ľįşŧ įş đįşäþľęđ đūę ŧő řęäđ őʼnľy mőđę", + "expand": "Ēχpäʼnđ şūģģęşŧęđ đäşĥþőäřđş ľįşŧ" + } + }, + "selector": { + "apply": "Åppľy", + "cancel": "Cäʼnčęľ", + "input": { + "placeholder": "Ŝęľęčŧ şčőpęş...", + "removeAll": "Ŗęmővę äľľ şčőpęş" + }, + "title": "Ŝęľęčŧ şčőpęş" + }, + "tree": { + "collapse": "Cőľľäpşę", + "expand": "Ēχpäʼnđ", + "headline": { + "noResults": "Ńő řęşūľŧş ƒőūʼnđ ƒőř yőūř qūęřy", + "recommended": "Ŗęčőmmęʼnđęđ", + "results": "Ŗęşūľŧş" + }, + "search": "Ŝęäřčĥ" + } + }, + "search": { + "actions": { + "include-panels": "Ĩʼnčľūđę päʼnęľş", + "remove-datasource-filter": "Đäŧäşőūřčę: {{datasource}}", + "sort-placeholder": "Ŝőřŧ", + "starred": "Ŝŧäřřęđ", + "view-as-folders": "Vįęŵ þy ƒőľđęřş", + "view-as-list": "Vįęŵ äş ľįşŧ" + }, + "dashboard-actions": { + "import": "Ĩmpőřŧ", + "new": "Ńęŵ", + "new-dashboard": "Ńęŵ đäşĥþőäřđ", + "new-folder": "Ńęŵ ƒőľđęř" + }, + "results-table": { + "datasource-header": "Đäŧä şőūřčę", + "deleted-less-than-1-min": "< 1 mįʼn", + "deleted-remaining-header": "Ŧįmę řęmäįʼnįʼnģ", + "location-header": "Ŀőčäŧįőʼn", + "name-header": "Ńämę", + "tags-header": "Ŧäģş", + "type-dashboard": "Đäşĥþőäřđ", + "type-folder": "Főľđęř", + "type-header": "Ŧypę" + }, + "search-input": { + "include-panels-placeholder": "Ŝęäřčĥ ƒőř đäşĥþőäřđş, ƒőľđęřş, äʼnđ päʼnęľş", + "placeholder": "Ŝęäřčĥ ƒőř đäşĥþőäřđş äʼnđ ƒőľđęřş" + } + }, + "select": { + "select-menu": { + "selected-count": "Ŝęľęčŧęđ " + } + }, + "service-account-create-page": { + "create": { + "button": "Cřęäŧę" + }, + "name": { + "label": "Đįşpľäy ʼnämę", + "required-error": "Đįşpľäy ʼnämę įş řęqūįřęđ" + }, + "page-nav": { + "label": "Cřęäŧę şęřvįčę äččőūʼnŧ" + }, + "role": { + "label": "Ŗőľę" + } + }, + "service-accounts": { + "empty-state": { + "button-title": "Åđđ şęřvįčę äččőūʼnŧ", + "message": "Ńő şęřvįčęş äččőūʼnŧş ƒőūʼnđ", + "more-info": "Ŗęmęmþęř, yőū čäʼn přővįđę şpęčįƒįč pęřmįşşįőʼnş ƒőř ÅPĨ äččęşş ŧő őŧĥęř äppľįčäŧįőʼnş", + "title": "Ÿőū ĥävęʼn'ŧ čřęäŧęđ äʼny şęřvįčę äččőūʼnŧş yęŧ" + } + }, + "share-dashboard": { + "menu": { + "export-json-title": "Ēχpőřŧ äş ĴŜØŃ", + "invite-user-title": "Ĩʼnvįŧę ʼnęŵ męmþęř", + "share-externally-title": "Ŝĥäřę ęχŧęřʼnäľľy", + "share-internally-title": "Ŝĥäřę įʼnŧęřʼnäľľy", + "share-snapshot-title": "Ŝĥäřę şʼnäpşĥőŧ" + }, + "share-button": "Ŝĥäřę", + "share-button-tooltip": "Cőpy ľįʼnĸ" + }, + "share-drawer": { + "confirm-action": { + "back-arrow-button": "ßäčĸ þūŧŧőʼn", + "cancel-button": "Cäʼnčęľ" + } + }, + "share-modal": { + "dashboard": { + "title": "Ŝĥäřę" + }, + "embed": { + "copy": "Cőpy ŧő čľįpþőäřđ", + "html": "Ēmþęđ ĦŦMĿ", + "html-description": "Ŧĥę ĦŦMĿ čőđę þęľőŵ čäʼn þę päşŧęđ äʼnđ įʼnčľūđęđ įʼn äʼnőŧĥęř ŵęþ päģę. Ůʼnľęşş äʼnőʼnymőūş äččęşş įş ęʼnäþľęđ, ŧĥę ūşęřş vįęŵįʼnģ ŧĥäŧ päģę ʼnęęđ ŧő þę şįģʼnęđ įʼnŧő Ğřäƒäʼnä ƒőř ŧĥę ģřäpĥ ŧő ľőäđ.", + "info": "Ğęʼnęřäŧę ĦŦMĿ ƒőř ęmþęđđįʼnģ äʼn įƒřämę ŵįŧĥ ŧĥįş päʼnęľ", + "time-range": "Ŀőčĸ ŧįmę řäʼnģę" + }, + "export": { + "back-button": "ßäčĸ ŧő ęχpőřŧ čőʼnƒįģ", + "cancel-button": "Cäʼnčęľ", + "info-text": "Ēχpőřŧ ŧĥįş đäşĥþőäřđ.", + "loading": "Ŀőäđįʼnģ...", + "save-button": "Ŝävę ŧő ƒįľę", + "share-externally-label": "Ēχpőřŧ ƒőř şĥäřįʼnģ ęχŧęřʼnäľľy", + "view-button": "Vįęŵ ĴŜØŃ" + }, + "library": { + "info": "Cřęäŧę ľįþřäřy päʼnęľ." + }, + "link": { + "copy-link-button": "Cőpy", + "info-text": "Cřęäŧę ä đįřęčŧ ľįʼnĸ ŧő ŧĥįş đäşĥþőäřđ őř päʼnęľ, čūşŧőmįžęđ ŵįŧĥ ŧĥę őpŧįőʼnş þęľőŵ.", + "link-url": "Ŀįʼnĸ ŮŖĿ", + "render-alert": "Ĩmäģę řęʼnđęřęř pľūģįʼn ʼnőŧ įʼnşŧäľľęđ", + "render-instructions": "Ŧő řęʼnđęř ä päʼnęľ įmäģę, yőū mūşŧ įʼnşŧäľľ ŧĥę <2>Ğřäƒäʼnä įmäģę řęʼnđęřęř pľūģįʼn. Pľęäşę čőʼnŧäčŧ yőūř Ğřäƒäʼnä äđmįʼnįşŧřäŧőř ŧő įʼnşŧäľľ ŧĥę pľūģįʼn.", + "rendered-image": "Đįřęčŧ ľįʼnĸ řęʼnđęřęđ įmäģę", + "save-alert": "Đäşĥþőäřđ įş ʼnőŧ şävęđ", + "save-dashboard": "Ŧő řęʼnđęř ä päʼnęľ įmäģę, yőū mūşŧ şävę ŧĥę đäşĥþőäřđ ƒįřşŧ.", + "shorten-url": "Ŝĥőřŧęʼn ŮŖĿ", + "time-range-description": "Ŧřäʼnşƒőřmş ŧĥę čūřřęʼnŧ řęľäŧįvę ŧįmę řäʼnģę ŧő äʼn äþşőľūŧę ŧįmę řäʼnģę", + "time-range-label": "Ŀőčĸ ŧįmę řäʼnģę" + }, + "panel": { + "title": "Ŝĥäřę Päʼnęľ" + }, + "snapshot": { + "cancel-button": "Cäʼnčęľ", + "copy-link-button": "Cőpy", + "delete-button": "Đęľęŧę şʼnäpşĥőŧ.", + "deleted-message": "Ŧĥę şʼnäpşĥőŧ ĥäş þęęʼn đęľęŧęđ. Ĩƒ yőū ĥävę äľřęäđy äččęşşęđ įŧ őʼnčę, ŧĥęʼn įŧ mįģĥŧ ŧäĸę ūp ŧő äʼn ĥőūř þęƒőřę þęƒőřę įŧ įş řęmővęđ ƒřőm þřőŵşęř čäčĥęş őř CĐŃ čäčĥęş.", + "expire": "Ēχpįřę", + "expire-day": "1 Đäy", + "expire-hour": "1 Ħőūř", + "expire-never": "Ńęvęř", + "expire-week": "1 Ŵęęĸ", + "info-text-1": "Å şʼnäpşĥőŧ įş äʼn įʼnşŧäʼnŧ ŵäy ŧő şĥäřę äʼn įʼnŧęřäčŧįvę đäşĥþőäřđ pūþľįčľy. Ŵĥęʼn čřęäŧęđ, ŵę şŧřįp şęʼnşįŧįvę đäŧä ľįĸę qūęřįęş (męŧřįč, ŧęmpľäŧę, äʼnđ äʼnʼnőŧäŧįőʼn) äʼnđ päʼnęľ ľįʼnĸş, ľęävįʼnģ őʼnľy ŧĥę vįşįþľę męŧřįč đäŧä äʼnđ şęřįęş ʼnämęş ęmþęđđęđ įʼn yőūř đäşĥþőäřđ.", + "info-text-2": "Ķęęp įʼn mįʼnđ, yőūř şʼnäpşĥőŧ <1>čäʼn þę vįęŵęđ þy äʼnyőʼnę ŧĥäŧ ĥäş ŧĥę ľįʼnĸ äʼnđ čäʼn äččęşş ŧĥę ŮŖĿ. Ŝĥäřę ŵįşęľy.", + "local-button": "Pūþľįşĥ Ŝʼnäpşĥőŧ", + "mistake-message": "Đįđ yőū mäĸę ä mįşŧäĸę? ", + "name": "Ŝʼnäpşĥőŧ ʼnämę", + "timeout": "Ŧįmęőūŧ (şęčőʼnđş)", + "timeout-description": "Ÿőū mįģĥŧ ʼnęęđ ŧő čőʼnƒįģūřę ŧĥę ŧįmęőūŧ väľūę įƒ įŧ ŧäĸęş ä ľőʼnģ ŧįmę ŧő čőľľęčŧ yőūř đäşĥþőäřđ męŧřįčş.", + "url-label": "Ŝʼnäpşĥőŧ ŮŖĿ" + }, + "tab-title": { + "embed": "Ēmþęđ", + "export": "Ēχpőřŧ", + "library-panel": "Ŀįþřäřy päʼnęľ", + "link": "Ŀįʼnĸ", + "panel-embed": "Ēmþęđ", + "public-dashboard": "Pūþľįč Đäşĥþőäřđ", + "public-dashboard-title": "Pūþľįč đäşĥþőäřđ", + "snapshot": "Ŝʼnäpşĥőŧ" + }, + "theme-picker": { + "current": "Cūřřęʼnŧ", + "dark": "Đäřĸ", + "field-name": "Ŧĥęmę", + "light": "Ŀįģĥŧ" + }, + "view-json": { + "copy-button": "Cőpy ŧő Cľįpþőäřđ" + } + }, + "share-panel": { + "drawer": { + "new-library-panel-title": "Ńęŵ ľįþřäřy päʼnęľ", + "share-embed-title": "Ŝĥäřę ęmþęđ", + "share-link-title": "Ŀįʼnĸ şęŧŧįʼnģş" + }, + "menu": { + "new-library-panel-title": "Ńęŵ ľįþřäřy päʼnęľ", + "share-embed-title": "Ŝĥäřę ęmþęđ", + "share-link-title": "Ŝĥäřę ľįʼnĸ", + "share-snapshot-title": "Ŝĥäřę şʼnäpşĥőŧ" + }, + "new-library-panel": { + "cancel-button": "Cäʼnčęľ", + "create-button": "Cřęäŧę ľįþřäřy päʼnęľ" + } + }, + "share-panel-image": { + "preview": { + "title": "Päʼnęľ přęvįęŵ" + }, + "settings": { + "height-label": "Ħęįģĥŧ", + "height-min": "Ħęįģĥŧ mūşŧ þę ęqūäľ őř ģřęäŧęř ŧĥäʼn 1", + "height-placeholder": "500", + "height-required": "Ħęįģĥŧ įş řęqūįřęđ", + "max-warning": "Ŝęŧŧįʼnģ mäχįmūmş äřę ľįmįŧęđ þy ŧĥę įmäģę řęʼnđęřęř şęřvįčę", + "scale-factor-label": "Ŝčäľę ƒäčŧőř", + "scale-factor-min": "Ŝčäľę ƒäčŧőř mūşŧ þę ęqūäľ őř ģřęäŧęř ŧĥäʼn 1", + "scale-factor-placeholder": "1", + "scale-factor-required": "Ŝčäľę ƒäčŧőř įş řęqūįřęđ", + "title": "Ĩmäģę şęŧŧįʼnģş", + "width-label": "Ŵįđŧĥ", + "width-min": "Ŵįđŧĥ mūşŧ þę ęqūäľ őř ģřęäŧęř ŧĥäʼn 1", + "width-placeholder": "1000", + "width-required": "Ŵįđŧĥ įş řęqūįřęđ" + } + }, + "share-playlist": { + "checkbox-description": "Päʼnęľ ĥęįģĥŧş ŵįľľ þę äđĵūşŧęđ ŧő ƒįŧ şčřęęʼn şįžę", + "checkbox-label": "Åūŧőƒįŧ", + "copy-link-button": "Cőpy", + "link-url-label": "Ŀįʼnĸ ŮŖĿ", + "mode": "Mőđę", + "mode-kiosk": "Ķįőşĸ", + "mode-normal": "Ńőřmäľ", + "title": "Ŝĥäřę pľäyľįşŧ" + }, + "shared": { + "preferences": { + "theme": { + "dark-label": "Đäřĸ", + "light-label": "Ŀįģĥŧ", + "system-label": "Ŝyşŧęm přęƒęřęʼnčę" + } + } + }, + "shared-dashboard": { + "delete-modal": { + "revoke-body-text": "Åřę yőū şūřę yőū ŵäʼnŧ ŧő řęvőĸę ŧĥįş äččęşş? Ŧĥę đäşĥþőäřđ čäʼn ʼnő ľőʼnģęř þę şĥäřęđ.", + "revoke-title": "Ŗęvőĸę äččęşş" + }, + "fields": { + "timezone-label": "Ŧįmęžőʼnę" + } + }, + "shared-dashboard-list": { + "button": { + "config-button-tooltip": "Cőʼnƒįģūřę şĥäřęđ đäşĥþőäřđ", + "revoke-button-text": "Ŗęvőĸę äččęşş", + "revoke-button-tooltip": "Ŗęvőĸę äččęşş", + "view-button-tooltip": "Vįęŵ şĥäřęđ đäşĥþőäřđ" + }, + "empty-state": { + "message": "Ÿőū ĥävęʼn'ŧ čřęäŧęđ äʼny şĥäřęđ đäşĥþőäřđş yęŧ", + "more-info": "Cřęäŧę ä şĥäřęđ đäşĥþőäřđ ƒřőm äʼny ęχįşŧįʼnģ đäşĥþőäřđ ŧĥřőūģĥ ŧĥę <1>Ŝĥäřę mőđäľ. <4>Ŀęäřʼn mőřę" + }, + "toggle": { + "pause-sharing-toggle-text": "Päūşę äččęşş" + } + }, + "shared-preferences": { + "fields": { + "home-dashboard-label": "Ħőmę Đäşĥþőäřđ", + "home-dashboard-placeholder": "Đęƒäūľŧ đäşĥþőäřđ", + "locale-label": "Ŀäʼnģūäģę", + "locale-placeholder": "Cĥőőşę ľäʼnģūäģę", + "theme-description": "Ēʼnĵőyįʼnģ ŧĥę ľįmįŧęđ ęđįŧįőʼn ŧĥęmęş? Ŧęľľ ūş ŵĥäŧ yőū'đ ľįĸę ŧő şęę <2>ĥęřę.", + "theme-label": "Ĩʼnŧęřƒäčę ŧĥęmę", + "week-start-label": "Ŵęęĸ şŧäřŧ" + }, + "theme": { + "default-label": "Đęƒäūľŧ" + }, + "title": "Přęƒęřęʼnčęş" + }, + "sign-up": { + "back-button": "ßäčĸ ŧő ľőģįʼn", + "submit-button": "Ŝūþmįŧ", + "verify": { + "back-button": "ßäčĸ ŧő ľőģįʼn", + "complete-button": "Cőmpľęŧę şįģʼnūp", + "header": "Vęřįƒy ęmäįľ", + "info": "Åʼn ęmäįľ ŵįŧĥ ä vęřįƒįčäŧįőʼn ľįʼnĸ ĥäş þęęʼn şęʼnŧ ŧő ŧĥę ęmäįľ äđđřęşş. Ÿőū şĥőūľđ řęčęįvę įŧ şĥőřŧľy.", + "send-button": "Ŝęʼnđ vęřįƒįčäŧįőʼn ęmäįľ" + } + }, + "silences": { + "empty-state": { + "button-title": "Cřęäŧę şįľęʼnčę", + "title": "Ÿőū ĥävęʼn'ŧ čřęäŧęđ äʼny şįľęʼnčęş yęŧ" + }, + "table": { + "add-silence-button": "Åđđ Ŝįľęʼnčę", + "edit-button": "Ēđįŧ", + "expired-silences": "Ēχpįřęđ şįľęʼnčęş äřę äūŧőmäŧįčäľľy đęľęŧęđ äƒŧęř 5 đäyş.", + "no-matching-silences": "Ńő mäŧčĥįʼnģ şįľęʼnčęş ƒőūʼnđ;", + "noConfig": "Cřęäŧę ä ʼnęŵ čőʼnŧäčŧ pőįʼnŧ ŧő čřęäŧę ä čőʼnƒįģūřäŧįőʼn ūşįʼnģ ŧĥę đęƒäūľŧ väľūęş őř čőʼnŧäčŧ yőūř äđmįʼnįşŧřäŧőř ŧő şęŧ ūp ŧĥę Åľęřŧmäʼnäģęř.", + "recreate-button": "Ŗęčřęäŧę", + "unsilence-button": "Ůʼnşįľęʼnčę" + } + }, + "silences-table": { + "header": { + "alert-name": "Åľęřŧ ʼnämę", + "state": "Ŝŧäŧę" + } + }, + "snapshot": { + "empty-state": { + "message": "Ÿőū ĥävęʼn'ŧ čřęäŧęđ äʼny şʼnäpşĥőŧş yęŧ", + "more-info": "Ÿőū čäʼn čřęäŧę ä şʼnäpşĥőŧ őƒ äʼny đäşĥþőäřđ ŧĥřőūģĥ ŧĥę <1>Ŝĥäřę mőđäľ. <4>Ŀęäřʼn mőřę" + }, + "external-badge": "Ēχŧęřʼnäľ", + "name-column-header": "Ńämę", + "share": { + "cancel-button": "Cäʼnčęľ", + "copy-link-button": "Cőpy ľįʼnĸ", + "delete-button": "Đęľęŧę şʼnäpşĥőŧ", + "delete-description": "Åřę yőū şūřę yőū ŵäʼnŧ ŧő đęľęŧę ŧĥįş şʼnäpşĥőŧ?", + "delete-permission-tooltip": "Ÿőū đőʼn'ŧ ĥävę pęřmįşşįőʼn ŧő đęľęŧę şʼnäpşĥőŧş", + "delete-title": "Đęľęŧę şʼnäpşĥőŧ", + "deleted-alert": "Ŝʼnäpşĥőŧ đęľęŧęđ. Ĩŧ čőūľđ ŧäĸę äʼn ĥőūř ŧő þę čľęäřęđ ƒřőm CĐŃ čäčĥęş.", + "expiration-label": "Ēχpįřęş įʼn", + "info-alert": "Å Ğřäƒäʼnä đäşĥþőäřđ şʼnäpşĥőŧ pūþľįčľy şĥäřęş ä đäşĥþőäřđ ŵĥįľę řęmővįʼnģ şęʼnşįŧįvę đäŧä şūčĥ äş qūęřįęş äʼnđ päʼnęľ ľįʼnĸş, ľęävįʼnģ őʼnľy vįşįþľę męŧřįčş äʼnđ şęřįęş ʼnämęş. Åʼnyőʼnę ŵįŧĥ ŧĥę ľįʼnĸ čäʼn äččęşş ŧĥę şʼnäpşĥőŧ.", + "learn-more-button": "Ŀęäřʼn mőřę", + "local-button": "Pūþľįşĥ şʼnäpşĥőŧ", + "name-label": "Ŝʼnäpşĥőŧ ʼnämę", + "new-snapshot-button": "Ńęŵ şʼnäpşĥőŧ", + "success-creation": "Ÿőūř şʼnäpşĥőŧ ĥäş þęęʼn čřęäŧęđ", + "success-delete": "Ÿőūř şʼnäpşĥőŧ ĥäş þęęʼn đęľęŧęđ", + "view-all-button": "Vįęŵ äľľ şʼnäpşĥőŧş" + }, + "share-panel": { + "info-alert": "Å Ğřäƒäʼnä päʼnęľ şʼnäpşĥőŧ pūþľįčľy şĥäřęş ä päʼnęľ ŵĥįľę řęmővįʼnģ şęʼnşįŧįvę đäŧä şūčĥ äş qūęřįęş äʼnđ päʼnęľ ľįʼnĸş, ľęävįʼnģ őʼnľy vįşįþľę męŧřįčş äʼnđ şęřįęş ʼnämęş. Åʼnyőʼnę ŵįŧĥ ŧĥę ľįʼnĸ čäʼn äččęşş ŧĥę şʼnäpşĥőŧ." + }, + "url-column-header": "Ŝʼnäpşĥőŧ ūřľ", + "view-button": "Vįęŵ" + }, + "table": { + "container": { + "content": "Ŝĥőŵįʼnģ ŧőő mäʼny čőľūmʼnş įʼn ä şįʼnģľę ŧäþľę mäy įmpäčŧ pęřƒőřmäʼnčę äʼnđ mäĸę đäŧä ĥäřđęř ŧő řęäđ. Cőʼnşįđęř řęƒįʼnįʼnģ yőūř qūęřįęş.", + "show-all-series": "Ŝĥőŵ äľľ čőľūmʼnş", + "show-only-series": "Ŝĥőŵįʼnģ őʼnľy {{MAX_NUMBER_OF_COLUMNS}} čőľūmʼnş" + } + }, + "tag-filter": { + "clear-button": "Cľęäř ŧäģş", + "loading": "Ŀőäđįʼnģ...", + "no-tags": "Ńő ŧäģş ƒőūʼnđ", + "placeholder": "Fįľŧęř þy ŧäģ" + }, + "teams": { + "empty-state": { + "button-title": "Ńęŵ ŧęäm", + "message": "Ńő ŧęämş ƒőūʼnđ", + "pro-tip": "Åşşįģʼn ƒőľđęř äʼnđ đäşĥþőäřđ pęřmįşşįőʼnş ŧő ŧęämş įʼnşŧęäđ őƒ ūşęřş ŧő ęäşę äđmįʼnįşŧřäŧįőʼn. <2>Ŀęäřʼn mőřę", + "title": "Ÿőū ĥävęʼn'ŧ čřęäŧęđ äʼny ŧęämş yęŧ" + } + }, + "time-picker": { + "absolute": { + "recent-title": "Ŗęčęʼnŧľy ūşęđ äþşőľūŧę řäʼnģęş", + "title": "Åþşőľūŧę ŧįmę řäʼnģę" + }, + "calendar": { + "apply-button": "Åppľy ŧįmę řäʼnģę", + "cancel-button": "Cäʼnčęľ", + "close": "Cľőşę čäľęʼnđäř", + "next-month": "Ńęχŧ mőʼnŧĥ", + "previous-month": "Přęvįőūş mőʼnŧĥ", + "select-time": "Ŝęľęčŧ ä ŧįmę řäʼnģę" + }, + "content": { + "empty-recent-list-docs": "<0><0>Ŗęäđ ŧĥę đőčūmęʼnŧäŧįőʼn<1> ŧő ƒįʼnđ őūŧ mőřę äþőūŧ ĥőŵ ŧő ęʼnŧęř čūşŧőm ŧįmę řäʼnģęş.", + "empty-recent-list-info": "Ĩŧ ľőőĸş ľįĸę yőū ĥävęʼn'ŧ ūşęđ ŧĥįş ŧįmę pįčĸęř þęƒőřę. Åş şőőʼn äş yőū ęʼnŧęř şőmę ŧįmę įʼnŧęřväľş, řęčęʼnŧľy ūşęđ įʼnŧęřväľş ŵįľľ äppęäř ĥęřę.", + "filter-placeholder": "Ŝęäřčĥ qūįčĸ řäʼnģęş" + }, + "copy-paste": { + "copy-success-message": "Ŧįmę řäʼnģę čőpįęđ ŧő čľįpþőäřđ", + "default-error-message": "{{error}} įş ʼnőŧ ä väľįđ ŧįmę řäʼnģę", + "default-error-title": "Ĩʼnväľįđ ŧįmę řäʼnģę", + "tooltip-copy": "Cőpy ŧįmę řäʼnģę ŧő čľįpþőäřđ", + "tooltip-paste": "Päşŧę ŧįmę řäʼnģę" + }, + "footer": { + "change-settings-button": "Cĥäʼnģę ŧįmę şęŧŧįʼnģş", + "fiscal-year-option": "Fįşčäľ yęäř", + "fiscal-year-start": "Fįşčäľ yęäř şŧäřŧ mőʼnŧĥ", + "time-zone-option": "Ŧįmę žőʼnę", + "time-zone-selection": "Ŧįmę žőʼnę şęľęčŧįőʼn" + }, + "range-content": { + "apply-button": "Åppľy ŧįmę řäʼnģę", + "default-error": "Pľęäşę ęʼnŧęř ä päşŧ đäŧę őř \"ʼnőŵ\"", + "fiscal-year": "Fįşčäľ yęäř", + "from-input": "Fřőm", + "open-input-calendar": "Øpęʼn čäľęʼnđäř", + "range-error": "\"Fřőm\" čäʼn'ŧ þę äƒŧęř \"Ŧő\"", + "to-input": "Ŧő" + }, + "range-picker": { + "backwards-time-aria-label": "Mővę ŧįmę řäʼnģę þäčĸŵäřđş", + "current-time-selected": "Ŧįmę řäʼnģę şęľęčŧęđ: {{currentTimeRange}}", + "forwards-time-aria-label": "Mővę ŧįmę řäʼnģę ƒőřŵäřđş", + "to": "ŧő", + "zoom-out-button": "Żőőm őūŧ ŧįmę řäʼnģę", + "zoom-out-tooltip": "Ŧįmę řäʼnģę žőőm őūŧ <1> CŦŖĿ+Ż" + }, + "time-range": { + "apply": "Åppľy ŧįmę řäʼnģę", + "aria-role": "Ŧįmę řäʼnģę şęľęčŧįőʼn", + "default-title": "Ŧįmę řäʼnģęş", + "example": "Ēχämpľę: ŧő şęľęčŧ ä ŧįmę řäʼnģę ƒřőm 10 mįʼnūŧęş äģő ŧő ʼnőŵ", + "example-details": "Fřőm: ʼnőŵ-10m Ŧő: ʼnőŵ", + "example-title": "Ēχämpľę ŧįmę řäʼnģęş", + "from-to": "{{timeOptionFrom}} ŧő {{timeOptionTo}}", + "more-info": "Főř mőřę įʼnƒőřmäŧįőʼn şęę <2>đőčş <1>.", + "specify": "Ŝpęčįƒy ŧįmę řäʼnģę <1>", + "supported-formats": "Ŝūppőřŧęđ ƒőřmäŧş: <1>ʼnőŵ-[đįģįŧ]ş/m/ĥ/đ/ŵ" + }, + "zone": { + "select-aria-label": "Ŧįmę žőʼnę pįčĸęř", + "select-search-input": "Ŧypę ŧő şęäřčĥ (čőūʼnŧřy, čįŧy, äþþřęvįäŧįőʼn)" + } + }, + "trails": { + "bookmarks": { + "or-view-bookmarks": "Øř vįęŵ þőőĸmäřĸş" + }, + "card": { + "date-created": "Đäŧę čřęäŧęđ: " + }, + "home": { + "learn-more": "Ŀęäřʼn mőřę", + "lets-start": "Ŀęŧ'ş şŧäřŧ!", + "start-your-metrics-exploration": "Ŝŧäřŧ yőūř męŧřįčş ęχpľőřäŧįőʼn!", + "subtitle": "Ēχpľőřę yőūř Přőmęŧĥęūş-čőmpäŧįþľę męŧřįčş ŵįŧĥőūŧ ŵřįŧįʼnģ ä qūęřy." + }, + "metric-select": { + "filter-by": "Fįľŧęř þy", + "native-histogram": "Ńäŧįvę Ħįşŧőģřäm", + "new-badge": "Ńęŵ", + "otel-switch": "Ŧĥįş şŵįŧčĥ ęʼnäþľęş ƒįľŧęřįʼnģ þy ØŦęľ řęşőūřčęş ƒőř ØŦęľ ʼnäŧįvę đäŧä şőūřčęş." + }, + "native-histogram-banner": { + "ch-heatmap": "Cľäşşįč Ħįşŧőģřäm đįşpľäyęđ äş ĥęäŧmäp:", + "ch-histogram": "Cľäşşįč Ħįşŧőģřäm đįşpľäyęđ äş ĥįşŧőģřäm:", + "click-histogram": "Cľįčĸ äʼny őƒ ŧĥę ʼnäŧįvę ĥįşŧőģřämş þęľőŵ ŧő ęχpľőřę ŧĥęm:", + "hide-examples": "Ħįđę ęχämpľęş", + "learn-more": "Ŀęäřʼn mőřę", + "metric-examples": "", + "nh-heatmap": "Ńäŧįvę Ħįşŧőģřäm đįşpľäyęđ äş ĥęäŧmäp:", + "nh-histogram": "Ńäŧįvę Ħįşŧőģřäm đįşpľäyęđ äş ĥįşŧőģřäm:", + "now": "Ńőŵ:", + "previously": "Přęvįőūşľy:", + "see-examples": "> Ŝęę ęχämpľęş", + "sentence": "Přőmęŧĥęūş ʼnäŧįvę ĥįşŧőģřämş őƒƒęř ĥįģĥ řęşőľūŧįőʼn, ĥįģĥ přęčįşįőʼn, şįmpľę ūşäģę įʼn įʼnşŧřūmęʼnŧäŧįőʼn äʼnđ ä ŵäy ŧő čőmþįʼnę äʼnđ mäʼnįpūľäŧę ĥįşŧőģřämş įʼn qūęřįęş äʼnđ įʼn Ğřäƒäʼnä." + }, + "recent-metrics": { + "or-view-a-recent-exploration": "Øř vįęŵ ä řęčęʼnŧ ęχpľőřäŧįőʼn" + }, + "settings": { + "always-keep-selected-metric-graph-in-view": "Åľŵäyş ĸęęp şęľęčŧęđ męŧřįč ģřäpĥ įʼn-vįęŵ", + "show-previews-of-metric-graphs": "Ŝĥőŵ přęvįęŵş őƒ męŧřįč ģřäpĥş" + } + }, + "transformations": { + "empty": { + "add-transformation-body": "Ŧřäʼnşƒőřmäŧįőʼnş äľľőŵ đäŧä ŧő þę čĥäʼnģęđ įʼn väřįőūş ŵäyş þęƒőřę yőūř vįşūäľįžäŧįőʼn įş şĥőŵʼn.<1>Ŧĥįş įʼnčľūđęş ĵőįʼnįʼnģ đäŧä ŧőģęŧĥęř, řęʼnämįʼnģ ƒįęľđş, mäĸįʼnģ čäľčūľäŧįőʼnş, ƒőřmäŧŧįʼnģ đäŧä ƒőř đįşpľäy, äʼnđ mőřę.", + "add-transformation-header": "Ŝŧäřŧ ŧřäʼnşƒőřmįʼnģ đäŧä" + } + }, + "upgrade-box": { + "discovery-text": "Ÿőū’vę đįşčővęřęđ ä Přő ƒęäŧūřę!", + "discovery-text-continued": "Ğęŧ ŧĥę Ğřäƒäʼnä Přő pľäʼn ŧő äččęşş {{featureName}}.", + "get-started": "Ğęŧ şŧäřŧęđ ŵįŧĥ {{featureName}}", + "learn-more": "Ŀęäřʼn mőřę", + "upgrade-button": "Ůpģřäđę" + }, + "user-orgs": { + "current-org-button": "Cūřřęʼnŧ", + "name-column": "Ńämę", + "role-column": "Ŗőľę", + "select-org-button": "Ŝęľęčŧ őřģäʼnįşäŧįőʼn", + "title": "Øřģäʼnįžäŧįőʼnş" + }, + "user-profile": { + "fields": { + "email-error": "Ēmäįľ įş řęqūįřęđ", + "email-label": "Ēmäįľ", + "name-error": "Ńämę įş řęqūįřęđ", + "name-label": "Ńämę", + "username-label": "Ůşęřʼnämę" + }, + "tabs": { + "general": "Ğęʼnęřäľ" + } + }, + "user-session": { + "auth-module-column": "Ĩđęʼnŧįŧy Přővįđęř", + "browser-column": "ßřőŵşęř & ØŜ", + "created-at-column": "Ŀőģģęđ őʼn", + "identity-provider-column": "Ĩđęʼnŧįŧy Přővįđęř", + "ip-column": "ĨP äđđřęşş", + "revoke": "Ŗęvőĸę ūşęř şęşşįőʼn", + "seen-at-column": "Ŀäşŧ şęęʼn" + }, + "user-sessions": { + "loading": "Ŀőäđįʼnģ şęşşįőʼnş..." + }, + "users": { + "empty-state": { + "message": "Ńő ūşęřş ƒőūʼnđ" + } + }, + "users-access-list": { + "tabs": { + "public-dashboard-users-tab-title": "Pūþľįč đäşĥþőäřđ ūşęřş", + "shared-dashboard-users-tab-title": "Ŝĥäřęđ đäşĥþőäřđ ūşęřş" + } + }, + "variable": { + "adhoc": { + "placeholder": "Ŝęľęčŧ väľūę" + }, + "dropdown": { + "placeholder": "Ēʼnŧęř väřįäþľę väľūę" + }, + "picker": { + "link-all": "Åľľ", + "option-all": "Åľľ", + "option-selected-values": "Ŝęľęčŧęđ", + "option-tooltip": "Cľęäř şęľęčŧįőʼnş" + }, + "textbox": { + "placeholder": "Ēʼnŧęř väřįäþľę väľūę" + } + }, + "variables": { + "empty-state": { + "button-title": "Åđđ väřįäþľę", + "info-box-content": "Väřįäþľęş ęʼnäþľę mőřę įʼnŧęřäčŧįvę äʼnđ đyʼnämįč đäşĥþőäřđş. Ĩʼnşŧęäđ őƒ ĥäřđ-čőđįʼnģ ŧĥįʼnģş ľįĸę şęřvęř őř şęʼnşőř ʼnämęş įʼn yőūř męŧřįč qūęřįęş yőū čäʼn ūşę väřįäþľęş įʼn ŧĥęįř pľäčę. Väřįäþľęş äřę şĥőŵʼn äş ľįşŧ þőχęş äŧ ŧĥę ŧőp őƒ ŧĥę đäşĥþőäřđ. Ŧĥęşę đřőp-đőŵʼn ľįşŧş mäĸę įŧ ęäşy ŧő čĥäʼnģę ŧĥę đäŧä þęįʼnģ đįşpľäyęđ įʼn yőūř đäşĥþőäřđ.", + "info-box-content-2": "Cĥęčĸ őūŧ ŧĥę <2>Ŧęmpľäŧęş äʼnđ väřįäþľęş đőčūmęʼnŧäŧįőʼn ƒőř mőřę įʼnƒőřmäŧįőʼn.", + "title": "Ŧĥęřę äřę ʼnő väřįäþľęş äđđęđ yęŧ" + }, + "unknown-table": { + "loading": "Ŀőäđįʼnģ...", + "no-unknowns": "Ńő řęʼnämęđ őř mįşşįʼnģ väřįäþľęş ƒőūʼnđ.", + "renamed-or-missing-variables": "Ŗęʼnämęđ őř mįşşįʼnģ väřįäþľęş", + "variable": "Väřįäþľę" + } + } +} From f3fb9592da11a5f8343699ea307e591e522af627 Mon Sep 17 00:00:00 2001 From: Ashley Harrison Date: Thu, 13 Mar 2025 09:42:12 +0000 Subject: [PATCH 013/117] Org redirection: Fix linking between orgs (#102021) * don't trim path * add unit test --- pkg/middleware/org_redirect.go | 3 +-- pkg/middleware/org_redirect_test.go | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/pkg/middleware/org_redirect.go b/pkg/middleware/org_redirect.go index c4d5623d69e..b794f9acfdf 100644 --- a/pkg/middleware/org_redirect.go +++ b/pkg/middleware/org_redirect.go @@ -4,7 +4,6 @@ import ( "fmt" "net/http" "strconv" - "strings" "github.com/grafana/grafana/pkg/services/contexthandler" "github.com/grafana/grafana/pkg/services/user" @@ -50,7 +49,7 @@ func OrgRedirect(cfg *setting.Cfg, userSvc user.Service) web.Handler { qs = fmt.Sprintf("%s&kiosk", urlParams.Encode()) } - newURL := fmt.Sprintf("%s%s?%s", cfg.AppSubURL, strings.TrimPrefix(c.Req.URL.Path, "/"), qs) + newURL := fmt.Sprintf("%s%s?%s", cfg.AppSubURL, c.Req.URL.Path, qs) c.Redirect(newURL, 302) } diff --git a/pkg/middleware/org_redirect_test.go b/pkg/middleware/org_redirect_test.go index e2bc6d81075..4087eeb91c6 100644 --- a/pkg/middleware/org_redirect_test.go +++ b/pkg/middleware/org_redirect_test.go @@ -7,6 +7,7 @@ import ( "github.com/stretchr/testify/require" "github.com/grafana/grafana/pkg/services/authn" + "github.com/grafana/grafana/pkg/setting" ) func TestOrgRedirectMiddleware(t *testing.T) { @@ -62,4 +63,17 @@ func TestOrgRedirectMiddleware(t *testing.T) { require.Equal(t, 404, sc.resp.Code) }) + + middlewareScenario(t, "works correctly when grafana is served under a subpath", func(t *testing.T, sc *scenarioContext) { + sc.withIdentity(&authn.Identity{}) + + sc.m.Get("/", sc.defaultHandler) + sc.fakeReq("GET", "/?orgId=3").exec() + + require.Equal(t, 302, sc.resp.Code) + require.Equal(t, "/grafana/?orgId=3", sc.resp.Header().Get("Location")) + }, func(cfg *setting.Cfg) { + cfg.AppURL = "http://localhost:3000/grafana/" + cfg.AppSubURL = "/grafana" + }) } From 40b1b625026af410afa76729aa3a1b71e11c5d94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20Farkas?= Date: Thu, 13 Mar 2025 11:10:07 +0100 Subject: [PATCH 014/117] improve the debugging experience (#101779) improve debugging experience --- .vscode/launch.json | 5 +++++ pkg/build/cmd.go | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/.vscode/launch.json b/.vscode/launch.json index 67c4f82699b..50393b02272 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -11,6 +11,11 @@ "cwd": "${workspaceFolder}", "args": ["server", "--homepath", "${workspaceFolder}", "--packaging", "dev", "cfg:app_mode=development"] }, + { + "name": "Attach to Go Process", + "type": "go", + "request": "attach" + }, { "name": "Attach to Test Process", "type": "go", diff --git a/pkg/build/cmd.go b/pkg/build/cmd.go index 9796a1428da..226bd15245f 100644 --- a/pkg/build/cmd.go +++ b/pkg/build/cmd.go @@ -185,6 +185,11 @@ func doBuild(binaryName, pkg string, opts BuildOpts) error { args := []string{"build", "-ldflags", lf} + if opts.isDev { + // disable optimizations, so debugger will work + args = append(args, "-gcflags", "all=-N -l") + } + if opts.goos == GoOSWindows { // Work around a linking error on Windows: "export ordinal too large" args = append(args, "-buildmode=exe") From 4c61991d7cbb23bf7db009eb5d2b1d292b6132ab Mon Sep 17 00:00:00 2001 From: ismail simsek Date: Thu, 13 Mar 2025 11:12:20 +0100 Subject: [PATCH 015/117] Chore: Remove unused prometheusDataplane feature toggle parameters (#102061) remove unused prometheusDataplane feature toggle parameters --- pkg/promlib/querydata/request.go | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/pkg/promlib/querydata/request.go b/pkg/promlib/querydata/request.go index 32cf801f557..20126f0b98f 100644 --- a/pkg/promlib/querydata/request.go +++ b/pkg/promlib/querydata/request.go @@ -100,7 +100,6 @@ func (s *QueryData) Execute(ctx context.Context, req *backend.QueryDataRequest) var ( cfg = backend.GrafanaConfigFromContext(ctx) hasPromQLScopeFeatureFlag = cfg.FeatureToggles().IsEnabled("promQLScope") - hasPrometheusDataplaneFeatureFlag = cfg.FeatureToggles().IsEnabled("prometheusDataplane") hasPrometheusRunQueriesInParallel = cfg.FeatureToggles().IsEnabled("prometheusRunQueriesInParallel") ) @@ -117,7 +116,7 @@ func (s *QueryData) Execute(ctx context.Context, req *backend.QueryDataRequest) _ = concurrency.ForEachJob(ctx, len(req.Queries), concurrentQueryCount, func(ctx context.Context, idx int) error { query := req.Queries[idx] - r := s.handleQuery(ctx, query, fromAlert, hasPromQLScopeFeatureFlag, hasPrometheusDataplaneFeatureFlag, true) + r := s.handleQuery(ctx, query, fromAlert, hasPromQLScopeFeatureFlag, true) if r != nil { m.Lock() result.Responses[query.RefID] = *r @@ -127,7 +126,7 @@ func (s *QueryData) Execute(ctx context.Context, req *backend.QueryDataRequest) }) } else { for _, q := range req.Queries { - r := s.handleQuery(ctx, q, fromAlert, hasPromQLScopeFeatureFlag, hasPrometheusDataplaneFeatureFlag, false) + r := s.handleQuery(ctx, q, fromAlert, hasPromQLScopeFeatureFlag, false) if r != nil { result.Responses[q.RefID] = *r } @@ -138,7 +137,7 @@ func (s *QueryData) Execute(ctx context.Context, req *backend.QueryDataRequest) } func (s *QueryData) handleQuery(ctx context.Context, bq backend.DataQuery, fromAlert, - hasPromQLScopeFeatureFlag, hasPrometheusDataplaneFeatureFlag, hasPrometheusRunQueriesInParallel bool) *backend.DataResponse { + hasPromQLScopeFeatureFlag, hasPrometheusRunQueriesInParallel bool) *backend.DataResponse { traceCtx, span := s.tracer.Start(ctx, "datasource.prometheus") defer span.End() query, err := models.Parse(span, bq, s.TimeInterval, s.intervalCalculator, fromAlert, hasPromQLScopeFeatureFlag) @@ -148,15 +147,14 @@ func (s *QueryData) handleQuery(ctx context.Context, bq backend.DataQuery, fromA } } - r := s.fetch(traceCtx, s.client, query, hasPrometheusDataplaneFeatureFlag, hasPrometheusRunQueriesInParallel) + r := s.fetch(traceCtx, s.client, query, hasPrometheusRunQueriesInParallel) if r == nil { s.log.FromContext(ctx).Debug("Received nil response from runQuery", "query", query.Expr) } return r } -func (s *QueryData) fetch(traceCtx context.Context, client *client.Client, q *models.Query, - enablePrometheusDataplane, hasPrometheusRunQueriesInParallel bool) *backend.DataResponse { +func (s *QueryData) fetch(traceCtx context.Context, client *client.Client, q *models.Query, hasPrometheusRunQueriesInParallel bool) *backend.DataResponse { logger := s.log.FromContext(traceCtx) logger.Debug("Sending query", "start", q.Start, "end", q.End, "step", q.Step, "query", q.Expr /*, "queryTimeout", s.QueryTimeout*/) @@ -175,13 +173,13 @@ func (s *QueryData) fetch(traceCtx context.Context, client *client.Client, q *mo wg.Add(1) go func() { defer wg.Done() - res := s.instantQuery(traceCtx, client, q, enablePrometheusDataplane) + res := s.instantQuery(traceCtx, client, q) m.Lock() addDataResponse(&res, dr) m.Unlock() }() } else { - res := s.instantQuery(traceCtx, client, q, enablePrometheusDataplane) + res := s.instantQuery(traceCtx, client, q) addDataResponse(&res, dr) } } @@ -191,13 +189,13 @@ func (s *QueryData) fetch(traceCtx context.Context, client *client.Client, q *mo wg.Add(1) go func() { defer wg.Done() - res := s.rangeQuery(traceCtx, client, q, enablePrometheusDataplane) + res := s.rangeQuery(traceCtx, client, q) m.Lock() addDataResponse(&res, dr) m.Unlock() }() } else { - res := s.rangeQuery(traceCtx, client, q, enablePrometheusDataplane) + res := s.rangeQuery(traceCtx, client, q) addDataResponse(&res, dr) } } @@ -207,7 +205,7 @@ func (s *QueryData) fetch(traceCtx context.Context, client *client.Client, q *mo wg.Add(1) go func() { defer wg.Done() - res := s.exemplarQuery(traceCtx, client, q, enablePrometheusDataplane) + res := s.exemplarQuery(traceCtx, client, q) m.Lock() if res.Error != nil { // If exemplar query returns error, we want to only log it and @@ -218,7 +216,7 @@ func (s *QueryData) fetch(traceCtx context.Context, client *client.Client, q *mo m.Unlock() }() } else { - res := s.exemplarQuery(traceCtx, client, q, enablePrometheusDataplane) + res := s.exemplarQuery(traceCtx, client, q) if res.Error != nil { // If exemplar query returns error, we want to only log it and // continue with other results processing @@ -232,7 +230,7 @@ func (s *QueryData) fetch(traceCtx context.Context, client *client.Client, q *mo return dr } -func (s *QueryData) rangeQuery(ctx context.Context, c *client.Client, q *models.Query, enablePrometheusDataplaneFlag bool) backend.DataResponse { +func (s *QueryData) rangeQuery(ctx context.Context, c *client.Client, q *models.Query) backend.DataResponse { res, err := c.QueryRange(ctx, q) if err != nil { return addErrorSourceToDataResponse(err) @@ -248,7 +246,7 @@ func (s *QueryData) rangeQuery(ctx context.Context, c *client.Client, q *models. return s.parseResponse(ctx, q, res) } -func (s *QueryData) instantQuery(ctx context.Context, c *client.Client, q *models.Query, enablePrometheusDataplaneFlag bool) backend.DataResponse { +func (s *QueryData) instantQuery(ctx context.Context, c *client.Client, q *models.Query) backend.DataResponse { res, err := c.QueryInstant(ctx, q) if err != nil { return addErrorSourceToDataResponse(err) @@ -272,7 +270,7 @@ func (s *QueryData) instantQuery(ctx context.Context, c *client.Client, q *model return s.parseResponse(ctx, q, res) } -func (s *QueryData) exemplarQuery(ctx context.Context, c *client.Client, q *models.Query, enablePrometheusDataplaneFlag bool) backend.DataResponse { +func (s *QueryData) exemplarQuery(ctx context.Context, c *client.Client, q *models.Query) backend.DataResponse { res, err := c.QueryExemplars(ctx, q) if err != nil { response := backend.DataResponse{ From 8d839780d682e616b112679d44fa3cdb91fb3633 Mon Sep 17 00:00:00 2001 From: Will Browne Date: Thu, 13 Mar 2025 10:23:30 +0000 Subject: [PATCH 016/117] Plugins: Update to latest go plugin SDK version (0.272.0) (#102090) update go plugin sdk to latest --- apps/dashboard/go.mod | 2 +- apps/dashboard/go.sum | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- pkg/aggregator/go.mod | 2 +- pkg/aggregator/go.sum | 4 ++-- pkg/promlib/go.mod | 2 +- pkg/promlib/go.sum | 4 ++-- pkg/storage/unified/apistore/go.mod | 2 +- pkg/storage/unified/apistore/go.sum | 4 ++-- pkg/storage/unified/resource/go.mod | 2 +- pkg/storage/unified/resource/go.sum | 4 ++-- 12 files changed, 18 insertions(+), 18 deletions(-) diff --git a/apps/dashboard/go.mod b/apps/dashboard/go.mod index 5edd23ff5ae..8c2285debc3 100644 --- a/apps/dashboard/go.mod +++ b/apps/dashboard/go.mod @@ -4,7 +4,7 @@ go 1.23.7 require ( github.com/grafana/grafana-app-sdk v0.31.0 - github.com/grafana/grafana-plugin-sdk-go v0.270.0 + github.com/grafana/grafana-plugin-sdk-go v0.272.0 github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250312121619-f64be062c432 github.com/stretchr/testify v1.10.0 k8s.io/apimachinery v0.32.1 diff --git a/apps/dashboard/go.sum b/apps/dashboard/go.sum index 838687c24bf..33cfb1d9e90 100644 --- a/apps/dashboard/go.sum +++ b/apps/dashboard/go.sum @@ -89,8 +89,8 @@ github.com/grafana/grafana-app-sdk v0.31.0 h1:/mFCcx+YqG8cWAi9hePDJQxIdtXDClDIDR github.com/grafana/grafana-app-sdk v0.31.0/go.mod h1:Xw00NL7qpRLo5r3Gn48Bl1Xn2n4eUDI5pYf/wMufKWs= github.com/grafana/grafana-app-sdk/logging v0.30.0 h1:K/P/bm7Cp7Di4tqIJ3EQz2+842JozQGRaz62r95ApME= github.com/grafana/grafana-app-sdk/logging v0.30.0/go.mod h1:xy6ZyVXl50Z3DBDLybvBPphbykPhuVNed/VNmen9DQM= -github.com/grafana/grafana-plugin-sdk-go v0.270.0 h1:SST2Vo//ITQG5h401gC4jTkJpTHy8OV91sf2uDh6M/8= -github.com/grafana/grafana-plugin-sdk-go v0.270.0/go.mod h1:Z0Cvkj4WGadz6F6FQmK4NGb/hD18kTTNkSqFb97Rfyc= +github.com/grafana/grafana-plugin-sdk-go v0.272.0 h1:TmPIG+6e3lYGzkyfUfCHuaMaaiwDbkCacTZ7V/JaSeg= +github.com/grafana/grafana-plugin-sdk-go v0.272.0/go.mod h1:i/9KH9y/6m5hkRnG3H6aR2nOMPbJUmvo4XNrHjI15cU= github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250312121619-f64be062c432 h1:/0MLOGx9Ow7ihR4smlUYHFvomXBpdpf/jLWHKNfEUiI= github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250312121619-f64be062c432/go.mod h1:A/SJ9CiAWNOdeD/IezNwRaDZusLKq0z6dTfhKDgZw5Y= github.com/grafana/otel-profiling-go v0.5.1 h1:stVPKAFZSa7eGiqbYuG25VcqYksR6iWvF3YH66t4qL8= diff --git a/go.mod b/go.mod index e1efdbd7ed0..3a489495e2d 100644 --- a/go.mod +++ b/go.mod @@ -89,7 +89,7 @@ require ( github.com/grafana/grafana-cloud-migration-snapshot v1.6.0 // @grafana/grafana-operator-experience-squad github.com/grafana/grafana-google-sdk-go v0.2.1 // @grafana/partner-datasources github.com/grafana/grafana-openapi-client-go v0.0.0-20231213163343-bd475d63fb79 // @grafana/grafana-backend-group - github.com/grafana/grafana-plugin-sdk-go v0.270.0 // @grafana/plugins-platform-backend + github.com/grafana/grafana-plugin-sdk-go v0.272.0 // @grafana/plugins-platform-backend github.com/grafana/loki/v3 v3.2.1 // @grafana/observability-logs github.com/grafana/otel-profiling-go v0.5.1 // @grafana/grafana-backend-group github.com/grafana/pyroscope-go/godeltaprof v0.1.8 // @grafana/observability-traces-and-profiling diff --git a/go.sum b/go.sum index 743a5da82aa..e5ac733e108 100644 --- a/go.sum +++ b/go.sum @@ -1574,8 +1574,8 @@ github.com/grafana/grafana-google-sdk-go v0.2.1 h1:XeFdKnkXBjOJjXc1gf4iMx4h5aCHT github.com/grafana/grafana-google-sdk-go v0.2.1/go.mod h1:RiITSHwBhqVTTd3se3HQq5Ncs/wzzhTB9OK5N0J0PEU= github.com/grafana/grafana-openapi-client-go v0.0.0-20231213163343-bd475d63fb79 h1:r+mU5bGMzcXCRVAuOrTn54S80qbfVkvTdUJZfSfTNbs= github.com/grafana/grafana-openapi-client-go v0.0.0-20231213163343-bd475d63fb79/go.mod h1:wc6Hbh3K2TgCUSfBC/BOzabItujtHMESZeFk5ZhdxhQ= -github.com/grafana/grafana-plugin-sdk-go v0.270.0 h1:SST2Vo//ITQG5h401gC4jTkJpTHy8OV91sf2uDh6M/8= -github.com/grafana/grafana-plugin-sdk-go v0.270.0/go.mod h1:Z0Cvkj4WGadz6F6FQmK4NGb/hD18kTTNkSqFb97Rfyc= +github.com/grafana/grafana-plugin-sdk-go v0.272.0 h1:TmPIG+6e3lYGzkyfUfCHuaMaaiwDbkCacTZ7V/JaSeg= +github.com/grafana/grafana-plugin-sdk-go v0.272.0/go.mod h1:i/9KH9y/6m5hkRnG3H6aR2nOMPbJUmvo4XNrHjI15cU= github.com/grafana/grafana/apps/advisor v0.0.0-20250220163425-b4c4b9abbdc8 h1:mG/6nDlEBVxWlo2GQJVASzucw3ByPIBsec06XcPrjgQ= github.com/grafana/grafana/apps/advisor v0.0.0-20250220163425-b4c4b9abbdc8/go.mod h1:9I1dKV3Dqr0NPR9Af0WJGxOytp5/6W3JLiNChOz8r+c= github.com/grafana/grafana/apps/alerting/notifications v0.0.0-20250220163425-b4c4b9abbdc8 h1:w42GlvkmHG4nM/p1kb2nKmROVP+AHtL3qWEYMhnhCVM= diff --git a/pkg/aggregator/go.mod b/pkg/aggregator/go.mod index 27ed1f96d1b..e6ca98240ed 100644 --- a/pkg/aggregator/go.mod +++ b/pkg/aggregator/go.mod @@ -4,7 +4,7 @@ go 1.23.7 require ( github.com/emicklei/go-restful/v3 v3.11.0 - github.com/grafana/grafana-plugin-sdk-go v0.270.0 + github.com/grafana/grafana-plugin-sdk-go v0.272.0 github.com/grafana/grafana/pkg/apimachinery v0.0.0-20240808213237-f4d2e064f435 github.com/grafana/grafana/pkg/semconv v0.0.0-20240808213237-f4d2e064f435 github.com/mattbaird/jsonpatch v0.0.0-20240118010651-0ba75a80ca38 diff --git a/pkg/aggregator/go.sum b/pkg/aggregator/go.sum index 7e1a462ca5b..0198e0efd67 100644 --- a/pkg/aggregator/go.sum +++ b/pkg/aggregator/go.sum @@ -135,8 +135,8 @@ github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grafana/grafana-plugin-sdk-go v0.270.0 h1:SST2Vo//ITQG5h401gC4jTkJpTHy8OV91sf2uDh6M/8= -github.com/grafana/grafana-plugin-sdk-go v0.270.0/go.mod h1:Z0Cvkj4WGadz6F6FQmK4NGb/hD18kTTNkSqFb97Rfyc= +github.com/grafana/grafana-plugin-sdk-go v0.272.0 h1:TmPIG+6e3lYGzkyfUfCHuaMaaiwDbkCacTZ7V/JaSeg= +github.com/grafana/grafana-plugin-sdk-go v0.272.0/go.mod h1:i/9KH9y/6m5hkRnG3H6aR2nOMPbJUmvo4XNrHjI15cU= github.com/grafana/grafana/pkg/apimachinery v0.0.0-20240808213237-f4d2e064f435 h1:lmw60EW7JWlAEvgggktOyVkH4hF1m/+LSF/Ap0NCyi8= github.com/grafana/grafana/pkg/apimachinery v0.0.0-20240808213237-f4d2e064f435/go.mod h1:ORVFiW/KNRY52lNjkGwnFWCxNVfE97bJG2jr2fetq0I= github.com/grafana/grafana/pkg/semconv v0.0.0-20240808213237-f4d2e064f435 h1:SNEeqY22DrGr5E9kGF1mKSqlOom14W9+b1u4XEGJowA= diff --git a/pkg/promlib/go.mod b/pkg/promlib/go.mod index 12ccc4c4040..4b4393c9c70 100644 --- a/pkg/promlib/go.mod +++ b/pkg/promlib/go.mod @@ -4,7 +4,7 @@ go 1.23.7 require ( github.com/grafana/dskit v0.0.0-20241105154643-a6b453a88040 - github.com/grafana/grafana-plugin-sdk-go v0.270.0 + github.com/grafana/grafana-plugin-sdk-go v0.272.0 github.com/json-iterator/go v1.1.12 github.com/prometheus/client_golang v1.21.0 github.com/prometheus/common v0.62.0 diff --git a/pkg/promlib/go.sum b/pkg/promlib/go.sum index 1135d5e1404..899f8550654 100644 --- a/pkg/promlib/go.sum +++ b/pkg/promlib/go.sum @@ -121,8 +121,8 @@ github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/grafana/dskit v0.0.0-20241105154643-a6b453a88040 h1:IR+UNYHqaU31t8/TArJk8K/GlDwOyxMpGNkWCXeZ28g= github.com/grafana/dskit v0.0.0-20241105154643-a6b453a88040/go.mod h1:SPLNCARd4xdjCkue0O6hvuoveuS1dGJjDnfxYe405YQ= -github.com/grafana/grafana-plugin-sdk-go v0.270.0 h1:SST2Vo//ITQG5h401gC4jTkJpTHy8OV91sf2uDh6M/8= -github.com/grafana/grafana-plugin-sdk-go v0.270.0/go.mod h1:Z0Cvkj4WGadz6F6FQmK4NGb/hD18kTTNkSqFb97Rfyc= +github.com/grafana/grafana-plugin-sdk-go v0.272.0 h1:TmPIG+6e3lYGzkyfUfCHuaMaaiwDbkCacTZ7V/JaSeg= +github.com/grafana/grafana-plugin-sdk-go v0.272.0/go.mod h1:i/9KH9y/6m5hkRnG3H6aR2nOMPbJUmvo4XNrHjI15cU= github.com/grafana/otel-profiling-go v0.5.1 h1:stVPKAFZSa7eGiqbYuG25VcqYksR6iWvF3YH66t4qL8= github.com/grafana/otel-profiling-go v0.5.1/go.mod h1:ftN/t5A/4gQI19/8MoWurBEtC6gFw8Dns1sJZ9W4Tls= github.com/grafana/pyroscope-go/godeltaprof v0.1.8 h1:iwOtYXeeVSAeYefJNaxDytgjKtUuKQbJqgAIjlnicKg= diff --git a/pkg/storage/unified/apistore/go.mod b/pkg/storage/unified/apistore/go.mod index 02f195feed4..b9f7acd2839 100644 --- a/pkg/storage/unified/apistore/go.mod +++ b/pkg/storage/unified/apistore/go.mod @@ -213,7 +213,7 @@ require ( github.com/grafana/grafana-app-sdk/logging v0.30.0 // indirect github.com/grafana/grafana-aws-sdk v0.31.5 // indirect github.com/grafana/grafana-azure-sdk-go/v2 v2.1.6 // indirect - github.com/grafana/grafana-plugin-sdk-go v0.270.0 // indirect + github.com/grafana/grafana-plugin-sdk-go v0.272.0 // indirect github.com/grafana/grafana/pkg/aggregator v0.0.0-20250220163425-b4c4b9abbdc8 // indirect github.com/grafana/grafana/pkg/promlib v0.0.8 // indirect github.com/grafana/grafana/pkg/semconv v0.0.0-20250220164708-c8d4ff28a450 // indirect diff --git a/pkg/storage/unified/apistore/go.sum b/pkg/storage/unified/apistore/go.sum index 636fc8cd18e..ef2762a74fd 100644 --- a/pkg/storage/unified/apistore/go.sum +++ b/pkg/storage/unified/apistore/go.sum @@ -1273,8 +1273,8 @@ github.com/grafana/grafana-aws-sdk v0.31.5 h1:4HpMQx7n4Qqoi7Bgu8KHQ2QKT9fYYdHilX github.com/grafana/grafana-aws-sdk v0.31.5/go.mod h1:5p4Cjyr5ZiR6/RT2nFWkJ8XpIKgX4lAUmUMu70m2yCM= github.com/grafana/grafana-azure-sdk-go/v2 v2.1.6 h1:OfCkitCuomzZKW1WYHrG8MxKwtMhALb7jqoj+487eTg= github.com/grafana/grafana-azure-sdk-go/v2 v2.1.6/go.mod h1:V7y2BmsWxS3A9Ohebwn4OiSfJJqi//4JQydQ8fHTduo= -github.com/grafana/grafana-plugin-sdk-go v0.270.0 h1:SST2Vo//ITQG5h401gC4jTkJpTHy8OV91sf2uDh6M/8= -github.com/grafana/grafana-plugin-sdk-go v0.270.0/go.mod h1:Z0Cvkj4WGadz6F6FQmK4NGb/hD18kTTNkSqFb97Rfyc= +github.com/grafana/grafana-plugin-sdk-go v0.272.0 h1:TmPIG+6e3lYGzkyfUfCHuaMaaiwDbkCacTZ7V/JaSeg= +github.com/grafana/grafana-plugin-sdk-go v0.272.0/go.mod h1:i/9KH9y/6m5hkRnG3H6aR2nOMPbJUmvo4XNrHjI15cU= github.com/grafana/grafana/pkg/aggregator v0.0.0-20250220163425-b4c4b9abbdc8 h1:9qOLpC21AmXZqZ6rUhrBWl2mVqS3CzV53pzw0BCuHt0= github.com/grafana/grafana/pkg/aggregator v0.0.0-20250220163425-b4c4b9abbdc8/go.mod h1:deLQ/ywLvpVGbncRGUA4UDGt8a5Ei9sivOP+x6AQ2ko= github.com/grafana/grafana/pkg/promlib v0.0.8 h1:VUWsqttdf0wMI4j9OX9oNrykguQpZcruudDAFpJJVw0= diff --git a/pkg/storage/unified/resource/go.mod b/pkg/storage/unified/resource/go.mod index 8bf1d427d11..97b89d53e3a 100644 --- a/pkg/storage/unified/resource/go.mod +++ b/pkg/storage/unified/resource/go.mod @@ -16,7 +16,7 @@ require ( github.com/grafana/authlib/types v0.0.0-20250224151205-5ef97131cc82 github.com/grafana/dskit v0.0.0-20241105154643-a6b453a88040 github.com/grafana/grafana v11.4.0-00010101000000-000000000000+incompatible - github.com/grafana/grafana-plugin-sdk-go v0.270.0 + github.com/grafana/grafana-plugin-sdk-go v0.272.0 github.com/grafana/grafana/apps/dashboard v0.0.0-20250220154326-6e5de80ef295 github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250312121619-f64be062c432 github.com/grafana/grafana/pkg/apiserver v0.0.0-20250220154326-6e5de80ef295 // indirect diff --git a/pkg/storage/unified/resource/go.sum b/pkg/storage/unified/resource/go.sum index 6df86ff30b9..7c628f8eb85 100644 --- a/pkg/storage/unified/resource/go.sum +++ b/pkg/storage/unified/resource/go.sum @@ -1168,8 +1168,8 @@ github.com/grafana/grafana-aws-sdk v0.31.5 h1:4HpMQx7n4Qqoi7Bgu8KHQ2QKT9fYYdHilX github.com/grafana/grafana-aws-sdk v0.31.5/go.mod h1:5p4Cjyr5ZiR6/RT2nFWkJ8XpIKgX4lAUmUMu70m2yCM= github.com/grafana/grafana-azure-sdk-go/v2 v2.1.6 h1:OfCkitCuomzZKW1WYHrG8MxKwtMhALb7jqoj+487eTg= github.com/grafana/grafana-azure-sdk-go/v2 v2.1.6/go.mod h1:V7y2BmsWxS3A9Ohebwn4OiSfJJqi//4JQydQ8fHTduo= -github.com/grafana/grafana-plugin-sdk-go v0.270.0 h1:SST2Vo//ITQG5h401gC4jTkJpTHy8OV91sf2uDh6M/8= -github.com/grafana/grafana-plugin-sdk-go v0.270.0/go.mod h1:Z0Cvkj4WGadz6F6FQmK4NGb/hD18kTTNkSqFb97Rfyc= +github.com/grafana/grafana-plugin-sdk-go v0.272.0 h1:TmPIG+6e3lYGzkyfUfCHuaMaaiwDbkCacTZ7V/JaSeg= +github.com/grafana/grafana-plugin-sdk-go v0.272.0/go.mod h1:i/9KH9y/6m5hkRnG3H6aR2nOMPbJUmvo4XNrHjI15cU= github.com/grafana/otel-profiling-go v0.5.1 h1:stVPKAFZSa7eGiqbYuG25VcqYksR6iWvF3YH66t4qL8= github.com/grafana/otel-profiling-go v0.5.1/go.mod h1:ftN/t5A/4gQI19/8MoWurBEtC6gFw8Dns1sJZ9W4Tls= github.com/grafana/pyroscope-go/godeltaprof v0.1.8 h1:iwOtYXeeVSAeYefJNaxDytgjKtUuKQbJqgAIjlnicKg= From 8fd2a1267002ce2fc27d65bc8c6081026ca9a25c Mon Sep 17 00:00:00 2001 From: Eric Leijonmarck Date: Thu, 13 Mar 2025 10:39:35 +0000 Subject: [PATCH 017/117] Docs: update terraform documentation to assign basic_roles (#102087) * Docs: update terraform documentation to assign basic_roles * fmt --- .../rbac-terraform-provisioning/index.md | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/docs/sources/administration/roles-and-permissions/access-control/rbac-terraform-provisioning/index.md b/docs/sources/administration/roles-and-permissions/access-control/rbac-terraform-provisioning/index.md index ce6acbaf2b5..e262d6bc8d6 100644 --- a/docs/sources/administration/roles-and-permissions/access-control/rbac-terraform-provisioning/index.md +++ b/docs/sources/administration/roles-and-permissions/access-control/rbac-terraform-provisioning/index.md @@ -93,6 +93,75 @@ provider "grafana" { } ``` +## Provision basic roles + +The following example shows how to assign basic roles to users, teams, and service accounts. Basic roles are predefined in Grafana and provide a set of permissions for common use cases. + +| Basic role | UID | +| --------------- | --------------------- | +| `None` | `basic_none` | +| `Viewer` | `basic_viewer` | +| `Editor` | `basic_editor` | +| `Admin` | `basic_admin` | +| `Grafana Admin` | `basic_grafana_admin` | + +You can use any of the basic role UIDs from the table above in your role assignments. For example, to assign the "None" role, use `basic_none` as the `role_uid`. + +```terraform +resource "grafana_team" "viewer_team" { + name = "terraform_viewer_team" +} + +resource "grafana_user" "editor_user" { + email = "terraform_editor@example.com" + login = "terraform_editor_user" + password = +} + +resource "grafana_service_account" "admin_sa" { + name = "terraform_admin_sa" +} + +# Assign Viewer role to a team +resource "grafana_role_assignment" "viewer_role_assignment" { + role_uid = "basic_viewer" + teams = [grafana_team.viewer_team.id] +} + +# Assign Editor role to a user +resource "grafana_role_assignment" "editor_role_assignment" { + role_uid = "basic_editor" + users = [grafana_user.editor_user.id] +} + +# Assign Admin role to a service account +resource "grafana_role_assignment" "admin_role_assignment" { + role_uid = "basic_admin" + service_accounts = [grafana_service_account.admin_sa.id] +} +``` + +### Provision basic role to multiple users + +```terraform +resource "grafana_user" "editor_user_2" { + email = "terraform_editor_2@example.com" + login = "terraform_editor_2_user" + password = +} +resource "grafana_user" "editor_user_3" { + email = "terraform_editor_3@example.com" + login = "terraform_editor_3_user" + password = +} + +# Assign Editor role to multiply users +resource "grafana_role_assignment" "editor_role_assignment" { + role_uid = "basic_editor" + users = [grafana_user.editor_user_2.id, grafana_user.editor_user_3.id] +} +``` + ## Provision custom roles The following example shows how to provision a custom role with some permissions. From d07b1851c743cbac46c4fb8c73419b9919e8ad95 Mon Sep 17 00:00:00 2001 From: Oscar Kilhed Date: Thu, 13 Mar 2025 11:56:20 +0100 Subject: [PATCH 018/117] Dynamic dashboards: Persist conditional rendering (#102022) * Dashboards: Add conditional rendering * Updates * Fixes * Code improvements * Code improvements * limit condition choices, add delete and clean up ui * add basic variable condition * add conditional rendering based on time range interval * adjust failing test * remove deprecated pseudo locale file * extract conditional rendering from behaviour to state property * clean up behaviour initialisation * clean up ts errors * adjust data condition to account for RowItem * persist-conditional-rendering * fix group value name and kind type * Fix types in base * minor style fix * Fix subscribes * notify change when deleting condition * fix hidden row item error * Remove option to have groups in groups * fix merge issue * address comments * subscribe to panel data change in data condition * Remove loop labels * only persist conditional rendering if root group has items * update backend types * Serialize variable conditional rendering operator as equals notEquals --------- Co-authored-by: Bogdan Matei Co-authored-by: Sergej-Vlasov --- .../kinds/v2alpha1/dashboard_spec.cue | 41 ++++ .../dashboard/v2alpha1/dashboard_spec_gen.go | 203 +++++++++++++++++- .../dashboard/v2alpha0/dashboard.schema.cue | 41 ++++ .../schema/dashboard/v2alpha0/types.gen.ts | 80 +++++++ .../dashboard/v2alpha1/types.spec.gen.ts | 80 +++++++ .../ConditionalRendering.tsx | 5 + .../ConditionalRenderingBase.tsx | 3 + .../ConditionalRenderingData.tsx | 10 + .../ConditionalRenderingGroup.tsx | 16 ++ .../ConditionalRenderingInterval.tsx | 10 + .../ConditionalRenderingVariable.tsx | 50 +++-- .../conditional-rendering/serializers.ts | 96 +++++++++ .../ResponsiveGridLayoutSerializer.ts | 9 +- .../layoutSerializers/RowsLayoutSerializer.ts | 10 +- .../serialization/layoutSerializers/utils.ts | 20 ++ 15 files changed, 646 insertions(+), 28 deletions(-) create mode 100644 public/app/features/dashboard-scene/conditional-rendering/serializers.ts diff --git a/apps/dashboard/kinds/v2alpha1/dashboard_spec.cue b/apps/dashboard/kinds/v2alpha1/dashboard_spec.cue index a1216596268..b3324616401 100644 --- a/apps/dashboard/kinds/v2alpha1/dashboard_spec.cue +++ b/apps/dashboard/kinds/v2alpha1/dashboard_spec.cue @@ -564,6 +564,7 @@ RowsLayoutRowKind: { RowsLayoutRowSpec: { title?: string collapsed: bool + conditionalRendering?: ConditionalRenderingGroupKind repeat?: RowRepeatOptions layout: GridLayoutKind | ResponsiveGridLayoutKind | TabsLayoutKind } @@ -587,6 +588,7 @@ ResponsiveGridLayoutItemKind: { ResponsiveGridLayoutItemSpec: { element: ElementReference repeat?: ResponsiveGridRepeatOptions + conditionalRendering?: ConditionalRenderingGroupKind } TabsLayoutKind: { @@ -921,3 +923,42 @@ AdhocVariableKind: { kind: "AdhocVariable" spec: AdhocVariableSpec } + +ConditionalRenderingGroupKind: { + kind: "ConditionalRenderingGroup" + spec: ConditionalRenderingGroupSpec +} + +ConditionalRenderingGroupSpec: { + condition: "and" | "or" + items: [...ConditionalRenderingVariableKind | ConditionalRenderingDataKind | ConditionalRenderingTimeIntervalKind] +} + +ConditionalRenderingVariableKind: { + kind: "ConditionalRenderingVariable" + spec: ConditionalRenderingVariableSpec +} + +ConditionalRenderingVariableSpec: { + variable: string + operator: "equals" | "notEquals" + value: string +} + +ConditionalRenderingDataKind: { + kind: "ConditionalRenderingData" + spec: ConditionalRenderingDataSpec +} + +ConditionalRenderingDataSpec: { + value: bool +} + +ConditionalRenderingTimeIntervalKind: { + kind: "ConditionalRenderingTimeInterval" + spec: ConditionalRenderingTimeIntervalSpec +} + +ConditionalRenderingTimeIntervalSpec: { + value: string +} \ No newline at end of file diff --git a/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_spec_gen.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_spec_gen.go index ade7b3398b0..9f13ee1f69b 100644 --- a/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_spec_gen.go +++ b/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_spec_gen.go @@ -833,10 +833,11 @@ func NewDashboardRowsLayoutRowKind() *DashboardRowsLayoutRowKind { // +k8s:openapi-gen=true type DashboardRowsLayoutRowSpec struct { - Title *string `json:"title,omitempty"` - Collapsed bool `json:"collapsed"` - Repeat *DashboardRowRepeatOptions `json:"repeat,omitempty"` - Layout DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind `json:"layout"` + Title *string `json:"title,omitempty"` + Collapsed bool `json:"collapsed"` + ConditionalRendering *DashboardConditionalRenderingGroupKind `json:"conditionalRendering,omitempty"` + Repeat *DashboardRowRepeatOptions `json:"repeat,omitempty"` + Layout DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind `json:"layout"` } // NewDashboardRowsLayoutRowSpec creates a new DashboardRowsLayoutRowSpec object. @@ -846,6 +847,105 @@ func NewDashboardRowsLayoutRowSpec() *DashboardRowsLayoutRowSpec { } } +// +k8s:openapi-gen=true +type DashboardConditionalRenderingGroupKind struct { + Kind string `json:"kind"` + Spec DashboardConditionalRenderingGroupSpec `json:"spec"` +} + +// NewDashboardConditionalRenderingGroupKind creates a new DashboardConditionalRenderingGroupKind object. +func NewDashboardConditionalRenderingGroupKind() *DashboardConditionalRenderingGroupKind { + return &DashboardConditionalRenderingGroupKind{ + Kind: "ConditionalRenderingGroup", + Spec: *NewDashboardConditionalRenderingGroupSpec(), + } +} + +// +k8s:openapi-gen=true +type DashboardConditionalRenderingGroupSpec struct { + Condition DashboardConditionalRenderingGroupSpecCondition `json:"condition"` + Items []DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind `json:"items"` +} + +// NewDashboardConditionalRenderingGroupSpec creates a new DashboardConditionalRenderingGroupSpec object. +func NewDashboardConditionalRenderingGroupSpec() *DashboardConditionalRenderingGroupSpec { + return &DashboardConditionalRenderingGroupSpec{} +} + +// +k8s:openapi-gen=true +type DashboardConditionalRenderingVariableKind struct { + Kind string `json:"kind"` + Spec DashboardConditionalRenderingVariableSpec `json:"spec"` +} + +// NewDashboardConditionalRenderingVariableKind creates a new DashboardConditionalRenderingVariableKind object. +func NewDashboardConditionalRenderingVariableKind() *DashboardConditionalRenderingVariableKind { + return &DashboardConditionalRenderingVariableKind{ + Kind: "ConditionalRenderingVariable", + Spec: *NewDashboardConditionalRenderingVariableSpec(), + } +} + +// +k8s:openapi-gen=true +type DashboardConditionalRenderingVariableSpec struct { + Variable string `json:"variable"` + Operator DashboardConditionalRenderingVariableSpecOperator `json:"operator"` + Value string `json:"value"` +} + +// NewDashboardConditionalRenderingVariableSpec creates a new DashboardConditionalRenderingVariableSpec object. +func NewDashboardConditionalRenderingVariableSpec() *DashboardConditionalRenderingVariableSpec { + return &DashboardConditionalRenderingVariableSpec{} +} + +// +k8s:openapi-gen=true +type DashboardConditionalRenderingDataKind struct { + Kind string `json:"kind"` + Spec DashboardConditionalRenderingDataSpec `json:"spec"` +} + +// NewDashboardConditionalRenderingDataKind creates a new DashboardConditionalRenderingDataKind object. +func NewDashboardConditionalRenderingDataKind() *DashboardConditionalRenderingDataKind { + return &DashboardConditionalRenderingDataKind{ + Kind: "ConditionalRenderingData", + Spec: *NewDashboardConditionalRenderingDataSpec(), + } +} + +// +k8s:openapi-gen=true +type DashboardConditionalRenderingDataSpec struct { + Value bool `json:"value"` +} + +// NewDashboardConditionalRenderingDataSpec creates a new DashboardConditionalRenderingDataSpec object. +func NewDashboardConditionalRenderingDataSpec() *DashboardConditionalRenderingDataSpec { + return &DashboardConditionalRenderingDataSpec{} +} + +// +k8s:openapi-gen=true +type DashboardConditionalRenderingTimeIntervalKind struct { + Kind string `json:"kind"` + Spec DashboardConditionalRenderingTimeIntervalSpec `json:"spec"` +} + +// NewDashboardConditionalRenderingTimeIntervalKind creates a new DashboardConditionalRenderingTimeIntervalKind object. +func NewDashboardConditionalRenderingTimeIntervalKind() *DashboardConditionalRenderingTimeIntervalKind { + return &DashboardConditionalRenderingTimeIntervalKind{ + Kind: "ConditionalRenderingTimeInterval", + Spec: *NewDashboardConditionalRenderingTimeIntervalSpec(), + } +} + +// +k8s:openapi-gen=true +type DashboardConditionalRenderingTimeIntervalSpec struct { + Value string `json:"value"` +} + +// NewDashboardConditionalRenderingTimeIntervalSpec creates a new DashboardConditionalRenderingTimeIntervalSpec object. +func NewDashboardConditionalRenderingTimeIntervalSpec() *DashboardConditionalRenderingTimeIntervalSpec { + return &DashboardConditionalRenderingTimeIntervalSpec{} +} + // +k8s:openapi-gen=true type DashboardResponsiveGridLayoutKind struct { Kind string `json:"kind"` @@ -888,8 +988,9 @@ func NewDashboardResponsiveGridLayoutItemKind() *DashboardResponsiveGridLayoutIt // +k8s:openapi-gen=true type DashboardResponsiveGridLayoutItemSpec struct { - Element DashboardElementReference `json:"element"` - Repeat *DashboardResponsiveGridRepeatOptions `json:"repeat,omitempty"` + Element DashboardElementReference `json:"element"` + Repeat *DashboardResponsiveGridRepeatOptions `json:"repeat,omitempty"` + ConditionalRendering *DashboardConditionalRenderingGroupKind `json:"conditionalRendering,omitempty"` } // NewDashboardResponsiveGridLayoutItemSpec creates a new DashboardResponsiveGridLayoutItemSpec object. @@ -1675,6 +1776,22 @@ const ( DashboardRepeatOptionsDirectionV DashboardRepeatOptionsDirection = "v" ) +// +k8s:openapi-gen=true +type DashboardConditionalRenderingGroupSpecCondition string + +const ( + DashboardConditionalRenderingGroupSpecConditionAnd DashboardConditionalRenderingGroupSpecCondition = "and" + DashboardConditionalRenderingGroupSpecConditionOr DashboardConditionalRenderingGroupSpecCondition = "or" +) + +// +k8s:openapi-gen=true +type DashboardConditionalRenderingVariableSpecOperator string + +const ( + DashboardConditionalRenderingVariableSpecOperatorEquals DashboardConditionalRenderingVariableSpecOperator = "equals" + DashboardConditionalRenderingVariableSpecOperatorNotEquals DashboardConditionalRenderingVariableSpecOperator = "notEquals" +) + // +k8s:openapi-gen=true type DashboardTimeSettingsSpecWeekStart string @@ -1968,6 +2085,80 @@ func (resource *DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKin return fmt.Errorf("could not unmarshal resource with `kind = %v`", discriminator) } +// +k8s:openapi-gen=true +type DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind struct { + ConditionalRenderingVariableKind *DashboardConditionalRenderingVariableKind `json:"ConditionalRenderingVariableKind,omitempty"` + ConditionalRenderingDataKind *DashboardConditionalRenderingDataKind `json:"ConditionalRenderingDataKind,omitempty"` + ConditionalRenderingTimeIntervalKind *DashboardConditionalRenderingTimeIntervalKind `json:"ConditionalRenderingTimeIntervalKind,omitempty"` +} + +// NewDashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind creates a new DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind object. +func NewDashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind() *DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind { + return &DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind{} +} + +// MarshalJSON implements a custom JSON marshalling logic to encode `DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind` as JSON. +func (resource DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind) MarshalJSON() ([]byte, error) { + if resource.ConditionalRenderingVariableKind != nil { + return json.Marshal(resource.ConditionalRenderingVariableKind) + } + if resource.ConditionalRenderingDataKind != nil { + return json.Marshal(resource.ConditionalRenderingDataKind) + } + if resource.ConditionalRenderingTimeIntervalKind != nil { + return json.Marshal(resource.ConditionalRenderingTimeIntervalKind) + } + + return nil, fmt.Errorf("no value for disjunction of refs") +} + +// UnmarshalJSON implements a custom JSON unmarshalling logic to decode `DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind` from JSON. +func (resource *DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind) UnmarshalJSON(raw []byte) error { + if raw == nil { + return nil + } + + // FIXME: this is wasteful, we need to find a more efficient way to unmarshal this. + parsedAsMap := make(map[string]interface{}) + if err := json.Unmarshal(raw, &parsedAsMap); err != nil { + return err + } + + discriminator, found := parsedAsMap["kind"] + if !found { + return errors.New("discriminator field 'kind' not found in payload") + } + + switch discriminator { + case "ConditionalRenderingData": + var dashboardConditionalRenderingDataKind DashboardConditionalRenderingDataKind + if err := json.Unmarshal(raw, &dashboardConditionalRenderingDataKind); err != nil { + return err + } + + resource.ConditionalRenderingDataKind = &dashboardConditionalRenderingDataKind + return nil + case "ConditionalRenderingTimeInterval": + var dashboardConditionalRenderingTimeIntervalKind DashboardConditionalRenderingTimeIntervalKind + if err := json.Unmarshal(raw, &dashboardConditionalRenderingTimeIntervalKind); err != nil { + return err + } + + resource.ConditionalRenderingTimeIntervalKind = &dashboardConditionalRenderingTimeIntervalKind + return nil + case "ConditionalRenderingVariable": + var dashboardConditionalRenderingVariableKind DashboardConditionalRenderingVariableKind + if err := json.Unmarshal(raw, &dashboardConditionalRenderingVariableKind); err != nil { + return err + } + + resource.ConditionalRenderingVariableKind = &dashboardConditionalRenderingVariableKind + return nil + } + + return fmt.Errorf("could not unmarshal resource with `kind = %v`", discriminator) +} + // +k8s:openapi-gen=true type DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind struct { GridLayoutKind *DashboardGridLayoutKind `json:"GridLayoutKind,omitempty"` diff --git a/packages/grafana-schema/src/schema/dashboard/v2alpha0/dashboard.schema.cue b/packages/grafana-schema/src/schema/dashboard/v2alpha0/dashboard.schema.cue index bb799f4053e..846d0cabd8f 100644 --- a/packages/grafana-schema/src/schema/dashboard/v2alpha0/dashboard.schema.cue +++ b/packages/grafana-schema/src/schema/dashboard/v2alpha0/dashboard.schema.cue @@ -553,6 +553,7 @@ RowsLayoutRowSpec: { title?: string collapsed: bool repeat?: RowRepeatOptions + conditionalRendering?: ConditionalRenderingGroupKind layout: GridLayoutKind | ResponsiveGridLayoutKind | TabsLayoutKind } @@ -575,6 +576,7 @@ ResponsiveGridLayoutItemKind: { ResponsiveGridLayoutItemSpec: { element: ElementReference repeat?: ResponsiveGridRepeatOptions + conditionalRendering?: ConditionalRenderingGroupKind } TabsLayoutKind: { @@ -913,3 +915,42 @@ AdhocVariableKind: { kind: "AdhocVariable" spec: AdhocVariableSpec } + +ConditionalRenderingGroupKind: { + kind: "ConditionalRenderingGroup" + spec: ConditionalRenderingGroupSpec +} + +ConditionalRenderingGroupSpec: { + condition: "and" | "or" + items: [...ConditionalRenderingVariableKind | ConditionalRenderingDataKind | ConditionalRenderingTimeIntervalKind] +} + +ConditionalRenderingVariableKind: { + kind: "ConditionalRenderingVariable" + spec: ConditionalRenderingVariableSpec +} + +ConditionalRenderingVariableSpec: { + variable: string + operator: "equals" | "notEquals" + value: string +} + +ConditionalRenderingDataKind: { + kind: "ConditionalRenderingData" + spec: ConditionalRenderingDataSpec +} + +ConditionalRenderingDataSpec: { + value: bool +} + +ConditionalRenderingTimeIntervalKind: { + kind: "ConditionalRenderingTimeInterval" + spec: ConditionalRenderingTimeIntervalSpec +} + +ConditionalRenderingTimeIntervalSpec: { + value: string +} \ No newline at end of file diff --git a/packages/grafana-schema/src/schema/dashboard/v2alpha0/types.gen.ts b/packages/grafana-schema/src/schema/dashboard/v2alpha0/types.gen.ts index 77bb17e5d4f..895014f6b6c 100644 --- a/packages/grafana-schema/src/schema/dashboard/v2alpha0/types.gen.ts +++ b/packages/grafana-schema/src/schema/dashboard/v2alpha0/types.gen.ts @@ -825,6 +825,7 @@ export interface RowsLayoutRowSpec { title?: string; collapsed: boolean; repeat?: RowRepeatOptions; + conditionalRendering?: ConditionalRenderingGroupKind; layout: GridLayoutKind | ResponsiveGridLayoutKind | TabsLayoutKind; } @@ -868,6 +869,7 @@ export const defaultResponsiveGridLayoutItemKind = (): ResponsiveGridLayoutItemK export interface ResponsiveGridLayoutItemSpec { element: ElementReference; repeat?: ResponsiveGridRepeatOptions; + conditionalRendering?: ConditionalRenderingGroupKind; } export const defaultResponsiveGridLayoutItemSpec = (): ResponsiveGridLayoutItemSpec => ({ @@ -1401,3 +1403,81 @@ export const defaultAdhocVariableKind = (): AdhocVariableKind => ({ spec: defaultAdhocVariableSpec(), }); +export interface ConditionalRenderingGroupKind { + kind: "ConditionalRenderingGroup"; + spec: ConditionalRenderingGroupSpec; +} + +export const defaultConditionalRenderingGroupKind = (): ConditionalRenderingGroupKind => ({ + kind: "ConditionalRenderingGroup", + spec: defaultConditionalRenderingGroupSpec(), +}); + +export interface ConditionalRenderingGroupSpec { + condition: "and" | "or"; + items: (ConditionalRenderingVariableKind | ConditionalRenderingDataKind | ConditionalRenderingTimeIntervalKind)[]; +} + +export const defaultConditionalRenderingGroupSpec = (): ConditionalRenderingGroupSpec => ({ + condition: "and", + items: [], +}); + +export interface ConditionalRenderingVariableKind { + kind: "ConditionalRenderingVariable"; + spec: ConditionalRenderingVariableSpec; +} + +export const defaultConditionalRenderingVariableKind = (): ConditionalRenderingVariableKind => ({ + kind: "ConditionalRenderingVariable", + spec: defaultConditionalRenderingVariableSpec(), +}); + +export interface ConditionalRenderingVariableSpec { + variable: string; + operator: "equals" | "notEquals"; + value: string; +} + +export const defaultConditionalRenderingVariableSpec = (): ConditionalRenderingVariableSpec => ({ + variable: "", + operator: "equals", + value: "", +}); + +export interface ConditionalRenderingDataKind { + kind: "ConditionalRenderingData"; + spec: ConditionalRenderingDataSpec; +} + +export const defaultConditionalRenderingDataKind = (): ConditionalRenderingDataKind => ({ + kind: "ConditionalRenderingData", + spec: defaultConditionalRenderingDataSpec(), +}); + +export interface ConditionalRenderingDataSpec { + value: boolean; +} + +export const defaultConditionalRenderingDataSpec = (): ConditionalRenderingDataSpec => ({ + value: false, +}); + +export interface ConditionalRenderingTimeIntervalKind { + kind: "ConditionalRenderingTimeInterval"; + spec: ConditionalRenderingTimeIntervalSpec; +} + +export const defaultConditionalRenderingTimeIntervalKind = (): ConditionalRenderingTimeIntervalKind => ({ + kind: "ConditionalRenderingTimeInterval", + spec: defaultConditionalRenderingTimeIntervalSpec(), +}); + +export interface ConditionalRenderingTimeIntervalSpec { + value: string; +} + +export const defaultConditionalRenderingTimeIntervalSpec = (): ConditionalRenderingTimeIntervalSpec => ({ + value: "", +}); + diff --git a/packages/grafana-schema/src/schema/dashboard/v2alpha1/types.spec.gen.ts b/packages/grafana-schema/src/schema/dashboard/v2alpha1/types.spec.gen.ts index 477ec4e63ad..9ed8a4765df 100644 --- a/packages/grafana-schema/src/schema/dashboard/v2alpha1/types.spec.gen.ts +++ b/packages/grafana-schema/src/schema/dashboard/v2alpha1/types.spec.gen.ts @@ -692,6 +692,7 @@ export const defaultRowsLayoutRowKind = (): RowsLayoutRowKind => ({ export interface RowsLayoutRowSpec { title?: string; collapsed: boolean; + conditionalRendering?: ConditionalRenderingGroupKind; repeat?: RowRepeatOptions; layout: GridLayoutKind | ResponsiveGridLayoutKind | TabsLayoutKind; } @@ -701,6 +702,84 @@ export const defaultRowsLayoutRowSpec = (): RowsLayoutRowSpec => ({ layout: defaultGridLayoutKind(), }); +export interface ConditionalRenderingGroupKind { + kind: "ConditionalRenderingGroup"; + spec: ConditionalRenderingGroupSpec; +} + +export const defaultConditionalRenderingGroupKind = (): ConditionalRenderingGroupKind => ({ + kind: "ConditionalRenderingGroup", + spec: defaultConditionalRenderingGroupSpec(), +}); + +export interface ConditionalRenderingGroupSpec { + condition: "and" | "or"; + items: (ConditionalRenderingVariableKind | ConditionalRenderingDataKind | ConditionalRenderingTimeIntervalKind)[]; +} + +export const defaultConditionalRenderingGroupSpec = (): ConditionalRenderingGroupSpec => ({ + condition: "and", + items: [], +}); + +export interface ConditionalRenderingVariableKind { + kind: "ConditionalRenderingVariable"; + spec: ConditionalRenderingVariableSpec; +} + +export const defaultConditionalRenderingVariableKind = (): ConditionalRenderingVariableKind => ({ + kind: "ConditionalRenderingVariable", + spec: defaultConditionalRenderingVariableSpec(), +}); + +export interface ConditionalRenderingVariableSpec { + variable: string; + operator: "equals" | "notEquals"; + value: string; +} + +export const defaultConditionalRenderingVariableSpec = (): ConditionalRenderingVariableSpec => ({ + variable: "", + operator: "equals", + value: "", +}); + +export interface ConditionalRenderingDataKind { + kind: "ConditionalRenderingData"; + spec: ConditionalRenderingDataSpec; +} + +export const defaultConditionalRenderingDataKind = (): ConditionalRenderingDataKind => ({ + kind: "ConditionalRenderingData", + spec: defaultConditionalRenderingDataSpec(), +}); + +export interface ConditionalRenderingDataSpec { + value: boolean; +} + +export const defaultConditionalRenderingDataSpec = (): ConditionalRenderingDataSpec => ({ + value: false, +}); + +export interface ConditionalRenderingTimeIntervalKind { + kind: "ConditionalRenderingTimeInterval"; + spec: ConditionalRenderingTimeIntervalSpec; +} + +export const defaultConditionalRenderingTimeIntervalKind = (): ConditionalRenderingTimeIntervalKind => ({ + kind: "ConditionalRenderingTimeInterval", + spec: defaultConditionalRenderingTimeIntervalSpec(), +}); + +export interface ConditionalRenderingTimeIntervalSpec { + value: string; +} + +export const defaultConditionalRenderingTimeIntervalSpec = (): ConditionalRenderingTimeIntervalSpec => ({ + value: "", +}); + export interface ResponsiveGridLayoutKind { kind: "ResponsiveGridLayout"; spec: ResponsiveGridLayoutSpec; @@ -736,6 +815,7 @@ export const defaultResponsiveGridLayoutItemKind = (): ResponsiveGridLayoutItemK export interface ResponsiveGridLayoutItemSpec { element: ElementReference; repeat?: ResponsiveGridRepeatOptions; + conditionalRendering?: ConditionalRenderingGroupKind; } export const defaultResponsiveGridLayoutItemSpec = (): ResponsiveGridLayoutItemSpec => ({ diff --git a/public/app/features/dashboard-scene/conditional-rendering/ConditionalRendering.tsx b/public/app/features/dashboard-scene/conditional-rendering/ConditionalRendering.tsx index 50770dcce9a..bc37e726cb3 100644 --- a/public/app/features/dashboard-scene/conditional-rendering/ConditionalRendering.tsx +++ b/public/app/features/dashboard-scene/conditional-rendering/ConditionalRendering.tsx @@ -1,4 +1,5 @@ import { SceneComponentProps, SceneObjectBase, SceneObjectState } from '@grafana/scenes'; +import { ConditionalRenderingGroupKind } from '@grafana/schema/dist/esm/schema/dashboard/v2alpha0'; import { ConditionalRenderingGroup } from './ConditionalRenderingGroup'; @@ -36,6 +37,10 @@ export class ConditionalRendering extends SceneObjectBase) { diff --git a/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingBase.tsx b/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingBase.tsx index 6fbbd1a83af..265372e54ec 100644 --- a/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingBase.tsx +++ b/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingBase.tsx @@ -4,6 +4,7 @@ import { SceneComponentProps, sceneGraph, SceneObjectBase, SceneObjectState } fr import { ConditionalRendering } from './ConditionalRendering'; import { ConditionalRenderingGroup } from './ConditionalRenderingGroup'; +import { ConditionalRenderingKindTypes } from './serializers'; import { ConditionValues } from './shared'; export interface ConditionalRenderingBaseState extends SceneObjectState { @@ -34,6 +35,8 @@ export abstract class ConditionalRenderingBase< public abstract readonly title: string; + public abstract serialize(): ConditionalRenderingKindTypes; + public abstract evaluate(): boolean; public abstract render(): ReactNode; diff --git a/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingData.tsx b/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingData.tsx index e95b5f45b18..47e60687dc6 100644 --- a/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingData.tsx +++ b/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingData.tsx @@ -2,6 +2,7 @@ import { ReactNode, useMemo } from 'react'; import { PanelData, SelectableValue } from '@grafana/data'; import { SceneComponentProps, SceneDataProvider, sceneGraph } from '@grafana/scenes'; +import { ConditionalRenderingDataKind } from '@grafana/schema/dist/esm/schema/dashboard/v2alpha0'; import { RadioButtonGroup, Stack } from '@grafana/ui'; import { t } from 'app/core/internationalization'; @@ -112,6 +113,15 @@ export class ConditionalRenderingData extends ConditionalRenderingBase) { diff --git a/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingGroup.tsx b/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingGroup.tsx index 45f4edd92ca..14bf66c40b5 100644 --- a/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingGroup.tsx +++ b/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingGroup.tsx @@ -3,6 +3,7 @@ import { Fragment, ReactNode, useMemo } from 'react'; import { GrafanaTheme2, SelectableValue } from '@grafana/data'; import { SceneComponentProps } from '@grafana/scenes'; +import { ConditionalRenderingGroupKind } from '@grafana/schema/dist/esm/schema/dashboard/v2alpha0'; import { Divider, Dropdown, Field, Menu, RadioButtonGroup, Stack, ToolbarButton, useStyles2 } from '@grafana/ui'; import { t, Trans } from 'app/core/internationalization'; @@ -68,6 +69,21 @@ export class ConditionalRenderingGroup extends ConditionalRenderingBase item instanceof ConditionalRenderingGroup)) { + throw new Error('ConditionalRenderingGroup cannot contain nested ConditionalRenderingGroups'); + } + return { + kind: 'ConditionalRenderingGroup', + spec: { + condition: this.state.condition, + items: this.state.value + .map((condition) => condition.serialize()) + .filter((item) => item.kind !== 'ConditionalRenderingGroup'), + }, + }; + } } function ConditionalRenderingGroupRenderer({ model }: SceneComponentProps) { diff --git a/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingInterval.tsx b/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingInterval.tsx index 8454fa627f5..d22ccd3a91e 100644 --- a/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingInterval.tsx +++ b/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingInterval.tsx @@ -2,6 +2,7 @@ import { ReactNode, useState } from 'react'; import { rangeUtil } from '@grafana/data'; import { SceneComponentProps, sceneGraph } from '@grafana/scenes'; +import { ConditionalRenderingTimeIntervalKind } from '@grafana/schema/dist/esm/schema/dashboard/v2alpha0'; import { Field, Input, Stack } from '@grafana/ui'; import { t } from 'app/core/internationalization'; @@ -54,6 +55,15 @@ export class ConditionalRenderingInterval extends ConditionalRenderingBase) { diff --git a/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingVariable.tsx b/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingVariable.tsx index 5899dfd1797..a9b58843a2f 100644 --- a/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingVariable.tsx +++ b/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingVariable.tsx @@ -1,8 +1,8 @@ import { css } from '@emotion/css'; import { ReactNode, useMemo } from 'react'; -import { GrafanaTheme2 } from '@grafana/data'; -import { SceneComponentProps, sceneGraph, VariableDependencyConfig } from '@grafana/scenes'; +import { SceneComponentProps, sceneGraph } from '@grafana/scenes'; +import { ConditionalRenderingVariableKind } from '@grafana/schema/dist/esm/schema/dashboard/v2alpha0'; import { Combobox, ComboboxOption, Field, Input, Stack, useStyles2 } from '@grafana/ui'; import { t } from 'app/core/internationalization'; @@ -16,21 +16,13 @@ export type VariableConditionValue = { value: string; }; -type ConditionalRenderingVariableState = ConditionalRenderingBaseState; +interface ConditionalRenderingVariableState extends ConditionalRenderingBaseState {} export class ConditionalRenderingVariable extends ConditionalRenderingBase { public get title(): string { return t('dashboard.conditional-rendering.variable.label', 'Variable'); } - protected _variableDependency = new VariableDependencyConfig(this, { - onAnyVariableChanged: (v) => { - if (v.state.name === this.state.value.name) { - this.getConditionalLogicRoot().notifyChange(); - } - }, - }); - public evaluate(): boolean { if (!this.state.value.name) { return true; @@ -41,10 +33,15 @@ export class ConditionalRenderingVariable extends ConditionalRenderingBase> { + return sceneGraph + .getVariables(this) + .state.variables.map((v) => ({ value: v.state.name, label: v.state.label ?? v.state.name })); + } + public onDelete() { handleDeleteNonGroupCondition(this); } } function ConditionalRenderingVariableRenderer({ model }: SceneComponentProps) { - const variables = useMemo(() => sceneGraph.getVariables(model), [model]); - const variableNames = useMemo( - () => variables.state.variables.map((v) => ({ value: v.state.name, label: v.state.label ?? v.state.name })), - [variables.state.variables] - ); + const variableNames = useMemo(() => model.getVariableOptions(), [model]); const operatorOptions: Array ({ +const getStyles = () => ({ variableNameSelect: css({ flexGrow: 1, }), operatorSelect: css({ - width: theme.spacing(12), + width: '6rem', }), }); diff --git a/public/app/features/dashboard-scene/conditional-rendering/serializers.ts b/public/app/features/dashboard-scene/conditional-rendering/serializers.ts new file mode 100644 index 00000000000..ab421d799d5 --- /dev/null +++ b/public/app/features/dashboard-scene/conditional-rendering/serializers.ts @@ -0,0 +1,96 @@ +import { Registry, RegistryItem } from '@grafana/data'; +import { + ConditionalRenderingGroupKind, + ConditionalRenderingVariableKind, + ConditionalRenderingDataKind, + ConditionalRenderingTimeIntervalKind, +} from '@grafana/schema/dist/esm/schema/dashboard/v2alpha0'; + +import { ConditionalRenderingData } from './ConditionalRenderingData'; +import { ConditionalRenderingGroup } from './ConditionalRenderingGroup'; +import { ConditionalRenderingInterval } from './ConditionalRenderingInterval'; +import { ConditionalRenderingVariable } from './ConditionalRenderingVariable'; + +export type ConditionalRenderingKindTypes = + | ConditionalRenderingGroupKind + | ConditionalRenderingVariableKind + | ConditionalRenderingDataKind + | ConditionalRenderingTimeIntervalKind; + +export interface ConditionalRenderingSerializer { + deserialize( + model: ConditionalRenderingKindTypes + ): ConditionalRenderingGroup | ConditionalRenderingVariable | ConditionalRenderingData | ConditionalRenderingInterval; +} + +interface ConditionalRenderingSerializerRegistryItem extends RegistryItem { + serializer: ConditionalRenderingSerializer; +} + +export class ConditionalRenderingGroupSerializer implements ConditionalRenderingSerializer { + deserialize(model: ConditionalRenderingGroupKind): ConditionalRenderingGroup { + return new ConditionalRenderingGroup({ + condition: model.spec.condition, + value: model.spec.items.map((item: ConditionalRenderingKindTypes) => { + const serializerRegistryItem = conditionalRenderingSerializerRegistry.getIfExists(item.kind); + if (!serializerRegistryItem) { + throw new Error(`No serializer found for conditional rendering kind: ${item.kind}`); + } + return serializerRegistryItem.serializer.deserialize(item); + }), + }); + } +} + +export class ConditionalRenderingVariableSerializer implements ConditionalRenderingSerializer { + deserialize(model: ConditionalRenderingVariableKind): ConditionalRenderingVariable { + return new ConditionalRenderingVariable({ + value: { + name: model.spec.variable, + operator: model.spec.operator === 'equals' ? '=' : '!=', + value: model.spec.value, + }, + }); + } +} + +export class ConditionalRenderingDataSerializer implements ConditionalRenderingSerializer { + deserialize(model: ConditionalRenderingDataKind): ConditionalRenderingData { + return new ConditionalRenderingData({ + value: model.spec.value, + }); + } +} + +export class ConditionalRenderingIntervalSerializer implements ConditionalRenderingSerializer { + deserialize(model: ConditionalRenderingTimeIntervalKind): ConditionalRenderingInterval { + return new ConditionalRenderingInterval({ + value: model.spec.value, + }); + } +} + +export const conditionalRenderingSerializerRegistry = new Registry(() => { + return [ + { + id: 'ConditionalRenderingGroup', + name: 'Group', + serializer: new ConditionalRenderingGroupSerializer(), + }, + { + id: 'ConditionalRenderingVariable', + name: 'Variable', + serializer: new ConditionalRenderingVariableSerializer(), + }, + { + id: 'ConditionalRenderingData', + name: 'Data', + serializer: new ConditionalRenderingDataSerializer(), + }, + { + id: 'ConditionalRenderingTimeInterval', + name: 'Time Interval', + serializer: new ConditionalRenderingIntervalSerializer(), + }, + ]; +}); diff --git a/public/app/features/dashboard-scene/serialization/layoutSerializers/ResponsiveGridLayoutSerializer.ts b/public/app/features/dashboard-scene/serialization/layoutSerializers/ResponsiveGridLayoutSerializer.ts index ce9fb910193..9faf62a1c9a 100644 --- a/public/app/features/dashboard-scene/serialization/layoutSerializers/ResponsiveGridLayoutSerializer.ts +++ b/public/app/features/dashboard-scene/serialization/layoutSerializers/ResponsiveGridLayoutSerializer.ts @@ -7,7 +7,7 @@ import { DashboardLayoutManager, LayoutManagerSerializer } from '../../scene/typ import { dashboardSceneGraph } from '../../utils/dashboardSceneGraph'; import { getGridItemKeyForPanelId } from '../../utils/utils'; -import { buildLibraryPanel, buildVizPanel } from './utils'; +import { buildLibraryPanel, buildVizPanel, getConditionalRendering } from './utils'; export class ResponsiveGridLayoutSerializer implements LayoutManagerSerializer { serialize(layoutManager: ResponsiveGridLayoutManager): DashboardV2Spec['layout'] { @@ -35,6 +35,12 @@ export class ResponsiveGridLayoutSerializer implements LayoutManagerSerializer { }, }; + const conditionalRenderingRootGroup = child.state.conditionalRendering?.serialize(); + // Only serialize the conditional rendering if it has items + if (conditionalRenderingRootGroup?.spec.items.length) { + layoutItem.spec.conditionalRendering = conditionalRenderingRootGroup; + } + if (child.state.variableName) { layoutItem.spec.repeat = { mode: 'variable', @@ -62,6 +68,7 @@ export class ResponsiveGridLayoutSerializer implements LayoutManagerSerializer { key: getGridItemKeyForPanelId(panel.spec.id), body: panel.kind === 'LibraryPanel' ? buildLibraryPanel(panel) : buildVizPanel(panel), variableName: item.spec.repeat?.value, + conditionalRendering: getConditionalRendering(item), }); }); diff --git a/public/app/features/dashboard-scene/serialization/layoutSerializers/RowsLayoutSerializer.ts b/public/app/features/dashboard-scene/serialization/layoutSerializers/RowsLayoutSerializer.ts index c2b9980b55c..ef3402cc304 100644 --- a/public/app/features/dashboard-scene/serialization/layoutSerializers/RowsLayoutSerializer.ts +++ b/public/app/features/dashboard-scene/serialization/layoutSerializers/RowsLayoutSerializer.ts @@ -7,7 +7,7 @@ import { RowsLayoutManager } from '../../scene/layout-rows/RowsLayoutManager'; import { LayoutManagerSerializer } from '../../scene/types/DashboardLayoutManager'; import { layoutSerializerRegistry } from './layoutSerializerRegistry'; -import { getLayout } from './utils'; +import { getConditionalRendering, getLayout } from './utils'; export class RowsLayoutSerializer implements LayoutManagerSerializer { serialize(layoutManager: RowsLayoutManager): DashboardV2Spec['layout'] { @@ -28,6 +28,12 @@ export class RowsLayoutSerializer implements LayoutManagerSerializer { }, }; + const conditionalRenderingRootGroup = row.state.conditionalRendering?.serialize(); + // Only serialize the conditional rendering if it has items + if (conditionalRenderingRootGroup?.spec.items.length) { + rowKind.spec.conditionalRendering = conditionalRenderingRootGroup; + } + if (row.state.$behaviors) { for (const behavior of row.state.$behaviors) { if (behavior instanceof RowItemRepeaterBehavior) { @@ -58,11 +64,13 @@ export class RowsLayoutSerializer implements LayoutManagerSerializer { if (row.spec.repeat) { behaviors.push(new RowItemRepeaterBehavior({ variableName: row.spec.repeat.value })); } + return new RowItem({ title: row.spec.title, isCollapsed: row.spec.collapsed, $behaviors: behaviors, layout: layoutSerializerRegistry.get(layout.kind).serializer.deserialize(layout, elements, preload), + conditionalRendering: getConditionalRendering(row), }); }); return new RowsLayoutManager({ rows }); diff --git a/public/app/features/dashboard-scene/serialization/layoutSerializers/utils.ts b/public/app/features/dashboard-scene/serialization/layoutSerializers/utils.ts index 416322e98db..637ce85c7a3 100644 --- a/public/app/features/dashboard-scene/serialization/layoutSerializers/utils.ts +++ b/public/app/features/dashboard-scene/serialization/layoutSerializers/utils.ts @@ -12,12 +12,17 @@ import { import { DataSourceRef } from '@grafana/schema/dist/esm/index.gen'; import { DashboardV2Spec, + ResponsiveGridLayoutItemKind, + RowsLayoutRowKind, LibraryPanelKind, PanelKind, PanelQueryKind, } from '@grafana/schema/dist/esm/schema/dashboard/v2alpha0'; import { MIXED_DATASOURCE_NAME } from 'app/plugins/datasource/mixed/MixedDataSource'; +import { ConditionalRendering } from '../../conditional-rendering/ConditionalRendering'; +import { ConditionalRenderingGroup } from '../../conditional-rendering/ConditionalRenderingGroup'; +import { conditionalRenderingSerializerRegistry } from '../../conditional-rendering/serializers'; import { DashboardDatasourceBehaviour } from '../../scene/DashboardDatasourceBehaviour'; import { LibraryPanelBehavior } from '../../scene/LibraryPanelBehavior'; import { VizPanelLinks, VizPanelLinksMenu } from '../../scene/PanelLinks'; @@ -202,3 +207,18 @@ export function getLayout(sceneState: DashboardLayoutManager): DashboardV2Spec[' } return registryItem.serializer.serialize(sceneState); } + +export function getConditionalRendering(item: RowsLayoutRowKind | ResponsiveGridLayoutItemKind): ConditionalRendering { + if (!item.spec.conditionalRendering) { + return ConditionalRendering.createEmpty(); + } + const rootGroup = conditionalRenderingSerializerRegistry + .get(item.spec.conditionalRendering.kind) + .serializer.deserialize(item.spec.conditionalRendering); + + if (rootGroup && !(rootGroup instanceof ConditionalRenderingGroup)) { + throw new Error(`Conditional rendering must always start with a root group`); + } + + return new ConditionalRendering({ rootGroup: rootGroup }); +} From 2c10b35b339326f04df953f92164a0b76d64d68f Mon Sep 17 00:00:00 2001 From: Matthew Thorning Date: Thu, 13 Mar 2025 11:14:29 +0000 Subject: [PATCH 019/117] GrafanaUI: Use safePolygon close handler for interactive tooltips instead of a delay (#101871) * feat: allow configuration of interactive tooltip delay * add comment explaining interactiveDelay prop * switch approach to using `safePolygon` close handler instead * remove unnecessary object spread from Tooltip component --- packages/grafana-ui/src/components/Tooltip/Tooltip.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/grafana-ui/src/components/Tooltip/Tooltip.tsx b/packages/grafana-ui/src/components/Tooltip/Tooltip.tsx index bd2d02fc348..530d2cf9bdb 100644 --- a/packages/grafana-ui/src/components/Tooltip/Tooltip.tsx +++ b/packages/grafana-ui/src/components/Tooltip/Tooltip.tsx @@ -10,6 +10,7 @@ import { useFocus, useHover, useInteractions, + safePolygon, } from '@floating-ui/react'; import { forwardRef, cloneElement, isValidElement, useCallback, useId, useRef, useState } from 'react'; @@ -67,9 +68,7 @@ export const Tooltip = forwardRef( const tooltipId = useId(); const hover = useHover(context, { - delay: { - close: interactive ? 100 : 0, - }, + handleClose: interactive ? safePolygon() : undefined, move: false, }); const focus = useFocus(context); From f4d43d3ef506517e7cfc915f4c717abd0db6cbc5 Mon Sep 17 00:00:00 2001 From: Jack Baldry Date: Thu, 13 Mar 2025 11:35:16 +0000 Subject: [PATCH 020/117] Lint provisioning file (#102005) * Remove reference to deprecated feature flag * Lint provisioning file Signed-off-by: Jack Baldry * Remove regression --------- Signed-off-by: Jack Baldry Co-authored-by: Kristina Durivage --- .../administration/provisioning/index.md | 561 +++++++++--------- 1 file changed, 277 insertions(+), 284 deletions(-) diff --git a/docs/sources/administration/provisioning/index.md b/docs/sources/administration/provisioning/index.md index b7b776a1774..dcec3f915d7 100644 --- a/docs/sources/administration/provisioning/index.md +++ b/docs/sources/administration/provisioning/index.md @@ -24,26 +24,25 @@ Refer to [Configuration](../../setup-grafana/configure-grafana/) for more inform ### Configuration file locations -- Default configuration from `$WORKING_DIR/conf/defaults.ini` -- Custom configuration from `$WORKING_DIR/conf/custom.ini` -- The custom configuration file path can be overridden using the `--config` parameter +Grafana reads its default configuration from `/conf/defaults.ini`. +By default, Grafana reads custom configuration from `/conf/custom.ini`. +You can override the custom configuration path with the `--config` option. {{< admonition type="note" >}} -If you have installed Grafana using the `deb` or `rpm` -packages, then your configuration file is located at -`/etc/grafana/grafana.ini`. This path is specified in the Grafana -`init.d` script using the `--config` file parameter. +The Deb and RPM packages install the configuration file at `/etc/grafana/grafana.ini`. +The Grafana init.d script sets the `--config` option to that path. {{< /admonition >}} -### Environment variables +### Use environment variables -You can use environment variable interpolation in all three provisioning configuration types. -The allowed syntax is either `$ENV_VAR_NAME` or `${ENV_VAR_NAME}`, and it can be used only for values, not for keys or larger parts -of the configurations. If the environment variable value has a `$` (e.g. `Pa$sw0rd`), use the `$ENV_VAR_NAME` syntax to avoid double expansion. -It's not available in the dashboard's definition files, just the dashboard provisioning -configuration. +You can use environment variable lookups in all provisioning configuration. +The syntax for an environment variable is `$ENV_VAR_NAME` or `${ENV_VAR_NAME}`. +If the environment variable value has a `$` in it (for example, `Pa$sw0rd`), use the `$ENV_VAR_NAME` syntax to avoid double expansion. +You can only use environment variables for configuration values and not for keys or bigger parts of the configuration file structure. -Example: +You can use environment variables in dashboard provisioning configuration but not the dashboard definition files themselves. + +The following example looks up the data source URL port, user, and password using environment variables: ```yaml datasources: @@ -54,40 +53,38 @@ datasources: password: $PASSWORD ``` -You can use `$$` if you have a literal `$` in your value and want to avoid interpolation. +To escape a literal `$` in your provisioning file values, use `$$`. ## Configuration management tools -Currently, we don't provide any scripts or manifests for configuring Grafana. -Rather than spending time learning and creating scripts or manifests for each tool, we think our time is better spent making Grafana easier to provision. -Therefore, we heavily rely on the expertise of the community. +The Grafana community maintains libraries for many popular configuration management tools. -| Tool | Project | -| --------- | ------------------------------------------------------------------------------------------------------------------------------- | -| Puppet | [https://forge.puppet.com/puppet/grafana](https://forge.puppet.com/puppet/grafana) | -| Ansible | [https://github.com/grafana/grafana-ansible-collection](https://github.com/grafana/grafana-ansible-collection) | -| Chef | [https://github.com/sous-chefs/chef-grafana](https://github.com/sous-chefs/chef-grafana) | -| Saltstack | [https://github.com/salt-formulas/salt-formula-grafana](https://github.com/salt-formulas/salt-formula-grafana) | -| Jsonnet | [https://github.com/grafana/grafonnet-lib/](https://github.com/grafana/grafonnet-lib/) | -| NixOS | [services.grafana.provision module](https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/services/monitoring/grafana.nix) | +| Tool | Project | +| --------- | --------------------------------------------------------------------------------------------------------------------------------- | +| Puppet | | +| Ansible | | +| Chef | | +| Saltstack | | +| Jsonnet | ) | +| NixOS | [`services.grafana.provision` module](https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/services/monitoring/grafana.nix) | ## Data sources You can manage data sources in Grafana by adding YAML configuration files in the [`provisioning/datasources`](../../setup-grafana/configure-grafana/#provisioning) directory. -Each configuration file can contain a list of `datasources` to add or update during startup. +Each configuration file contains a list of data sources, under the `datasources` key, to add or update during startup. If the data source already exists, Grafana reconfigures it to match the provisioned configuration file. -The configuration file can also list data sources to automatically delete, called `deleteDatasources`. +You can also list data sources to automatically delete, using the key `deleteDatasources`. Grafana deletes the data sources listed in `deleteDatasources` _before_ adding or updating those in the `datasources` list. You can configure Grafana to automatically delete provisioned data sources when they're removed from the provisioning file. To do so, add `prune: true` to the root of your data source provisioning file. With this configuration, Grafana also removes the provisioned data sources if you remove the provisioning file entirely. -### Running multiple Grafana instances +### Run multiple Grafana instances If you run multiple instances of Grafana, add a version number to each data source in the configuration and increase it when you update the configuration. -Grafana updates only data sources with the same or lower version number than specified in the configuration. +Grafana only updates data sources with the same or lower version number than the one set in the configuration file. This prevents old configurations from overwriting newer ones if you have different versions of the `datasource.yaml` file that don't define version numbers, and then restart instances at the same time. ### Example data source configuration file @@ -176,99 +173,100 @@ For provisioning examples of specific data sources, refer to that [data source's #### JSON data -Not all data sources have the same configuration settings. Only the most common fields are included in examples. -To provision the rest of a data source's settings, include them as a JSON blob in the `jsonData` field. +Not all data sources have the same configuration settings, only the most common ones are fields in the data source provisioning file. +To provision the rest of a data source's settings, include them as JSON in the `jsonData` field. Common settings in the [built-in core data sources](../../datasources/#built-in-core-data-sources) include: +| Name | Type | Data source | Description | +| ------------------------------- | ------- | ---------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `tlsAuth` | boolean | _HTTP\*_, MySQL | Enable TLS authentication using client cert configured in secure JSON data | +| `tlsAuthWithCACert` | boolean | _HTTP\*_, MySQL, PostgreSQL | Enable TLS authentication using CA cert | +| `tlsSkipVerify` | boolean | _HTTP\*_, MySQL, PostgreSQL, MSSQL | Controls whether a client verifies the server's certificate chain and host name. | +| `serverName` | string | _HTTP\*_, MSSQL | Optional. Controls the server name used for certificate common name/subject alternative name verification. Defaults to using the data source URL. | +| `timeout` | string | _HTTP\*_ | Request timeout in seconds. Overrides `dataproxy.timeout` option | +| `graphiteVersion` | string | Graphite | Graphite version | +| `timeInterval` | string | Prometheus, Elasticsearch, InfluxDB, MySQL, PostgreSQL and MSSQL | Lowest interval/step value that should be used for this data source. | +| `httpMode` | string | InfluxDB | HTTP Method. 'GET', 'POST', defaults to GET | +| `maxSeries` | number | InfluxDB | Max number of series/tables that Grafana processes | +| `httpMethod` | string | Prometheus | HTTP Method. 'GET', 'POST', defaults to POST | +| `customQueryParameters` | string | Prometheus | Query parameters to add, as a URL-encoded string. | +| `manageAlerts` | boolean | Prometheus and Loki | Manage alerts via Alerting UI | +| `alertmanagerUid` | string | Prometheus and Loki | UID of Alertmanager that manages Alert for this data source. | +| `timeField` | string | Elasticsearch | Which field that should be used as timestamp | +| `interval` | string | Elasticsearch | Index date time format. nil(No Pattern), 'Hourly', 'Daily', 'Weekly', 'Monthly' or 'Yearly' | +| `logMessageField` | string | Elasticsearch | Which field should be used as the log message | +| `logLevelField` | string | Elasticsearch | Which field should be used to indicate the priority of the log message | +| `maxConcurrentShardRequests` | number | Elasticsearch | Maximum number of concurrent shard requests that each sub-search request executes per node | +| `sigV4Auth` | boolean | Elasticsearch and Prometheus | Enable usage of SigV4 | +| `sigV4AuthType` | string | Elasticsearch and Prometheus | SigV4 auth provider. default/credentials/keys | +| `sigV4ExternalId` | string | Elasticsearch and Prometheus | Optional SigV4 External ID | +| `sigV4AssumeRoleArn` | string | Elasticsearch and Prometheus | Optional SigV4 ARN role to assume | +| `sigV4Region` | string | Elasticsearch and Prometheus | SigV4 AWS region | +| `sigV4Profile` | string | Elasticsearch and Prometheus | Optional SigV4 credentials profile | +| `authType` | string | Amazon CloudWatch | Auth provider. default/credentials/keys | +| `externalId` | string | Amazon CloudWatch | Optional External ID | +| `assumeRoleArn` | string | Amazon CloudWatch | Optional ARN role to assume | +| `defaultRegion` | string | Amazon CloudWatch | Optional default AWS region | +| `customMetricsNamespaces` | string | Amazon CloudWatch | Namespaces of Custom Metrics | +| `profile` | string | Amazon CloudWatch | Optional credentials profile | +| `tsdbVersion` | string | OpenTSDB | Version | +| `tsdbResolution` | string | OpenTSDB | Resolution | +| `sslmode` | string | PostgreSQL | SSL mode. 'disable', 'require', 'verify-ca' or 'verify-full' | +| `tlsConfigurationMethod` | string | PostgreSQL | SSL certificate configuration, either by 'file-path' or 'file-content' | +| `sslRootCertFile` | string | PostgreSQL, MSSQL | SSL server root certificate file, must be readable by the Grafana user | +| `sslCertFile` | string | PostgreSQL | SSL client certificate file, must be readable by the Grafana user | +| `sslKeyFile` | string | PostgreSQL | SSL client key file, must be readable by _only_ the Grafana user | +| `encrypt` | string | MSSQL | Determines SSL encryption handling. Options include: `disable` - data sent between client and server is not encrypted; `false` - data sent between client and server is not encrypted beyond the login packet; `true` - data sent between client and server is encrypted. Default is `false`. | +| `postgresVersion` | number | PostgreSQL | Postgres version as a number (903/904/905/906/1000) meaning v9.3, v9.4, ..., v10 | +| `timescaledb` | boolean | PostgreSQL | Enable usage of TimescaleDB extension | +| `maxOpenConns` | number | MySQL, PostgreSQL and MSSQL | Maximum number of open connections to the database (Grafana v5.4+) | +| `maxIdleConns` | number | MySQL, PostgreSQL and MSSQL | Maximum number of connections in the idle connection pool (Grafana v5.4+) | +| `connMaxLifetime` | number | MySQL, PostgreSQL and MSSQL | Maximum amount of time in seconds a connection may be reused (Grafana v5.4+) | +| `keepCookies` | array | _HTTP\*_ | Cookies that needs to be passed along while communicating with data sources | +| `prometheusVersion` | string | Prometheus | The version of the Prometheus data source, such as `2.37.0`, `2.24.0` | +| `prometheusType` | string | Prometheus | Prometheus database type. Options are `Prometheus`, `Cortex`, `Mimir` or`Thanos`. | +| `cacheLevel` | string | Prometheus | Determines the duration of the browser cache. Valid values include: `Low`, `Medium`, `High`, and `None`. | +| `incrementalQuerying` | string | Prometheus | Experimental: Turn on incremental querying to enhance dashboard reload performance with slow data sources | +| `incrementalQueryOverlapWindow` | string | Prometheus | Experimental: Configure incremental query overlap window. Requires a valid duration string, for example, `180s` or `15m` Default value is `10m` (10 minutes). | +| `disableRecordingRules` | boolean | Prometheus | Experimental: Turn off Prometheus recording rules | +| `implementation` | string | Alertmanager | The implementation of the Alertmanager data source, such as `prometheus`, `cortex` or `mimir` | +| `handleGrafanaManagedAlerts` | boolean | Alertmanager | When enabled, Grafana-managed alerts are sent to this Alertmanager | + {{< admonition type="note" >}} Data sources tagged with _HTTP\*_ communicate using the HTTP protocol, which includes all core data source plugins except MySQL, PostgreSQL, and MSSQL. {{< /admonition >}} -| Name | Type | Data source | Description | -| ----------------------------- | ------- | ---------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| tlsAuth | boolean | _HTTP\*_, MySQL | Enable TLS authentication using client cert configured in secure json data | -| tlsAuthWithCACert | boolean | _HTTP\*_, MySQL, PostgreSQL | Enable TLS authentication using CA cert | -| tlsSkipVerify | boolean | _HTTP\*_, MySQL, PostgreSQL, MSSQL | Controls whether a client verifies the server's certificate chain and host name. | -| serverName | string | _HTTP\*_, MSSQL | Optional. Controls the server name used for certificate common name/subject alternative name verification. Defaults to using the data source URL. | -| timeout | string | _HTTP\*_ | Request timeout in seconds. Overrides dataproxy.timeout option | -| graphiteVersion | string | Graphite | Graphite version | -| timeInterval | string | Prometheus, Elasticsearch, InfluxDB, MySQL, PostgreSQL and MSSQL | Lowest interval/step value that should be used for this data source. | -| httpMode | string | Influxdb | HTTP Method. 'GET', 'POST', defaults to GET | -| maxSeries | number | Influxdb | Max number of series/tables that Grafana processes | -| httpMethod | string | Prometheus | HTTP Method. 'GET', 'POST', defaults to POST | -| customQueryParameters | string | Prometheus | Query parameters to add, as a URL-encoded string. | -| manageAlerts | boolean | Prometheus and Loki | Manage alerts via Alerting UI | -| alertmanagerUid | string | Prometheus and Loki | UID of Alert Manager that manages Alert for this data source. | -| timeField | string | Elasticsearch | Which field that should be used as timestamp | -| interval | string | Elasticsearch | Index date time format. nil(No Pattern), 'Hourly', 'Daily', 'Weekly', 'Monthly' or 'Yearly' | -| logMessageField | string | Elasticsearch | Which field should be used as the log message | -| logLevelField | string | Elasticsearch | Which field should be used to indicate the priority of the log message | -| maxConcurrentShardRequests | number | Elasticsearch | Maximum number of concurrent shard requests that each sub-search request executes per node | -| sigV4Auth | boolean | Elasticsearch and Prometheus | Enable usage of SigV4 | -| sigV4AuthType | string | Elasticsearch and Prometheus | SigV4 auth provider. default/credentials/keys | -| sigV4ExternalId | string | Elasticsearch and Prometheus | Optional SigV4 External ID | -| sigV4AssumeRoleArn | string | Elasticsearch and Prometheus | Optional SigV4 ARN role to assume | -| sigV4Region | string | Elasticsearch and Prometheus | SigV4 AWS region | -| sigV4Profile | string | Elasticsearch and Prometheus | Optional SigV4 credentials profile | -| authType | string | Cloudwatch | Auth provider. default/credentials/keys | -| externalId | string | Cloudwatch | Optional External ID | -| assumeRoleArn | string | Cloudwatch | Optional ARN role to assume | -| defaultRegion | string | Cloudwatch | Optional default AWS region | -| customMetricsNamespaces | string | Cloudwatch | Namespaces of Custom Metrics | -| profile | string | Cloudwatch | Optional credentials profile | -| tsdbVersion | string | OpenTSDB | Version | -| tsdbResolution | string | OpenTSDB | Resolution | -| sslmode | string | PostgreSQL | SSLmode. 'disable', 'require', 'verify-ca' or 'verify-full' | -| tlsConfigurationMethod | string | PostgreSQL | SSL Certificate configuration, either by 'file-path' or 'file-content' | -| sslRootCertFile | string | PostgreSQL, MSSQL | SSL server root certificate file, must be readable by the Grafana user | -| sslCertFile | string | PostgreSQL | SSL client certificate file, must be readable by the Grafana user | -| sslKeyFile | string | PostgreSQL | SSL client key file, must be readable by _only_ the Grafana user | -| encrypt | string | MSSQL | Determines SSL encryption handling. Options include: `disable` - data sent between client and server is not encrypted; `false` - data sent between client and server is not encrypted beyond the login packet; `true` - data sent between client and server is encrypted. Default is `false`. | -| postgresVersion | number | PostgreSQL | Postgres version as a number (903/904/905/906/1000) meaning v9.3, v9.4, ..., v10 | -| timescaledb | boolean | PostgreSQL | Enable usage of TimescaleDB extension | -| maxOpenConns | number | MySQL, PostgreSQL and MSSQL | Maximum number of open connections to the database | -| maxIdleConns | number | MySQL, PostgreSQL and MSSQL | Maximum number of connections in the idle connection pool | -| connMaxLifetime | number | MySQL, PostgreSQL and MSSQL | Maximum amount of time in seconds a connection may be reused | -| keepCookies | array | _HTTP\*_ | Cookies that needs to be passed along while communicating with data sources | -| prometheusVersion | string | Prometheus | The version of the Prometheus data source, such as `2.37.0`, `2.24.0` | -| prometheusType | string | Prometheus | Prometheus database type. Options are `Prometheus`, `Cortex`, `Mimir` or`Thanos`. | -| cacheLevel | string | Prometheus | Determines the duration of the browser cache. Valid values include: `Low`, `Medium`, `High`, and `None`. | -| incrementalQuerying | string | Prometheus | Experimental: Turn on incremental querying to enhance dashboard reload performance with slow data sources | -| incrementalQueryOverlapWindow | string | Prometheus | Experimental: Configure incremental query overlap window. Requires a valid duration string, i.e. `180s` or `15m` Default value is `10m` (10 minutes). | -| disableRecordingRules | boolean | Prometheus | Experimental: Turn off Prometheus recording rules | -| implementation | string | AlertManager | The implementation of the AlertManager data source, such as `prometheus`, `cortex` or `mimir` | -| handleGrafanaManagedAlerts | boolean | AlertManager | When enabled, Grafana-managed alerts are sent to this Alertmanager | - For examples of specific data sources' JSON data, refer to that [data source's documentation](../../datasources/). -#### Secure JSON Data +#### Secure JSON data -Secure JSON data is a map of settings that are encrypted with a [secret key](../../setup-grafana/configure-grafana/#secret_key) from the Grafana configuration. -The encryption hides content from the users of the application. -This should be used for storing the TLS Cert and password that Grafana appends to the request on the server side. +Secure JSON data is a map of settings encrypted with a [secret key](../../setup-grafana/configure-grafana/#secret_key). +The encryption hides the JSON data from the users of Grafana. +You should use secure JSON data to store TLS certificates and passwords for data source HTTP requests. All of these settings are optional. +| Name | Type | Data source | Description | +| ------------------- | ------ | ---------------------------------- | -------------------------------------------------------- | +| `tlsCACert` | string | _HTTP\*_, MySQL, PostgreSQL | CA cert for out going requests | +| `tlsClientCert` | string | _HTTP\*_, MySQL, PostgreSQL | TLS Client cert for outgoing requests | +| `tlsClientKey` | string | _HTTP\*_, MySQL, PostgreSQL | TLS Client key for outgoing requests | +| `password` | string | _HTTP\*_, MySQL, PostgreSQL, MSSQL | password | +| `basicAuthPassword` | string | _HTTP\*_ | password for basic authentication | +| `accessKey` | string | Amazon CloudWatch | Access key for connecting to Amazon CloudWatch | +| `secretKey` | string | Amazon CloudWatch | Secret key for connecting to Amazon CloudWatch | +| `sigV4AccessKey` | string | Elasticsearch and Prometheus | SigV4 access key. Required when using keys auth provider | +| `sigV4SecretKey` | string | Elasticsearch and Prometheus | SigV4 secret key. Required when using keys auth provider | + {{< admonition type="note" >}} -The _HTTP\*_ tag denotes data sources that communicate using the HTTP protocol, including all core data source plugins except MySQL, PostgreSQL, and MS SQL. +The _HTTP\*_ tag denotes data sources that communicate using the HTTP protocol, including all core data source plugins except MySQL, PostgreSQL, and MSSQL. {{< /admonition >}} -| Name | Type | Data source | Description | -| ----------------- | ------ | ---------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| tlsCACert | string | _HTTP\*_, MySQL, PostgreSQL | CA cert for out going requests. You can point directly to your stored cert by using an environment variable following the `$__file{path/to/ca}` format. | -| tlsClientCert | string | _HTTP\*_, MySQL, PostgreSQL | TLS Client cert for outgoing requests. You can point directly to your stored cert by using an environment variable following the `$__file{path/to/cert}` format. | -| tlsClientKey | string | _HTTP\*_, MySQL, PostgreSQL | TLS Client key for outgoing requests. You can point directly to your stored key by using an environment variable following the `$__file{path/to/key}` format. | -| password | string | _HTTP\*_, MySQL, PostgreSQL, MSSQL | password | -| basicAuthPassword | string | _HTTP\*_ | password for basic authentication | -| accessKey | string | Cloudwatch | Access key for connecting to Cloudwatch | -| secretKey | string | Cloudwatch | Secret key for connecting to Cloudwatch | -| sigV4AccessKey | string | Elasticsearch and Prometheus | SigV4 access key. Required when using keys auth provider | -| sigV4SecretKey | string | Elasticsearch and Prometheus | SigV4 secret key. Required when using keys auth provider | - #### Custom HTTP headers for data sources -Data sources managed with provisioning can be configured to add HTTP headers to all requests. +You can add HTTP headers to all requests sent to data sources managed by Grafana provisioning Configure the header name in the `jsonData` field and the header value in `secureJsonData`. +The following example sets the `HeaderName` header to have the value `HeaderValue` and the `Authorization` header to have the value `Bearer XXXXXXXXX`: ```yaml apiVersion: 1 @@ -286,12 +284,12 @@ datasources: ## Plugins You can manage plugin applications in Grafana by adding one or more YAML configuration files in the [`provisioning/plugins`](../../setup-grafana/configure-grafana/#provisioning) directory. -Each configuration file can contain a list of `apps` that update during start up. -Grafana updates each app to match the configuration file. +Each configuration file contains a list of `apps` that Grafana configures during start up. +Grafana configures each app to use the configuration in the file. {{< admonition type="note" >}} This feature enables you to provision plugin configurations, not the plugins themselves. -The plugins must already be installed on the Grafana instance. +You must have already installed the plugin to use plugin configuration provisioning. {{< /admonition >}} ### Example plugin configuration file @@ -321,9 +319,9 @@ apps: ## Dashboards You can manage dashboards in Grafana by adding one or more YAML configuration files in the [`provisioning/dashboards`](../../setup-grafana/configure-grafana/#dashboards) directory. -Each configuration file can contain a list of `dashboards providers` that load dashboards into Grafana from the local filesystem. +Each configuration file contains a list of `providers` that Grafana uses to load dashboards from the local filesystem. -The dashboard provider configuration file looks somewhat like this: +### Example dashboard configuration file ```yaml apiVersion: 1 @@ -352,53 +350,55 @@ providers: foldersFromFilesStructure: true ``` -When Grafana starts, it updates and inserts all dashboards available in the configured path. -Then later on, Grafana polls that path every **updateIntervalSeconds**, looks for updated JSON files, and updates and inserts those into the database. +When Grafana starts, it updates or creates all dashboards found in the configured path. +It later polls that path every `updateIntervalSeconds` for updates to the dashboard files and updates its database. -> **Note:** Dashboards are provisioned to the root level if the `folder` option is missing or empty. +{{< admonition type="note" >}} +Grafana installs dashboards at the root level if you don't set the `folder` field. +{{< /admonition >}} -#### Making changes to a provisioned dashboard +#### Make changes to a provisioned dashboard -While you can change a provisioned dashboard in the Grafana UI, those changes can't be saved back to the provisioning source. -If `allowUiUpdates` is set to `true` and you make changes to a provisioned dashboard, you can `Save` the dashboard, then changes persist to the Grafana database. +You can make changes to a provisioned dashboard in the Grafana UI but its not possible to automatically save the changes back to the provisioning source. +If `allowUiUpdates` is set to `true` and you make changes to a provisioned dashboard, when you save the dashboard, Grafana persists the changes to its database. -{{< admonition type="note" >}} -If a provisioned dashboard is saved from the UI and then later updated from the source, the dashboard stored in the database will always be overwritten. The `version` property in the JSON file won't affect this, even if it's lower than the version of the existing dashboard. +{{< admonition type="caution" >}} +If you save a provisioned dashboard in the UI and then later update the provisioning source, Grafana always overwrites the database dashboard with the one from the provisioning file. +Grafana ignores the `version` property in the JSON file, even if it's lower than the dashboard in the database. +{{< /admonition >}} -If a provisioned dashboard is saved from the UI and the source is removed, the dashboard stored in the database is deleted unless the configuration option `disableDeletion` is set to `true`. +{{< admonition type="caution" >}} +If you save a provisioned dashboard in the UI and remove the provisioning source, Grafana deletes the dashboard in the database unless you have set the option `disableDeletion` to `true`. {{< /admonition >}} -If `allowUiUpdates` is configured to `false`, you are not able to make changes to a provisioned dashboard. When you click `Save`, Grafana brings up a _Cannot save provisioned dashboard_ dialog. The screenshot below illustrates this behavior. +If you set `allowUiUpdates` to `false`, you can't save changes to a provisioned dashboard. +When you try to save changes to a provisioned dashboard, Grafana brings up a _Cannot save provisioned dashboard_ dialog box. -Grafana offers options to export the JSON definition of a dashboard. Either `Copy JSON to Clipboard` or `Save JSON to file` can help you synchronize your dashboard changes back to the provisioning source. +Grafana offers options to export the JSON definition of a dashboard. +Use either **Copy JSON to Clipboard** or **Save JSON to file** to sync your dashboard changes back to the provisioning source. +Grafana removes the `id` field from the dashboard JSON to help the provisioning workflow. -{{< admonition type="note" >}} -The JSON definition in the input field when using `Copy JSON to Clipboard` or `Save JSON to file` has the `id` field automatically removed to aid the provisioning workflow. -{{< /admonition >}} +The following screenshot illustrates this behavior. {{< figure src="/static/img/docs/v51/provisioning_cannot_save_dashboard.png" max-width="500px" class="docs-image--no-shadow" >}} ### Reusable dashboard URLs -If the dashboard in the JSON file contains an [UID](../../dashboards/build-dashboards/view-dashboard-json-model/), Grafana forces insert/update on that UID. -This allows you to migrate dashboards between Grafana instances and provisioning Grafana from configuration without breaking the URLs given because the new dashboard URL uses the UID as identifier. -When Grafana starts, it updates and inserts all dashboards available in the configured folders. -If you modify the file, then the dashboard is also updated. -By default, Grafana deletes dashboards in the database if the file is removed. -You can disable this behavior using the `disableDeletion` setting. +If the dashboard in the JSON file contains an [UID](../../dashboards/build-dashboards/view-dashboard-json-model/), Grafana updates that the dashboard with that UID in the database. +This lets you migrate dashboards between Grafana instances and keep consistent dashboard URLs. +When Grafana starts, it creates or updates all dashboards available in the configured folders. -{{< admonition type="note" >}} -Provisioning allows you to overwrite existing dashboards -which leads to problems if you reuse settings that are supposed to be unique. -Be careful not to reuse the same `title` multiple times within a folder -or `uid` within the same installation as this causes weird behaviors. +{{< admonition type="caution" >}} +You can overwrite existing dashboards with provisioning. + +Be careful not to reuse the same `title` multiple times within a folder or `uid` within the same Grafana instance to avoid inconsistent behavior. {{< /admonition >}} ### Provision folders structure from filesystem to Grafana -If you already store your dashboards using folders in a git repo or on a filesystem, and also you want to have the same folder names in the Grafana menu, you can use `foldersFromFilesStructure` option. +If you already store your dashboards using folders in a Git repository or on a filesystem, and want to have the same folder names in the Grafana menu, use `foldersFromFilesStructure` option. -For example, to replicate these dashboards structure from the filesystem to Grafana, +For example, to replicate the following dashboards structure from the filesystem to Grafana: ``` /etc/dashboards @@ -410,7 +410,7 @@ For example, to replicate these dashboards structure from the filesystem to Graf └── /resources_dashboard.json ``` -You need to specify just this short provision configuration file. +use the following provisioning configuration file: ```yaml apiVersion: 1 @@ -424,14 +424,14 @@ providers: foldersFromFilesStructure: true ``` -In this example, `server` and `application` become new folders in the Grafana menu. +Grafana creates the `server` and `application` folders in the UI. -{{< admonition type="note" >}} -The `folder` and `folderUid` options should be empty or missing to make `foldersFromFilesStructure` work. +To use `foldersFromFilesStructure`, you must unset the `folder` and `folderUid` options. To provision dashboards to the root level, store them in the root of your `path`. -You can't create nested folders structures, where you have folders within folders. +{{< admonition type="note" >}} +This feature doesn't let you create nested folder structures, where you have folders within folders. {{< /admonition >}} ## Alerting @@ -440,212 +440,205 @@ For information on provisioning Grafana Alerting, refer to [Provision Grafana Al ### Supported settings -The following sections detail the supported settings and secure settings for each alert notification type. Secure settings are stored encrypted in the database and you add them to `secure_settings` in the YAML file instead of `settings`. +The following sections detail the supported settings and secure settings for each alert notification type. +In the provisioning YAML use `settings` for settings and `secure_settings` for secure settings. +Grafana encrypts secure settings in the database. #### Alert notification `pushover` -| Name | Secure setting | -| ---------- | -------------- | -| apiToken | yes | -| userKey | yes | -| device | | -| priority | | -| okPriority | | -| retry | | -| expire | | -| sound | | -| okSound | | +| Name | Secure setting | +| ------------ | -------------- | +| `apiToken` | yes | +| `userKey` | yes | +| `device` | | +| `priority` | | +| `okPriority` | | +| `retry` | | +| `expire` | | +| `sound` | | +| `okSound` | | #### Alert notification `discord` -| Name | Secure setting | -| -------------------- | -------------- | -| url | yes | -| avatar_url | | -| content | | -| use_discord_username | | +| Name | Secure setting | +| ---------------------- | -------------- | +| `url` | yes | +| `avatar_url` | | +| `content` | | +| `use_discord_username` | | #### Alert notification `slack` -| Name | Secure setting | -| -------------- | -------------- | -| url | yes | -| recipient | | -| username | | -| icon_emoji | | -| icon_url | | -| uploadImage | | -| mentionUsers | | -| mentionGroups | | -| mentionChannel | | -| token | yes | -| color | | +| Name | Secure setting | +| ---------------- | -------------- | +| `url` | yes | +| `recipient` | | +| `username` | | +| `icon_emoji` | | +| `icon_url` | | +| `uploadImage` | | +| `mentionUsers` | | +| `mentionGroups` | | +| `mentionChannel` | | +| `token` | yes | +| `color` | | #### Alert notification `victorops` -| Name | -| ----------- | -| url | -| autoResolve | +| Name | +| ------------- | +| `url` | +| `autoResolve` | #### Alert notification `kafka` -| Name | -| -------------- | -| kafkaRestProxy | -| kafkaTopic | +| Name | +| ---------------- | +| `kafkaRestProxy` | +| `kafkaTopic` | #### Alert notification `LINE` -| Name | Secure setting | -| ----- | -------------- | -| token | yes | +| Name | Secure setting | +| ------- | -------------- | +| `token` | yes | #### Alert notification `MQTT` -| Name | Secure setting | -| ------------- | -------------- | -| brokerUrl | | -| clientId | | -| topic | | -| messageFormat | | -| username | | -| password | yes | -| retain | | -| qos | | -| tlsConfig | | - -##### TLS config +| Name | Secure setting | +| --------------- | -------------- | +| `brokerUrl` | | +| `clientId` | | +| `topic` | | +| `messageFormat` | | +| `username` | | +| `password` | yes | +| `retain` | | +| `qos` | | +| `tlsConfig` | | -| Name | Secure setting | -| ------------------ | -------------- | -| insecureSkipVerify | | -| clientCertificate | yes | -| clientKey | yes | -| caCertificate | yes | +##### TLS configuration + +| Name | Secure setting | +| -------------------- | -------------- | +| `insecureSkipVerify` | | +| `clientCertificate` | yes | +| `clientKey` | yes | +| `caCertificate` | yes | #### Alert notification `pagerduty` -| Name | Secure setting | -| -------------- | -------------- | -| integrationKey | yes | -| autoResolve | | +| Name | Secure setting | +| ---------------- | -------------- | +| `integrationKey` | yes | +| `autoResolve` | | #### Alert notification `sensu` -| Name | Secure setting | -| -------- | -------------- | -| url | | -| source | | -| handler | | -| username | | -| password | yes | +| Name | Secure setting | +| ---------- | -------------- | +| `url` | | +| `source` | | +| `handler` | | +| `username` | | +| `password` | yes | #### Alert notification `sensugo` -| Name | Secure setting | -| --------- | -------------- | -| url | | -| apikey | yes | -| entity | | -| check | | -| handler | | -| namespace | | +| Name | Secure setting | +| ----------- | -------------- | +| `url` | | +| `apikey` | yes | +| `entity` | | +| `check` | | +| `handler` | | +| `namespace` | | #### Alert notification `prometheus-alertmanager` -| Name | Secure setting | -| ----------------- | -------------- | -| url | | -| basicAuthUser | | -| basicAuthPassword | yes | +| Name | Secure setting | +| ------------------- | -------------- | +| `url` | | +| `basicAuthUser` | | +| `basicAuthPassword` | yes | #### Alert notification `teams` -| Name | -| ---- | -| url | +| Name | Secure setting | +| ----- | -------------- | +| `url` | | #### Alert notification `dingding` -| Name | -| ---- | -| url | +| Name | Secure setting | +| ----- | -------------- | +| `url` | | #### Alert notification `email` -| Name | -| ----------- | -| singleEmail | -| addresses | +| Name | Secure setting | +| ------------- | -------------- | +| `singleEmail` | | +| `addresses` | | #### Alert notification `hipchat` -| Name | -| ------ | -| url | -| apikey | -| roomid | +| Name | Secure setting | +| -------- | -------------- | +| `url` | | +| `apikey` | | +| `roomid` | | #### Alert notification `opsgenie` -| Name | Secure setting | -| ---------------- | -------------- | -| apiKey | yes | -| apiUrl | | -| autoClose | | -| overridePriority | | -| sendTagsAs | | +| Name | Secure setting | +| ------------------ | -------------- | +| `apiKey` | yes | +| `apiUrl` | | +| `autoClose` | | +| `overridePriority` | | +| `sendTagsAs` | | #### Alert notification `telegram` -| Name | Secure setting | -| ----------- | -------------- | -| bottoken | yes | -| chatid | | -| uploadImage | | +| Name | Secure setting | +| ------------- | -------------- | +| `bottoken` | yes | +| `chatid` | | +| `uploadImage` | | #### Alert notification `threema` -| Name | Secure setting | -| ------------ | -------------- | -| gateway_id | | -| recipient_id | | -| api_secret | yes | +| Name | Secure setting | +| -------------- | -------------- | +| `gateway_id` | | +| `recipient_id` | | +| `api_secret` | yes | #### Alert notification `webhook` -| Name | Secure setting | -| ----------- | -------------- | -| url | | -| http_method | | -| username | | -| password | yes | -| tls_config | | - -##### TLS config - -| Name | Secure setting | -| ------------------ | -------------- | -| insecureSkipVerify | | -| clientCertificate | yes | -| clientKey | yes | -| caCertificate | yes | +| Name | Secure setting | +| ------------ | -------------- | +| `url` | | +| `httpMethod` | | +| `username` | | +| `password` | yes | +| `tls_config` | | #### Alert notification `googlechat` -| Name | -| ---- | -| url | +| Name | Secure setting | +| ----- | -------------- | +| `url` | | #### Alert notification `Cisco Webex Teams` -| Name | Secure setting | -| --------- | -------------- | -| message | | -| room_id | | -| api_url | | -| bot_token | yes | +| Name | Secure setting | +| ----------- | -------------- | +| `message` | | +| `room_id` | | +| `api_url` | | +| `bot_token` | yes | ## Grafana Enterprise From 50ff1ae69b354d0695f6cc51eefe27ab791bd8cf Mon Sep 17 00:00:00 2001 From: Josh Hunt Date: Thu, 13 Mar 2025 11:54:57 +0000 Subject: [PATCH 021/117] I18n: Add useT hook for plugin translation API (#102033) * Create placeholder useT function * expose useT() in @grafana/runtime * fix setting useT correctly * example usage of useT * rename hook to useTranslate * fix rename * remove comment --- .betterer.results | 6 +++++- packages/grafana-runtime/src/unstable.ts | 3 +-- packages/grafana-runtime/src/utils/i18n.ts | 21 +++++++++++++++++++ public/app/app.ts | 4 +++- .../app/core/internationalization/index.tsx | 10 +++++++++ .../app/features/bookmarks/BookmarksPage.tsx | 4 +++- 6 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 packages/grafana-runtime/src/utils/i18n.ts diff --git a/.betterer.results b/.betterer.results index 4358fc331ee..fad77bbf86c 100644 --- a/.betterer.results +++ b/.betterer.results @@ -887,7 +887,8 @@ exports[`better eslint`] = { "public/app/app.ts:5381": [ [0, 0, 0, "\'@grafana/runtime/src/components/PanelDataErrorView\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], [0, 0, 0, "\'@grafana/runtime/src/components/PanelRenderer\' import is restricted from being used by a pattern. Import from the public export instead.", "1"], - [0, 0, 0, "\'@grafana/runtime/src/components/PluginPage\' import is restricted from being used by a pattern. Import from the public export instead.", "2"] + [0, 0, 0, "\'@grafana/runtime/src/components/PluginPage\' import is restricted from being used by a pattern. Import from the public export instead.", "2"], + [0, 0, 0, "\'@grafana/runtime/src/unstable\' import is restricted from being used by a pattern. Import from the public export instead.", "3"] ], "public/app/core/TableModel.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], @@ -2883,6 +2884,9 @@ exports[`better eslint`] = { "public/app/features/auth-config/utils/data.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], + "public/app/features/bookmarks/BookmarksPage.tsx:5381": [ + [0, 0, 0, "\'@grafana/runtime/src/unstable\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/features/browse-dashboards/api/browseDashboardsAPI.ts:5381": [ [0, 0, 0, "Do not re-export imported variable (\`@reduxjs/toolkit/query/react\`)", "0"] ], diff --git a/packages/grafana-runtime/src/unstable.ts b/packages/grafana-runtime/src/unstable.ts index 5cf9253a7c4..bc7633502aa 100644 --- a/packages/grafana-runtime/src/unstable.ts +++ b/packages/grafana-runtime/src/unstable.ts @@ -9,5 +9,4 @@ * and be subject to the standard policies */ -// Dummy export to make it a valid module. Remove when we have real exports. -export const unstable = {}; +export { useTranslate as useT, setUseTranslateHook } from './utils/i18n'; diff --git a/packages/grafana-runtime/src/utils/i18n.ts b/packages/grafana-runtime/src/utils/i18n.ts new file mode 100644 index 00000000000..eb1160197ab --- /dev/null +++ b/packages/grafana-runtime/src/utils/i18n.ts @@ -0,0 +1,21 @@ +type UseTranslateHook = () => (id: string, defaultMessage: string, values?: Record) => string; + +/** + * Provides a i18next-compatible translation function. + */ +export let useTranslate: UseTranslateHook = () => { + // Fallback implementation that should be overridden by setUseT + const errorMessage = 'useT is not set. useT must not be called before Grafana is initialized.'; + if (process.env.NODE_ENV === 'development') { + throw new Error(errorMessage); + } + + console.error(errorMessage); + return (id: string, defaultMessage: string) => { + return defaultMessage; + }; +}; + +export function setUseTranslateHook(useTParam: UseTranslateHook) { + useTranslate = useTParam; +} diff --git a/public/app/app.ts b/public/app/app.ts index f576ba415a0..f9e65818a3d 100644 --- a/public/app/app.ts +++ b/public/app/app.ts @@ -45,6 +45,7 @@ import { import { setPanelDataErrorView } from '@grafana/runtime/src/components/PanelDataErrorView'; import { setPanelRenderer } from '@grafana/runtime/src/components/PanelRenderer'; import { setPluginPage } from '@grafana/runtime/src/components/PluginPage'; +import { setUseTranslateHook } from '@grafana/runtime/src/unstable'; import config, { updateConfig } from 'app/core/config'; import { getStandardTransformers } from 'app/features/transformers/standardTransformers'; @@ -58,7 +59,7 @@ import { getAllOptionEditors, getAllStandardFieldConfigs } from './core/componen import { PluginPage } from './core/components/Page/PluginPage'; import { GrafanaContextType, useChromeHeaderHeight, useReturnToPreviousInternal } from './core/context/GrafanaContext'; import { initializeCrashDetection } from './core/crash'; -import { initializeI18n } from './core/internationalization'; +import { initializeI18n, useTranslateInternal } from './core/internationalization'; import { setMonacoEnv } from './core/monacoEnv'; import { interceptLinkClicks } from './core/navigation/patch/interceptLinkClicks'; import { CorrelationsService } from './core/services/CorrelationsService'; @@ -253,6 +254,7 @@ export class GrafanaApp { setReturnToPreviousHook(useReturnToPreviousInternal); setChromeHeaderHeightHook(useChromeHeaderHeight); + setUseTranslateHook(useTranslateInternal); if (config.featureToggles.crashDetection) { initializeCrashDetection(); diff --git a/public/app/core/internationalization/index.tsx b/public/app/core/internationalization/index.tsx index e3dbfb28270..538a643b9af 100644 --- a/public/app/core/internationalization/index.tsx +++ b/public/app/core/internationalization/index.tsx @@ -72,6 +72,8 @@ export const Trans = (props: TransProps): ReactElement => { * This is a simple wrapper over i18n.t() to provide default namespaces and enforce a consistent API. * Note: Don't use this in the top level module scope. This wrapper needs initialization, which is done during Grafana * startup, and it will throw if used before. + * + * This will soon be deprecated in favor of useT() * @param id ID of the translation string * @param defaultMessage Default message to use if the translation is missing * @param values Values to be interpolated into the string @@ -111,3 +113,11 @@ export function getI18next() { return i18nInstance || i18n; } + +// We want to move to a react-only API for translations. +// This hook doesn't do much now, but we want it to define the API for plugins. +// Perhaps in the future this will use useTranslation from react-i18next or something else +// from context +export function useTranslateInternal() { + return t; +} diff --git a/public/app/features/bookmarks/BookmarksPage.tsx b/public/app/features/bookmarks/BookmarksPage.tsx index 810baa17ed9..7d172b66d67 100644 --- a/public/app/features/bookmarks/BookmarksPage.tsx +++ b/public/app/features/bookmarks/BookmarksPage.tsx @@ -1,15 +1,17 @@ import { css } from '@emotion/css'; import { GrafanaTheme2, NavModelItem } from '@grafana/data'; +import { useT } from '@grafana/runtime/src/unstable'; import { EmptyState, useStyles2 } from '@grafana/ui'; import { usePinnedItems } from 'app/core/components/AppChrome/MegaMenu/hooks'; import { findByUrl } from 'app/core/components/AppChrome/MegaMenu/utils'; import { NavLandingPageCard } from 'app/core/components/NavLandingPage/NavLandingPageCard'; import { Page } from 'app/core/components/Page/Page'; -import { t, Trans } from 'app/core/internationalization'; +import { Trans } from 'app/core/internationalization'; import { useSelector } from 'app/types'; export function BookmarksPage() { + const t = useT(); const styles = useStyles2(getStyles); const pinnedItems = usePinnedItems(); const navTree = useSelector((state) => state.navBarTree); From 2c1bc1bb7c8b860687faa87c30f85a6b0b0619c9 Mon Sep 17 00:00:00 2001 From: Tom Ratcliffe Date: Thu, 13 Mar 2025 12:48:06 +0000 Subject: [PATCH 022/117] Alerting: Fix DataQuery and DataSourceRef deprecated imports in alerting code (#102095) Fix DataQuery and DataSourceRef deprecated imports in alerting code --- .../app/features/alerting/unified/GrafanaRuleQueryViewer.tsx | 3 ++- .../unified/components/rule-editor/ExpressionEditor.tsx | 3 ++- .../alerting/unified/components/rule-editor/QueryRows.tsx | 2 +- .../rule-editor/query-and-alert-condition/reducer.ts | 2 +- .../central-state-history/CentralHistoryRuntimeDataSource.ts | 3 ++- public/app/features/alerting/unified/utils/rule-form.ts | 4 +--- 6 files changed, 9 insertions(+), 8 deletions(-) diff --git a/public/app/features/alerting/unified/GrafanaRuleQueryViewer.tsx b/public/app/features/alerting/unified/GrafanaRuleQueryViewer.tsx index 10126744321..b591ece380d 100644 --- a/public/app/features/alerting/unified/GrafanaRuleQueryViewer.tsx +++ b/public/app/features/alerting/unified/GrafanaRuleQueryViewer.tsx @@ -2,9 +2,10 @@ import { css, cx } from '@emotion/css'; import { keyBy, startCase, uniqueId } from 'lodash'; import * as React from 'react'; -import { DataSourceInstanceSettings, DataSourceRef, GrafanaTheme2, PanelData, urlUtil } from '@grafana/data'; +import { DataSourceInstanceSettings, GrafanaTheme2, PanelData, urlUtil } from '@grafana/data'; import { secondsToHms } from '@grafana/data/src/datetime/rangeutil'; import { config } from '@grafana/runtime'; +import { DataSourceRef } from '@grafana/schema'; import { Preview } from '@grafana/sql/src/components/visual-query-builder/Preview'; import { Alert, Badge, ErrorBoundaryAlert, LinkButton, Stack, Text, useStyles2 } from '@grafana/ui'; import { CombinedRule } from 'app/types/unified-alerting'; diff --git a/public/app/features/alerting/unified/components/rule-editor/ExpressionEditor.tsx b/public/app/features/alerting/unified/components/rule-editor/ExpressionEditor.tsx index 66d191dce5a..ab7f1f5f36c 100644 --- a/public/app/features/alerting/unified/components/rule-editor/ExpressionEditor.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/ExpressionEditor.tsx @@ -3,9 +3,10 @@ import { noop } from 'lodash'; import { useCallback, useMemo } from 'react'; import { useAsync } from 'react-use'; -import { CoreApp, DataQuery, DataSourcePluginContextProvider, GrafanaTheme2, LoadingState } from '@grafana/data'; +import { CoreApp, DataSourcePluginContextProvider, GrafanaTheme2, LoadingState } from '@grafana/data'; import { PromQuery } from '@grafana/prometheus'; import { getDataSourceSrv } from '@grafana/runtime'; +import { DataQuery } from '@grafana/schema'; import { Alert, Button, useStyles2 } from '@grafana/ui'; import { LokiQuery } from 'app/plugins/datasource/loki/types'; diff --git a/public/app/features/alerting/unified/components/rule-editor/QueryRows.tsx b/public/app/features/alerting/unified/components/rule-editor/QueryRows.tsx index 92f8bb020d5..08c67ebf3d2 100644 --- a/public/app/features/alerting/unified/components/rule-editor/QueryRows.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/QueryRows.tsx @@ -3,7 +3,6 @@ import { omit } from 'lodash'; import { PureComponent, useState } from 'react'; import { - DataQuery, DataSourceInstanceSettings, LoadingState, PanelData, @@ -12,6 +11,7 @@ import { rangeUtil, } from '@grafana/data'; import { getDataSourceSrv } from '@grafana/runtime'; +import { DataQuery } from '@grafana/schema'; import { Button, Card, Icon, Stack } from '@grafana/ui'; import { QueryOperationRow } from 'app/core/components/QueryOperationRow/QueryOperationRow'; import { getDatasourceSrv } from 'app/features/plugins/datasource_srv'; diff --git a/public/app/features/alerting/unified/components/rule-editor/query-and-alert-condition/reducer.ts b/public/app/features/alerting/unified/components/rule-editor/query-and-alert-condition/reducer.ts index e54506ebcc6..aab9e184a56 100644 --- a/public/app/features/alerting/unified/components/rule-editor/query-and-alert-condition/reducer.ts +++ b/public/app/features/alerting/unified/components/rule-editor/query-and-alert-condition/reducer.ts @@ -1,7 +1,6 @@ import { createAction, createReducer, original } from '@reduxjs/toolkit'; import { - DataQuery, ReducerID, RelativeTimeRange, getDataSourceRef, @@ -10,6 +9,7 @@ import { rangeUtil, } from '@grafana/data'; import { getDataSourceSrv } from '@grafana/runtime'; +import { DataQuery } from '@grafana/schema'; import { dataSource as expressionDatasource } from 'app/features/expressions/ExpressionDatasource'; import { isExpressionQuery } from 'app/features/expressions/guards'; import { ExpressionDatasourceUID, ExpressionQuery, ExpressionQueryType } from 'app/features/expressions/types'; diff --git a/public/app/features/alerting/unified/components/rules/central-state-history/CentralHistoryRuntimeDataSource.ts b/public/app/features/alerting/unified/components/rules/central-state-history/CentralHistoryRuntimeDataSource.ts index b6fef8062f4..3013b097e16 100644 --- a/public/app/features/alerting/unified/components/rules/central-state-history/CentralHistoryRuntimeDataSource.ts +++ b/public/app/features/alerting/unified/components/rules/central-state-history/CentralHistoryRuntimeDataSource.ts @@ -1,8 +1,9 @@ import { useEffect, useMemo } from 'react'; -import { DataQuery, DataQueryRequest, DataQueryResponse, TestDataSourceResponse } from '@grafana/data'; +import { DataQueryRequest, DataQueryResponse, TestDataSourceResponse } from '@grafana/data'; import { getTemplateSrv } from '@grafana/runtime'; import { RuntimeDataSource, sceneUtils } from '@grafana/scenes'; +import { DataQuery } from '@grafana/schema'; import { getTimeSrv } from 'app/features/dashboard/services/TimeSrv'; import { dispatch } from 'app/store/store'; diff --git a/public/app/features/alerting/unified/utils/rule-form.ts b/public/app/features/alerting/unified/utils/rule-form.ts index 7a95be75c1a..194b7bec552 100644 --- a/public/app/features/alerting/unified/utils/rule-form.ts +++ b/public/app/features/alerting/unified/utils/rule-form.ts @@ -1,7 +1,5 @@ import { - DataQuery, DataSourceInstanceSettings, - DataSourceRef, IntervalValues, RelativeTimeRange, ScopedVars, @@ -14,7 +12,7 @@ import { PromQuery } from '@grafana/prometheus'; import { config, getDataSourceSrv } from '@grafana/runtime'; import { ExpressionDatasourceRef } from '@grafana/runtime/src/utils/DataSourceWithBackend'; import { VizPanel, sceneGraph } from '@grafana/scenes'; -import { DataSourceJsonData } from '@grafana/schema'; +import { DataQuery, DataSourceJsonData, DataSourceRef } from '@grafana/schema'; import { DashboardModel } from 'app/features/dashboard/state/DashboardModel'; import { PanelModel } from 'app/features/dashboard/state/PanelModel'; import { From d6c97bd6c964a9b22fad77f6b652b3fc9f944cff Mon Sep 17 00:00:00 2001 From: Josh Hunt Date: Thu, 13 Mar 2025 12:49:49 +0000 Subject: [PATCH 023/117] I18n: Add useT/useTranslate PR feedback that got missed (#102098) I18n: Add PR feedback that got missed --- packages/grafana-runtime/src/unstable.ts | 2 +- packages/grafana-runtime/src/utils/i18n.ts | 6 +++--- public/app/core/internationalization/index.tsx | 2 +- public/app/features/bookmarks/BookmarksPage.tsx | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/grafana-runtime/src/unstable.ts b/packages/grafana-runtime/src/unstable.ts index bc7633502aa..84075dbb08a 100644 --- a/packages/grafana-runtime/src/unstable.ts +++ b/packages/grafana-runtime/src/unstable.ts @@ -9,4 +9,4 @@ * and be subject to the standard policies */ -export { useTranslate as useT, setUseTranslateHook } from './utils/i18n'; +export { useTranslate, setUseTranslateHook } from './utils/i18n'; diff --git a/packages/grafana-runtime/src/utils/i18n.ts b/packages/grafana-runtime/src/utils/i18n.ts index eb1160197ab..f67f63316e5 100644 --- a/packages/grafana-runtime/src/utils/i18n.ts +++ b/packages/grafana-runtime/src/utils/i18n.ts @@ -5,7 +5,7 @@ type UseTranslateHook = () => (id: string, defaultMessage: string, values?: Reco */ export let useTranslate: UseTranslateHook = () => { // Fallback implementation that should be overridden by setUseT - const errorMessage = 'useT is not set. useT must not be called before Grafana is initialized.'; + const errorMessage = 'useTranslate is not set. useTranslate must not be called before Grafana is initialized.'; if (process.env.NODE_ENV === 'development') { throw new Error(errorMessage); } @@ -16,6 +16,6 @@ export let useTranslate: UseTranslateHook = () => { }; }; -export function setUseTranslateHook(useTParam: UseTranslateHook) { - useTranslate = useTParam; +export function setUseTranslateHook(hook: UseTranslateHook) { + useTranslate = hook; } diff --git a/public/app/core/internationalization/index.tsx b/public/app/core/internationalization/index.tsx index 538a643b9af..4e541b170c6 100644 --- a/public/app/core/internationalization/index.tsx +++ b/public/app/core/internationalization/index.tsx @@ -73,7 +73,7 @@ export const Trans = (props: TransProps): ReactElement => { * Note: Don't use this in the top level module scope. This wrapper needs initialization, which is done during Grafana * startup, and it will throw if used before. * - * This will soon be deprecated in favor of useT() + * This will soon be deprecated in favor of useTranslate() * @param id ID of the translation string * @param defaultMessage Default message to use if the translation is missing * @param values Values to be interpolated into the string diff --git a/public/app/features/bookmarks/BookmarksPage.tsx b/public/app/features/bookmarks/BookmarksPage.tsx index 7d172b66d67..067b52e3d34 100644 --- a/public/app/features/bookmarks/BookmarksPage.tsx +++ b/public/app/features/bookmarks/BookmarksPage.tsx @@ -1,7 +1,7 @@ import { css } from '@emotion/css'; import { GrafanaTheme2, NavModelItem } from '@grafana/data'; -import { useT } from '@grafana/runtime/src/unstable'; +import { useTranslate } from '@grafana/runtime/src/unstable'; import { EmptyState, useStyles2 } from '@grafana/ui'; import { usePinnedItems } from 'app/core/components/AppChrome/MegaMenu/hooks'; import { findByUrl } from 'app/core/components/AppChrome/MegaMenu/utils'; @@ -11,7 +11,7 @@ import { Trans } from 'app/core/internationalization'; import { useSelector } from 'app/types'; export function BookmarksPage() { - const t = useT(); + const t = useTranslate(); const styles = useStyles2(getStyles); const pinnedItems = usePinnedItems(); const navTree = useSelector((state) => state.navBarTree); From 85a3ae2d072740001e362b4f5f472bfa297f4121 Mon Sep 17 00:00:00 2001 From: Tom Ratcliffe Date: Thu, 13 Mar 2025 13:17:05 +0000 Subject: [PATCH 024/117] Chore: Add heuristic approach to fixing untranslated text with eslint rule (#101561) * Add heuristic approach to fixing untranslated text with eslint rule * Update logic of how we track and report untranslated strings so we can prevent autofixes * Update betterer to reflect different reporting of untranslated text * Move logic for rule to utils and change to suggest instead of fix * Update tests to cope with suggest instead of fix * Remove commented out `only` * Add config to allow force fixing * Fix type errors and improve shouldFix logic --- .betterer.eslint.config.js | 11 +- .betterer.results | 406 ++++------------ .../rules/no-untranslated-strings.cjs | 105 +++- .../rules/translation-utils.cjs | 310 ++++++++++++ .../tests/no-untranslated-strings.test.js | 453 ++++++++++++++++++ 5 files changed, 963 insertions(+), 322 deletions(-) create mode 100644 packages/grafana-eslint-rules/rules/translation-utils.cjs create mode 100644 packages/grafana-eslint-rules/tests/no-untranslated-strings.test.js diff --git a/.betterer.eslint.config.js b/.betterer.eslint.config.js index 349ee612837..32f06b160a4 100644 --- a/.betterer.eslint.config.js +++ b/.betterer.eslint.config.js @@ -112,7 +112,16 @@ module.exports = [ files: ['public/**/*.tsx', 'packages/grafana-ui/**/*.tsx'], ignores: ['public/app/plugins/**', '**/*.story.tsx', '**/*.{test,spec}.{ts,tsx}', '**/__mocks__/', 'public/test'], rules: { - '@grafana/no-untranslated-strings': 'error', + '@grafana/no-untranslated-strings': [ + 'error', + { + forceFix: [ + // Add paths here that are happy to be auto fixed by this rule, + // for example + // 'public/app/features/alerting' + ], + }, + ], '@grafana/no-translation-top-level': 'error', }, }, diff --git a/.betterer.results b/.betterer.results index fad77bbf86c..52b3e8a45c2 100644 --- a/.betterer.results +++ b/.betterer.results @@ -1423,10 +1423,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "6"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "7"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] ], "public/app/features/alerting/unified/Settings.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -1442,8 +1439,7 @@ exports[`better eslint`] = { ], "public/app/features/alerting/unified/components/AlertLabels.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], "public/app/features/alerting/unified/components/AnnotationDetailsField.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] @@ -1459,15 +1455,11 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] ], "public/app/features/alerting/unified/components/InvalidIntervalWarning.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], "public/app/features/alerting/unified/components/MoreButton.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -1482,9 +1474,7 @@ exports[`better eslint`] = { "public/app/features/alerting/unified/components/Provisioning.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] ], "public/app/features/alerting/unified/components/RuleLocation.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] @@ -1525,10 +1515,7 @@ exports[`better eslint`] = { "public/app/features/alerting/unified/components/alert-groups/MatcherFilter.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] ], "public/app/features/alerting/unified/components/alertmanager-entities/MuteTimingsSelector.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -1608,10 +1595,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "6"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "7"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] ], "public/app/features/alerting/unified/components/export/GrafanaModifyExport.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -1662,8 +1646,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "9"], [0, 0, 0, "No untranslated strings. Wrap text with ", "10"], [0, 0, 0, "No untranslated strings. Wrap text with ", "11"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "12"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "13"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "12"] ], "public/app/features/alerting/unified/components/extensions/AlertInstanceExtensionPoint.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] @@ -1789,8 +1772,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "6"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "5"] ], "public/app/features/alerting/unified/components/panel-alerts-tab/NewRuleFromPanelButton.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -1834,9 +1816,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "7"], [0, 0, 0, "No untranslated strings. Wrap text with ", "8"], [0, 0, 0, "No untranslated strings. Wrap text with ", "9"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "10"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "11"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "12"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "10"] ], "public/app/features/alerting/unified/components/receivers/TemplateForm.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -1917,9 +1897,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "6"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] ], "public/app/features/alerting/unified/components/receivers/form/fields/KeyValueMapInput.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], @@ -1972,8 +1950,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "6"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "7"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "8"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "7"] ], "public/app/features/alerting/unified/components/rule-editor/AnnotationKeyInput.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] @@ -2016,11 +1993,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "8"], [0, 0, 0, "No untranslated strings. Wrap text with ", "9"], [0, 0, 0, "No untranslated strings. Wrap text with ", "10"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "11"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "12"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "13"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "14"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "15"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "11"] ], "public/app/features/alerting/unified/components/rule-editor/ExpressionEditor.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], @@ -2066,12 +2039,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], [0, 0, 0, "No untranslated strings. Wrap text with ", "6"], [0, 0, 0, "No untranslated strings. Wrap text with ", "7"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "8"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "9"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "10"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "11"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "12"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "13"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "8"] ], "public/app/features/alerting/unified/components/rule-editor/PreviewRule.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -2102,9 +2070,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "6"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] ], "public/app/features/alerting/unified/components/rule-editor/RecordingRuleEditor.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] @@ -2121,9 +2087,7 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] ], "public/app/features/alerting/unified/components/rule-editor/VizWrapper.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] @@ -2160,11 +2124,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"], [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "6"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "7"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "8"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "9"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "10"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "6"] ], "public/app/features/alerting/unified/components/rule-editor/dag.test.ts:5381": [ [0, 0, 0, "\'@grafana/runtime/src/utils/DataSourceWithBackend\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] @@ -2249,16 +2209,13 @@ exports[`better eslint`] = { [0, 0, 0, "\'@grafana/runtime/src/services/__mocks__/dataSourceSrv\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] ], "public/app/features/alerting/unified/components/rule-editor/rule-types/GrafanaManagedAlert.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], "public/app/features/alerting/unified/components/rule-editor/rule-types/MimirOrLokiAlert.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], "public/app/features/alerting/unified/components/rule-editor/rule-types/MimirOrLokiRecordingRule.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], "public/app/features/alerting/unified/components/rule-editor/rule-types/RuleTypePicker.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] @@ -2308,9 +2265,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] ], "public/app/features/alerting/unified/components/rules/CloudRules.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -2383,9 +2338,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"] ], "public/app/features/alerting/unified/components/rules/RuleConfigStatus.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], "public/app/features/alerting/unified/components/rules/RuleDetails.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -2415,10 +2368,7 @@ exports[`better eslint`] = { ], "public/app/features/alerting/unified/components/rules/RuleDetailsMatchingInstances.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], "public/app/features/alerting/unified/components/rules/RuleHealth.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] @@ -2431,13 +2381,10 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], [0, 0, 0, "No untranslated strings. Wrap text with ", "6"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "7"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "8"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "9"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "7"] ], "public/app/features/alerting/unified/components/rules/RuleListStateSection.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], "public/app/features/alerting/unified/components/rules/RuleState.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], @@ -2477,18 +2424,14 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "20"], [0, 0, 0, "No untranslated strings. Wrap text with ", "21"], [0, 0, 0, "No untranslated strings. Wrap text with ", "22"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "23"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "24"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "25"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "26"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "23"] ], "public/app/features/alerting/unified/components/rules/central-state-history/utils.ts:5381": [ [0, 0, 0, "\'@grafana/data/src/field/fieldComparers\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] ], "public/app/features/alerting/unified/components/rules/state-history/LogRecordViewer.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], "public/app/features/alerting/unified/components/rules/state-history/LokiStateHistory.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -2498,16 +2441,14 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], [0, 0, 0, "No untranslated strings. Wrap text with ", "6"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "7"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "8"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "7"] ], "public/app/features/alerting/unified/components/rules/state-history/StateHistory.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] ], "public/app/features/alerting/unified/components/rules/state-history/useRuleHistoryRecords.tsx:5381": [ [0, 0, 0, "\'@grafana/data/src/field/fieldComparers\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] @@ -2601,8 +2542,7 @@ exports[`better eslint`] = { "public/app/features/alerting/unified/components/silences/SilencesFilter.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] ], "public/app/features/alerting/unified/components/silences/SilencesTable.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -2629,11 +2569,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "12"], [0, 0, 0, "No untranslated strings. Wrap text with ", "13"], [0, 0, 0, "No untranslated strings. Wrap text with ", "14"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "15"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "16"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "17"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "18"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "19"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "15"] ], "public/app/features/alerting/unified/home/Home.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -2642,8 +2578,7 @@ exports[`better eslint`] = { ], "public/app/features/alerting/unified/home/Insights.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], "public/app/features/alerting/unified/home/PluginIntegrations.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] @@ -2783,8 +2718,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] ], "public/app/features/annotations/events_processing.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] @@ -2836,16 +2770,12 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "6"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "7"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "8"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "6"] ], "public/app/features/auth-config/AuthProvidersListPage.tsx:5381": [ [0, 0, 0, "\'@grafana/data/src/types/config\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] ], "public/app/features/auth-config/ProviderConfigForm.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -2872,11 +2802,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "6"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "7"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "8"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] ], "public/app/features/auth-config/index.ts:5381": [ [0, 0, 0, "Do not use export all (\`export * from ...\`)", "0"] @@ -2929,11 +2855,7 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use export all (\`export * from ...\`)", "0"] ], "public/app/features/connections/pages/DataSourceDetailsPage.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], "public/app/features/connections/pages/index.tsx:5381": [ [0, 0, 0, "Do not re-export imported variable (\`./AddNewConnectionPage\`)", "0"], @@ -2957,9 +2879,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "6"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] ], "public/app/features/connections/tabs/ConnectData/NoAccessModal/index.tsx:5381": [ [0, 0, 0, "Do not use export all (\`export * from ...\`)", "0"] @@ -3021,11 +2941,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "13"], [0, 0, 0, "No untranslated strings. Wrap text with ", "14"], [0, 0, 0, "No untranslated strings. Wrap text with ", "15"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "16"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "17"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "18"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "19"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "20"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "16"] ], "public/app/features/dashboard-scene/inspect/HelpWizard/utils.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] @@ -3105,8 +3021,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "6"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "7"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "6"] ], "public/app/features/dashboard-scene/saving/DashboardPrompt.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -3147,19 +3062,13 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "14"], [0, 0, 0, "No untranslated strings. Wrap text with ", "15"], [0, 0, 0, "No untranslated strings. Wrap text with ", "16"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "17"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "18"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "19"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "17"] ], "public/app/features/dashboard-scene/saving/SaveProvisionedDashboardForm.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "6"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "7"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] ], "public/app/features/dashboard-scene/saving/getDashboardChanges.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], @@ -3216,10 +3125,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "6"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] ], "public/app/features/dashboard-scene/settings/JsonModelEditView.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -3227,9 +3133,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "6"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "7"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "5"] ], "public/app/features/dashboard-scene/settings/annotations/AnnotationSettingsEdit.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -3329,9 +3233,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] ], "public/app/features/dashboard-scene/settings/variables/components/GroupByVariableForm.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -3357,10 +3259,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "6"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "7"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] ], "public/app/features/dashboard-scene/settings/variables/components/SelectionOptionsForm.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -3388,8 +3287,7 @@ exports[`better eslint`] = { ], "public/app/features/dashboard-scene/settings/version-history/RevertDashboardModal.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], "public/app/features/dashboard-scene/settings/version-history/VersionHistoryButtons.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], @@ -3399,9 +3297,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] ], "public/app/features/dashboard-scene/settings/version-history/VersionHistoryHeader.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -3563,9 +3459,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] ], "public/app/features/dashboard/components/DashboardRow/index.ts:5381": [ [0, 0, 0, "Do not re-export imported variable (\`./DashboardRow\`)", "0"] @@ -3588,8 +3482,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] ], "public/app/features/dashboard/components/GenAI/MinimalisticPagination.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -3610,9 +3503,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "10"], [0, 0, 0, "No untranslated strings. Wrap text with ", "11"], [0, 0, 0, "No untranslated strings. Wrap text with ", "12"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "13"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "14"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "15"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "13"] ], "public/app/features/dashboard/components/Inspector/PanelInspector.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] @@ -3732,12 +3623,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], [0, 0, 0, "No untranslated strings. Wrap text with ", "6"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "7"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "8"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "9"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "10"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "11"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "12"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "7"] ], "public/app/features/dashboard/components/SaveDashboard/UnsavedChangesModal.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -3771,11 +3657,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "6"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "7"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "8"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] ], "public/app/features/dashboard/components/SaveDashboard/useDashboardSave.tsx:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] @@ -3839,9 +3721,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "6"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] ], "public/app/features/dashboard/components/TransformationsEditor/TransformationPickerNg.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -3860,16 +3740,13 @@ exports[`better eslint`] = { ], "public/app/features/dashboard/components/VersionHistory/RevertDashboardModal.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], "public/app/features/dashboard/components/VersionHistory/VersionHistoryComparison.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] ], "public/app/features/dashboard/components/VersionHistory/VersionHistoryTable.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -3895,8 +3772,7 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "0"] ], "public/app/features/dashboard/containers/NewDashboardWithDS.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], "public/app/features/dashboard/containers/PublicDashboardPage.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] @@ -4076,11 +3952,7 @@ exports[`better eslint`] = { [0, 0, 0, "\'@grafana/data/src/types/config\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "6"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "7"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] ], "public/app/features/datasources/components/DashboardsTable.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -4231,9 +4103,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "6"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] ], "public/app/features/dimensions/editors/ValueMappingsEditor/ValueMappingsEditorModal.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -4290,8 +4160,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "7"], [0, 0, 0, "No untranslated strings. Wrap text with ", "8"], [0, 0, 0, "No untranslated strings. Wrap text with ", "9"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "10"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "11"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "10"] ], "public/app/features/explore/CorrelationTransformationAddModal.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -4331,8 +4200,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], "public/app/features/explore/FeatureTogglePage.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], "public/app/features/explore/LiveTailButton.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], @@ -4342,8 +4210,7 @@ exports[`better eslint`] = { "public/app/features/explore/Logs/LiveLogs.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] ], "public/app/features/explore/Logs/Logs.test.tsx:5381": [ [0, 0, 0, "\'@grafana/data/src/transformations/transformers/organize\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] @@ -4399,8 +4266,7 @@ exports[`better eslint`] = { ], "public/app/features/explore/Logs/LogsTableMultiSelect.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], "public/app/features/explore/Logs/LogsTableNavField.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -4434,8 +4300,7 @@ exports[`better eslint`] = { ], "public/app/features/explore/NodeGraph/NodeGraphContainer.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], "public/app/features/explore/PrometheusListView/RawListContainer.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -4444,8 +4309,7 @@ exports[`better eslint`] = { ], "public/app/features/explore/PrometheusListView/RawListItem.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], "public/app/features/explore/PrometheusListView/RawListItemAttributes.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], @@ -4490,8 +4354,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], [0, 0, 0, "No untranslated strings. Wrap text with ", "6"], [0, 0, 0, "No untranslated strings. Wrap text with ", "7"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "8"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "9"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "8"] ], "public/app/features/explore/TraceView/components/TracePageHeader/SearchBar/TracePageSearchBar.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -4540,16 +4403,13 @@ exports[`better eslint`] = { "public/app/features/explore/TraceView/components/TracePageHeader/TracePageHeader.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] ], "public/app/features/explore/TraceView/components/TracePageHeader/index.tsx:5381": [ [0, 0, 0, "Do not re-export imported variable (\`./TracePageHeader\`)", "0"] ], "public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanBar.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], "public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/AccordianKeyValues.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] @@ -4557,21 +4417,16 @@ exports[`better eslint`] = { "public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/AccordianLogs.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] ], "public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/AccordianReferences.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] ], "public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/AccordianText.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], "public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/SpanFlameGraph.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] @@ -4746,12 +4601,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "11"], [0, 0, 0, "No untranslated strings. Wrap text with ", "12"], [0, 0, 0, "No untranslated strings. Wrap text with ", "13"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "14"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "15"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "16"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "17"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "18"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "19"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "14"] ], "public/app/features/expressions/components/Reduce.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -4775,8 +4625,7 @@ exports[`better eslint`] = { ], "public/app/features/geo/editor/GazetteerPathEditor.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], "public/app/features/geo/editor/locationModeEditor.tsx:5381": [ [0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"] @@ -4816,9 +4665,7 @@ exports[`better eslint`] = { "public/app/features/inspector/InspectErrorTab.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] ], "public/app/features/inspector/InspectJSONTab.tsx:5381": [ [0, 0, 0, "Do not use the t() function outside of a component or function", "0"], @@ -4844,8 +4691,7 @@ exports[`better eslint`] = { [0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "7"] ], "public/app/features/invites/InviteeRow.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] ], "public/app/features/invites/InviteesTable.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], @@ -4862,9 +4708,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "7"], [0, 0, 0, "No untranslated strings. Wrap text with ", "8"], [0, 0, 0, "No untranslated strings. Wrap text with ", "9"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "10"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "11"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "12"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "10"] ], "public/app/features/library-panels/components/AddLibraryPanelModal/AddLibraryPanelModal.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] @@ -4881,8 +4725,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], "public/app/features/library-panels/components/LibraryPanelInfo/LibraryPanelInfo.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], "public/app/features/library-panels/components/LibraryPanelsSearch/LibraryPanelsSearch.tsx:5381": [ [0, 0, 0, "\'VerticalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"], @@ -4899,8 +4742,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "6"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "7"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "6"] ], "public/app/features/live/LiveConnectionWarning.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] @@ -4958,9 +4800,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"] ], "public/app/features/logs/components/LogLabelStats.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], "public/app/features/logs/components/LogRowMenuCell.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -5015,8 +4855,7 @@ exports[`better eslint`] = { "public/app/features/manage-dashboards/components/ImportDashboardOverview.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] ], "public/app/features/manage-dashboards/components/SnapshotListTable.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] @@ -5074,9 +4913,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], [0, 0, 0, "No untranslated strings. Wrap text with ", "6"], [0, 0, 0, "No untranslated strings. Wrap text with ", "7"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "8"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "9"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "10"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "8"] ], "public/app/features/org/UserInvitePage.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] @@ -5094,8 +4931,7 @@ exports[`better eslint`] = { "public/app/features/panel/components/PanelPluginError.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] ], "public/app/features/panel/components/PanelRenderer.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], @@ -5207,9 +5043,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"], [0, 0, 0, "No untranslated strings. Wrap text with ", "6"], [0, 0, 0, "No untranslated strings. Wrap text with ", "7"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "8"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "9"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "10"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "8"] ], "public/app/features/plugins/admin/components/InstallControls/index.tsx:5381": [ [0, 0, 0, "Do not re-export imported variable (\`./InstallControlsButton\`)", "0"], @@ -5226,15 +5060,11 @@ exports[`better eslint`] = { [0, 0, 0, "\'@grafana/runtime/src/components/PluginPage\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], [0, 0, 0, "Do not use any type assertions.", "1"], [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] ], "public/app/features/plugins/admin/components/PluginDetailsDeprecatedWarning.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], "public/app/features/plugins/admin/components/PluginDetailsDisabledError.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -5252,10 +5082,7 @@ exports[`better eslint`] = { "public/app/features/plugins/admin/components/PluginDetailsPage.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] ], "public/app/features/plugins/admin/components/PluginDetailsPanel.tsx:5381": [ [0, 0, 0, "\'@grafana/runtime/src/components/PluginPage\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], @@ -5271,15 +5098,13 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], "public/app/features/plugins/admin/components/PluginSignatureDetailsBadge.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], "public/app/features/plugins/admin/components/PluginUsage.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] ], "public/app/features/plugins/admin/components/SearchField.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] @@ -5305,9 +5130,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "6"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "7"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "8"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "9"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "10"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "11"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "9"] ], "public/app/features/plugins/admin/state/actions.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] @@ -5394,8 +5217,7 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "3"] ], "public/app/features/profile/FeatureTogglePage.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], "public/app/features/profile/UserOrganizations.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] @@ -5424,12 +5246,10 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "4"] + [0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "3"] ], "public/app/features/query/components/QueryErrorAlert.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], "public/app/features/query/components/QueryGroup.tsx:5381": [ [0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"], @@ -5469,27 +5289,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "22"], [0, 0, 0, "No untranslated strings. Wrap text with ", "23"], [0, 0, 0, "No untranslated strings. Wrap text with ", "24"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "25"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "26"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "27"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "28"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "29"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "30"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "31"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "32"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "33"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "34"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "35"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "36"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "37"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "38"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "39"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "40"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "41"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "42"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "43"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "44"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "45"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "25"] ], "public/app/features/query/state/DashboardQueryRunner/AnnotationsQueryRunner.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] @@ -5798,8 +5598,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"], [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], [0, 0, 0, "No untranslated strings. Wrap text with ", "6"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "7"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "8"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "7"] ], "public/app/features/trails/MetricsHeader.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], @@ -5810,8 +5609,7 @@ exports[`better eslint`] = { ], "public/app/features/trails/TrailStore/utils.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], "public/app/features/trails/banners/NativeHistogramBanner.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] @@ -5996,9 +5794,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "6"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "7"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "8"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "6"] ], "public/app/features/transformers/editors/GroupByTransformerEditor.tsx:5381": [ [0, 0, 0, "\'@grafana/data/src/transformations/transformers/groupBy\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], @@ -6114,8 +5910,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "6"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "7"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "6"] ], "public/app/features/transformers/extractFields/extractFields.test.ts:5381": [ [0, 0, 0, "\'@grafana/data/src/dataframe/processDataFrame\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], @@ -6248,9 +6043,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] ], "public/app/features/users/UsersActionBar.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -6387,8 +6180,7 @@ exports[`better eslint`] = { "public/app/features/variables/pickers/shared/VariableOptions.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "3"] + [0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "2"] ], "public/app/features/variables/query/QueryVariableEditor.tsx:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], diff --git a/packages/grafana-eslint-rules/rules/no-untranslated-strings.cjs b/packages/grafana-eslint-rules/rules/no-untranslated-strings.cjs index 4e8737afe6e..02621e361c6 100644 --- a/packages/grafana-eslint-rules/rules/no-untranslated-strings.cjs +++ b/packages/grafana-eslint-rules/rules/no-untranslated-strings.cjs @@ -1,12 +1,28 @@ // @ts-check +/** @typedef {import('@typescript-eslint/utils').TSESTree.Node} Node */ +/** @typedef {import('@typescript-eslint/utils').TSESTree.JSXElement} JSXElement */ +/** @typedef {import('@typescript-eslint/utils').TSESTree.JSXFragment} JSXFragment */ +/** @typedef {import('@typescript-eslint/utils').TSESLint.RuleModule<'noUntranslatedStrings' | 'noUntranslatedStringsProp' | 'wrapWithTrans' | 'wrapWithT', [{ forceFix: string[] }]>} RuleDefinition */ + +const { + getNodeValue, + getTFixers, + getTransFixers, + canBeFixed, + elementIsTrans, + shouldBeFixed, +} = require('./translation-utils.cjs'); + const { ESLintUtils, AST_NODE_TYPES } = require('@typescript-eslint/utils'); const createRule = ESLintUtils.RuleCreator( (name) => `https://github.com/grafana/grafana/blob/main/packages/grafana-eslint-rules/README.md#${name}` ); +/** @type {string[]} */ const propsToCheck = ['label', 'description', 'placeholder', 'aria-label', 'title', 'text', 'tooltip']; +/** @type {RuleDefinition} */ const noUntranslatedStrings = createRule({ create(context) { return { @@ -17,31 +33,74 @@ const noUntranslatedStrings = createRule({ const isUntranslatedProp = (node.value.type === 'Literal' && node.value.value !== '') || - (node.value.type === 'JSXExpressionContainer' && + (node.value.type === AST_NODE_TYPES.JSXExpressionContainer && (node.value.expression.type === 'Literal' || node.value.expression.type === 'TemplateLiteral')); if (isUntranslatedProp) { + const errorShouldBeFixed = shouldBeFixed(context); + const errorCanBeFixed = canBeFixed(node, context); return context.report({ node, messageId: 'noUntranslatedStringsProp', + fix: errorShouldBeFixed && errorCanBeFixed ? getTFixers(node, context) : undefined, + suggest: errorCanBeFixed + ? [ + { + messageId: 'wrapWithT', + fix: getTFixers(node, context), + }, + ] + : undefined, }); } }, - JSXText(node) { - const ancestors = context.sourceCode.getAncestors(node); - const isEmpty = !node.value.trim(); - const hasTransAncestor = ancestors.some((ancestor) => { - return ( - ancestor.type === AST_NODE_TYPES.JSXElement && - ancestor.openingElement.type === AST_NODE_TYPES.JSXOpeningElement && - ancestor.openingElement.name.type === AST_NODE_TYPES.JSXIdentifier && - ancestor.openingElement.name.name === 'Trans' - ); + /** + * @param {JSXElement|JSXFragment} node + */ + 'JSXElement, JSXFragment'(node) { + const parent = node.parent; + const children = node.children; + const untranslatedTextNodes = children.filter((child) => { + if (child.type === AST_NODE_TYPES.JSXText) { + const hasValue = child.value.trim(); + if (!hasValue) { + return false; + } + const ancestors = context.sourceCode.getAncestors(node); + const hasTransAncestor = + elementIsTrans(node) || + ancestors.some((ancestor) => { + return elementIsTrans(ancestor); + }); + return !hasTransAncestor; + } + return false; }); - if (!isEmpty && !hasTransAncestor) { + + const parentHasChildren = + parent.type === AST_NODE_TYPES.JSXElement || parent.type === AST_NODE_TYPES.JSXFragment; + + // We don't want to report if the parent has a text node, + // as we'd end up doing it twice. This makes it awkward for us to auto fix + const parentHasText = parentHasChildren + ? parent.children.some((child) => child.type === AST_NODE_TYPES.JSXText && getNodeValue(child).trim()) + : false; + + if (untranslatedTextNodes.length && !parentHasText) { + const errorShouldBeFixed = shouldBeFixed(context); + const errorCanBeFixed = canBeFixed(node, context); context.report({ node, messageId: 'noUntranslatedStrings', + fix: errorShouldBeFixed && errorCanBeFixed ? getTransFixers(node, context) : undefined, + suggest: errorCanBeFixed + ? [ + { + messageId: 'wrapWithTrans', + fix: getTransFixers(node, context), + }, + ] + : undefined, }); } }, @@ -50,16 +109,34 @@ const noUntranslatedStrings = createRule({ name: 'no-untranslated-strings', meta: { type: 'suggestion', + hasSuggestions: true, + fixable: 'code', docs: { description: 'Check untranslated strings', }, messages: { noUntranslatedStrings: 'No untranslated strings. Wrap text with ', noUntranslatedStringsProp: `No untranslated strings in text props. Wrap text with or use t()`, + wrapWithTrans: 'Wrap text with for manual key assignment', + wrapWithT: 'Wrap text with t() for manual key assignment', }, - schema: [], + schema: [ + { + type: 'object', + properties: { + forceFix: { + type: 'array', + items: { + type: 'string', + }, + uniqueItems: true, + }, + }, + additionalProperties: false, + }, + ], }, - defaultOptions: [], + defaultOptions: [{ forceFix: [] }], }); module.exports = noUntranslatedStrings; diff --git a/packages/grafana-eslint-rules/rules/translation-utils.cjs b/packages/grafana-eslint-rules/rules/translation-utils.cjs new file mode 100644 index 00000000000..3b23b8dd9ba --- /dev/null +++ b/packages/grafana-eslint-rules/rules/translation-utils.cjs @@ -0,0 +1,310 @@ +// @ts-check +/** @typedef {import('@typescript-eslint/utils').TSESTree.Node} Node */ +/** @typedef {import('@typescript-eslint/utils').TSESTree.JSXAttribute} JSXAttribute */ +/** @typedef {import('@typescript-eslint/utils').TSESTree.JSXElement} JSXElement */ +/** @typedef {import('@typescript-eslint/utils').TSESTree.JSXFragment} JSXFragment */ +/** @typedef {import('@typescript-eslint/utils').TSESTree.JSXText} JSXText */ +/** @typedef {import('@typescript-eslint/utils').TSESTree.JSXChild} JSXChild */ +/** @typedef {import('@typescript-eslint/utils/ts-eslint').RuleFixer} RuleFixer */ +/** @typedef {import('@typescript-eslint/utils/ts-eslint').RuleContext<'noUntranslatedStrings' | 'noUntranslatedStringsProp' | 'wrapWithTrans' | 'wrapWithT', [{forceFix: string[]}]>} RuleContextWithOptions */ + +const { AST_NODE_TYPES } = require('@typescript-eslint/utils'); + +/** + * @param {Node} node + */ +const elementIsTrans = (node) => { + return ( + node.type === AST_NODE_TYPES.JSXElement && + node.openingElement.type === AST_NODE_TYPES.JSXOpeningElement && + node.openingElement.name.type === AST_NODE_TYPES.JSXIdentifier && + node.openingElement.name.name === 'Trans' + ); +}; + +/** + * Converts a string to kebab case + * @param {string} str The string to convert + * @returns {string} The kebab case string + */ +function toKebabCase(str) { + return str + .replace(/([a-z])([A-Z])/g, '$1-$2') + .toLowerCase() + .replace(/\s+/g, '-'); +} + +/** + * Checks if we _should_ fix an error automatically + * @param {RuleContextWithOptions} context + * @returns {boolean} Whether the node should be fixed + */ +function shouldBeFixed(context) { + const pathsThatAreFixable = context.options[0]?.forceFix || []; + return pathsThatAreFixable.some((path) => context.filename.includes(path)); +} + +/** + * Checks if a node can be fixed automatically + * @param {JSXAttribute|JSXElement|JSXFragment} node The node to check + * @param {RuleContextWithOptions} context + * @returns {boolean} Whether the node can be fixed + */ +function canBeFixed(node, context) { + if (!getTranslationPrefix(context)) { + return false; + } + + // We can only fix JSX attribute strings that are within a function, + // otherwise the `t` function call will be made too early + + if (node.type === AST_NODE_TYPES.JSXAttribute) { + const ancestors = context.sourceCode.getAncestors(node); + const isInFunction = ancestors.some((anc) => { + return [ + AST_NODE_TYPES.ArrowFunctionExpression, + AST_NODE_TYPES.FunctionDeclaration, + AST_NODE_TYPES.ClassDeclaration, + ].includes(anc.type); + }); + if (!isInFunction) { + return false; + } + if (node.value?.type === AST_NODE_TYPES.JSXExpressionContainer) { + return false; + } + } + + const values = + node.type === AST_NODE_TYPES.JSXElement || node.type === AST_NODE_TYPES.JSXFragment + ? node.children.map((child) => { + return getNodeValue(child); + }) + : [getNodeValue(node)]; + + const stringIsTooLong = values.some((value) => value.trim().split(' ').length > 10); + // If we have more than 10 words, + // we don't want to fix it automatically as the chance of a duplicate key is higher, + // and it's better for a user to manually decide the key + if (stringIsTooLong) { + return false; + } + const stringIsNonAlphanumeric = values.some((value) => !/[a-zA-Z0-9]/.test(value)); + const stringContainsHTMLEntities = values.some((value) => /(&[a-zA-Z0-9]+;)/.test(value)); + // If node only contains non-alphanumeric characters, + // or contains HTML character entities, then we don't want to autofix + if (stringIsNonAlphanumeric || stringContainsHTMLEntities) { + return false; + } + + return true; +} + +/** + * Gets the translation prefix from the filename + * @param {RuleContextWithOptions} context + * @returns {string|null} The translation prefix or null + */ +function getTranslationPrefix(context) { + const filename = context.getFilename(); + const match = filename.match(/public\/app\/features\/([^/]+)/); + if (match) { + return match[1]; + } + return null; +} + +/** + * Gets the i18n key for a node + * @param {JSXAttribute|JSXText} node The node + * @param {RuleContextWithOptions} context + * @returns {string} The i18n key + */ +const getI18nKey = (node, context) => { + const prefixFromFilePath = getTranslationPrefix(context); + const stringValue = getNodeValue(node); + + const componentNames = getComponentNames(node, context); + const words = stringValue + .trim() + .replace(/[^\a-zA-Z\s]/g, '') + .trim() + .split(/\s+/); + + const maxWordsForKey = 6; + + // If we have more than 6 words, filter out the words that are less than 4 characters + // This heuristic tends to result in a good balance between unique and descriptive keys + const filteredWords = words.length > maxWordsForKey ? words.filter((word) => word.length > 4) : words; + + // If we've filtered everything out, use the original words, deduplicated + const wordsToUse = filteredWords.length === 0 ? words : filteredWords; + const uniqueWords = [...new Set(wordsToUse)].slice(0, maxWordsForKey); + + let kebabString = toKebabCase(uniqueWords.join(' ')); + + if (node.type === AST_NODE_TYPES.JSXAttribute) { + const propName = node.name.name; + const attribute = node.parent?.attributes.find( + (attr) => + attr.type === AST_NODE_TYPES.JSXAttribute && + attr.name.type === AST_NODE_TYPES.JSXIdentifier && + attr && + ['id', 'data-testid'].includes(attr.name?.name) + ); + const potentialId = + attribute && + attribute.type === AST_NODE_TYPES.JSXAttribute && + attribute.value && + attribute.value.type === AST_NODE_TYPES.Literal + ? attribute.value.value + : undefined; + kebabString = [potentialId, propName, kebabString].filter(Boolean).join('-'); + } + + const fullPrefix = [prefixFromFilePath, ...componentNames, kebabString].filter(Boolean).join('.'); + + return fullPrefix; +}; + +/** + * Gets component names from ancestors + * @param {JSXAttribute|JSXText} node The node + * @param {RuleContextWithOptions} context + * @returns {string[]} The component names + */ +function getComponentNames(node, context) { + const names = []; + const ancestors = context.sourceCode.getAncestors(node); + + for (const ancestor of ancestors) { + if ( + ancestor.type === AST_NODE_TYPES.VariableDeclarator || + ancestor.type === AST_NODE_TYPES.FunctionDeclaration || + ancestor.type === AST_NODE_TYPES.ClassDeclaration + ) { + const name = ancestor.id?.type === AST_NODE_TYPES.Identifier ? ancestor.id.name : ''; + // Remove the word "component" from the name, as this is a bit + // redundant in a translation key + const sanitizedName = name.replace(/component/gi, ''); + names.push(toKebabCase(sanitizedName)); + } + } + + return names; +} + +/** + * Gets the import fixer for a node + * @param {JSXElement|JSXFragment|JSXAttribute} node + * @param {RuleFixer} fixer The fixer + * @param {string} importName The import name + * @param {RuleContextWithOptions} context + * @returns {import('@typescript-eslint/utils/ts-eslint').RuleFix|undefined} The fix + */ +function getImportsFixer(node, fixer, importName, context) { + const body = context.sourceCode.ast.body; + + const existingAppCoreI18n = body.find( + (node) => node.type === AST_NODE_TYPES.ImportDeclaration && node.source.value === 'app/core/internationalization' + ); + + // If there's no existing import at all, add it + if (!existingAppCoreI18n) { + return fixer.insertTextBefore(body[0], `import { ${importName} } from 'app/core/internationalization';\n`); + } + + // To keep the typechecker happy - we have to explicitly check the type + // so we can infer it further down + if (existingAppCoreI18n.type !== AST_NODE_TYPES.ImportDeclaration) { + return; + } + + // If there's an existing import, and it already has the importName, do nothing + if ( + existingAppCoreI18n.specifiers.some((s) => { + return ( + s.type === AST_NODE_TYPES.ImportSpecifier && + s.imported.type === AST_NODE_TYPES.Identifier && + s.imported.name === importName + ); + }) + ) { + return; + } + const lastSpecifier = existingAppCoreI18n.specifiers[existingAppCoreI18n.specifiers.length - 1]; + /** @type {[number, number]} */ + const range = [lastSpecifier.range[1], lastSpecifier.range[1]]; + return fixer.insertTextAfterRange(range, `, ${importName}`); +} + +/** + * @param {JSXElement|JSXFragment} node + * @param {RuleContextWithOptions} context + * @returns {(fixer: RuleFixer) => import('@typescript-eslint/utils/ts-eslint').RuleFix[]} + */ +const getTransFixers = (node, context) => (fixer) => { + const fixes = []; + const children = node.children; + children.forEach((child) => { + if (child.type === AST_NODE_TYPES.JSXText) { + const i18nKey = getI18nKey(child, context); + const value = getNodeValue(child); + fixes.push(fixer.replaceText(child, `${value}`)); + } + }); + + const importsFixer = getImportsFixer(node, fixer, 'Trans', context); + if (importsFixer) { + fixes.push(importsFixer); + } + return fixes; +}; + +/** + * @param {JSXAttribute} node + * @param {RuleContextWithOptions} context + * @returns {(fixer: RuleFixer) => import('@typescript-eslint/utils/ts-eslint').RuleFix[]} + */ +const getTFixers = (node, context) => (fixer) => { + const fixes = []; + const i18nKey = getI18nKey(node, context); + const value = getNodeValue(node); + const wrappingQuotes = value.includes('"') ? "'" : '"'; + + fixes.push( + fixer.replaceText(node, `${node.name.name}={t("${i18nKey}", ${wrappingQuotes}${value}${wrappingQuotes})}`) + ); + + const importsFixer = getImportsFixer(node, fixer, 't', context); + if (importsFixer) { + fixes.push(importsFixer); + } + return fixes; +}; + +/** + * Gets the value of a node + * @param {JSXAttribute|JSXText|JSXElement|JSXFragment|JSXChild} node The node + * @returns {string} The node value + */ +function getNodeValue(node) { + if (node.type === AST_NODE_TYPES.JSXAttribute && node.value?.type === AST_NODE_TYPES.Literal) { + return String(node.value.value) || ''; + } + if (node.type === AST_NODE_TYPES.JSXText) { + // Return the raw value if we can, so we can work out if there are any HTML entities + return node.raw; + } + return ''; +} + +module.exports = { + getNodeValue, + getTFixers, + getTransFixers, + getTranslationPrefix, + canBeFixed, + shouldBeFixed, + elementIsTrans, +}; diff --git a/packages/grafana-eslint-rules/tests/no-untranslated-strings.test.js b/packages/grafana-eslint-rules/tests/no-untranslated-strings.test.js new file mode 100644 index 00000000000..b180e67af7a --- /dev/null +++ b/packages/grafana-eslint-rules/tests/no-untranslated-strings.test.js @@ -0,0 +1,453 @@ +import { RuleTester } from 'eslint'; + +import noUntranslatedStrings from '../rules/no-untranslated-strings.cjs'; + +RuleTester.setDefaultConfig({ + languageOptions: { + ecmaVersion: 2018, + sourceType: 'module', + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + }, + }, +}); + +const filename = 'public/app/features/some-feature/SomeFile.tsx'; + +const ruleTester = new RuleTester(); + +ruleTester.run('eslint no-untranslated-strings', noUntranslatedStrings, { + test: [], + valid: [ + { + name: 'Text in Trans component', + code: `const Foo = () => Translated text`, + }, + { + name: 'Text in Trans component with whitespace/JSXText elements', + code: `const Foo = () => + + Translated text + `, + }, + { + name: 'Empty component', + code: `
`, + }, + { + name: 'Text using t() function', + code: `
{t('translated.key', 'Translated text')}
`, + }, + { + name: 'Prop using t() function', + code: `
`, + }, + { + name: 'Variable interpolation', + code: `
{variable}
`, + }, + ], + invalid: [ + /** + * FIXABLE CASES + */ + // Basic happy path case: + // untranslated text, in a component, in a file location where we can extract a prefix, + // and it can be fixed + { + name: 'Basic untranslated text in component', + code: ` +const Foo = () =>
Untranslated text
`, + filename, + errors: [ + { + messageId: 'noUntranslatedStrings', + suggestions: [ + { + messageId: 'wrapWithTrans', + output: ` +import { Trans } from 'app/core/internationalization'; +const Foo = () =>
Untranslated text
`, + }, + ], + }, + ], + }, + + { + name: 'Text inside JSXElement, not in a function', + code: `const thing =
foo
`, + filename, + errors: [ + { + messageId: 'noUntranslatedStrings', + suggestions: [ + { + messageId: 'wrapWithTrans', + output: `import { Trans } from 'app/core/internationalization'; +const thing =
foo
`, + }, + ], + }, + ], + }, + + { + name: 'Fixes medium length strings', + code: ` +const Foo = () =>
This is a longer string that we will translate
`, + filename, + errors: [ + { + messageId: 'noUntranslatedStrings', + suggestions: [ + { + messageId: 'wrapWithTrans', + output: ` +import { Trans } from 'app/core/internationalization'; +const Foo = () =>
This is a longer string that we will translate
`, + }, + ], + }, + ], + }, + + { + name: 'Fixes short strings with many words', + code: ` +const Foo = () =>
lots of sho rt word s to be filt ered
`, + filename, + errors: [ + { + messageId: 'noUntranslatedStrings', + suggestions: [ + { + messageId: 'wrapWithTrans', + output: ` +import { Trans } from 'app/core/internationalization'; +const Foo = () =>
lots of sho rt word s to be filt ered
`, + }, + ], + }, + ], + }, + + { + name: 'expression', + code: ` +const foo = <>hello`, + filename, + errors: [ + { + messageId: 'noUntranslatedStrings', + suggestions: [ + { + messageId: 'wrapWithTrans', + output: ` +import { Trans } from 'app/core/internationalization'; +const foo = <>hello`, + }, + ], + }, + ], + }, + + { + name: 'Fixes strings in JSX in props', + code: ` +const Foo = () =>
Test} />
`, + filename, + errors: [ + { + messageId: 'noUntranslatedStrings', + suggestions: [ + { + messageId: 'wrapWithTrans', + output: ` +import { Trans } from 'app/core/internationalization'; +const Foo = () =>
Test} />
`, + }, + ], + }, + ], + }, + + { + name: 'Fixes and uses ID from attribute if exists', + code: ` +import { t } from 'app/core/internationalization'; +const Foo = () =>
`, + filename, + errors: [ + { + messageId: 'noUntranslatedStringsProp', + suggestions: [ + { + messageId: 'wrapWithT', + output: ` +import { t } from 'app/core/internationalization'; +const Foo = () =>
`, + }, + ], + }, + ], + }, + + { + name: 'Fixes correctly when Trans import already exists', + code: ` +import { Trans } from 'app/core/internationalization'; +const Foo = () =>
Untranslated text
`, + filename, + errors: [ + { + messageId: 'noUntranslatedStrings', + suggestions: [ + { + messageId: 'wrapWithTrans', + output: ` +import { Trans } from 'app/core/internationalization'; +const Foo = () =>
Untranslated text
`, + }, + ], + }, + ], + }, + + { + name: 'Fixes correctly when t() import already exists', + code: ` +import { t } from 'app/core/internationalization'; +const Foo = () =>
`, + filename, + errors: [ + { + messageId: 'noUntranslatedStringsProp', + suggestions: [ + { + messageId: 'wrapWithT', + output: ` +import { t } from 'app/core/internationalization'; +const Foo = () =>
`, + }, + ], + }, + ], + }, + + { + name: 'Fixes correctly when import exists but needs to add t()', + code: ` +import { Trans } from 'app/core/internationalization'; +const Foo = () =>
`, + filename, + errors: [ + { + messageId: 'noUntranslatedStringsProp', + suggestions: [ + { + messageId: 'wrapWithT', + output: ` +import { Trans, t } from 'app/core/internationalization'; +const Foo = () =>
`, + }, + ], + }, + ], + }, + + { + name: 'Fixes correctly with a Class component', + code: ` +class Foo extends React.Component { + render() { + return
untranslated text
; + } +}`, + filename, + errors: [ + { + messageId: 'noUntranslatedStrings', + suggestions: [ + { + messageId: 'wrapWithTrans', + output: ` +import { Trans } from 'app/core/internationalization'; +class Foo extends React.Component { + render() { + return
untranslated text
; + } +}`, + }, + ], + }, + ], + }, + + { + name: 'Fixes basic prop case', + code: ` +const Foo = () =>
`, + filename, + errors: [ + { + messageId: 'noUntranslatedStringsProp', + suggestions: [ + { + messageId: 'wrapWithT', + output: ` +import { t } from 'app/core/internationalization'; +const Foo = () =>
`, + }, + ], + }, + ], + }, + + { + name: 'Fixes prop case with double quotes in value', + code: ` +const Foo = () =>
`, + filename, + errors: [ + { + messageId: 'noUntranslatedStringsProp', + suggestions: [ + { + messageId: 'wrapWithT', + output: ` +import { t } from 'app/core/internationalization'; +const Foo = () =>
`, + }, + ], + }, + ], + }, + + { + name: 'Fixes case with nested functions/components', + code: ` +import { Trans } from 'app/core/internationalization'; +const Foo = () => { + const getSomething = () => { + return
foo
; + } + + return
{getSomething()}
; +} +`, + filename, + errors: [ + { + messageId: 'noUntranslatedStrings', + suggestions: [ + { + messageId: 'wrapWithTrans', + output: ` +import { Trans } from 'app/core/internationalization'; +const Foo = () => { + const getSomething = () => { + return
foo
; + } + + return
{getSomething()}
; +} +`, + }, + ], + }, + ], + }, + + /** + * UNFIXABLE CASES + */ + + { + name: 'Multiple untranslated strings in one element', + code: `const Foo = () =>
test {name} example
`, + filename, + errors: [ + { + messageId: 'noUntranslatedStrings', + }, + ], + }, + + { + name: 'Cannot fix entirely non-alphanumeric text', + code: `const Foo = () =>
-
`, + filename, + errors: [{ messageId: 'noUntranslatedStrings' }], + }, + { + name: 'Cannot fix text with expression sibling', + code: `const Foo = () =>
{name} Hello
`, + filename, + errors: [{ messageId: 'noUntranslatedStrings' }], + }, + + { + name: 'Cannot fix text with expression sibling in fragment', + code: ` +const Foo = () => { + const bar = { + baz: (<>Hello {name}) + } +}`, + filename, + errors: [{ messageId: 'noUntranslatedStrings' }], + }, + + { + name: 'Cannot fix text containing HTML entities', + code: `const Foo = () =>
Something 
`, + filename, + errors: [{ messageId: 'noUntranslatedStrings' }], + }, + + { + name: 'Cannot fix text that is too long', + code: `const Foo = () =>
This is something with lots of text that we don't want to translate automatically
`, + filename, + errors: [{ messageId: 'noUntranslatedStrings' }], + }, + + { + name: 'Cannot fix prop text that is too long', + code: `const Foo = () =>
`, + filename, + errors: [{ messageId: 'noUntranslatedStringsProp' }], + }, + + { + name: 'Cannot fix text with HTML sibling', + code: `const Foo = () =>
something foo bar
`, + filename, + errors: [{ messageId: 'noUntranslatedStrings' }], + }, + + { + name: 'JSXAttribute not in a function', + code: `
`, + filename, + errors: [{ messageId: 'noUntranslatedStringsProp' }], + }, + + { + name: 'Cannot fix JSXExpression in attribute', + code: `const Foo = () =>
`, + filename, + errors: [{ messageId: 'noUntranslatedStringsProp' }], + }, + + { + name: 'Cannot fix text outside correct directory location', + code: `const Foo = () =>
Untranslated text
`, + filename: 'public/something-else/foo/SomeOtherFile.tsx', + errors: [{ messageId: 'noUntranslatedStrings' }], + }, + ], +}); From ec94e5b7ad8b24a97836bc00d409b4aaf0fb092a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Thu, 13 Mar 2025 14:21:10 +0100 Subject: [PATCH 025/117] Dashboard: Switch between tabs and rows and rows to tabs (#102083) --- .../scene/layout-rows/RowsLayoutManager.tsx | 9 +++++++-- .../scene/layout-tabs/TabsLayoutManager.tsx | 12 ++++++++++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/public/app/features/dashboard-scene/scene/layout-rows/RowsLayoutManager.tsx b/public/app/features/dashboard-scene/scene/layout-rows/RowsLayoutManager.tsx index 4c1acfe940a..14378e4feaa 100644 --- a/public/app/features/dashboard-scene/scene/layout-rows/RowsLayoutManager.tsx +++ b/public/app/features/dashboard-scene/scene/layout-rows/RowsLayoutManager.tsx @@ -7,6 +7,7 @@ import { dashboardSceneGraph } from '../../utils/dashboardSceneGraph'; import { DashboardGridItem } from '../layout-default/DashboardGridItem'; import { DefaultGridLayoutManager } from '../layout-default/DefaultGridLayoutManager'; import { RowRepeaterBehavior } from '../layout-default/RowRepeaterBehavior'; +import { TabsLayoutManager } from '../layout-tabs/TabsLayoutManager'; import { DashboardLayoutManager } from '../types/DashboardLayoutManager'; import { LayoutRegistryItem } from '../types/LayoutRegistryItem'; @@ -186,9 +187,13 @@ export class RowsLayoutManager extends SceneObjectBase i } public static createFromLayout(layout: DashboardLayoutManager): RowsLayoutManager { - let rows: RowItem[]; + let rows: RowItem[] = []; - if (layout instanceof DefaultGridLayoutManager) { + if (layout instanceof TabsLayoutManager) { + for (const tab of layout.state.tabs) { + rows.push(new RowItem({ layout: tab.state.layout, title: tab.state.title })); + } + } else if (layout instanceof DefaultGridLayoutManager) { const config: Array<{ title?: string; isCollapsed?: boolean; diff --git a/public/app/features/dashboard-scene/scene/layout-tabs/TabsLayoutManager.tsx b/public/app/features/dashboard-scene/scene/layout-tabs/TabsLayoutManager.tsx index 3c7f1b24bd4..2c0f5d4943a 100644 --- a/public/app/features/dashboard-scene/scene/layout-tabs/TabsLayoutManager.tsx +++ b/public/app/features/dashboard-scene/scene/layout-tabs/TabsLayoutManager.tsx @@ -8,6 +8,7 @@ import { import { t } from 'app/core/internationalization'; import { ObjectRemovedFromCanvasEvent } from '../../edit-pane/shared'; +import { RowsLayoutManager } from '../layout-rows/RowsLayoutManager'; import { DashboardLayoutManager } from '../types/DashboardLayoutManager'; import { LayoutRegistryItem } from '../types/LayoutRegistryItem'; @@ -177,7 +178,14 @@ export class TabsLayoutManager extends SceneObjectBase i } public static createFromLayout(layout: DashboardLayoutManager): TabsLayoutManager { - const tab = new TabItem({ layout: layout.clone() }); - return new TabsLayoutManager({ tabs: [tab] }); + let tabs: TabItem[] = []; + + if (layout instanceof RowsLayoutManager) { + tabs = layout.state.rows.map((row) => new TabItem({ layout: row.state.layout.clone(), title: row.state.title })); + } else { + tabs.push(new TabItem({ layout: layout.clone() })); + } + + return new TabsLayoutManager({ tabs }); } } From 2bbd5faf6da8dbc33320fd8e375a2f041a8b6a46 Mon Sep 17 00:00:00 2001 From: Kristina Date: Thu, 13 Mar 2025 08:39:17 -0500 Subject: [PATCH 026/117] Transformations: Include other counts as numbers when assessing field types (#102109) Distinct count and change count should also always be numbers --- packages/grafana-data/src/transformations/fieldReducer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/grafana-data/src/transformations/fieldReducer.ts b/packages/grafana-data/src/transformations/fieldReducer.ts index 56006b7b43e..ace45415bfc 100644 --- a/packages/grafana-data/src/transformations/fieldReducer.ts +++ b/packages/grafana-data/src/transformations/fieldReducer.ts @@ -132,7 +132,7 @@ export enum ReducerID { } export function getFieldTypeForReducer(id: ReducerID, fallback: FieldType): FieldType { - return id === ReducerID.count + return id === ReducerID.count || id === ReducerID.distinctCount || id === ReducerID.changeCount ? FieldType.number : id === ReducerID.allIsNull || id === ReducerID.allIsZero ? FieldType.boolean From 5d94293305730f564341dcd3b3b4528580a3f2f9 Mon Sep 17 00:00:00 2001 From: Karl Persson <23356117+kalleep@users.noreply.github.com> Date: Thu, 13 Mar 2025 14:54:35 +0100 Subject: [PATCH 027/117] Authz: Fix namespace authorization when calling a cluster resource (#102110) --- pkg/services/apiserver/auth/authorizer/namespace.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pkg/services/apiserver/auth/authorizer/namespace.go b/pkg/services/apiserver/auth/authorizer/namespace.go index 45a792d084f..836218fbd9d 100644 --- a/pkg/services/apiserver/auth/authorizer/namespace.go +++ b/pkg/services/apiserver/auth/authorizer/namespace.go @@ -40,6 +40,11 @@ func (auth namespaceAuthorizer) Authorize(ctx context.Context, a authorizer.Attr return authorizer.DecisionDeny, "invalid namespace", err } + // If we call a cluster resource we delegate to the next authorizer + if ns.Value == "" { + return authorizer.DecisionNoOpinion, "", nil + } + if ns.OrgID != ident.GetOrgID() { return authorizer.DecisionDeny, "invalid org", nil } From 772432e025f9b4efea4f405b0999f041c2ddf8ad Mon Sep 17 00:00:00 2001 From: Ivan Ortega Alba Date: Thu, 13 Mar 2025 15:02:03 +0100 Subject: [PATCH 028/117] Dashboards: Changes are not detected from worker (#102105) --- .../saving/DashboardSceneChangeTracker.ts | 6 ++-- .../saving/DetectChangesWorker.ts | 28 +++++++++++++++++-- .../__mocks__/createDetectChangesWorker.ts | 2 -- .../scene/DashboardScene.test.tsx | 27 +++++------------- 4 files changed, 35 insertions(+), 28 deletions(-) diff --git a/public/app/features/dashboard-scene/saving/DashboardSceneChangeTracker.ts b/public/app/features/dashboard-scene/saving/DashboardSceneChangeTracker.ts index 2bfdb9b8646..5d73f119759 100644 --- a/public/app/features/dashboard-scene/saving/DashboardSceneChangeTracker.ts +++ b/public/app/features/dashboard-scene/saving/DashboardSceneChangeTracker.ts @@ -137,9 +137,7 @@ export class DashboardSceneChangeTracker { return this._dashboard.state.meta.folderUid !== this._dashboard.getInitialState()?.meta.folderUid; } - private updateIsDirty(result: DashboardChangeInfo) { - const { hasChanges } = result; - + private updateIsDirty(hasChanges: boolean) { if (hasChanges || this.hasMetadataChanges()) { if (!this._dashboard.state.isDirty) { this._dashboard.setState({ isDirty: true }); @@ -161,7 +159,7 @@ export class DashboardSceneChangeTracker { } this._changesWorker!.onmessage = (e: MessageEvent) => { - this.updateIsDirty(e.data); + this.updateIsDirty(!!e.data.hasChanges); }; const performSaveModelDiff = getChangeTrackerDebouncer(this.detectSaveModelChanges.bind(this)); diff --git a/public/app/features/dashboard-scene/saving/DetectChangesWorker.ts b/public/app/features/dashboard-scene/saving/DetectChangesWorker.ts index 3da81d5ad5b..cb856ad8758 100644 --- a/public/app/features/dashboard-scene/saving/DetectChangesWorker.ts +++ b/public/app/features/dashboard-scene/saving/DetectChangesWorker.ts @@ -1,6 +1,7 @@ import { Dashboard } from '@grafana/schema'; +import { DashboardV2Spec } from '@grafana/schema/dist/esm/schema/dashboard/v2alpha0'; -import { getRawDashboardChanges } from './getDashboardChanges'; +import { jsonDiff } from '../settings/version-history/utils'; function _debounce(f: (...args: T[]) => void, timeout: number) { let timeoutId: NodeJS.Timeout | undefined = undefined; @@ -13,6 +14,29 @@ function _debounce(f: (...args: T[]) => void, timeout: number) { } self.onmessage = _debounce((e: MessageEvent<{ initial: Dashboard; changed: Dashboard }>) => { - const result = getRawDashboardChanges(e.data.initial, e.data.changed, false, false, false); + const result = detectDashboardChanges(e.data.initial, e.data.changed); self.postMessage(result); }, 500); + +export function detectDashboardChanges( + changedSaveModel: DashboardV2Spec | Dashboard, + initialSaveModel: DashboardV2Spec | Dashboard +) { + // Calculate differences using the non-transformed to v2 spec values to be able to compare the initial and changed dashboard values + const diff = jsonDiff(initialSaveModel, changedSaveModel); + const diffCount = Object.values(diff).reduce((acc, cur) => acc + cur.length, 0); + const hasMigratedToV2 = isDashboardV2Spec(changedSaveModel) && !isDashboardV2Spec(initialSaveModel); + + return { + changedSaveModel, + initialSaveModel, + diffs: diff, + diffCount, + hasChanges: diffCount > 0, + hasMigratedToV2, + }; +} + +export function isDashboardV2Spec(obj: Dashboard | DashboardV2Spec): obj is DashboardV2Spec { + return 'elements' in obj; +} diff --git a/public/app/features/dashboard-scene/saving/__mocks__/createDetectChangesWorker.ts b/public/app/features/dashboard-scene/saving/__mocks__/createDetectChangesWorker.ts index 746a759c558..a9120947e5c 100644 --- a/public/app/features/dashboard-scene/saving/__mocks__/createDetectChangesWorker.ts +++ b/public/app/features/dashboard-scene/saving/__mocks__/createDetectChangesWorker.ts @@ -8,8 +8,6 @@ jest.mocked(worker.postMessage).mockImplementation(() => { worker.onmessage?.({ data: { hasChanges: true, - hasTimeChanges: true, - hasVariableValueChanges: true, }, } as unknown as MessageEvent); }); diff --git a/public/app/features/dashboard-scene/scene/DashboardScene.test.tsx b/public/app/features/dashboard-scene/scene/DashboardScene.test.tsx index 3a9ecd5cee2..69e96644509 100644 --- a/public/app/features/dashboard-scene/scene/DashboardScene.test.tsx +++ b/public/app/features/dashboard-scene/scene/DashboardScene.test.tsx @@ -81,7 +81,7 @@ locationUtil.initialize({ }); const worker = createWorker(); -mockResultsOfDetectChangesWorker({ hasChanges: true, hasTimeChanges: false, hasVariableValueChanges: false }); +mockResultsOfDetectChangesWorker({ hasChanges: true }); describe('DashboardScene', () => { describe('DashboardSrv.getCurrent compatibility', () => { @@ -224,7 +224,7 @@ describe('DashboardScene', () => { const prevMeta = { ...scene.state.meta }; // The worker only detects changes in the model, so the folder change should be detected anyway - mockResultsOfDetectChangesWorker({ hasChanges: false, hasTimeChanges: false, hasVariableValueChanges: false }); + mockResultsOfDetectChangesWorker({ hasChanges: false }); scene.setState({ meta: { @@ -706,7 +706,7 @@ describe('DashboardScene', () => { }); it('A change to a variable state should set isDirty true', () => { - mockResultsOfDetectChangesWorker({ hasChanges: true, hasTimeChanges: false, hasVariableValueChanges: true }); + mockResultsOfDetectChangesWorker({ hasChanges: true }); const variable = new TestVariable({ name: 'A' }); const scene = buildTestScene({ $variables: new SceneVariableSet({ variables: [variable] }), @@ -730,13 +730,10 @@ describe('DashboardScene', () => { scene.activate(); scene.onEnterEditMode(); - mockResultsOfDetectChangesWorker({ hasChanges: true, hasTimeChanges: false, hasVariableValueChanges: false }); + mockResultsOfDetectChangesWorker({ hasChanges: true }); variable.setState({ name: 'B' }); expect(scene.state.isDirty).toBe(true); - mockResultsOfDetectChangesWorker( - // No changes, it is the same name than before comparing saving models - { hasChanges: false, hasTimeChanges: false, hasVariableValueChanges: false } - ); + mockResultsOfDetectChangesWorker({ hasChanges: false }); variable.setState({ name: 'A' }); expect(scene.state.isDirty).toBe(false); }); @@ -959,21 +956,11 @@ function buildTestScene(overrides?: Partial) { return scene; } -function mockResultsOfDetectChangesWorker({ - hasChanges, - hasTimeChanges, - hasVariableValueChanges, -}: { - hasChanges: boolean; - hasTimeChanges: boolean; - hasVariableValueChanges: boolean; -}) { +function mockResultsOfDetectChangesWorker({ hasChanges = true }) { jest.mocked(worker.postMessage).mockImplementationOnce(() => { worker.onmessage?.({ data: { - hasChanges: hasChanges ?? true, - hasTimeChanges: hasTimeChanges ?? true, - hasVariableValueChanges: hasVariableValueChanges ?? true, + hasChanges, }, } as unknown as MessageEvent); }); From a9634f9b1214cbff5c9c9a90d8e213d1ade02458 Mon Sep 17 00:00:00 2001 From: Andres Martinez Gotor Date: Thu, 13 Mar 2025 15:04:08 +0100 Subject: [PATCH 029/117] Advisor: Skip plugin check for provisioned plugins (#101782) --- .../pkg/app/checkregistry/checkregistry.go | 8 ++- .../pkg/app/checks/plugincheck/check.go | 58 ++++++++++++++----- .../pkg/app/checks/plugincheck/check_test.go | 28 ++++++++- .../pluginsintegration/pluginsintegration.go | 3 + .../provisionedplugins/provisioned.go | 19 ++++++ 5 files changed, 100 insertions(+), 16 deletions(-) create mode 100644 pkg/services/pluginsintegration/provisionedplugins/provisioned.go diff --git a/apps/advisor/pkg/app/checkregistry/checkregistry.go b/apps/advisor/pkg/app/checkregistry/checkregistry.go index 335b9cc7567..31be8ae936e 100644 --- a/apps/advisor/pkg/app/checkregistry/checkregistry.go +++ b/apps/advisor/pkg/app/checkregistry/checkregistry.go @@ -11,6 +11,7 @@ import ( "github.com/grafana/grafana/pkg/services/pluginsintegration/plugincontext" "github.com/grafana/grafana/pkg/services/pluginsintegration/plugininstaller" "github.com/grafana/grafana/pkg/services/pluginsintegration/pluginstore" + "github.com/grafana/grafana/pkg/services/pluginsintegration/provisionedplugins" ) type CheckService interface { @@ -25,11 +26,14 @@ type Service struct { pluginRepo repo.Service pluginPreinstall plugininstaller.Preinstall managedPlugins managedplugins.Manager + provisionedPlugins provisionedplugins.Manager } func ProvideService(datasourceSvc datasources.DataSourceService, pluginStore pluginstore.Store, pluginContextProvider *plugincontext.Provider, pluginClient plugins.Client, - pluginRepo repo.Service, pluginPreinstall plugininstaller.Preinstall, managedPlugins managedplugins.Manager) *Service { + pluginRepo repo.Service, pluginPreinstall plugininstaller.Preinstall, managedPlugins managedplugins.Manager, + provisionedPlugins provisionedplugins.Manager, +) *Service { return &Service{ datasourceSvc: datasourceSvc, pluginStore: pluginStore, @@ -38,6 +42,7 @@ func ProvideService(datasourceSvc datasources.DataSourceService, pluginStore plu pluginRepo: pluginRepo, pluginPreinstall: pluginPreinstall, managedPlugins: managedPlugins, + provisionedPlugins: provisionedPlugins, } } @@ -54,6 +59,7 @@ func (s *Service) Checks() []checks.Check { s.pluginRepo, s.pluginPreinstall, s.managedPlugins, + s.provisionedPlugins, ), } } diff --git a/apps/advisor/pkg/app/checks/plugincheck/check.go b/apps/advisor/pkg/app/checks/plugincheck/check.go index 45c54d4fdc0..3b08e0c5f6f 100644 --- a/apps/advisor/pkg/app/checks/plugincheck/check.go +++ b/apps/advisor/pkg/app/checks/plugincheck/check.go @@ -4,15 +4,18 @@ import ( "context" "fmt" sysruntime "runtime" + "slices" "github.com/Masterminds/semver/v3" advisor "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1" "github.com/grafana/grafana/apps/advisor/pkg/app/checks" "github.com/grafana/grafana/pkg/cmd/grafana-cli/services" + "github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/plugins/repo" "github.com/grafana/grafana/pkg/services/pluginsintegration/managedplugins" "github.com/grafana/grafana/pkg/services/pluginsintegration/plugininstaller" "github.com/grafana/grafana/pkg/services/pluginsintegration/pluginstore" + "github.com/grafana/grafana/pkg/services/pluginsintegration/provisionedplugins" ) func New( @@ -20,20 +23,23 @@ func New( pluginRepo repo.Service, pluginPreinstall plugininstaller.Preinstall, managedPlugins managedplugins.Manager, + provisionedPlugins provisionedplugins.Manager, ) checks.Check { return &check{ - PluginStore: pluginStore, - PluginRepo: pluginRepo, - PluginPreinstall: pluginPreinstall, - ManagedPlugins: managedPlugins, + PluginStore: pluginStore, + PluginRepo: pluginRepo, + PluginPreinstall: pluginPreinstall, + ManagedPlugins: managedPlugins, + ProvisionedPlugins: provisionedPlugins, } } type check struct { - PluginStore pluginstore.Store - PluginRepo repo.Service - PluginPreinstall plugininstaller.Preinstall - ManagedPlugins managedplugins.Manager + PluginStore pluginstore.Store + PluginRepo repo.Service + PluginPreinstall plugininstaller.Preinstall + ManagedPlugins managedplugins.Manager + ProvisionedPlugins provisionedplugins.Manager } func (c *check) ID() string { @@ -55,9 +61,11 @@ func (c *check) Steps() []checks.Step { PluginRepo: c.PluginRepo, }, &updateStep{ - PluginRepo: c.PluginRepo, - PluginPreinstall: c.PluginPreinstall, - ManagedPlugins: c.ManagedPlugins, + PluginRepo: c.PluginRepo, + PluginPreinstall: c.PluginPreinstall, + ManagedPlugins: c.ManagedPlugins, + ProvisionedPlugins: c.ProvisionedPlugins, + log: log.New("advisor.check.plugin.update"), }, } } @@ -117,9 +125,12 @@ func (s *deprecationStep) Run(ctx context.Context, _ *advisor.CheckSpec, it any) } type updateStep struct { - PluginRepo repo.Service - PluginPreinstall plugininstaller.Preinstall - ManagedPlugins managedplugins.Manager + PluginRepo repo.Service + PluginPreinstall plugininstaller.Preinstall + ManagedPlugins managedplugins.Manager + ProvisionedPlugins provisionedplugins.Manager + provisionedPlugins []string + log log.Logger } func (s *updateStep) Title() string { @@ -146,11 +157,19 @@ func (s *updateStep) Run(ctx context.Context, _ *advisor.CheckSpec, i any) (*adv // Skip if it's a core plugin if p.IsCorePlugin() { + s.log.Debug("Skipping core plugin", "plugin", p.ID) return nil, nil } // Skip if it's managed or pinned if s.isManaged(ctx, p.ID) || s.PluginPreinstall.IsPinned(p.ID) { + s.log.Debug("Skipping managed or pinned plugin", "plugin", p.ID) + return nil, nil + } + + // Skip if it's provisioned + if s.isProvisioned(ctx, p.ID) { + s.log.Debug("Skipping provisioned plugin", "plugin", p.ID) return nil, nil } @@ -197,3 +216,14 @@ func (s *updateStep) isManaged(ctx context.Context, pluginID string) bool { } return false } + +func (s *updateStep) isProvisioned(ctx context.Context, pluginID string) bool { + if s.provisionedPlugins == nil { + var err error + s.provisionedPlugins, err = s.ProvisionedPlugins.ProvisionedPlugins(ctx) + if err != nil { + return false + } + } + return slices.Contains(s.provisionedPlugins, pluginID) +} diff --git a/apps/advisor/pkg/app/checks/plugincheck/check_test.go b/apps/advisor/pkg/app/checks/plugincheck/check_test.go index 13b2a17ea1b..c8cdc965a32 100644 --- a/apps/advisor/pkg/app/checks/plugincheck/check_test.go +++ b/apps/advisor/pkg/app/checks/plugincheck/check_test.go @@ -10,6 +10,7 @@ import ( "github.com/grafana/grafana/pkg/services/pluginsintegration/managedplugins" "github.com/grafana/grafana/pkg/services/pluginsintegration/plugininstaller" "github.com/grafana/grafana/pkg/services/pluginsintegration/pluginstore" + "github.com/grafana/grafana/pkg/services/pluginsintegration/provisionedplugins" "github.com/stretchr/testify/assert" ) @@ -21,6 +22,7 @@ func TestRun(t *testing.T) { pluginArchives map[string]*repo.PluginArchiveInfo pluginPreinstalled []string pluginManaged []string + pluginProvisioned []string expectedFailures []advisor.CheckReportFailure }{ { @@ -131,6 +133,20 @@ func TestRun(t *testing.T) { pluginManaged: []string{"plugin4"}, expectedFailures: []advisor.CheckReportFailure{}, }, + { + name: "Provisioned plugin", + plugins: []pluginstore.Plugin{ + {JSONData: plugins.JSONData{ID: "plugin5", Info: plugins.Info{Version: "1.0.0"}}}, + }, + pluginInfo: map[string]*repo.PluginInfo{ + "plugin5": {Status: "active"}, + }, + pluginArchives: map[string]*repo.PluginArchiveInfo{ + "plugin5": {Version: "1.1.0"}, + }, + pluginProvisioned: []string{"plugin5"}, + expectedFailures: []advisor.CheckReportFailure{}, + }, } for _, tt := range tests { @@ -142,7 +158,8 @@ func TestRun(t *testing.T) { } pluginPreinstall := &mockPluginPreinstall{pinned: tt.pluginPreinstalled} managedPlugins := &mockManagedPlugins{managed: tt.pluginManaged} - check := New(pluginStore, pluginRepo, pluginPreinstall, managedPlugins) + provisionedPlugins := &mockProvisionedPlugins{provisioned: tt.pluginProvisioned} + check := New(pluginStore, pluginRepo, pluginPreinstall, managedPlugins, provisionedPlugins) items, err := check.Items(context.Background()) assert.NoError(t, err) @@ -208,3 +225,12 @@ type mockManagedPlugins struct { func (m *mockManagedPlugins) ManagedPlugins(ctx context.Context) []string { return m.managed } + +type mockProvisionedPlugins struct { + provisionedplugins.Manager + provisioned []string +} + +func (m *mockProvisionedPlugins) ProvisionedPlugins(ctx context.Context) ([]string, error) { + return m.provisioned, nil +} diff --git a/pkg/services/pluginsintegration/pluginsintegration.go b/pkg/services/pluginsintegration/pluginsintegration.go index eca6c3be53f..da0319b3d7f 100644 --- a/pkg/services/pluginsintegration/pluginsintegration.go +++ b/pkg/services/pluginsintegration/pluginsintegration.go @@ -53,6 +53,7 @@ import ( "github.com/grafana/grafana/pkg/services/pluginsintegration/pluginsettings" pluginSettings "github.com/grafana/grafana/pkg/services/pluginsintegration/pluginsettings/service" "github.com/grafana/grafana/pkg/services/pluginsintegration/pluginstore" + "github.com/grafana/grafana/pkg/services/pluginsintegration/provisionedplugins" "github.com/grafana/grafana/pkg/services/pluginsintegration/renderer" "github.com/grafana/grafana/pkg/services/pluginsintegration/serviceregistration" "github.com/grafana/grafana/pkg/services/rendering" @@ -144,6 +145,8 @@ var WireExtensionSet = wire.NewSet( wire.Bind(new(plugins.Client), new(*backend.MiddlewareHandler)), managedplugins.NewNoop, wire.Bind(new(managedplugins.Manager), new(*managedplugins.Noop)), + provisionedplugins.NewNoop, + wire.Bind(new(provisionedplugins.Manager), new(*provisionedplugins.Noop)), sources.ProvideService, wire.Bind(new(sources.Registry), new(*sources.Service)), ) diff --git a/pkg/services/pluginsintegration/provisionedplugins/provisioned.go b/pkg/services/pluginsintegration/provisionedplugins/provisioned.go new file mode 100644 index 00000000000..c124f6b0203 --- /dev/null +++ b/pkg/services/pluginsintegration/provisionedplugins/provisioned.go @@ -0,0 +1,19 @@ +package provisionedplugins + +import "context" + +type Manager interface { + ProvisionedPlugins(ctx context.Context) ([]string, error) +} + +var _ Manager = (*Noop)(nil) + +type Noop struct{} + +func NewNoop() *Noop { + return &Noop{} +} + +func (s *Noop) ProvisionedPlugins(_ context.Context) ([]string, error) { + return []string{}, nil +} From 31a371e385e29b6216b5f3f6afde5a7bde58a49e Mon Sep 17 00:00:00 2001 From: Will Assis <35489495+gassiss@users.noreply.github.com> Date: Thu, 13 Mar 2025 11:09:38 -0300 Subject: [PATCH 030/117] fix(unified-storage): remove bleve index metric from global scope (#101825) * refactor grafana_index_server_index_size to calculate in a goroutine instead of at scrape time and remove grafana_index_server_indexed_docs metric * use wire to inject bleve index metrics * remove sprinkles metrics from bleve index metrics * log error when trying to calculate file index size and bump interval to 1m instead of 5s --- .../datamigrations/to_unified_storage.go | 2 +- pkg/server/module_server.go | 10 +- pkg/server/wire.go | 1 + pkg/server/wireexts_oss.go | 1 + pkg/storage/unified/client.go | 9 +- .../unified/resource/bleve_index_metrics.go | 175 ++++-------------- pkg/storage/unified/resource/search.go | 54 +++--- pkg/storage/unified/resource/server.go | 6 +- pkg/storage/unified/search/bleve.go | 67 +++++-- .../unified/search/bleve_search_test.go | 5 +- pkg/storage/unified/search/bleve_test.go | 5 +- pkg/storage/unified/search/options.go | 16 +- pkg/storage/unified/sql/server.go | 3 +- pkg/storage/unified/sql/service.go | 7 +- .../unified/sql/test/integration_test.go | 2 +- pkg/tests/testinfra/testinfra.go | 2 +- 16 files changed, 152 insertions(+), 213 deletions(-) diff --git a/pkg/cmd/grafana-cli/commands/datamigrations/to_unified_storage.go b/pkg/cmd/grafana-cli/commands/datamigrations/to_unified_storage.go index 5d39ee165c1..faae73c2ba8 100644 --- a/pkg/cmd/grafana-cli/commands/datamigrations/to_unified_storage.go +++ b/pkg/cmd/grafana-cli/commands/datamigrations/to_unified_storage.go @@ -196,7 +196,7 @@ func newUnifiedClient(cfg *setting.Cfg, sqlStore db.DB) (resource.ResourceClient Reg: prometheus.NewPedanticRegistry(), Authzc: authlib.FixedAccessClient(true), // always true! Docs: nil, // document supplier - }, nil) + }, nil, nil) } func newParquetClient(file *os.File) (resource.BulkStoreClient, error) { diff --git a/pkg/server/module_server.go b/pkg/server/module_server.go index 2f0e7a1a03c..82fd314f5e1 100644 --- a/pkg/server/module_server.go +++ b/pkg/server/module_server.go @@ -22,8 +22,8 @@ import ( // NewModule returns an instance of a ModuleServer, responsible for managing // dskit modules (services). -func NewModule(opts Options, apiOpts api.ServerOptions, features featuremgmt.FeatureToggles, cfg *setting.Cfg, storageMetrics *resource.StorageMetrics) (*ModuleServer, error) { - s, err := newModuleServer(opts, apiOpts, features, cfg, storageMetrics) +func NewModule(opts Options, apiOpts api.ServerOptions, features featuremgmt.FeatureToggles, cfg *setting.Cfg, storageMetrics *resource.StorageMetrics, indexMetrics *resource.BleveIndexMetrics) (*ModuleServer, error) { + s, err := newModuleServer(opts, apiOpts, features, cfg, storageMetrics, indexMetrics) if err != nil { return nil, err } @@ -35,7 +35,7 @@ func NewModule(opts Options, apiOpts api.ServerOptions, features featuremgmt.Fea return s, nil } -func newModuleServer(opts Options, apiOpts api.ServerOptions, features featuremgmt.FeatureToggles, cfg *setting.Cfg, storageMetrics *resource.StorageMetrics) (*ModuleServer, error) { +func newModuleServer(opts Options, apiOpts api.ServerOptions, features featuremgmt.FeatureToggles, cfg *setting.Cfg, storageMetrics *resource.StorageMetrics, indexMetrics *resource.BleveIndexMetrics) (*ModuleServer, error) { rootCtx, shutdownFn := context.WithCancel(context.Background()) s := &ModuleServer{ @@ -52,6 +52,7 @@ func newModuleServer(opts Options, apiOpts api.ServerOptions, features featuremg commit: opts.Commit, buildBranch: opts.BuildBranch, storageMetrics: storageMetrics, + indexMetrics: indexMetrics, } return s, nil @@ -74,6 +75,7 @@ type ModuleServer struct { isInitialized bool mtx sync.Mutex storageMetrics *resource.StorageMetrics + indexMetrics *resource.BleveIndexMetrics pidFile string version string @@ -138,7 +140,7 @@ func (s *ModuleServer) Run() error { if err != nil { return nil, err } - return sql.ProvideUnifiedStorageGrpcService(s.cfg, s.features, nil, s.log, nil, docBuilders, s.storageMetrics) + return sql.ProvideUnifiedStorageGrpcService(s.cfg, s.features, nil, s.log, nil, docBuilders, s.storageMetrics, s.indexMetrics) }) m.RegisterModule(modules.ZanzanaServer, func() (services.Service, error) { diff --git a/pkg/server/wire.go b/pkg/server/wire.go index c24a40e80d4..e211b739ecb 100644 --- a/pkg/server/wire.go +++ b/pkg/server/wire.go @@ -404,6 +404,7 @@ var wireBasicSet = wire.NewSet( authz.WireSet, // Unified storage resource.ProvideStorageMetrics, + resource.ProvideIndexMetrics, // Kubernetes API server grafanaapiserver.WireSet, apiregistry.WireSet, diff --git a/pkg/server/wireexts_oss.go b/pkg/server/wireexts_oss.go index 75e6f6842fb..77ff00b960c 100644 --- a/pkg/server/wireexts_oss.go +++ b/pkg/server/wireexts_oss.go @@ -159,6 +159,7 @@ var wireExtsModuleServerSet = wire.NewSet( wireExtsBaseCLISet, // Unified storage resource.ProvideStorageMetrics, + resource.ProvideIndexMetrics, ) var wireExtsStandaloneAPIServerSet = wire.NewSet( diff --git a/pkg/storage/unified/client.go b/pkg/storage/unified/client.go index 75c6cbdf9fa..3eebaffeac8 100644 --- a/pkg/storage/unified/client.go +++ b/pkg/storage/unified/client.go @@ -51,7 +51,7 @@ type clientMetrics struct { } // This adds a UnifiedStorage client into the wire dependency tree -func ProvideUnifiedStorageClient(opts *Options, storageMetrics *resource.StorageMetrics) (resource.ResourceClient, error) { +func ProvideUnifiedStorageClient(opts *Options, storageMetrics *resource.StorageMetrics, indexMetrics *resource.BleveIndexMetrics) (resource.ResourceClient, error) { // See: apiserver.ApplyGrafanaConfig(cfg, features, o) apiserverCfg := opts.Cfg.SectionWithEnvOverrides("grafana-apiserver") client, err := newClient(options.StorageOptions{ @@ -59,7 +59,7 @@ func ProvideUnifiedStorageClient(opts *Options, storageMetrics *resource.Storage DataPath: apiserverCfg.Key("storage_path").MustString(filepath.Join(opts.Cfg.DataPath, "grafana-apiserver")), Address: apiserverCfg.Key("address").MustString(""), // client address BlobStoreURL: apiserverCfg.Key("blob_url").MustString(""), - }, opts.Cfg, opts.Features, opts.DB, opts.Tracer, opts.Reg, opts.Authzc, opts.Docs, storageMetrics) + }, opts.Cfg, opts.Features, opts.DB, opts.Tracer, opts.Reg, opts.Authzc, opts.Docs, storageMetrics, indexMetrics) if err == nil { // Used to get the folder stats client = federated.NewFederatedClient( @@ -80,6 +80,7 @@ func newClient(opts options.StorageOptions, authzc types.AccessClient, docs resource.DocumentBuilderSupplier, storageMetrics *resource.StorageMetrics, + indexMetrics *resource.BleveIndexMetrics, ) (resource.ResourceClient, error) { ctx := context.Background() switch opts.StorageType { @@ -131,11 +132,11 @@ func newClient(opts options.StorageOptions, // Use the local SQL default: - searchOptions, err := search.NewSearchOptions(features, cfg, tracer, docs, reg) + searchOptions, err := search.NewSearchOptions(features, cfg, tracer, docs, indexMetrics) if err != nil { return nil, err } - server, err := sql.NewResourceServer(db, cfg, tracer, reg, authzc, searchOptions, storageMetrics) + server, err := sql.NewResourceServer(db, cfg, tracer, reg, authzc, searchOptions, storageMetrics, indexMetrics) if err != nil { return nil, err } diff --git a/pkg/storage/unified/resource/bleve_index_metrics.go b/pkg/storage/unified/resource/bleve_index_metrics.go index a15f36be543..310886666cc 100644 --- a/pkg/storage/unified/resource/bleve_index_metrics.go +++ b/pkg/storage/unified/resource/bleve_index_metrics.go @@ -1,160 +1,57 @@ package resource import ( - "os" - "path/filepath" - "sync" "time" "github.com/grafana/dskit/instrument" "github.com/prometheus/client_golang/prometheus" -) - -var ( - onceIndex sync.Once - onceSprinkles sync.Once - IndexMetrics *BleveIndexMetrics - SprinklesIndexMetrics *SprinklesMetrics + "github.com/prometheus/client_golang/prometheus/promauto" ) type BleveIndexMetrics struct { - IndexDir string - Backend SearchBackend - - // metrics IndexLatency *prometheus.HistogramVec IndexSize prometheus.Gauge - IndexedDocs prometheus.Gauge IndexedKinds *prometheus.GaugeVec IndexCreationTime *prometheus.HistogramVec IndexTenants *prometheus.CounterVec } -type SprinklesMetrics struct { - SprinklesLatency prometheus.Histogram -} - var IndexCreationBuckets = []float64{1, 5, 10, 25, 50, 75, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000} -func NewSprinklesMetrics() *SprinklesMetrics { - onceSprinkles.Do(func() { - SprinklesIndexMetrics = &SprinklesMetrics{ - SprinklesLatency: prometheus.NewHistogram(prometheus.HistogramOpts{ - Namespace: "index_server", - Name: "sprinkles_latency_seconds", - Help: "Time (in seconds) it takes until sprinkles are fetched", - Buckets: instrument.DefBuckets, - NativeHistogramBucketFactor: 1.1, // enable native histograms - NativeHistogramMaxBucketNumber: 160, - NativeHistogramMinResetDuration: time.Hour, - }), - } - }) - - return SprinklesIndexMetrics -} - -func NewIndexMetrics(indexDir string, searchBackend SearchBackend) *BleveIndexMetrics { - onceIndex.Do(func() { - IndexMetrics = &BleveIndexMetrics{ - IndexDir: indexDir, - Backend: searchBackend, - IndexLatency: prometheus.NewHistogramVec(prometheus.HistogramOpts{ - Namespace: "index_server", - Name: "index_latency_seconds", - Help: "Time (in seconds) until index is updated with new event", - Buckets: instrument.DefBuckets, - NativeHistogramBucketFactor: 1.1, // enable native histograms - NativeHistogramMaxBucketNumber: 160, - NativeHistogramMinResetDuration: time.Hour, - }, []string{"resource"}), - IndexSize: prometheus.NewGauge(prometheus.GaugeOpts{ - Namespace: "index_server", - Name: "index_size", - Help: "Size of the index in bytes - only for file-based indices", - }), - IndexedDocs: prometheus.NewGauge(prometheus.GaugeOpts{ - Namespace: "index_server", - Name: "indexed_docs", - Help: "Number of indexed documents by resource", - }), - IndexedKinds: prometheus.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: "index_server", - Name: "indexed_kinds", - Help: "Number of indexed documents by kind", - }, []string{"kind"}), - IndexCreationTime: prometheus.NewHistogramVec(prometheus.HistogramOpts{ - Namespace: "index_server", - Name: "index_creation_time_seconds", - Help: "Time (in seconds) it takes until index is created", - Buckets: IndexCreationBuckets, - NativeHistogramBucketFactor: 1.1, // enable native histograms - NativeHistogramMaxBucketNumber: 160, - NativeHistogramMinResetDuration: time.Hour, - }, []string{}), - IndexTenants: prometheus.NewCounterVec(prometheus.CounterOpts{ - Namespace: "index_server", - Name: "index_tenants", - Help: "Number of tenants in the index", - }, []string{"index_storage"}), // index_storage is either "file" or "memory" - } - }) - - return IndexMetrics -} - -func (s *SprinklesMetrics) Collect(ch chan<- prometheus.Metric) { - s.SprinklesLatency.Collect(ch) -} - -func (s *SprinklesMetrics) Describe(ch chan<- *prometheus.Desc) { - s.SprinklesLatency.Describe(ch) -} - -func (s *BleveIndexMetrics) Collect(ch chan<- prometheus.Metric) { - s.IndexLatency.Collect(ch) - s.IndexCreationTime.Collect(ch) - s.IndexedKinds.Collect(ch) - s.IndexTenants.Collect(ch) - - // collect index size - totalSize, err := getTotalIndexSize(s.IndexDir) - if err == nil { - s.IndexSize.Set(float64(totalSize)) - s.IndexSize.Collect(ch) +func ProvideIndexMetrics(reg prometheus.Registerer) *BleveIndexMetrics { + return &BleveIndexMetrics{ + IndexLatency: promauto.With(reg).NewHistogramVec(prometheus.HistogramOpts{ + Namespace: "index_server", + Name: "index_latency_seconds", + Help: "Time (in seconds) until index is updated with new event", + Buckets: instrument.DefBuckets, + NativeHistogramBucketFactor: 1.1, // enable native histograms + NativeHistogramMaxBucketNumber: 160, + NativeHistogramMinResetDuration: time.Hour, + }, []string{"resource"}), + IndexSize: promauto.With(reg).NewGauge(prometheus.GaugeOpts{ + Namespace: "index_server", + Name: "index_size", + Help: "Size of the index in bytes - only for file-based indices", + }), + IndexedKinds: promauto.With(reg).NewGaugeVec(prometheus.GaugeOpts{ + Namespace: "index_server", + Name: "indexed_kinds", + Help: "Number of indexed documents by kind", + }, []string{"kind"}), + IndexCreationTime: promauto.With(reg).NewHistogramVec(prometheus.HistogramOpts{ + Namespace: "index_server", + Name: "index_creation_time_seconds", + Help: "Time (in seconds) it takes until index is created", + Buckets: IndexCreationBuckets, + NativeHistogramBucketFactor: 1.1, // enable native histograms + NativeHistogramMaxBucketNumber: 160, + NativeHistogramMinResetDuration: time.Hour, + }, []string{}), + IndexTenants: promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ + Namespace: "index_server", + Name: "index_tenants", + Help: "Number of tenants in the index", + }, []string{"index_storage"}), // index_storage is either "file" or "memory" } - - // collect index docs - s.IndexedDocs.Set(float64(s.Backend.TotalDocs())) - s.IndexedDocs.Collect(ch) -} - -func (s *BleveIndexMetrics) Describe(ch chan<- *prometheus.Desc) { - s.IndexLatency.Describe(ch) - s.IndexSize.Describe(ch) - s.IndexedDocs.Describe(ch) - s.IndexedKinds.Describe(ch) - s.IndexCreationTime.Describe(ch) - s.IndexTenants.Describe(ch) -} - -// getTotalIndexSize returns the total size of all file-based indices. -func getTotalIndexSize(dir string) (int64, error) { - var totalSize int64 - - err := filepath.WalkDir(dir, func(path string, info os.DirEntry, err error) error { - if err != nil { - return err - } - if !info.IsDir() { - fileInfo, err := info.Info() - if err != nil { - return err - } - totalSize += fileInfo.Size() - } - return nil - }) - - return totalSize, err } diff --git a/pkg/storage/unified/resource/search.go b/pkg/storage/unified/resource/search.go index 63acc10be7c..196b33e2492 100644 --- a/pkg/storage/unified/resource/search.go +++ b/pkg/storage/unified/resource/search.go @@ -88,14 +88,15 @@ const tracingPrexfixSearch = "unified_search." // This supports indexing+search regardless of implementation type searchSupport struct { - tracer trace.Tracer - log *slog.Logger - storage StorageBackend - search SearchBackend - access types.AccessClient - builders *builderCache - initWorkers int - initMinSize int + tracer trace.Tracer + log *slog.Logger + storage StorageBackend + search SearchBackend + indexMetrics *BleveIndexMetrics + access types.AccessClient + builders *builderCache + initWorkers int + initMinSize int } var ( @@ -103,7 +104,7 @@ var ( _ ManagedObjectIndexServer = (*searchSupport)(nil) ) -func newSearchSupport(opts SearchOptions, storage StorageBackend, access types.AccessClient, blob BlobSupport, tracer trace.Tracer) (support *searchSupport, err error) { +func newSearchSupport(opts SearchOptions, storage StorageBackend, access types.AccessClient, blob BlobSupport, tracer trace.Tracer, indexMetrics *BleveIndexMetrics) (support *searchSupport, err error) { // No backend search support if opts.Backend == nil { return nil, nil @@ -117,13 +118,14 @@ func newSearchSupport(opts SearchOptions, storage StorageBackend, access types.A } support = &searchSupport{ - access: access, - tracer: tracer, - storage: storage, - search: opts.Backend, - log: slog.Default().With("logger", "resource-search"), - initWorkers: opts.WorkerThreads, - initMinSize: opts.InitMinCount, + access: access, + tracer: tracer, + storage: storage, + search: opts.Backend, + log: slog.Default().With("logger", "resource-search"), + initWorkers: opts.WorkerThreads, + initMinSize: opts.InitMinCount, + indexMetrics: indexMetrics, } info, err := opts.Resources.GetDocumentBuilders() @@ -399,8 +401,8 @@ func (s *searchSupport) init(ctx context.Context) error { end := time.Now().Unix() s.log.Info("search index initialized", "duration_secs", end-start, "total_docs", s.search.TotalDocs()) - if IndexMetrics != nil { - IndexMetrics.IndexCreationTime.WithLabelValues().Observe(float64(end - start)) + if s.indexMetrics != nil { + s.indexMetrics.IndexCreationTime.WithLabelValues().Observe(float64(end - start)) } return nil @@ -457,8 +459,8 @@ func (s *searchSupport) handleEvent(ctx context.Context, evt *WrittenEvent) { s.log.Warn("error writing document watch event", "error", err) return } - if evt.Type == WatchEvent_ADDED { - IndexMetrics.IndexedKinds.WithLabelValues(evt.Key.Resource).Inc() + if evt.Type == WatchEvent_ADDED && s.indexMetrics != nil { + s.indexMetrics.IndexedKinds.WithLabelValues(evt.Key.Resource).Inc() } case WatchEvent_DELETED: _, deleteSpan := s.tracer.Start(ctx, tracingPrexfixSearch+"DeleteDocument") @@ -468,7 +470,9 @@ func (s *searchSupport) handleEvent(ctx context.Context, evt *WrittenEvent) { s.log.Warn("error deleting document watch event", "error", err) return } - IndexMetrics.IndexedKinds.WithLabelValues(evt.Key.Resource).Dec() + if s.indexMetrics != nil { + s.indexMetrics.IndexedKinds.WithLabelValues(evt.Key.Resource).Dec() + } default: // do nothing s.log.Warn("unknown watch event", "type", evt.Type) @@ -481,8 +485,8 @@ func (s *searchSupport) handleEvent(ctx context.Context, evt *WrittenEvent) { if latencySeconds > 1 { s.log.Warn("high index latency object details", "resource", evt.Key.Resource, "latency_seconds", latencySeconds, "name", evt.Key.Name, "namespace", evt.Key.Namespace, "rv", evt.ResourceVersion) } - if IndexMetrics != nil { - IndexMetrics.IndexLatency.WithLabelValues(evt.Key.Resource).Observe(latencySeconds) + if s.indexMetrics != nil { + s.indexMetrics.IndexLatency.WithLabelValues(evt.Key.Resource).Observe(latencySeconds) } } @@ -573,8 +577,8 @@ func (s *searchSupport) build(ctx context.Context, nsr NamespacedResource, size if err != nil { s.log.Warn("error getting doc count", "error", err) } - if IndexMetrics != nil { - IndexMetrics.IndexedKinds.WithLabelValues(key.Resource).Add(float64(docCount)) + if s.indexMetrics != nil { + s.indexMetrics.IndexedKinds.WithLabelValues(key.Resource).Add(float64(docCount)) } if err == nil { diff --git a/pkg/storage/unified/resource/server.go b/pkg/storage/unified/resource/server.go index 0acc0dd2520..0a983de75aa 100644 --- a/pkg/storage/unified/resource/server.go +++ b/pkg/storage/unified/resource/server.go @@ -184,6 +184,8 @@ type ResourceServerOptions struct { Reg prometheus.Registerer storageMetrics *StorageMetrics + + IndexMetrics *BleveIndexMetrics } func NewResourceServer(opts ResourceServerOptions) (ResourceServer, error) { @@ -248,11 +250,12 @@ func NewResourceServer(opts ResourceServerOptions) (ResourceServer, error) { ctx: ctx, cancel: cancel, storageMetrics: opts.storageMetrics, + indexMetrics: opts.IndexMetrics, } if opts.Search.Resources != nil { var err error - s.search, err = newSearchSupport(opts.Search, s.backend, s.access, s.blob, opts.Tracer) + s.search, err = newSearchSupport(opts.Search, s.backend, s.access, s.blob, opts.Tracer, opts.IndexMetrics) if err != nil { return nil, err } @@ -282,6 +285,7 @@ type server struct { now func() int64 mostRecentRV atomic.Int64 // The most recent resource version seen by the server storageMetrics *StorageMetrics + indexMetrics *BleveIndexMetrics // Background watch task -- this has permissions for everything ctx context.Context diff --git a/pkg/storage/unified/search/bleve.go b/pkg/storage/unified/search/bleve.go index 322abff0516..4976449f548 100644 --- a/pkg/storage/unified/search/bleve.go +++ b/pkg/storage/unified/search/bleve.go @@ -59,10 +59,11 @@ type bleveBackend struct { cache map[resource.NamespacedResource]*bleveIndex cacheMu sync.RWMutex - features featuremgmt.FeatureToggles + features featuremgmt.FeatureToggles + indexMetrics *resource.BleveIndexMetrics } -func NewBleveBackend(opts BleveOptions, tracer trace.Tracer, features featuremgmt.FeatureToggles) (*bleveBackend, error) { +func NewBleveBackend(opts BleveOptions, tracer trace.Tracer, features featuremgmt.FeatureToggles, indexMetrics *resource.BleveIndexMetrics) (*bleveBackend, error) { if opts.Root == "" { return nil, fmt.Errorf("bleve backend missing root folder configuration") } @@ -74,14 +75,19 @@ func NewBleveBackend(opts BleveOptions, tracer trace.Tracer, features featuremgm return nil, fmt.Errorf("bleve root is configured against a file (not folder)") } - return &bleveBackend{ - log: slog.Default().With("logger", "bleve-backend"), - tracer: tracer, - cache: make(map[resource.NamespacedResource]*bleveIndex), - opts: opts, - start: time.Now(), - features: features, - }, nil + bleveBackend := &bleveBackend{ + log: slog.Default().With("logger", "bleve-backend"), + tracer: tracer, + cache: make(map[resource.NamespacedResource]*bleveIndex), + opts: opts, + start: time.Now(), + features: features, + indexMetrics: indexMetrics, + } + + go bleveBackend.updateIndexSizeMetric(opts.Root) + + return bleveBackend, nil } // This will return nil if the key does not exist @@ -96,6 +102,39 @@ func (b *bleveBackend) GetIndex(ctx context.Context, key resource.NamespacedReso return nil, nil } +// updateIndexSizeMetric sets the total size of all file-based indices metric. +func (b *bleveBackend) updateIndexSizeMetric(indexPath string) { + if b.indexMetrics == nil { + return + } + + for { + var totalSize int64 + + err := filepath.WalkDir(indexPath, func(path string, info os.DirEntry, err error) error { + if err != nil { + return err + } + if !info.IsDir() { + fileInfo, err := info.Info() + if err != nil { + return err + } + totalSize += fileInfo.Size() + } + return nil + }) + + if err == nil { + b.indexMetrics.IndexSize.Set(float64(totalSize)) + } else { + b.log.Error("got error while trying to calculate bleve file index size", "error", err) + } + + time.Sleep(60 * time.Second) + } +} + // Build an index from scratch func (b *bleveBackend) BuildIndex(ctx context.Context, key resource.NamespacedResource, @@ -166,10 +205,14 @@ func (b *bleveBackend) BuildIndex(ctx context.Context, if index != nil && err == nil { go b.cleanOldIndexes(resourceDir, fname) } - resource.IndexMetrics.IndexTenants.WithLabelValues("file").Inc() + if b.indexMetrics != nil { + b.indexMetrics.IndexTenants.WithLabelValues("file").Inc() + } } else { index, err = bleve.NewMemOnly(mapper) - resource.IndexMetrics.IndexTenants.WithLabelValues("memory").Inc() + if b.indexMetrics != nil { + b.indexMetrics.IndexTenants.WithLabelValues("memory").Inc() + } } if err != nil { return nil, err diff --git a/pkg/storage/unified/search/bleve_search_test.go b/pkg/storage/unified/search/bleve_search_test.go index 39eb0638995..29287de97e4 100644 --- a/pkg/storage/unified/search/bleve_search_test.go +++ b/pkg/storage/unified/search/bleve_search_test.go @@ -335,12 +335,9 @@ func newTestDashboardsIndex(t *testing.T) resource.ResourceIndex { backend, err := NewBleveBackend(BleveOptions{ Root: tmpdir, FileThreshold: 9999, // use in-memory for tests - }, tracing.NewNoopTracerService(), featuremgmt.WithFeatures(featuremgmt.FlagUnifiedStorageSearchPermissionFiltering)) + }, tracing.NewNoopTracerService(), featuremgmt.WithFeatures(featuremgmt.FlagUnifiedStorageSearchPermissionFiltering), nil) require.NoError(t, err) - // AVOID NPE in test - resource.NewIndexMetrics(backend.opts.Root, backend) - rv := int64(10) ctx := identity.WithRequester(context.Background(), &user.SignedInUser{Namespace: "ns"}) diff --git a/pkg/storage/unified/search/bleve_test.go b/pkg/storage/unified/search/bleve_test.go index f1d6fec51b6..204a4a07cbd 100644 --- a/pkg/storage/unified/search/bleve_test.go +++ b/pkg/storage/unified/search/bleve_test.go @@ -39,12 +39,9 @@ func TestBleveBackend(t *testing.T) { backend, err := NewBleveBackend(BleveOptions{ Root: tmpdir, FileThreshold: 5, // with more than 5 items we create a file on disk - }, tracing.NewNoopTracerService(), featuremgmt.WithFeatures(featuremgmt.FlagUnifiedStorageSearchPermissionFiltering)) + }, tracing.NewNoopTracerService(), featuremgmt.WithFeatures(featuremgmt.FlagUnifiedStorageSearchPermissionFiltering), nil) require.NoError(t, err) - // AVOID NPE in test - resource.NewIndexMetrics(backend.opts.Root, backend) - rv := int64(10) ctx := identity.WithRequester(context.Background(), &user.SignedInUser{Namespace: "ns"}) var dashboardsIndex resource.ResourceIndex diff --git a/pkg/storage/unified/search/options.go b/pkg/storage/unified/search/options.go index 13a2612319d..f3103e3c94e 100644 --- a/pkg/storage/unified/search/options.go +++ b/pkg/storage/unified/search/options.go @@ -1,19 +1,16 @@ package search import ( - "log/slog" "os" "path/filepath" - "github.com/prometheus/client_golang/prometheus" - "github.com/grafana/grafana/pkg/infra/tracing" "github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/storage/unified/resource" ) -func NewSearchOptions(features featuremgmt.FeatureToggles, cfg *setting.Cfg, tracer tracing.Tracer, docs resource.DocumentBuilderSupplier, reg prometheus.Registerer) (resource.SearchOptions, error) { +func NewSearchOptions(features featuremgmt.FeatureToggles, cfg *setting.Cfg, tracer tracing.Tracer, docs resource.DocumentBuilderSupplier, indexMetrics *resource.BleveIndexMetrics) (resource.SearchOptions, error) { // Setup the search server if features.IsEnabledGlobally(featuremgmt.FlagUnifiedStorageSearch) { root := cfg.IndexPath @@ -28,21 +25,12 @@ func NewSearchOptions(features featuremgmt.FeatureToggles, cfg *setting.Cfg, tra Root: root, FileThreshold: int64(cfg.IndexFileThreshold), // fewer than X items will use a memory index BatchSize: cfg.IndexMaxBatchSize, // This is the batch size for how many objects to add to the index at once - }, tracer, features) + }, tracer, features, indexMetrics) if err != nil { return resource.SearchOptions{}, err } - err = reg.Register(resource.NewIndexMetrics(cfg.IndexPath, bleve)) - if err != nil { - slog.Warn("Failed to register indexer metrics", "error", err) - } - err = reg.Register(resource.NewSprinklesMetrics()) - if err != nil { - slog.Warn("Failed to register sprinkles metrics", "error", err) - } - return resource.SearchOptions{ Backend: bleve, Resources: docs, diff --git a/pkg/storage/unified/sql/server.go b/pkg/storage/unified/sql/server.go index 69738f96f21..330e265d9f7 100644 --- a/pkg/storage/unified/sql/server.go +++ b/pkg/storage/unified/sql/server.go @@ -18,7 +18,7 @@ import ( // Creates a new ResourceServer func NewResourceServer(db infraDB.DB, cfg *setting.Cfg, - tracer tracing.Tracer, reg prometheus.Registerer, ac types.AccessClient, searchOptions resource.SearchOptions, storageMetrics *resource.StorageMetrics) (resource.ResourceServer, error) { + tracer tracing.Tracer, reg prometheus.Registerer, ac types.AccessClient, searchOptions resource.SearchOptions, storageMetrics *resource.StorageMetrics, indexMetrics *resource.BleveIndexMetrics) (resource.ResourceServer, error) { apiserverCfg := cfg.SectionWithEnvOverrides("grafana-apiserver") opts := resource.ResourceServerOptions{ Tracer: tracer, @@ -55,6 +55,7 @@ func NewResourceServer(db infraDB.DB, cfg *setting.Cfg, opts.Diagnostics = store opts.Lifecycle = store opts.Search = searchOptions + opts.IndexMetrics = indexMetrics rs, err := resource.NewResourceServer(opts) if err != nil { diff --git a/pkg/storage/unified/sql/service.go b/pkg/storage/unified/sql/service.go index e6ad6cd6096..6b4e3dc2a87 100644 --- a/pkg/storage/unified/sql/service.go +++ b/pkg/storage/unified/sql/service.go @@ -52,6 +52,7 @@ type service struct { log log.Logger reg prometheus.Registerer storageMetrics *resource.StorageMetrics + indexMetrics *resource.BleveIndexMetrics docBuilders resource.DocumentBuilderSupplier } @@ -64,6 +65,7 @@ func ProvideUnifiedStorageGrpcService( reg prometheus.Registerer, docBuilders resource.DocumentBuilderSupplier, storageMetrics *resource.StorageMetrics, + indexMetrics *resource.BleveIndexMetrics, ) (UnifiedStorageGrpcService, error) { tracingCfg, err := tracing.ProvideTracingConfig(cfg) if err != nil { @@ -96,6 +98,7 @@ func ProvideUnifiedStorageGrpcService( reg: reg, docBuilders: docBuilders, storageMetrics: storageMetrics, + indexMetrics: indexMetrics, } // This will be used when running as a dskit service @@ -110,12 +113,12 @@ func (s *service) start(ctx context.Context) error { return err } - searchOptions, err := search.NewSearchOptions(s.features, s.cfg, s.tracing, s.docBuilders, s.reg) + searchOptions, err := search.NewSearchOptions(s.features, s.cfg, s.tracing, s.docBuilders, s.indexMetrics) if err != nil { return err } - server, err := NewResourceServer(s.db, s.cfg, s.tracing, s.reg, authzClient, searchOptions, s.storageMetrics) + server, err := NewResourceServer(s.db, s.cfg, s.tracing, s.reg, authzClient, searchOptions, s.storageMetrics, s.indexMetrics) if err != nil { return err } diff --git a/pkg/storage/unified/sql/test/integration_test.go b/pkg/storage/unified/sql/test/integration_test.go index 64164300dea..cf62ab0b0d7 100644 --- a/pkg/storage/unified/sql/test/integration_test.go +++ b/pkg/storage/unified/sql/test/integration_test.go @@ -83,7 +83,7 @@ func TestClientServer(t *testing.T) { features := featuremgmt.WithFeatures() - svc, err := sql.ProvideUnifiedStorageGrpcService(cfg, features, dbstore, nil, prometheus.NewPedanticRegistry(), nil, nil) + svc, err := sql.ProvideUnifiedStorageGrpcService(cfg, features, dbstore, nil, prometheus.NewPedanticRegistry(), nil, nil, nil) require.NoError(t, err) var client resource.ResourceStoreClient diff --git a/pkg/tests/testinfra/testinfra.go b/pkg/tests/testinfra/testinfra.go index 118cb83b7de..d8c412f9618 100644 --- a/pkg/tests/testinfra/testinfra.go +++ b/pkg/tests/testinfra/testinfra.go @@ -104,7 +104,7 @@ func StartGrafanaEnv(t *testing.T, grafDir, cfgPath string) (string, *server.Tes var storage sql.UnifiedStorageGrpcService if runstore { storage, err = sql.ProvideUnifiedStorageGrpcService(env.Cfg, env.FeatureToggles, env.SQLStore, - env.Cfg.Logger, prometheus.NewPedanticRegistry(), nil, nil) + env.Cfg.Logger, prometheus.NewPedanticRegistry(), nil, nil, nil) require.NoError(t, err) ctx := context.Background() err = storage.StartAsync(ctx) From 6d61196e55b7550dae8fa8c69698e604f80adcdf Mon Sep 17 00:00:00 2001 From: Sergej-Vlasov <37613182+Sergej-Vlasov@users.noreply.github.com> Date: Thu, 13 Mar 2025 14:37:16 +0000 Subject: [PATCH 031/117] ConditionalRendering: Restore variable conditional rendering logic (#102115) restore variable conditional rendering logic --- .../ConditionalRenderingVariable.tsx | 38 ++++++++++--------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingVariable.tsx b/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingVariable.tsx index a9b58843a2f..7a2b15d296b 100644 --- a/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingVariable.tsx +++ b/public/app/features/dashboard-scene/conditional-rendering/ConditionalRenderingVariable.tsx @@ -1,7 +1,8 @@ import { css } from '@emotion/css'; import { ReactNode, useMemo } from 'react'; -import { SceneComponentProps, sceneGraph } from '@grafana/scenes'; +import { GrafanaTheme2 } from '@grafana/data'; +import { SceneComponentProps, sceneGraph, VariableDependencyConfig } from '@grafana/scenes'; import { ConditionalRenderingVariableKind } from '@grafana/schema/dist/esm/schema/dashboard/v2alpha0'; import { Combobox, ComboboxOption, Field, Input, Stack, useStyles2 } from '@grafana/ui'; import { t } from 'app/core/internationalization'; @@ -16,17 +17,26 @@ export type VariableConditionValue = { value: string; }; -interface ConditionalRenderingVariableState extends ConditionalRenderingBaseState {} +type ConditionalRenderingVariableState = ConditionalRenderingBaseState; export class ConditionalRenderingVariable extends ConditionalRenderingBase { public get title(): string { return t('dashboard.conditional-rendering.variable.label', 'Variable'); } + protected _variableDependency = new VariableDependencyConfig(this, { + onAnyVariableChanged: (v) => { + if (v.state.name === this.state.value.name) { + this.getConditionalLogicRoot().notifyChange(); + } + }, + }); + public evaluate(): boolean { if (!this.state.value.name) { return true; } + const variable = sceneGraph.getVariables(this).state.variables.find((v) => v.state.name === this.state.value.name); // name is defined but no variable found - return false @@ -35,13 +45,7 @@ export class ConditionalRenderingVariable extends ConditionalRenderingBase ({ +const getStyles = (theme: GrafanaTheme2) => ({ variableNameSelect: css({ flexGrow: 1, }), operatorSelect: css({ - width: '6rem', + width: theme.spacing(12), }), }); From 9264431c81a7297aae9a214d4d60ed6a9a6af47f Mon Sep 17 00:00:00 2001 From: Ieva Date: Thu, 13 Mar 2025 15:18:23 +0000 Subject: [PATCH 032/117] RBAC: Remove action set feature toggle (#101959) * remove action set feature toggle * don't pass feature toggles to action set service instantiation * linting * test fixes and frontend clean-up * fix test --- .../feature-toggles/index.md | 121 +++++++++--------- .../src/types/featureToggles.gen.ts | 1 - pkg/api/folder_bench_test.go | 2 +- .../acimpl/accesscontrol_test.go | 2 +- pkg/services/accesscontrol/acimpl/service.go | 38 ++---- .../accesscontrol/acimpl/service_test.go | 20 +-- .../ossaccesscontrol/testutil/testutil.go | 2 +- .../resourcepermissions/service.go | 71 +++++----- .../resourcepermissions/service_test.go | 47 +------ .../resourcepermissions/store.go | 4 +- .../resourcepermissions/store_test.go | 6 +- pkg/services/featuremgmt/registry.go | 7 - pkg/services/featuremgmt/toggles_gen.csv | 1 - pkg/services/featuremgmt/toggles_gen.go | 4 - pkg/services/featuremgmt/toggles_gen.json | 1 + pkg/services/folder/folderimpl/folder.go | 6 - .../folderimpl/folder_unifiedstorage.go | 6 - .../sqlstore/permissions/dashboard.go | 47 ++----- .../sqlstore/permissions/dashboard_test.go | 13 +- .../sqlstore/searchstore/search_test.go | 39 ++++++ pkg/tests/apis/helper.go | 2 +- .../features/browse-dashboards/permissions.ts | 10 -- 22 files changed, 184 insertions(+), 266 deletions(-) diff --git a/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md b/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md index 60f30055ae8..fac87ab8fd8 100644 --- a/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md +++ b/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md @@ -21,67 +21,66 @@ For more information about feature release stages, refer to [Release life cycle Most [generally available](https://grafana.com/docs/release-life-cycle/#general-availability) features are enabled by default. You can disable these feature by setting the feature flag to "false" in the configuration. -| Feature toggle name | Description | Enabled by default | -| -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------ | -| `disableEnvelopeEncryption` | Disable envelope encryption (emergency only) | | -| `publicDashboardsScene` | Enables public dashboard rendering using scenes | Yes | -| `featureHighlights` | Highlight Grafana Enterprise features | | -| `correlations` | Correlations page | Yes | -| `cloudWatchCrossAccountQuerying` | Enables cross-account querying in CloudWatch datasources | Yes | -| `nestedFolders` | Enable folder nesting | Yes | -| `logsContextDatasourceUi` | Allow datasource to provide custom UI for context view | Yes | -| `lokiQuerySplitting` | Split large interval queries into subqueries with smaller time intervals | Yes | -| `influxdbBackendMigration` | Query InfluxDB InfluxQL without the proxy | Yes | -| `dataplaneFrontendFallback` | Support dataplane contract field name change for transformations and field name matchers where the name is different | Yes | -| `unifiedRequestLog` | Writes error logs to the request logger | Yes | -| `recordedQueriesMulti` | Enables writing multiple items from a single query within Recorded Queries | Yes | -| `logsExploreTableVisualisation` | A table visualisation for logs in Explore | Yes | -| `transformationsRedesign` | Enables the transformations redesign | Yes | -| `traceQLStreaming` | Enables response streaming of TraceQL queries of the Tempo data source | | -| `awsAsyncQueryCaching` | Enable caching for async queries for Redshift and Athena. Requires that the datasource has caching and async query support enabled | Yes | -| `alertingNoDataErrorExecution` | Changes how Alerting state manager handles execution of NoData/Error | Yes | -| `angularDeprecationUI` | Display Angular warnings in dashboards and panels | Yes | -| `dashgpt` | Enable AI powered features in dashboards | Yes | -| `alertingInsights` | Show the new alerting insights landing page | Yes | -| `panelMonitoring` | Enables panel monitoring through logs and measurements | Yes | -| `formatString` | Enable format string transformer | Yes | -| `kubernetesPlaylists` | Use the kubernetes API in the frontend for playlists, and route /api/playlist requests to k8s | Yes | -| `recoveryThreshold` | Enables feature recovery threshold (aka hysteresis) for threshold server-side expression | Yes | -| `lokiStructuredMetadata` | Enables the loki data source to request structured metadata from the Loki server | Yes | -| `addFieldFromCalculationStatFunctions` | Add cumulative and window functions to the add field from calculation transformation | Yes | -| `annotationPermissionUpdate` | Change the way annotation permissions work by scoping them to folders and dashboards. | Yes | -| `dashboardSceneForViewers` | Enables dashboard rendering using Scenes for viewer roles | Yes | -| `dashboardSceneSolo` | Enables rendering dashboards using scenes for solo panels | Yes | -| `dashboardScene` | Enables dashboard rendering using scenes for all roles | Yes | -| `ssoSettingsApi` | Enables the SSO settings API and the OAuth configuration UIs in Grafana | Yes | -| `logsInfiniteScrolling` | Enables infinite scrolling for the Logs panel in Explore and Dashboards | Yes | -| `exploreMetrics` | Enables the new Grafana Metrics Drilldown core app | Yes | -| `alertingSimplifiedRouting` | Enables users to easily configure alert notifications by specifying a contact point directly when editing or creating an alert rule | Yes | -| `logRowsPopoverMenu` | Enable filtering menu displayed when text of a log line is selected | Yes | -| `lokiQueryHints` | Enables query hints for Loki | Yes | -| `alertingQueryOptimization` | Optimizes eligible queries in order to reduce load on datasources | | -| `groupToNestedTableTransformation` | Enables the group to nested table transformation | Yes | -| `newPDFRendering` | New implementation for the dashboard-to-PDF rendering | Yes | -| `tlsMemcached` | Use TLS-enabled memcached in the enterprise caching feature | Yes | -| `ssoSettingsSAML` | Use the new SSO Settings API to configure the SAML connector | Yes | -| `cloudWatchNewLabelParsing` | Updates CloudWatch label parsing to be more accurate | Yes | -| `accessActionSets` | Introduces action sets for resource permissions. Also ensures that all folder editors and admins can create subfolders without needing any additional permissions. | Yes | -| `newDashboardSharingComponent` | Enables the new sharing drawer design | Yes | -| `pluginProxyPreserveTrailingSlash` | Preserve plugin proxy trailing slash. | | -| `pinNavItems` | Enables pinning of nav items | Yes | -| `alertingApiServer` | Register Alerting APIs with the K8s API server | Yes | -| `cloudWatchRoundUpEndTime` | Round up end time for metric queries to the next minute to avoid missing data | Yes | -| `newFiltersUI` | Enables new combobox style UI for the Ad hoc filters variable in scenes architecture | Yes | -| `alertingQueryAndExpressionsStepMode` | Enables step mode for alerting queries and expressions | Yes | -| `useSessionStorageForRedirection` | Use session storage for handling the redirection after login | Yes | -| `userStorageAPI` | Enables the user storage API | Yes | -| `azureMonitorDisableLogLimit` | Disables the log limit restriction for Azure Monitor when true. The limit is enabled by default. | | -| `preinstallAutoUpdate` | Enables automatic updates for pre-installed plugins | Yes | -| `reportingUseRawTimeRange` | Uses the original report or dashboard time range instead of making an absolute transformation | Yes | -| `alertingUIOptimizeReducer` | Enables removing the reducer from the alerting UI when creating a new alert rule and using instant query | Yes | -| `azureMonitorEnableUserAuth` | Enables user auth for Azure Monitor datasource only | Yes | -| `alertingNotificationsStepMode` | Enables simplified step mode in the notifications section | Yes | -| `lokiLabelNamesQueryApi` | Defaults to using the Loki `/labels` API instead of `/series` | Yes | +| Feature toggle name | Description | Enabled by default | +| -------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------ | +| `disableEnvelopeEncryption` | Disable envelope encryption (emergency only) | | +| `publicDashboardsScene` | Enables public dashboard rendering using scenes | Yes | +| `featureHighlights` | Highlight Grafana Enterprise features | | +| `correlations` | Correlations page | Yes | +| `cloudWatchCrossAccountQuerying` | Enables cross-account querying in CloudWatch datasources | Yes | +| `nestedFolders` | Enable folder nesting | Yes | +| `logsContextDatasourceUi` | Allow datasource to provide custom UI for context view | Yes | +| `lokiQuerySplitting` | Split large interval queries into subqueries with smaller time intervals | Yes | +| `influxdbBackendMigration` | Query InfluxDB InfluxQL without the proxy | Yes | +| `dataplaneFrontendFallback` | Support dataplane contract field name change for transformations and field name matchers where the name is different | Yes | +| `unifiedRequestLog` | Writes error logs to the request logger | Yes | +| `recordedQueriesMulti` | Enables writing multiple items from a single query within Recorded Queries | Yes | +| `logsExploreTableVisualisation` | A table visualisation for logs in Explore | Yes | +| `transformationsRedesign` | Enables the transformations redesign | Yes | +| `traceQLStreaming` | Enables response streaming of TraceQL queries of the Tempo data source | | +| `awsAsyncQueryCaching` | Enable caching for async queries for Redshift and Athena. Requires that the datasource has caching and async query support enabled | Yes | +| `alertingNoDataErrorExecution` | Changes how Alerting state manager handles execution of NoData/Error | Yes | +| `angularDeprecationUI` | Display Angular warnings in dashboards and panels | Yes | +| `dashgpt` | Enable AI powered features in dashboards | Yes | +| `alertingInsights` | Show the new alerting insights landing page | Yes | +| `panelMonitoring` | Enables panel monitoring through logs and measurements | Yes | +| `formatString` | Enable format string transformer | Yes | +| `kubernetesPlaylists` | Use the kubernetes API in the frontend for playlists, and route /api/playlist requests to k8s | Yes | +| `recoveryThreshold` | Enables feature recovery threshold (aka hysteresis) for threshold server-side expression | Yes | +| `lokiStructuredMetadata` | Enables the loki data source to request structured metadata from the Loki server | Yes | +| `addFieldFromCalculationStatFunctions` | Add cumulative and window functions to the add field from calculation transformation | Yes | +| `annotationPermissionUpdate` | Change the way annotation permissions work by scoping them to folders and dashboards. | Yes | +| `dashboardSceneForViewers` | Enables dashboard rendering using Scenes for viewer roles | Yes | +| `dashboardSceneSolo` | Enables rendering dashboards using scenes for solo panels | Yes | +| `dashboardScene` | Enables dashboard rendering using scenes for all roles | Yes | +| `ssoSettingsApi` | Enables the SSO settings API and the OAuth configuration UIs in Grafana | Yes | +| `logsInfiniteScrolling` | Enables infinite scrolling for the Logs panel in Explore and Dashboards | Yes | +| `exploreMetrics` | Enables the new Grafana Metrics Drilldown core app | Yes | +| `alertingSimplifiedRouting` | Enables users to easily configure alert notifications by specifying a contact point directly when editing or creating an alert rule | Yes | +| `logRowsPopoverMenu` | Enable filtering menu displayed when text of a log line is selected | Yes | +| `lokiQueryHints` | Enables query hints for Loki | Yes | +| `alertingQueryOptimization` | Optimizes eligible queries in order to reduce load on datasources | | +| `groupToNestedTableTransformation` | Enables the group to nested table transformation | Yes | +| `newPDFRendering` | New implementation for the dashboard-to-PDF rendering | Yes | +| `tlsMemcached` | Use TLS-enabled memcached in the enterprise caching feature | Yes | +| `ssoSettingsSAML` | Use the new SSO Settings API to configure the SAML connector | Yes | +| `cloudWatchNewLabelParsing` | Updates CloudWatch label parsing to be more accurate | Yes | +| `newDashboardSharingComponent` | Enables the new sharing drawer design | Yes | +| `pluginProxyPreserveTrailingSlash` | Preserve plugin proxy trailing slash. | | +| `pinNavItems` | Enables pinning of nav items | Yes | +| `alertingApiServer` | Register Alerting APIs with the K8s API server | Yes | +| `cloudWatchRoundUpEndTime` | Round up end time for metric queries to the next minute to avoid missing data | Yes | +| `newFiltersUI` | Enables new combobox style UI for the Ad hoc filters variable in scenes architecture | Yes | +| `alertingQueryAndExpressionsStepMode` | Enables step mode for alerting queries and expressions | Yes | +| `useSessionStorageForRedirection` | Use session storage for handling the redirection after login | Yes | +| `userStorageAPI` | Enables the user storage API | Yes | +| `azureMonitorDisableLogLimit` | Disables the log limit restriction for Azure Monitor when true. The limit is enabled by default. | | +| `preinstallAutoUpdate` | Enables automatic updates for pre-installed plugins | Yes | +| `reportingUseRawTimeRange` | Uses the original report or dashboard time range instead of making an absolute transformation | Yes | +| `alertingUIOptimizeReducer` | Enables removing the reducer from the alerting UI when creating a new alert rule and using instant query | Yes | +| `azureMonitorEnableUserAuth` | Enables user auth for Azure Monitor datasource only | Yes | +| `alertingNotificationsStepMode` | Enables simplified step mode in the notifications section | Yes | +| `lokiLabelNamesQueryApi` | Defaults to using the Loki `/labels` API instead of `/series` | Yes | ## Public preview feature toggles diff --git a/packages/grafana-data/src/types/featureToggles.gen.ts b/packages/grafana-data/src/types/featureToggles.gen.ts index d8f014be4da..abeab22f2b4 100644 --- a/packages/grafana-data/src/types/featureToggles.gen.ts +++ b/packages/grafana-data/src/types/featureToggles.gen.ts @@ -163,7 +163,6 @@ export interface FeatureToggles { oauthRequireSubClaim?: boolean; newDashboardWithFiltersAndGroupBy?: boolean; cloudWatchNewLabelParsing?: boolean; - accessActionSets?: boolean; disableNumericMetricsSortingInExpressions?: boolean; grafanaManagedRecordingRules?: boolean; queryLibrary?: boolean; diff --git a/pkg/api/folder_bench_test.go b/pkg/api/folder_bench_test.go index 99957bff603..5847529c941 100644 --- a/pkg/api/folder_bench_test.go +++ b/pkg/api/folder_bench_test.go @@ -460,7 +460,7 @@ func setupServer(b testing.TB, sc benchScenario, features featuremgmt.FeatureTog ac := acimpl.ProvideAccessControl(featuremgmt.WithFeatures()) cfg := setting.NewCfg() - actionSets := resourcepermissions.NewActionSetService(features) + actionSets := resourcepermissions.NewActionSetService() fStore := folderimpl.ProvideStore(sc.db) folderServiceWithFlagOn := folderimpl.ProvideService( fStore, ac, bus.ProvideBus(tracing.InitializeTracerForTest()), dashStore, folderStore, diff --git a/pkg/services/accesscontrol/acimpl/accesscontrol_test.go b/pkg/services/accesscontrol/acimpl/accesscontrol_test.go index 9bc60141a14..37c258e612d 100644 --- a/pkg/services/accesscontrol/acimpl/accesscontrol_test.go +++ b/pkg/services/accesscontrol/acimpl/accesscontrol_test.go @@ -65,7 +65,7 @@ func TestAccessControl_Evaluate(t *testing.T) { for _, tt := range tests { t.Run(tt.desc, func(t *testing.T) { - ac := acimpl.ProvideAccessControl(featuremgmt.WithFeatures(featuremgmt.FlagAccessActionSets)) + ac := acimpl.ProvideAccessControl(featuremgmt.WithFeatures()) if tt.scopeResolver != nil { ac.RegisterScopeAttributeResolver(tt.resolverPrefix, tt.scopeResolver) diff --git a/pkg/services/accesscontrol/acimpl/service.go b/pkg/services/accesscontrol/acimpl/service.go index 1a2751978cd..ece482bdd2b 100644 --- a/pkg/services/accesscontrol/acimpl/service.go +++ b/pkg/services/accesscontrol/acimpl/service.go @@ -166,10 +166,8 @@ func (s *Service) getUserPermissions(ctx context.Context, user identity.Requeste if err != nil { return nil, err } - if s.features.IsEnabled(ctx, featuremgmt.FlagAccessActionSets) { - dbPermissions = s.actionResolver.ExpandActionSets(dbPermissions) - } + dbPermissions = s.actionResolver.ExpandActionSets(dbPermissions) return append(permissions, dbPermissions...), nil } @@ -188,10 +186,8 @@ func (s *Service) getBasicRolePermissions(ctx context.Context, role string, orgI OrgID: orgID, RolePrefixes: OSSRolesPrefixes, }) - if s.features.IsEnabled(ctx, featuremgmt.FlagAccessActionSets) { - dbPermissions = s.actionResolver.ExpandActionSets(dbPermissions) - } + dbPermissions = s.actionResolver.ExpandActionSets(dbPermissions) return append(permissions, dbPermissions...), err } @@ -205,10 +201,8 @@ func (s *Service) getTeamsPermissions(ctx context.Context, teamIDs []int64, orgI RolePrefixes: OSSRolesPrefixes, }) - if s.features.IsEnabled(ctx, featuremgmt.FlagAccessActionSets) { - for teamID, permissions := range teamPermissions { - teamPermissions[teamID] = s.actionResolver.ExpandActionSets(permissions) - } + for teamID, permissions := range teamPermissions { + teamPermissions[teamID] = s.actionResolver.ExpandActionSets(permissions) } return teamPermissions, err @@ -237,9 +231,7 @@ func (s *Service) getUserDirectPermissions(ctx context.Context, user identity.Re return nil, err } - if s.features.IsEnabled(ctx, featuremgmt.FlagAccessActionSets) { - permissions = s.actionResolver.ExpandActionSets(permissions) - } + permissions = s.actionResolver.ExpandActionSets(permissions) if s.features.IsEnabled(ctx, featuremgmt.FlagNestedFolders) { permissions = append(permissions, SharedWithMeFolderPermission) } @@ -545,11 +537,9 @@ func (s *Service) SearchUsersPermissions(ctx context.Context, usr identity.Reque return nil, err } - if s.features.IsEnabled(ctx, featuremgmt.FlagAccessActionSets) { - options.ActionSets = s.actionResolver.ResolveAction(options.Action) - options.ActionSets = append(options.ActionSets, - s.actionResolver.ResolveActionPrefix(options.ActionPrefix)...) - } + options.ActionSets = s.actionResolver.ResolveAction(options.Action) + options.ActionSets = append(options.ActionSets, + s.actionResolver.ResolveActionPrefix(options.ActionPrefix)...) // Get managed permissions (DB) usersPermissions, err := s.store.SearchUsersPermissions(ctx, usr.GetOrgID(), options) @@ -610,7 +600,7 @@ func (s *Service) SearchUsersPermissions(ctx context.Context, usr identity.Reque } } - if s.features.IsEnabled(ctx, featuremgmt.FlagAccessActionSets) && len(options.ActionSets) > 0 { + if len(options.ActionSets) > 0 { for id, perms := range res { res[id] = s.actionResolver.ExpandActionSetsWithFilter(perms, GetActionFilter(options)) } @@ -661,11 +651,9 @@ func (s *Service) searchUserPermissions(ctx context.Context, orgID int64, search } } - if s.features.IsEnabled(ctx, featuremgmt.FlagAccessActionSets) { - searchOptions.ActionSets = s.actionResolver.ResolveAction(searchOptions.Action) - searchOptions.ActionSets = append(searchOptions.ActionSets, - s.actionResolver.ResolveActionPrefix(searchOptions.ActionPrefix)...) - } + searchOptions.ActionSets = s.actionResolver.ResolveAction(searchOptions.Action) + searchOptions.ActionSets = append(searchOptions.ActionSets, + s.actionResolver.ResolveActionPrefix(searchOptions.ActionPrefix)...) // Get permissions from the DB dbPermissions, err := s.store.SearchUsersPermissions(ctx, orgID, searchOptions) @@ -674,7 +662,7 @@ func (s *Service) searchUserPermissions(ctx context.Context, orgID int64, search } permissions = append(permissions, dbPermissions[searchOptions.UserID]...) - if s.features.IsEnabled(ctx, featuremgmt.FlagAccessActionSets) && len(searchOptions.ActionSets) != 0 { + if len(searchOptions.ActionSets) != 0 { permissions = s.actionResolver.ExpandActionSetsWithFilter(permissions, GetActionFilter(searchOptions)) } diff --git a/pkg/services/accesscontrol/acimpl/service_test.go b/pkg/services/accesscontrol/acimpl/service_test.go index d1f3e45c1d0..435123ebd91 100644 --- a/pkg/services/accesscontrol/acimpl/service_test.go +++ b/pkg/services/accesscontrol/acimpl/service_test.go @@ -35,14 +35,15 @@ func setupTestEnv(t testing.TB) *Service { cfg := setting.NewCfg() ac := &Service{ - cache: localcache.ProvideService(), - cfg: cfg, - features: featuremgmt.WithFeatures(), - log: log.New("accesscontrol"), - registrations: accesscontrol.RegistrationList{}, - roles: accesscontrol.BuildBasicRoleDefinitions(), - store: database.ProvideService(db.InitTestDB(t)), - permRegistry: permreg.ProvidePermissionRegistry(), + cache: localcache.ProvideService(), + cfg: cfg, + features: featuremgmt.WithFeatures(), + log: log.New("accesscontrol"), + registrations: accesscontrol.RegistrationList{}, + roles: accesscontrol.BuildBasicRoleDefinitions(), + store: database.ProvideService(db.InitTestDB(t)), + permRegistry: permreg.ProvidePermissionRegistry(), + actionResolver: resourcepermissions.NewActionSetService(), } require.NoError(t, ac.RegisterFixedRoles(context.Background())) return ac @@ -805,8 +806,7 @@ func TestService_SearchUserPermissions(t *testing.T) { t.Run(tt.name, func(t *testing.T) { ac := setupTestEnv(t) if tt.withActionSets { - ac.features = featuremgmt.WithFeatures(featuremgmt.FlagAccessActionSets) - actionSetSvc := resourcepermissions.NewActionSetService(ac.features) + actionSetSvc := resourcepermissions.NewActionSetService() for set, actions := range tt.actionSets { actionSetName := resourcepermissions.GetActionSetName(strings.Split(set, ":")[0], strings.Split(set, ":")[1]) actionSetSvc.StoreActionSet(actionSetName, actions) diff --git a/pkg/services/accesscontrol/ossaccesscontrol/testutil/testutil.go b/pkg/services/accesscontrol/ossaccesscontrol/testutil/testutil.go index 6e347fb5c7b..b16046e2dc1 100644 --- a/pkg/services/accesscontrol/ossaccesscontrol/testutil/testutil.go +++ b/pkg/services/accesscontrol/ossaccesscontrol/testutil/testutil.go @@ -32,7 +32,7 @@ func ProvideFolderPermissions( cfg *setting.Cfg, sqlStore *sqlstore.SQLStore, ) (*ossaccesscontrol.FolderPermissionsService, error) { - actionSets := resourcepermissions.NewActionSetService(features) + actionSets := resourcepermissions.NewActionSetService() license := licensingtest.NewFakeLicensing() license.On("FeatureEnabled", "accesscontrol.enforcement").Return(true).Maybe() diff --git a/pkg/services/accesscontrol/resourcepermissions/service.go b/pkg/services/accesscontrol/resourcepermissions/service.go index 37334ce35eb..276ab2a5d3e 100644 --- a/pkg/services/accesscontrol/resourcepermissions/service.go +++ b/pkg/services/accesscontrol/resourcepermissions/service.go @@ -76,9 +76,7 @@ func New(cfg *setting.Cfg, for _, a := range actions { actionSet[a] = struct{}{} } - if features.IsEnabled(context.Background(), featuremgmt.FlagAccessActionSets) { - actionSetService.StoreActionSet(GetActionSetName(options.Resource, permission), actions) - } + actionSetService.StoreActionSet(GetActionSetName(options.Resource, permission), actions) } // Sort all permissions based on action length. Will be used when mapping between actions to permissions @@ -151,13 +149,11 @@ func (s *Service) GetPermissions(ctx context.Context, user identity.Requester, r } actions := s.actions - if s.features.IsEnabled(ctx, featuremgmt.FlagAccessActionSets) { - for _, action := range s.actions { - actionSets := s.actionSetSvc.ResolveAction(action) - for _, actionSet := range actionSets { - if !slices.Contains(actions, actionSet) { - actions = append(actions, actionSet) - } + for _, action := range s.actions { + actionSets := s.actionSetSvc.ResolveAction(action) + for _, actionSet := range actionSets { + if !slices.Contains(actions, actionSet) { + actions = append(actions, actionSet) } } } @@ -176,33 +172,31 @@ func (s *Service) GetPermissions(ctx context.Context, user identity.Requester, r return nil, err } - if s.features.IsEnabled(ctx, featuremgmt.FlagAccessActionSets) { - for i := range resourcePermissions { - actions := resourcePermissions[i].Actions - var expandedActions []string - for _, action := range actions { - if isFolderOrDashboardAction(action) { - actionSetActions := s.actionSetSvc.ResolveActionSet(action) - if len(actionSetActions) > 0 { - // Add all actions for folder - if s.options.Resource == dashboards.ScopeFoldersRoot { - expandedActions = append(expandedActions, actionSetActions...) - continue - } - // This check is needed for resolving inherited permissions - we don't want to include - // actions that are not related to dashboards when expanding dashboard action sets - for _, actionSetAction := range actionSetActions { - if slices.Contains(s.actions, actionSetAction) { - expandedActions = append(expandedActions, actionSetAction) - } - } + for i := range resourcePermissions { + actions := resourcePermissions[i].Actions + var expandedActions []string + for _, action := range actions { + if isFolderOrDashboardAction(action) { + actionSetActions := s.actionSetSvc.ResolveActionSet(action) + if len(actionSetActions) > 0 { + // Add all actions for folder + if s.options.Resource == dashboards.ScopeFoldersRoot { + expandedActions = append(expandedActions, actionSetActions...) continue } + // This check is needed for resolving inherited permissions - we don't want to include + // actions that are not related to dashboards when expanding dashboard action sets + for _, actionSetAction := range actionSetActions { + if slices.Contains(s.actions, actionSetAction) { + expandedActions = append(expandedActions, actionSetAction) + } + } + continue } - expandedActions = append(expandedActions, action) } - resourcePermissions[i].Actions = expandedActions + expandedActions = append(expandedActions, action) } + resourcePermissions[i].Actions = expandedActions } return resourcePermissions, nil @@ -495,15 +489,13 @@ type ActionSetStore interface { } type ActionSetSvc struct { - features featuremgmt.FeatureToggles - store ActionSetStore + store ActionSetStore } // NewActionSetService returns a new instance of InMemoryActionSetService. -func NewActionSetService(features featuremgmt.FeatureToggles) ActionSetService { +func NewActionSetService() ActionSetService { return &ActionSetSvc{ - features: features, - store: NewInMemoryActionSetStore(features), + store: NewInMemoryActionSetStore(), } } @@ -580,12 +572,9 @@ func (a *ActionSetSvc) ExpandActionSetsWithFilter(permissions []accesscontrol.Pe // RegisterActionSets allow the caller to expand the existing action sets with additional permissions // This is intended to be used by plugins, and currently supports extending folder and dashboard action sets func (a *ActionSetSvc) RegisterActionSets(ctx context.Context, pluginID string, registrations []plugins.ActionSet) error { - ctx, span := tracer.Start(ctx, "accesscontrol.resourcepermissions.RegisterActionSets") + _, span := tracer.Start(ctx, "accesscontrol.resourcepermissions.RegisterActionSets") defer span.End() - if !a.features.IsEnabled(ctx, featuremgmt.FlagAccessActionSets) { - return nil - } for _, reg := range registrations { if err := pluginutils.ValidatePluginActionSet(pluginID, reg); err != nil { return err diff --git a/pkg/services/accesscontrol/resourcepermissions/service_test.go b/pkg/services/accesscontrol/resourcepermissions/service_test.go index 3022dd6fb46..6e7b28ea3d0 100644 --- a/pkg/services/accesscontrol/resourcepermissions/service_test.go +++ b/pkg/services/accesscontrol/resourcepermissions/service_test.go @@ -228,15 +228,13 @@ func TestService_SetPermissions(t *testing.T) { func TestService_RegisterActionSets(t *testing.T) { type registerActionSetsTest struct { desc string - actionSetsEnabled bool options Options expectedActionSets []ActionSet } tests := []registerActionSetsTest{ { - desc: "should register folder action sets if action sets are enabled", - actionSetsEnabled: true, + desc: "should register folder action sets if action sets are enabled", options: Options{ Resource: "folders", PermissionsToActions: map[string][]string{ @@ -256,8 +254,7 @@ func TestService_RegisterActionSets(t *testing.T) { }, }, { - desc: "should register dashboard action set if action sets are enabled", - actionSetsEnabled: true, + desc: "should register dashboard action set if action sets are enabled", options: Options{ Resource: "dashboards", PermissionsToActions: map[string][]string{ @@ -271,27 +268,13 @@ func TestService_RegisterActionSets(t *testing.T) { }, }, }, - { - desc: "should not register dashboard action set if action sets are not enabled", - actionSetsEnabled: false, - options: Options{ - Resource: "dashboards", - PermissionsToActions: map[string][]string{ - "View": {"dashboards:read"}, - }, - }, - expectedActionSets: []ActionSet{}, - }, } for _, tt := range tests { t.Run(tt.desc, func(t *testing.T) { features := featuremgmt.WithFeatures() - if tt.actionSetsEnabled { - features = featuremgmt.WithFeatures(featuremgmt.FlagAccessActionSets) - } ac := acimpl.ProvideAccessControl(features) - actionSets := NewActionSetService(features) + actionSets := NewActionSetService() _, err := New( setting.NewCfg(), tt.options, features, routing.NewRouteRegister(), licensingtest.NewFakeLicensing(), ac, &actest.FakeService{}, db.InitTestDB(t), nil, nil, actionSets, @@ -317,7 +300,6 @@ func TestService_RegisterActionSets(t *testing.T) { func TestStore_RegisterActionSet(t *testing.T) { type actionSetTest struct { desc string - features featuremgmt.FeatureToggles pluginID string pluginActions []plugins.ActionSet coreActionSets []ActionSet @@ -327,8 +309,7 @@ func TestStore_RegisterActionSet(t *testing.T) { tests := []actionSetTest{ { - desc: "should be able to register a plugin action set if the right feature toggles are enabled", - features: featuremgmt.WithFeatures(featuremgmt.FlagAccessActionSets), + desc: "should be able to register a plugin action set", pluginID: "test-app", pluginActions: []plugins.ActionSet{ { @@ -343,21 +324,8 @@ func TestStore_RegisterActionSet(t *testing.T) { }, }, }, - { - desc: "should not register plugin action set if feature toggles are missing", - features: featuremgmt.WithFeatures(), - pluginID: "test-app", - pluginActions: []plugins.ActionSet{ - { - Action: "folders:view", - Actions: []string{"test-app.resource:read"}, - }, - }, - expectedActionSets: []ActionSet{}, - }, { desc: "should be able to register multiple plugin action sets", - features: featuremgmt.WithFeatures(featuremgmt.FlagAccessActionSets), pluginID: "test-app", pluginActions: []plugins.ActionSet{ { @@ -382,7 +350,6 @@ func TestStore_RegisterActionSet(t *testing.T) { }, { desc: "action set actions should be added not replaced", - features: featuremgmt.WithFeatures(featuremgmt.FlagAccessActionSets), pluginID: "test-app", pluginActions: []plugins.ActionSet{ { @@ -425,7 +392,6 @@ func TestStore_RegisterActionSet(t *testing.T) { }, { desc: "should not be able to register an action that doesn't have a plugin prefix", - features: featuremgmt.WithFeatures(featuremgmt.FlagAccessActionSets), pluginID: "test-app", pluginActions: []plugins.ActionSet{ { @@ -441,7 +407,6 @@ func TestStore_RegisterActionSet(t *testing.T) { }, { desc: "should not be able to register action set that is not in the allow list", - features: featuremgmt.WithFeatures(featuremgmt.FlagAccessActionSets), pluginID: "test-app", pluginActions: []plugins.ActionSet{ { @@ -454,7 +419,7 @@ func TestStore_RegisterActionSet(t *testing.T) { } for _, tt := range tests { t.Run(tt.desc, func(t *testing.T) { - asService := NewActionSetService(tt.features) + asService := NewActionSetService() err := asService.RegisterActionSets(context.Background(), tt.pluginID, tt.pluginActions) if tt.expectedErr { @@ -511,7 +476,7 @@ func setupTestEnvironment(t *testing.T, ops Options) (*Service, user.Service, te ac := acimpl.ProvideAccessControl(features) service, err := New( cfg, ops, features, routing.NewRouteRegister(), license, - ac, acService, sql, teamSvc, userSvc, NewActionSetService(features), + ac, acService, sql, teamSvc, userSvc, NewActionSetService(), ) require.NoError(t, err) diff --git a/pkg/services/accesscontrol/resourcepermissions/store.go b/pkg/services/accesscontrol/resourcepermissions/store.go index c146cc0b241..c8d8e8db88e 100644 --- a/pkg/services/accesscontrol/resourcepermissions/store.go +++ b/pkg/services/accesscontrol/resourcepermissions/store.go @@ -771,18 +771,16 @@ func managedPermission(action, resource string, resourceID, resourceAttribute st // InMemoryActionSets is an in-memory implementation of the ActionSetStore. type InMemoryActionSets struct { - features featuremgmt.FeatureToggles log log.Logger actionSetToActions map[string][]string actionToActionSets map[string][]string } -func NewInMemoryActionSetStore(features featuremgmt.FeatureToggles) *InMemoryActionSets { +func NewInMemoryActionSetStore() *InMemoryActionSets { return &InMemoryActionSets{ actionSetToActions: make(map[string][]string), actionToActionSets: make(map[string][]string), log: log.New("resourcepermissions.actionsets"), - features: features, } } diff --git a/pkg/services/accesscontrol/resourcepermissions/store_test.go b/pkg/services/accesscontrol/resourcepermissions/store_test.go index a3c52bbc85b..a7f0628ed1d 100644 --- a/pkg/services/accesscontrol/resourcepermissions/store_test.go +++ b/pkg/services/accesscontrol/resourcepermissions/store_test.go @@ -781,7 +781,7 @@ func TestStore_StoreActionSet(t *testing.T) { for _, tt := range tests { t.Run(tt.desc, func(t *testing.T) { - asService := NewInMemoryActionSetStore(featuremgmt.WithFeatures(featuremgmt.FlagAccessActionSets)) + asService := NewInMemoryActionSetStore() asService.StoreActionSet(GetActionSetName(tt.resource, tt.action), tt.actions) actionSetName := GetActionSetName(tt.resource, tt.action) @@ -792,7 +792,7 @@ func TestStore_StoreActionSet(t *testing.T) { } func TestStore_ResolveActionSet(t *testing.T) { - actionSetService := NewActionSetService(featuremgmt.WithFeatures(featuremgmt.FlagAccessActionSets)) + actionSetService := NewActionSetService() actionSetService.StoreActionSet("folders:edit", []string{"folders:read", "folders:write", "dashboards:read", "dashboards:write"}) actionSetService.StoreActionSet("folders:view", []string{"folders:read", "dashboards:read"}) actionSetService.StoreActionSet("dashboards:view", []string{"dashboards:read"}) @@ -835,7 +835,7 @@ func TestStore_ResolveActionSet(t *testing.T) { } func TestStore_ExpandActions(t *testing.T) { - actionSetService := NewActionSetService(featuremgmt.WithFeatures(featuremgmt.FlagAccessActionSets)) + actionSetService := NewActionSetService() actionSetService.StoreActionSet("folders:edit", []string{"folders:read", "folders:write", "dashboards:read", "dashboards:write"}) actionSetService.StoreActionSet("folders:view", []string{"folders:read", "dashboards:read"}) actionSetService.StoreActionSet("dashboards:view", []string{"dashboards:read"}) diff --git a/pkg/services/featuremgmt/registry.go b/pkg/services/featuremgmt/registry.go index 34432ae1dc7..befd4cfafc0 100644 --- a/pkg/services/featuremgmt/registry.go +++ b/pkg/services/featuremgmt/registry.go @@ -1105,13 +1105,6 @@ var ( FrontendOnly: false, AllowSelfServe: false, }, - { - Name: "accessActionSets", - Description: "Introduces action sets for resource permissions. Also ensures that all folder editors and admins can create subfolders without needing any additional permissions.", - Stage: FeatureStageGeneralAvailability, - Owner: identityAccessTeam, - Expression: "true", // enabled by default - }, { Name: "disableNumericMetricsSortingInExpressions", Description: "In server-side expressions, disable the sorting of numeric-kind metrics by their metric name or labels.", diff --git a/pkg/services/featuremgmt/toggles_gen.csv b/pkg/services/featuremgmt/toggles_gen.csv index dece266a38d..f6857945bc2 100644 --- a/pkg/services/featuremgmt/toggles_gen.csv +++ b/pkg/services/featuremgmt/toggles_gen.csv @@ -144,7 +144,6 @@ ssoSettingsSAML,GA,@grafana/identity-access-team,false,false,false oauthRequireSubClaim,experimental,@grafana/identity-access-team,false,false,false newDashboardWithFiltersAndGroupBy,experimental,@grafana/dashboards-squad,false,false,false cloudWatchNewLabelParsing,GA,@grafana/aws-datasources,false,false,false -accessActionSets,GA,@grafana/identity-access-team,false,false,false disableNumericMetricsSortingInExpressions,experimental,@grafana/oss-big-tent,false,true,false grafanaManagedRecordingRules,experimental,@grafana/alerting-squad,false,false,false queryLibrary,experimental,@grafana/grafana-frontend-platform,false,false,false diff --git a/pkg/services/featuremgmt/toggles_gen.go b/pkg/services/featuremgmt/toggles_gen.go index a8b217d6a79..f2d09129a96 100644 --- a/pkg/services/featuremgmt/toggles_gen.go +++ b/pkg/services/featuremgmt/toggles_gen.go @@ -587,10 +587,6 @@ const ( // Updates CloudWatch label parsing to be more accurate FlagCloudWatchNewLabelParsing = "cloudWatchNewLabelParsing" - // FlagAccessActionSets - // Introduces action sets for resource permissions. Also ensures that all folder editors and admins can create subfolders without needing any additional permissions. - FlagAccessActionSets = "accessActionSets" - // FlagDisableNumericMetricsSortingInExpressions // In server-side expressions, disable the sorting of numeric-kind metrics by their metric name or labels. FlagDisableNumericMetricsSortingInExpressions = "disableNumericMetricsSortingInExpressions" diff --git a/pkg/services/featuremgmt/toggles_gen.json b/pkg/services/featuremgmt/toggles_gen.json index 1f078ca5349..5933a93ecb8 100644 --- a/pkg/services/featuremgmt/toggles_gen.json +++ b/pkg/services/featuremgmt/toggles_gen.json @@ -36,6 +36,7 @@ "name": "accessActionSets", "resourceVersion": "1731413707429", "creationTimestamp": "2024-04-12T16:19:25Z", + "deletionTimestamp": "2025-03-11T16:34:55Z", "annotations": { "grafana.app/updatedTimestamp": "2024-11-12 12:15:07.42916 +0000 UTC" } diff --git a/pkg/services/folder/folderimpl/folder.go b/pkg/services/folder/folderimpl/folder.go index bac4edc1c59..98f005659ef 100644 --- a/pkg/services/folder/folderimpl/folder.go +++ b/pkg/services/folder/folderimpl/folder.go @@ -1248,12 +1248,6 @@ func (s *Service) canMove(ctx context.Context, cmd *folder.MoveFolderCommand) (b var evaluators []accesscontrol.Evaluator currentFolderScope := dashboards.ScopeFoldersProvider.GetResourceScopeUID(cmd.UID) for action, scopes := range permissions { - // Skip unexpanded action sets - they have no impact if action sets are not enabled - if !s.features.IsEnabled(ctx, featuremgmt.FlagAccessActionSets) { - if action == "folders:view" || action == "folders:edit" || action == "folders:admin" { - continue - } - } for _, scope := range newFolderAndParentUIDs { if slices.Contains(scopes, scope) { evaluators = append(evaluators, accesscontrol.EvalPermission(action, currentFolderScope)) diff --git a/pkg/services/folder/folderimpl/folder_unifiedstorage.go b/pkg/services/folder/folderimpl/folder_unifiedstorage.go index b1b00484553..b121415ed0e 100644 --- a/pkg/services/folder/folderimpl/folder_unifiedstorage.go +++ b/pkg/services/folder/folderimpl/folder_unifiedstorage.go @@ -842,12 +842,6 @@ func (s *Service) canMoveViaApiServer(ctx context.Context, cmd *folder.MoveFolde var evaluators []accesscontrol.Evaluator currentFolderScope := dashboards.ScopeFoldersProvider.GetResourceScopeUID(cmd.UID) for action, scopes := range permissions { - // Skip unexpanded action sets - they have no impact if action sets are not enabled - if !s.features.IsEnabled(ctx, featuremgmt.FlagAccessActionSets) { - if action == "folders:view" || action == "folders:edit" || action == "folders:admin" { - continue - } - } for _, scope := range newFolderAndParentUIDs { if slices.Contains(scopes, scope) { evaluators = append(evaluators, accesscontrol.EvalPermission(action, currentFolderScope)) diff --git a/pkg/services/sqlstore/permissions/dashboard.go b/pkg/services/sqlstore/permissions/dashboard.go index cdf22a15569..4f09c706291 100644 --- a/pkg/services/sqlstore/permissions/dashboard.go +++ b/pkg/services/sqlstore/permissions/dashboard.go @@ -2,7 +2,6 @@ package permissions import ( "bytes" - "context" "fmt" "slices" "strings" @@ -61,59 +60,41 @@ func NewAccessControlDashboardPermissionFilter(user identity.Requester, permissi var dashboardActionSets []string if queryType == searchstore.TypeFolder { folderAction = dashboards.ActionFoldersRead - if features.IsEnabled(context.Background(), featuremgmt.FlagAccessActionSets) { - folderActionSets = []string{"folders:view", "folders:edit", "folders:admin"} - } + folderActionSets = []string{"folders:view", "folders:edit", "folders:admin"} if needEdit { folderAction = dashboards.ActionDashboardsCreate - if features.IsEnabled(context.Background(), featuremgmt.FlagAccessActionSets) { - folderActionSets = []string{"folders:edit", "folders:admin"} - } + folderActionSets = []string{"folders:edit", "folders:admin"} } } else if queryType == searchstore.TypeDashboard { dashboardAction = dashboards.ActionDashboardsRead - if features.IsEnabled(context.Background(), featuremgmt.FlagAccessActionSets) { - folderActionSets = []string{"folders:view", "folders:edit", "folders:admin"} - dashboardActionSets = []string{"dashboards:view", "dashboards:edit", "dashboards:admin"} - } + folderActionSets = []string{"folders:view", "folders:edit", "folders:admin"} + dashboardActionSets = []string{"dashboards:view", "dashboards:edit", "dashboards:admin"} if needEdit { dashboardAction = dashboards.ActionDashboardsWrite - if features.IsEnabled(context.Background(), featuremgmt.FlagAccessActionSets) { - folderActionSets = []string{"folders:edit", "folders:admin"} - dashboardActionSets = []string{"dashboards:edit", "dashboards:admin"} - } + folderActionSets = []string{"folders:edit", "folders:admin"} + dashboardActionSets = []string{"dashboards:edit", "dashboards:admin"} } } else if queryType == searchstore.TypeAlertFolder { folderAction = accesscontrol.ActionAlertingRuleRead - if features.IsEnabled(context.Background(), featuremgmt.FlagAccessActionSets) { - folderActionSets = []string{"folders:view", "folders:edit", "folders:admin"} - } + folderActionSets = []string{"folders:view", "folders:edit", "folders:admin"} if needEdit { folderAction = accesscontrol.ActionAlertingRuleCreate - if features.IsEnabled(context.Background(), featuremgmt.FlagAccessActionSets) { - folderActionSets = []string{"folders:edit", "folders:admin"} - } + folderActionSets = []string{"folders:edit", "folders:admin"} } } else if queryType == searchstore.TypeAnnotation { dashboardAction = accesscontrol.ActionAnnotationsRead - if features.IsEnabled(context.Background(), featuremgmt.FlagAccessActionSets) { - folderActionSets = []string{"folders:view", "folders:edit", "folders:admin"} - dashboardActionSets = []string{"dashboards:view", "dashboards:edit", "dashboards:admin"} - } + folderActionSets = []string{"folders:view", "folders:edit", "folders:admin"} + dashboardActionSets = []string{"dashboards:view", "dashboards:edit", "dashboards:admin"} } else { folderAction = dashboards.ActionFoldersRead dashboardAction = dashboards.ActionDashboardsRead - if features.IsEnabled(context.Background(), featuremgmt.FlagAccessActionSets) { - folderActionSets = []string{"folders:view", "folders:edit", "folders:admin"} - dashboardActionSets = []string{"dashboards:view", "dashboards:edit", "dashboards:admin"} - } + folderActionSets = []string{"folders:view", "folders:edit", "folders:admin"} + dashboardActionSets = []string{"dashboards:view", "dashboards:edit", "dashboards:admin"} if needEdit { folderAction = dashboards.ActionDashboardsCreate dashboardAction = dashboards.ActionDashboardsWrite - if features.IsEnabled(context.Background(), featuremgmt.FlagAccessActionSets) { - folderActionSets = []string{"folders:edit", "folders:admin"} - dashboardActionSets = []string{"dashboards:edit", "dashboards:admin"} - } + folderActionSets = []string{"folders:edit", "folders:admin"} + dashboardActionSets = []string{"dashboards:edit", "dashboards:admin"} } } diff --git a/pkg/services/sqlstore/permissions/dashboard_test.go b/pkg/services/sqlstore/permissions/dashboard_test.go index efc72764d9d..2f625298937 100644 --- a/pkg/services/sqlstore/permissions/dashboard_test.go +++ b/pkg/services/sqlstore/permissions/dashboard_test.go @@ -417,7 +417,7 @@ func TestIntegration_DashboardNestedPermissionFilter(t *testing.T) { permissions: []accesscontrol.Permission{ {Action: dashboards.ActionDashboardsRead, Scope: dashboards.ScopeFoldersAll}, }, - features: []any{featuremgmt.FlagNestedFolders, featuremgmt.FlagAccessActionSets}, + features: []any{featuremgmt.FlagNestedFolders}, expectedResult: []string{"dashboard under the root", "dashboard under parent folder", "dashboard under subfolder"}, }, { @@ -459,7 +459,7 @@ func TestIntegration_DashboardNestedPermissionFilter(t *testing.T) { }) usr := &user.SignedInUser{OrgID: orgID, OrgRole: org.RoleViewer, Permissions: map[int64]map[string][]string{orgID: accesscontrol.GroupScopesByActionContext(context.Background(), tc.permissions)}} - for _, features := range []featuremgmt.FeatureToggles{featuremgmt.WithFeatures(append(tc.features, featuremgmt.FlagAccessActionSets)...), featuremgmt.WithFeatures(tc.features...), featuremgmt.WithFeatures(append(tc.features, featuremgmt.FlagPermissionsFilterRemoveSubquery)...)} { + for _, features := range []featuremgmt.FeatureToggles{featuremgmt.WithFeatures(tc.features...), featuremgmt.WithFeatures(append(tc.features, featuremgmt.FlagPermissionsFilterRemoveSubquery)...)} { m := features.GetEnabled(context.Background()) keys := make([]string, 0, len(m)) for k := range m { @@ -616,20 +616,17 @@ func TestIntegration_DashboardNestedPermissionFilter_WithActionSets(t *testing.T permission dashboardaccess.PermissionType signedInUserPermissions []accesscontrol.Permission expectedResult []string - features []any }{ { desc: "Should not list any dashboards if user has no permissions", permission: dashboardaccess.PERMISSION_VIEW, signedInUserPermissions: nil, - features: []any{featuremgmt.FlagNestedFolders, featuremgmt.FlagAccessActionSets}, expectedResult: nil, }, { desc: "Should not list any folders if user has no permissions", permission: dashboardaccess.PERMISSION_VIEW, signedInUserPermissions: nil, - features: []any{featuremgmt.FlagNestedFolders, featuremgmt.FlagAccessActionSets}, expectedResult: nil, }, { @@ -639,7 +636,6 @@ func TestIntegration_DashboardNestedPermissionFilter_WithActionSets(t *testing.T signedInUserPermissions: []accesscontrol.Permission{ {Action: dashboards.ActionFoldersRead, Scope: dashboards.ScopeFoldersAll}, }, - features: []any{featuremgmt.FlagNestedFolders, featuremgmt.FlagAccessActionSets}, expectedResult: []string{"parent", "subfolder"}, }, { @@ -649,7 +645,6 @@ func TestIntegration_DashboardNestedPermissionFilter_WithActionSets(t *testing.T signedInUserPermissions: []accesscontrol.Permission{ {Action: "folders:view", Scope: "folders:uid:parent", Kind: "folders", Identifier: "parent"}, }, - features: []any{featuremgmt.FlagNestedFolders, featuremgmt.FlagAccessActionSets}, expectedResult: []string{"parent", "subfolder"}, }, { @@ -659,7 +654,6 @@ func TestIntegration_DashboardNestedPermissionFilter_WithActionSets(t *testing.T signedInUserPermissions: []accesscontrol.Permission{ {Action: "folders:admin", Scope: "folders:uid:subfolder", Kind: "folders", Identifier: "subfolder"}, }, - features: []any{featuremgmt.FlagNestedFolders, featuremgmt.FlagAccessActionSets}, expectedResult: []string{"subfolder"}, }, { @@ -670,7 +664,6 @@ func TestIntegration_DashboardNestedPermissionFilter_WithActionSets(t *testing.T {Action: "folders:edit", Scope: "folders:uid:subfolder", Kind: "folders", Identifier: "subfolder"}, {Action: "folders:view", Scope: "folders:uid:parent", Kind: "folders", Identifier: "parent"}, }, - features: []any{featuremgmt.FlagNestedFolders, featuremgmt.FlagAccessActionSets}, expectedResult: []string{"subfolder"}, }, } @@ -696,7 +689,7 @@ func TestIntegration_DashboardNestedPermissionFilter_WithActionSets(t *testing.T Scope: "folders:uid:unrelated"}) usr := &user.SignedInUser{OrgID: orgID, OrgRole: org.RoleViewer, Permissions: map[int64]map[string][]string{orgID: accesscontrol.GroupScopesByActionContext(context.Background(), tc.signedInUserPermissions)}} - for _, features := range []featuremgmt.FeatureToggles{featuremgmt.WithFeatures(tc.features...), featuremgmt.WithFeatures(append(tc.features, featuremgmt.FlagPermissionsFilterRemoveSubquery)...)} { + for _, features := range []featuremgmt.FeatureToggles{featuremgmt.WithFeatures(featuremgmt.FlagNestedFolders), featuremgmt.WithFeatures(featuremgmt.FlagNestedFolders, featuremgmt.FlagPermissionsFilterRemoveSubquery)} { m := features.GetEnabled(context.Background()) keys := make([]string, 0, len(m)) for k := range m { diff --git a/pkg/services/sqlstore/searchstore/search_test.go b/pkg/services/sqlstore/searchstore/search_test.go index 4b0786f4ceb..e9eadd5fa22 100644 --- a/pkg/services/sqlstore/searchstore/search_test.go +++ b/pkg/services/sqlstore/searchstore/search_test.go @@ -153,6 +153,9 @@ func TestBuilder_RBAC(t *testing.T) { int64(1), 0, "dashboards:read", + "dashboards:view", + "dashboards:edit", + "dashboards:admin", int64(1), int64(1), int64(1), @@ -161,6 +164,9 @@ func TestBuilder_RBAC(t *testing.T) { int64(1), 0, "dashboards:read", + "folders:view", + "folders:edit", + "folders:admin", int64(1), int64(1), 0, @@ -168,6 +174,9 @@ func TestBuilder_RBAC(t *testing.T) { int64(1), 0, "folders:read", + "folders:view", + "folders:edit", + "folders:admin", }, }, { @@ -186,6 +195,8 @@ func TestBuilder_RBAC(t *testing.T) { int64(1), 0, "dashboards:write", + "dashboards:edit", + "dashboards:admin", int64(1), int64(1), int64(1), @@ -194,6 +205,8 @@ func TestBuilder_RBAC(t *testing.T) { int64(1), 0, "dashboards:write", + "folders:edit", + "folders:admin", int64(1), int64(1), 0, @@ -201,6 +214,8 @@ func TestBuilder_RBAC(t *testing.T) { int64(1), 0, "dashboards:create", + "folders:edit", + "folders:admin", }, }, { @@ -219,6 +234,9 @@ func TestBuilder_RBAC(t *testing.T) { int64(1), 0, "dashboards:read", + "folders:view", + "folders:edit", + "folders:admin", int64(1), int64(1), int64(1), @@ -227,6 +245,9 @@ func TestBuilder_RBAC(t *testing.T) { int64(1), 0, "folders:read", + "folders:view", + "folders:edit", + "folders:admin", int64(1), int64(1), int64(1), @@ -235,6 +256,9 @@ func TestBuilder_RBAC(t *testing.T) { int64(1), 0, "dashboards:read", + "dashboards:view", + "dashboards:edit", + "dashboards:admin", int64(1), }, }, @@ -254,6 +278,9 @@ func TestBuilder_RBAC(t *testing.T) { int64(1), 0, "dashboards:read", + "dashboards:view", + "dashboards:edit", + "dashboards:admin", int64(1), int64(1), 0, @@ -261,6 +288,9 @@ func TestBuilder_RBAC(t *testing.T) { int64(1), 0, "dashboards:read", + "folders:view", + "folders:edit", + "folders:admin", int64(1), int64(1), 0, @@ -268,6 +298,9 @@ func TestBuilder_RBAC(t *testing.T) { int64(1), 0, "folders:read", + "folders:view", + "folders:edit", + "folders:admin", }, }, { @@ -286,6 +319,8 @@ func TestBuilder_RBAC(t *testing.T) { int64(1), 0, "dashboards:write", + "folders:edit", + "folders:admin", int64(1), int64(1), int64(1), @@ -294,6 +329,8 @@ func TestBuilder_RBAC(t *testing.T) { int64(1), 0, "dashboards:create", + "folders:edit", + "folders:admin", int64(1), int64(1), int64(1), @@ -302,6 +339,8 @@ func TestBuilder_RBAC(t *testing.T) { int64(1), 0, "dashboards:write", + "dashboards:edit", + "dashboards:admin", }, }, } diff --git a/pkg/tests/apis/helper.go b/pkg/tests/apis/helper.go index 13880d44dc6..2c2c0b7236f 100644 --- a/pkg/tests/apis/helper.go +++ b/pkg/tests/apis/helper.go @@ -607,7 +607,7 @@ func (c *K8sTestHelper) AddOrUpdateTeamMember(user User, teamID int64, permissio c.env.Server.HTTPServer.AlertNG.AccesscontrolService, c.teamSvc, c.userSvc, - resourcepermissions.NewActionSetService(c.env.FeatureToggles), + resourcepermissions.NewActionSetService(), ) require.NoError(c.t, err) diff --git a/public/app/features/browse-dashboards/permissions.ts b/public/app/features/browse-dashboards/permissions.ts index 3347fb9f442..49eff8d69ff 100644 --- a/public/app/features/browse-dashboards/permissions.ts +++ b/public/app/features/browse-dashboards/permissions.ts @@ -12,16 +12,6 @@ function checkCanCreateFolders(folderDTO?: FolderDTO) { return false; } - if (!config.featureToggles.accessActionSets) { - if (!folderDTO || folderDTO.uid === 'general') { - return checkFolderPermission(AccessControlAction.FoldersCreate); - } - return ( - checkFolderPermission(AccessControlAction.FoldersCreate) && - checkFolderPermission(AccessControlAction.FoldersWrite, folderDTO) - ); - } - return checkFolderPermission(AccessControlAction.FoldersCreate, folderDTO); } From 20b91cfa04f94400c7edc20557ea958e650117b9 Mon Sep 17 00:00:00 2001 From: Kevin Minehart <5140827+kminehart@users.noreply.github.com> Date: Thu, 13 Mar 2025 10:27:19 -0500 Subject: [PATCH 033/117] CI: Add integration tests GitHub Actions workflow (#101732) * Add integration tests workflow --------- Co-authored-by: Serge Zaitsev --- .github/CODEOWNERS | 1 + .github/workflows/pr-test-integration.yml | 126 ++++++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 .github/workflows/pr-test-integration.yml diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 1b4b6f34d65..878975846db 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -792,6 +792,7 @@ embed.go @grafana/grafana-as-code /.github/workflows/pr-codeql-analysis-python.yml @DanCech /.github/workflows/pr-commands.yml @tolzhabayev /.github/workflows/pr-patch-check.yml @grafana/grafana-developer-enablement-squad +/.github/workflows/pr-test-integration.yml @grafana/grafana-backend-group /.github/workflows/pr-backend-unit-tests.yml @grafana/grafana-backend-group /.github/workflows/pr-backend-coverage.yml @grafana/grafana-backend-group /.github/workflows/sync-mirror.yml @grafana/grafana-developer-enablement-squad diff --git a/.github/workflows/pr-test-integration.yml b/.github/workflows/pr-test-integration.yml new file mode 100644 index 00000000000..f0a5f0a7fa3 --- /dev/null +++ b/.github/workflows/pr-test-integration.yml @@ -0,0 +1,126 @@ +name: Integration Tests + +on: + push: + branches: + - main + - release-*.*.* + pull_request: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + sqlite: + name: Sqlite + runs-on: ubuntu-latest-8-cores + steps: + - name: Checkout code + uses: actions/checkout@v4 + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version-file: go.mod + cache: true + - name: Restore GOCACHE + uses: actions/cache/restore@v4 + with: + key: go-test-cache-${{ github.ref_name }}-sqlite + restore-keys: | + go-test-cache-${{ github.base_ref }}-sqlite + go-test-cache-main-sqlite + path: /home/runner/.cache/go-build + - run: | + make gen-go + go test -tags=sqlite -timeout=5m -run '^TestIntegration' $(find ./pkg -type f -name '*_test.go' -exec grep -l '^func TestIntegration' '{}' '+' | grep -o '\(.*\)/' | sort -u) + - name: Save GOCACHE + uses: actions/cache/save@v4 + with: + key: go-test-cache-${{ github.ref_name }}-sqlite + path: /home/runner/.cache/go-build + mysql: + name: MySQL + runs-on: ubuntu-latest-8-cores + env: + GRAFANA_TEST_DB: mysql + MYSQL_HOST: 127.0.0.1 + services: + mysql: + image: mysql:8.0.32 + env: + MYSQL_ROOT_PASSWORD: rootpass + MYSQL_DATABASE: grafana_tests + MYSQL_USER: grafana + MYSQL_PASSWORD: password + options: --health-cmd="mysqladmin ping --silent" --health-interval=10s --health-timeout=5s --health-retries=3 + ports: + - 3306:3306 + steps: + - name: Checkout code + uses: actions/checkout@v4 + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version-file: go.mod + cache: true + - name: Restore GOCACHE + uses: actions/cache/restore@v4 + with: + key: go-test-cache-${{ github.ref_name }}-mysql + restore-keys: | + go-test-cache-${{ github.base_ref }}-mysql + go-test-cache-main-mysql + path: /home/runner/.cache/go-build + - run: | + sudo apt-get update -yq && sudo apt-get install mariadb-client + cat devenv/docker/blocks/mysql_tests/setup.sql | mariadb -h 127.0.0.1 -P 3306 -u root -prootpass --disable-ssl-verify-server-cert + make gen-go + go test -tags=mysql -p=1 -timeout=5m -run '^TestIntegration' $(find ./pkg -type f -name '*_test.go' -exec grep -l '^func TestIntegration' '{}' '+' | grep -o '\(.*\)/' | sort -u) + - name: Save GOCACHE + uses: actions/cache/save@v4 + with: + key: go-test-cache-${{ github.ref_name }}-mysql + path: /home/runner/.cache/go-build + postgres: + name: Postgres + runs-on: ubuntu-latest-8-cores + services: + postgres: + image: postgres:12.3-alpine + env: + POSTGRES_USER: grafanatest + POSTGRES_PASSWORD: grafanatest + POSTGRES_DB: grafanatest + ports: + - 5432:5432 + steps: + - name: Checkout code + uses: actions/checkout@v4 + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version-file: go.mod + cache: true + - name: Restore GOCACHE + uses: actions/cache/restore@v4 + with: + key: go-test-cache-${{ github.ref_name }}-postgres + restore-keys: | + go-test-cache-${{ github.base_ref }}-postgres + go-test-cache-main-postgres + path: /home/runner/.cache/go-build + - env: + GRAFANA_TEST_DB: postgres + PGPASSWORD: grafanatest + POSTGRES_HOST: 127.0.0.1 + run: | + sudo apt-get update -yq && sudo apt-get install postgresql-client + psql -p 5432 -h 127.0.0.1 -U grafanatest -d grafanatest -f devenv/docker/blocks/postgres_tests/setup.sql + make gen-go + go test -p=1 -tags=postgres -timeout=5m -run '^TestIntegration' $(find ./pkg -type f -name '*_test.go' -exec grep -l '^func TestIntegration' '{}' '+' | grep -o '\(.*\)/' | sort -u) + - name: Save GOCACHE + uses: actions/cache/save@v4 + with: + key: go-test-cache-${{ github.ref_name }}-postgres + path: /home/runner/.cache/go-build From 6f12712ad629a1bb225cf8b57ac4f1520022bc4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20=C5=A0tibran=C3=BD?= Date: Thu, 13 Mar 2025 16:38:05 +0100 Subject: [PATCH 034/117] Add Spanner dialect to pkg/storage/unified/sql/sqltemplate package. (#102121) --- .../unified/sql/sqltemplate/dialect.go | 2 ++ .../sql/sqltemplate/dialect_spanner.go | 32 +++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 pkg/storage/unified/sql/sqltemplate/dialect_spanner.go diff --git a/pkg/storage/unified/sql/sqltemplate/dialect.go b/pkg/storage/unified/sql/sqltemplate/dialect.go index 918545fdb25..0789ab7f214 100644 --- a/pkg/storage/unified/sql/sqltemplate/dialect.go +++ b/pkg/storage/unified/sql/sqltemplate/dialect.go @@ -24,6 +24,8 @@ func DialectForDriver(driverName string) Dialect { return PostgreSQL case "sqlite", "sqlite3": return SQLite + case "spanner": + return Spanner default: return nil } diff --git a/pkg/storage/unified/sql/sqltemplate/dialect_spanner.go b/pkg/storage/unified/sql/sqltemplate/dialect_spanner.go new file mode 100644 index 00000000000..4fba8375d3a --- /dev/null +++ b/pkg/storage/unified/sql/sqltemplate/dialect_spanner.go @@ -0,0 +1,32 @@ +package sqltemplate + +// Spanner is an implementation of Dialect for the Google Spanner database. +var Spanner = spanner{} + +var _ Dialect = Spanner + +type spanner struct{} + +func (s spanner) DialectName() string { + return "spanner" +} + +func (s spanner) Ident(a string) (string, error) { + return backtickIdent{}.Ident(a) +} + +func (s spanner) ArgPlaceholder(argNum int) string { + return argFmtSQL92.ArgPlaceholder(argNum) +} + +func (s spanner) SelectFor(a ...string) (string, error) { + return rowLockingClauseSpanner.SelectFor(a...) +} + +func (spanner) CurrentEpoch() string { + return "UNIX_MICROS(CURRENT_TIMESTAMP())" +} + +var rowLockingClauseSpanner = rowLockingClauseMap{ + SelectForUpdate: SelectForUpdate, +} From 441e72b07f1193b4fe2b27dbf9fa1fc232dbfb67 Mon Sep 17 00:00:00 2001 From: Alex Khomenko Date: Thu, 13 Mar 2025 17:40:52 +0200 Subject: [PATCH 035/117] API Client: Add client-level error handler (#102091) * API Client: Add client-level error handler * Return fetch error * Simplify error object --- public/app/api/createBaseQuery.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/public/app/api/createBaseQuery.ts b/public/app/api/createBaseQuery.ts index 29327703bf9..ac282ddc192 100644 --- a/public/app/api/createBaseQuery.ts +++ b/public/app/api/createBaseQuery.ts @@ -8,7 +8,11 @@ interface RequestOptions extends BackendSrvRequest { body?: BackendSrvRequest['data']; } -export function createBaseQuery({ baseURL }: { baseURL: string }): BaseQueryFn { +interface CreateBaseQueryOptions { + baseURL: string; +} + +export function createBaseQuery({ baseURL }: CreateBaseQueryOptions): BaseQueryFn { async function backendSrvBaseQuery(requestOptions: RequestOptions) { try { const { data: responseData, ...meta } = await lastValueFrom( @@ -33,9 +37,7 @@ export function createBaseQuery({ baseURL }: { baseURL: string }): BaseQueryFn Date: Thu, 13 Mar 2025 17:02:40 +0100 Subject: [PATCH 036/117] Alerting: Move summary position above paused rule indicator (#102124) Move summary position above paused rule indicator --- .../alerting/unified/components/rule-viewer/RuleViewer.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/app/features/alerting/unified/components/rule-viewer/RuleViewer.tsx b/public/app/features/alerting/unified/components/rule-viewer/RuleViewer.tsx index d661d942077..119d15a21f1 100644 --- a/public/app/features/alerting/unified/components/rule-viewer/RuleViewer.tsx +++ b/public/app/features/alerting/unified/components/rule-viewer/RuleViewer.tsx @@ -99,9 +99,9 @@ const RuleViewer = () => { info={createMetadata(rule)} subTitle={ - {isPaused && } {summary} {/* alerts and notifications and stuff */} + {isPaused && } {isFederatedRule && } {/* indicator for rules in a provisioned group */} {isProvisioned && ( From 65d047dd432c778fbee06fa8cb0e22184fd7e86f Mon Sep 17 00:00:00 2001 From: Pepe Cano <825430+ppcano@users.noreply.github.com> Date: Thu, 13 Mar 2025 17:12:57 +0100 Subject: [PATCH 037/117] docs(alerting): add notification screenshots details in `Create and link alert rules to panels` (#102103) * format admonition * include mention to display panel screenshots in notifications --- .../link-alert-rules-to-panels.md | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/docs/sources/alerting/alerting-rules/link-alert-rules-to-panels.md b/docs/sources/alerting/alerting-rules/link-alert-rules-to-panels.md index 746cb778052..78cce1a5efa 100644 --- a/docs/sources/alerting/alerting-rules/link-alert-rules-to-panels.md +++ b/docs/sources/alerting/alerting-rules/link-alert-rules-to-panels.md @@ -33,6 +33,11 @@ refs: destination: /docs/grafana//alerting/monitor-status/view-alert-state/#view-alert-state-on-panels - pattern: /docs/grafana-cloud/ destination: /docs/grafana-cloud/alerting-and-irm/alerting/monitor-status/view-alert-state/#view-alert-state-on-panels + images-in-notifications: + - pattern: /docs/grafana/ + destination: /docs/grafana//alerting/configure-notifications/template-notifications/images-in-notifications/ + - pattern: /docs/grafana-cloud/ + destination: /docs/grafana-cloud/alerting-and-irm/alerting/configure-notifications/template-notifications/images-in-notifications/ --- # Create and link alert rules to panels @@ -41,13 +46,10 @@ Grafana allows you to link an alert rule to a dashboard panel. This can help you - Inform alert responders about where to investigate and which data to examine. - Visualize the alert state directly from dashboards. +- Include a screenshot of the panel in notification messages. An alert rule is linked to a panel by setting the [`dashboardUId` and `panelId` annotations](ref:annotations). Both annotations must be set together. -{{% admonition type="tutorial" %}} -For a hands-on example of integrating alert rules with dashboards, check out [Part 5 of our Get Started with Grafana Alerting tutorial](http://www.grafana.com/tutorials/alerting-get-started-pt5/). -{{% /admonition %}} - ## Link alert rules to panels When configuring the alert rule, you can set the dashboard and panel annotations as shown in this [video](https://youtu.be/ClLp-iSoaSY?si=qKWnvSVaQuvYcuw9&t=170). @@ -59,6 +61,8 @@ When configuring the alert rule, you can set the dashboard and panel annotations You can then [view the alert state on the panel](ref:view-alert-state-on-panels). +By default, notification messages include a link to the dashboard panel. Additionally, you can [enable displaying panel screenshots in notifications](ref:images-in-notifications). + {{< figure src="/media/docs/alerting/panel-displays-alert-state.png" max-width="1200px" caption="A panel displaying the alert status and state changes." >}} ## Create alert rules from panels @@ -75,6 +79,8 @@ To streamline alert creation, you can create an alert rule directly from a panel You can then [view the alert state on the panel](ref:view-alert-state-on-panels). +By default, notification messages include a link to the dashboard panel. Additionally, you can [enable displaying panel screenshots in notifications](ref:images-in-notifications). + {{% admonition type="note" %}} Changes to panel and alert rule queries aren't synchronized. If you change a query, you have to update it in both the panel and the alert rule. {{% /admonition %}} @@ -86,3 +92,7 @@ This option is available only in [time series panels](ref:time-series-visualizat 1. Hover over the top-right corner of the panel and click the panel menu icon. 1. Click **Edit**. 1. Click the **Alert** tab to view existing alert rules or create a new one. + +{{< admonition type="tip" >}} +For a practical example that links a panel to an alert rule, refer to [Part 5 of our Get Started with Grafana Alerting tutorial](http://www.grafana.com/tutorials/alerting-get-started-pt5/). +{{% /admonition %}} From 4d5fd2cfb775b781f87e061f52e7f8ce93967033 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20=C5=A0tibran=C3=BD?= Date: Thu, 13 Mar 2025 17:13:43 +0100 Subject: [PATCH 038/117] Spanner: Fix queries for deleting query history. (#102125) --- pkg/services/queryhistory/database.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/services/queryhistory/database.go b/pkg/services/queryhistory/database.go index 54b0c5e545b..61bff39506a 100644 --- a/pkg/services/queryhistory/database.go +++ b/pkg/services/queryhistory/database.go @@ -327,12 +327,12 @@ func (s QueryHistoryService) deleteStaleQueries(ctx context.Context, olderThan i FROM query_history WHERE uid IN (` + uids_sql + `)` - _, err := session.Exec(details_sql, strconv.FormatInt(olderThan, 10)) + _, err := session.Exec(details_sql, olderThan) if err != nil { return err } - res, err := session.Exec(sql, strconv.FormatInt(olderThan, 10)) + res, err := session.Exec(sql, olderThan) if err != nil { return err } From 106856881487ad4c13aa130a23deb0b743b8603d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20=C5=A0tibran=C3=BD?= Date: Thu, 13 Mar 2025 17:39:49 +0100 Subject: [PATCH 039/117] Spanner: Fix query for limiting query history. (#102132) --- pkg/services/queryhistory/database.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pkg/services/queryhistory/database.go b/pkg/services/queryhistory/database.go index 61bff39506a..80c7d363888 100644 --- a/pkg/services/queryhistory/database.go +++ b/pkg/services/queryhistory/database.go @@ -2,7 +2,6 @@ package queryhistory import ( "context" - "strconv" "github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/services/user" @@ -401,7 +400,7 @@ func (s QueryHistoryService) enforceQueryHistoryRowLimit(ctx context.Context, li sqlLimit = 10000 } - res, err := session.Exec(sql, strconv.FormatInt(sqlLimit, 10)) + res, err := session.Exec(sql, sqlLimit) if err != nil { return err } From 945206974543cc0dba252e47da988b32da9514e3 Mon Sep 17 00:00:00 2001 From: Pepe Cano <825430+ppcano@users.noreply.github.com> Date: Thu, 13 Mar 2025 18:08:31 +0100 Subject: [PATCH 040/117] docs(alerting): timing options minor enhancements (#101965) * docs(alerting): timing options minor enhancements * minor addition * Update docs/sources/alerting/fundamentals/notifications/group-alert-notifications.md Co-authored-by: Johnny Kartheiser <140559259+JohnnyK-Grafana@users.noreply.github.com> --------- Co-authored-by: Johnny Kartheiser <140559259+JohnnyK-Grafana@users.noreply.github.com> --- .../notifications/group-alert-notifications.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/sources/alerting/fundamentals/notifications/group-alert-notifications.md b/docs/sources/alerting/fundamentals/notifications/group-alert-notifications.md index 4434a6f9a88..64b1e83ef54 100644 --- a/docs/sources/alerting/fundamentals/notifications/group-alert-notifications.md +++ b/docs/sources/alerting/fundamentals/notifications/group-alert-notifications.md @@ -99,7 +99,9 @@ flowchart LR Group wait is the duration Grafana waits before sending the first notification for a new group of alerts. -The longer the group wait, the more time other alerts have to be included in the initial notification of the new group. The shorter the group wait, the earlier the first notification is sent, but at the risk of not including some alerts. +This option helps reduce the number of notifications sent for related alerts occurring within a short time frame. The longer the group wait, the more time other alerts have to be included in the initial notification of the new group. The shorter the group wait, the earlier the first notification is sent, but at the risk of not including some alerts. + +If an alert is resolved before the duration elapses, no notification is sent for that alert. This reduces noise from flapping alerts. **Example** @@ -125,7 +127,10 @@ Consider a notification policy that: If an alert was too late to be included in the first notification due to group wait, it is included in subsequent notifications after group interval. -Group interval is the duration to wait before sending notifications about group changes. For instance, a group change may be adding a new firing alert to the group, or resolving an existing alert. +Group interval is the duration to wait before sending notifications about group changes. A group change occurs when: + +- A new firing alert is added to the group. +- An existing alert is resolved. **Example** @@ -170,6 +175,8 @@ Repeat interval is evaluated every time the group interval resets. If the alert Repeat interval must not only be greater than or equal to group interval, but also must be a multiple of Group interval. If Repeat interval is not a multiple of group interval it is coerced into one. For example, if your Group interval is 5 minutes, and your Repeat interval is 9 minutes, the Repeat interval is rounded up to the nearest multiple of 5 which is 10 minutes. +The maximum duration of the repeat interval is 5 days, constrained by the default value of the `notification_log_retention` setting in Grafana. + **Example** Here are the related excerpts from the previous example: From 42958497ffc371c2658e78a26bea476da98f7a57 Mon Sep 17 00:00:00 2001 From: Johnny Kartheiser <140559259+JohnnyK-Grafana@users.noreply.github.com> Date: Thu, 13 Mar 2025 14:01:56 -0500 Subject: [PATCH 041/117] alerting docs: add alert rule history image (#101980) * alerting docs: add alert rule history image add image for alert rule history to docs * Update view-alert-rules.md * lint/prettier --- docs/sources/alerting/monitor-status/view-alert-rules.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/sources/alerting/monitor-status/view-alert-rules.md b/docs/sources/alerting/monitor-status/view-alert-rules.md index 64dc4df3aa2..2d7a404b90b 100644 --- a/docs/sources/alerting/monitor-status/view-alert-rules.md +++ b/docs/sources/alerting/monitor-status/view-alert-rules.md @@ -69,3 +69,4 @@ To view or restore previous versions for an alert rule, complete the following s The page displays a list of the previous rule versions. On the Alert rule's Versions page you can view, compare and restore the previous rule versions. +{{< figure src="/media/docs/alerting/screenshot-grafana-alerting-version-history-v3.png" max-width="750px" alt="View alert rule history to compare and restore previous alert rules." >}} From a3ada255795d4e54f5b05bc5bb33aab1ac69c735 Mon Sep 17 00:00:00 2001 From: Jev Forsberg <46619047+baldm0mma@users.noreply.github.com> Date: Thu, 13 Mar 2025 13:34:35 -0600 Subject: [PATCH 042/117] Chore: Migrate pr-docs pipeline to GHAs (#101982) * baldmomma/ add pr-lint-build-docs.yml * baldm0mma/ update codeowners * baldm0mma/ remove superfluous command * baldm0mma/ trigger * baldm0mma/ update with heredoc format * baldm0mma/ update content stash * baldm0mma/ explore container for prod target * baldm0mma/ update to use hugo directly * baldm0mma/ clone the websote dir * baldm0mma/ rebuild with docker * baldm0mma/ docker run * baldm0mma/ remove build trigger * baldm0mma/ remove cue gen step that is covered elsewhere --- .github/CODEOWNERS | 1 + .github/workflows/pr-lint-build-docs.yml | 52 ++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 .github/workflows/pr-lint-build-docs.yml diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 878975846db..fcb251d3f83 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -791,6 +791,7 @@ embed.go @grafana/grafana-as-code /.github/workflows/pr-codeql-analysis-javascript.yml @DanCech /.github/workflows/pr-codeql-analysis-python.yml @DanCech /.github/workflows/pr-commands.yml @tolzhabayev +/.github/workflows/pr-lint-build-docs.yml @grafana/docs-tooling /.github/workflows/pr-patch-check.yml @grafana/grafana-developer-enablement-squad /.github/workflows/pr-test-integration.yml @grafana/grafana-backend-group /.github/workflows/pr-backend-unit-tests.yml @grafana/grafana-backend-group diff --git a/.github/workflows/pr-lint-build-docs.yml b/.github/workflows/pr-lint-build-docs.yml new file mode 100644 index 00000000000..8ed36d3da9a --- /dev/null +++ b/.github/workflows/pr-lint-build-docs.yml @@ -0,0 +1,52 @@ +name: Documentation + +on: + pull_request: + paths: + - '*.md' + - 'docs/**' + - 'packages/**/*.md' + - 'latest.json' + +jobs: + docs: + name: Build & Verify Docs + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '22.11.0' + cache: 'yarn' + + - name: Install dependencies + run: yarn install --immutable + + - name: Lint docs + run: yarn run prettier:checkDocs + env: + # Increase memory for prettier due to large number of files + NODE_OPTIONS: --max_old_space_size=8192 + + - name: Build docs website + run: | + # Create and start a container from the docs-base image in detached mode + docker run -d --name docs-builder grafana/docs-base:latest tail -f /dev/null + + # Create the directory structure inside the container + docker exec docs-builder mkdir -p /hugo/content/docs/grafana/latest + + # Create the _index.md file + docker exec docs-builder /bin/sh -c "echo -e '---\nredirectURL: /docs/grafana/latest/\ntype: redirect\nversioned: true\n---\n' > /hugo/content/docs/grafana/_index.md" + + # Copy the docs sources from the host to the container + docker cp docs/sources/. docs-builder:/hugo/content/docs/grafana/latest/ + + # Run the make prod command inside the container + docker exec -w /hugo docs-builder make prod || echo "Build completed with warnings" + + # Clean up the container + docker rm -f docs-builder From ae7cba3268cc25d23f6b1e1dc27aa84787092e36 Mon Sep 17 00:00:00 2001 From: Nick Richmond <5732000+NWRichmond@users.noreply.github.com> Date: Thu, 13 Mar 2025 17:50:37 -0400 Subject: [PATCH 043/117] MetricsDrilldown: Advance `exploreMetricsUseExternalAppPlugin` feature toggle stage (#102137) * chore: advance `exploreMetricsUseExternalAppPlugin` feature toggle stage * fix: do not hide from docs --- .../configure-grafana/feature-toggles/index.md | 1 + pkg/services/featuremgmt/registry.go | 5 ++--- pkg/services/featuremgmt/toggles_gen.csv | 2 +- pkg/services/featuremgmt/toggles_gen.go | 2 +- pkg/services/featuremgmt/toggles_gen.json | 11 +++++------ 5 files changed, 10 insertions(+), 11 deletions(-) diff --git a/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md b/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md index fac87ab8fd8..23849201ec7 100644 --- a/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md +++ b/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md @@ -115,6 +115,7 @@ Most [generally available](https://grafana.com/docs/release-life-cycle/#general- | `improvedExternalSessionHandling` | Enables improved support for OAuth external sessions. After enabling this feature, users might need to re-authenticate themselves. | | `elasticsearchCrossClusterSearch` | Enables cross cluster search in the Elasticsearch datasource | | `improvedExternalSessionHandlingSAML` | Enables improved support for SAML external sessions. Ensure the NameID format is correctly configured in Grafana for SAML Single Logout to function properly. | +| `exploreMetricsUseExternalAppPlugin` | Use the externalized Grafana Metrics Drilldown (formerly known as Explore Metrics) app plugin | | `alertRuleRestore` | Enables the alert rule restore feature | ## Experimental feature toggles diff --git a/pkg/services/featuremgmt/registry.go b/pkg/services/featuremgmt/registry.go index befd4cfafc0..680a2c9f7d9 100644 --- a/pkg/services/featuremgmt/registry.go +++ b/pkg/services/featuremgmt/registry.go @@ -1660,12 +1660,11 @@ var ( }, { Name: "exploreMetricsUseExternalAppPlugin", - Description: "Use the externalized Metrics Drilldown (formerly known as Explore Metrics) app plugin", - Stage: FeatureStageExperimental, + Description: "Use the externalized Grafana Metrics Drilldown (formerly known as Explore Metrics) app plugin", + Stage: FeatureStagePublicPreview, Owner: grafanaObservabilityMetricsSquad, FrontendOnly: true, RequiresRestart: true, - HideFromDocs: true, }, { Name: "datasourceConnectionsTab", diff --git a/pkg/services/featuremgmt/toggles_gen.csv b/pkg/services/featuremgmt/toggles_gen.csv index f6857945bc2..339046fd261 100644 --- a/pkg/services/featuremgmt/toggles_gen.csv +++ b/pkg/services/featuremgmt/toggles_gen.csv @@ -220,7 +220,7 @@ templateVariablesUsesCombobox,experimental,@grafana/grafana-frontend-platform,fa ABTestFeatureToggleB,experimental,@grafana/sharing-squad,false,false,false grafanaAdvisor,experimental,@grafana/plugins-platform-backend,false,false,false elasticsearchImprovedParsing,experimental,@grafana/aws-datasources,false,false,false -exploreMetricsUseExternalAppPlugin,experimental,@grafana/observability-metrics,false,true,true +exploreMetricsUseExternalAppPlugin,preview,@grafana/observability-metrics,false,true,true datasourceConnectionsTab,experimental,@grafana/plugins-platform-backend,false,false,true fetchRulesUsingPost,experimental,@grafana/alerting-squad,false,false,false alertingConversionAPI,experimental,@grafana/alerting-squad,false,false,false diff --git a/pkg/services/featuremgmt/toggles_gen.go b/pkg/services/featuremgmt/toggles_gen.go index f2d09129a96..fc5a5f399f5 100644 --- a/pkg/services/featuremgmt/toggles_gen.go +++ b/pkg/services/featuremgmt/toggles_gen.go @@ -892,7 +892,7 @@ const ( FlagElasticsearchImprovedParsing = "elasticsearchImprovedParsing" // FlagExploreMetricsUseExternalAppPlugin - // Use the externalized Metrics Drilldown (formerly known as Explore Metrics) app plugin + // Use the externalized Grafana Metrics Drilldown (formerly known as Explore Metrics) app plugin FlagExploreMetricsUseExternalAppPlugin = "exploreMetricsUseExternalAppPlugin" // FlagDatasourceConnectionsTab diff --git a/pkg/services/featuremgmt/toggles_gen.json b/pkg/services/featuremgmt/toggles_gen.json index 5933a93ecb8..9773e96a8c0 100644 --- a/pkg/services/featuremgmt/toggles_gen.json +++ b/pkg/services/featuremgmt/toggles_gen.json @@ -1661,19 +1661,18 @@ { "metadata": { "name": "exploreMetricsUseExternalAppPlugin", - "resourceVersion": "1738596266973", + "resourceVersion": "1741883352541", "creationTimestamp": "2025-01-21T23:24:50Z", "annotations": { - "grafana.app/updatedTimestamp": "2025-02-03 15:24:26.973231 +0000 UTC" + "grafana.app/updatedTimestamp": "2025-03-13 16:29:12.541156 +0000 UTC" } }, "spec": { - "description": "Use the externalized Metrics Drilldown (formerly known as Explore Metrics) app plugin", - "stage": "experimental", + "description": "Use the externalized Grafana Metrics Drilldown (formerly known as Explore Metrics) app plugin", + "stage": "preview", "codeowner": "@grafana/observability-metrics", "frontend": true, - "requiresRestart": true, - "hideFromDocs": true + "requiresRestart": true } }, { From 4420ff92022854e92dd58d4e3c11fe75611568e9 Mon Sep 17 00:00:00 2001 From: Michael Mandrus <41969079+mmandrus@users.noreply.github.com> Date: Thu, 13 Mar 2025 18:10:46 -0400 Subject: [PATCH 044/117] SecretsManager: Merge codegen portion so that we can use the dependency elsewhere (#102152) * copy changes over from feature branch * update codegen --- .../v2alpha1/zz_generated.openapi.go | 272 ++++++- ...enerated.openapi_violation_exceptions.list | 4 + pkg/apis/secret/README.md | 20 + pkg/apis/secret/v0alpha1/decrypt/buf.gen.yaml | 12 + pkg/apis/secret/v0alpha1/decrypt/buf.yaml | 7 + .../secret/v0alpha1/decrypt/decrypt.pb.go | 214 +++++ .../secret/v0alpha1/decrypt/decrypt.proto | 25 + .../v0alpha1/decrypt/decrypt_grpc.pb.go | 110 +++ pkg/apis/secret/v0alpha1/decrypt/go.mod | 18 + pkg/apis/secret/v0alpha1/decrypt/go.sum | 34 + pkg/apis/secret/v0alpha1/doc.go | 6 + .../secret/v0alpha1/exposed_secure_value.go | 66 ++ .../v0alpha1/exposed_secure_value_test.go | 48 ++ pkg/apis/secret/v0alpha1/keeper.go | 145 ++++ pkg/apis/secret/v0alpha1/register.go | 131 ++++ pkg/apis/secret/v0alpha1/secure_value.go | 91 +++ .../secret/v0alpha1/zz_generated.deepcopy.go | 441 +++++++++++ .../secret/v0alpha1/zz_generated.defaults.go | 19 + .../secret/v0alpha1/zz_generated.openapi.go | 740 ++++++++++++++++++ ...enerated.openapi_violation_exceptions.list | 8 + 20 files changed, 2409 insertions(+), 2 deletions(-) create mode 100644 pkg/apis/secret/README.md create mode 100644 pkg/apis/secret/v0alpha1/decrypt/buf.gen.yaml create mode 100644 pkg/apis/secret/v0alpha1/decrypt/buf.yaml create mode 100644 pkg/apis/secret/v0alpha1/decrypt/decrypt.pb.go create mode 100644 pkg/apis/secret/v0alpha1/decrypt/decrypt.proto create mode 100644 pkg/apis/secret/v0alpha1/decrypt/decrypt_grpc.pb.go create mode 100644 pkg/apis/secret/v0alpha1/decrypt/go.mod create mode 100644 pkg/apis/secret/v0alpha1/decrypt/go.sum create mode 100644 pkg/apis/secret/v0alpha1/doc.go create mode 100644 pkg/apis/secret/v0alpha1/exposed_secure_value.go create mode 100644 pkg/apis/secret/v0alpha1/exposed_secure_value_test.go create mode 100644 pkg/apis/secret/v0alpha1/keeper.go create mode 100644 pkg/apis/secret/v0alpha1/register.go create mode 100644 pkg/apis/secret/v0alpha1/secure_value.go create mode 100644 pkg/apis/secret/v0alpha1/zz_generated.deepcopy.go create mode 100644 pkg/apis/secret/v0alpha1/zz_generated.defaults.go create mode 100644 pkg/apis/secret/v0alpha1/zz_generated.openapi.go create mode 100644 pkg/apis/secret/v0alpha1/zz_generated.openapi_violation_exceptions.list diff --git a/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi.go index 5d0d6801fcb..ccb68473004 100644 --- a/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi.go +++ b/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi.go @@ -24,6 +24,15 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAnnotationPanelFilter": schema_pkg_apis_dashboard_v2alpha1_DashboardAnnotationPanelFilter(ref), "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAnnotationQueryKind": schema_pkg_apis_dashboard_v2alpha1_DashboardAnnotationQueryKind(ref), "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAnnotationQuerySpec": schema_pkg_apis_dashboard_v2alpha1_DashboardAnnotationQuerySpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingDataKind": schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingDataKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingDataSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingDataSpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingGroupKind": schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingGroupKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingGroupSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingGroupSpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingTimeIntervalKind": schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingTimeIntervalKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingTimeIntervalSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingTimeIntervalSpec(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingVariableKind": schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingVariableKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind": schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind(ref), + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingVariableSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingVariableSpec(ref), "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConstantVariableKind": schema_pkg_apis_dashboard_v2alpha1_DashboardConstantVariableKind(ref), "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConstantVariableSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardConstantVariableSpec(ref), "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConversionStatus": schema_pkg_apis_dashboard_v2alpha1_DashboardConversionStatus(ref), @@ -634,6 +643,255 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardAnnotationQuerySpec(ref common. } } +func schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingDataKind(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "spec": { + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingDataSpec"), + }, + }, + }, + Required: []string{"kind", "spec"}, + }, + }, + Dependencies: []string{ + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingDataSpec"}, + } +} + +func schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingDataSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "value": { + SchemaProps: spec.SchemaProps{ + Default: false, + Type: []string{"boolean"}, + Format: "", + }, + }, + }, + Required: []string{"value"}, + }, + }, + } +} + +func schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingGroupKind(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "spec": { + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingGroupSpec"), + }, + }, + }, + Required: []string{"kind", "spec"}, + }, + }, + Dependencies: []string{ + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingGroupSpec"}, + } +} + +func schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingGroupSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "condition": { + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "items": { + SchemaProps: spec.SchemaProps{ + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind"), + }, + }, + }, + }, + }, + }, + Required: []string{"condition", "items"}, + }, + }, + Dependencies: []string{ + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind"}, + } +} + +func schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingTimeIntervalKind(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "spec": { + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingTimeIntervalSpec"), + }, + }, + }, + Required: []string{"kind", "spec"}, + }, + }, + Dependencies: []string{ + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingTimeIntervalSpec"}, + } +} + +func schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingTimeIntervalSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "value": { + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + Required: []string{"value"}, + }, + }, + } +} + +func schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingVariableKind(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "spec": { + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingVariableSpec"), + }, + }, + }, + Required: []string{"kind", "spec"}, + }, + }, + Dependencies: []string{ + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingVariableSpec"}, + } +} + +func schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "ConditionalRenderingVariableKind": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingVariableKind"), + }, + }, + "ConditionalRenderingDataKind": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingDataKind"), + }, + }, + "ConditionalRenderingTimeIntervalKind": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingTimeIntervalKind"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingDataKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingTimeIntervalKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingVariableKind"}, + } +} + +func schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingVariableSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "variable": { + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "operator": { + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "value": { + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + Required: []string{"variable", "operator", "value"}, + }, + }, + } +} + func schema_pkg_apis_dashboard_v2alpha1_DashboardConstantVariableKind(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -3116,12 +3374,17 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardResponsiveGridLayoutItemSpec(re Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridRepeatOptions"), }, }, + "conditionalRendering": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingGroupKind"), + }, + }, }, Required: []string{"element"}, }, }, Dependencies: []string{ - "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardElementReference", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridRepeatOptions"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingGroupKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardElementReference", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridRepeatOptions"}, } } @@ -3324,6 +3587,11 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardRowsLayoutRowSpec(ref common.Re Format: "", }, }, + "conditionalRendering": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingGroupKind"), + }, + }, "repeat": { SchemaProps: spec.SchemaProps{ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowRepeatOptions"), @@ -3339,7 +3607,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardRowsLayoutRowSpec(ref common.Re }, }, Dependencies: []string{ - "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowRepeatOptions"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingGroupKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowRepeatOptions"}, } } diff --git a/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi_violation_exceptions.list b/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi_violation_exceptions.list index 66ecc8175bb..31084da6e9f 100644 --- a/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi_violation_exceptions.list +++ b/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi_violation_exceptions.list @@ -3,6 +3,7 @@ API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/ API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardAdhocVariableSpec,BaseFilters API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardAdhocVariableSpec,DefaultKeys API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardAdhocVariableSpec,Filters +API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardConditionalRenderingGroupSpec,Items API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardCustomVariableSpec,Options API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardDashboardLink,Tags API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardDatasourceVariableSpec,Options @@ -31,6 +32,9 @@ API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/ API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardTimeSettingsSpec,QuickRanges API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardV2alpha1FieldConfigSourceOverrides,Properties API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,LibraryPanelStatus,Warnings +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind,ConditionalRenderingDataKind +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind,ConditionalRenderingTimeIntervalKind +API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind,ConditionalRenderingVariableKind API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutItemKindOrGridLayoutRowKind,GridLayoutItemKind API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutItemKindOrGridLayoutRowKind,GridLayoutRowKind API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind,GridLayoutKind diff --git a/pkg/apis/secret/README.md b/pkg/apis/secret/README.md new file mode 100644 index 00000000000..a375b20df06 --- /dev/null +++ b/pkg/apis/secret/README.md @@ -0,0 +1,20 @@ +# pkg/apis/secret + +General documentation on the Secrets API for App Platform. + +## Regenerating codegen files + +Currently the generated files are not using `grafana-app-sdk` and does not have a CUE schema definition. + +In order to regenerate the codegen files (those prefixed by `zz_`), you can run: +```sh +./hack/update-codegen.sh secret +``` + +More details [here](https://github.com/grafana/grafana/tree/main/hack#kubernetes-hack-alert). + +## Regenerating Protobuf files + +```sh +make protobuf +``` diff --git a/pkg/apis/secret/v0alpha1/decrypt/buf.gen.yaml b/pkg/apis/secret/v0alpha1/decrypt/buf.gen.yaml new file mode 100644 index 00000000000..f725fb6452d --- /dev/null +++ b/pkg/apis/secret/v0alpha1/decrypt/buf.gen.yaml @@ -0,0 +1,12 @@ +version: v1 + +plugins: + - plugin: go + out: pkg/apis/secret/v0alpha1/decrypt + opt: + - paths=source_relative + - plugin: go-grpc + out: pkg/apis/secret/v0alpha1/decrypt + opt: + - paths=source_relative + - require_unimplemented_servers=false diff --git a/pkg/apis/secret/v0alpha1/decrypt/buf.yaml b/pkg/apis/secret/v0alpha1/decrypt/buf.yaml new file mode 100644 index 00000000000..1a5194568a9 --- /dev/null +++ b/pkg/apis/secret/v0alpha1/decrypt/buf.yaml @@ -0,0 +1,7 @@ +version: v1 +breaking: + use: + - FILE +lint: + use: + - DEFAULT diff --git a/pkg/apis/secret/v0alpha1/decrypt/decrypt.pb.go b/pkg/apis/secret/v0alpha1/decrypt/decrypt.pb.go new file mode 100644 index 00000000000..58bcba20ae0 --- /dev/null +++ b/pkg/apis/secret/v0alpha1/decrypt/decrypt.pb.go @@ -0,0 +1,214 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.4 +// protoc (unknown) +// source: decrypt.proto + +package decrypt + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type SecureValueDecryptRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The stack_id or org_id. + Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` + // A list of secure value names to decrypt. + Names []string `protobuf:"bytes,2,rep,name=names,proto3" json:"names,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SecureValueDecryptRequest) Reset() { + *x = SecureValueDecryptRequest{} + mi := &file_decrypt_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SecureValueDecryptRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SecureValueDecryptRequest) ProtoMessage() {} + +func (x *SecureValueDecryptRequest) ProtoReflect() protoreflect.Message { + mi := &file_decrypt_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SecureValueDecryptRequest.ProtoReflect.Descriptor instead. +func (*SecureValueDecryptRequest) Descriptor() ([]byte, []int) { + return file_decrypt_proto_rawDescGZIP(), []int{0} +} + +func (x *SecureValueDecryptRequest) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *SecureValueDecryptRequest) GetNames() []string { + if x != nil { + return x.Names + } + return nil +} + +type SecureValueDecryptResponseCollection struct { + state protoimpl.MessageState `protogen:"open.v1"` + // A map of secure value names and their decrypted values. + // The value may be empty if the requestor does not have permissions to read it, or if the value does not exist. + // It will never return a 404 Not Found to avoid scanning of valid secure values. + DecryptedValues map[string]string `protobuf:"bytes,1,rep,name=decrypted_values,json=decryptedValues,proto3" json:"decrypted_values,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SecureValueDecryptResponseCollection) Reset() { + *x = SecureValueDecryptResponseCollection{} + mi := &file_decrypt_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SecureValueDecryptResponseCollection) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SecureValueDecryptResponseCollection) ProtoMessage() {} + +func (x *SecureValueDecryptResponseCollection) ProtoReflect() protoreflect.Message { + mi := &file_decrypt_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SecureValueDecryptResponseCollection.ProtoReflect.Descriptor instead. +func (*SecureValueDecryptResponseCollection) Descriptor() ([]byte, []int) { + return file_decrypt_proto_rawDescGZIP(), []int{1} +} + +func (x *SecureValueDecryptResponseCollection) GetDecryptedValues() map[string]string { + if x != nil { + return x.DecryptedValues + } + return nil +} + +var File_decrypt_proto protoreflect.FileDescriptor + +var file_decrypt_proto_rawDesc = string([]byte{ + 0x0a, 0x0d, 0x64, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, + 0x07, 0x64, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x22, 0x4f, 0x0a, 0x19, 0x53, 0x65, 0x63, 0x75, + 0x72, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0xd9, 0x01, 0x0a, 0x24, 0x53, 0x65, + 0x63, 0x75, 0x72, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x6d, 0x0a, 0x10, 0x64, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x5f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x64, + 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x44, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x65, 0x63, 0x72, + 0x79, 0x70, 0x74, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0f, 0x64, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x1a, 0x42, 0x0a, 0x14, 0x44, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x32, 0x80, 0x01, 0x0a, 0x14, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x72, 0x12, 0x68, + 0x0a, 0x13, 0x44, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x64, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x2e, + 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x65, 0x63, 0x72, 0x79, + 0x70, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x64, 0x65, 0x63, 0x72, + 0x79, 0x70, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, + 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x3d, 0x5a, 0x3b, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x66, 0x61, 0x6e, 0x61, 0x2f, 0x67, + 0x72, 0x61, 0x66, 0x61, 0x6e, 0x61, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, + 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x2f, 0x76, 0x30, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, + 0x64, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +}) + +var ( + file_decrypt_proto_rawDescOnce sync.Once + file_decrypt_proto_rawDescData []byte +) + +func file_decrypt_proto_rawDescGZIP() []byte { + file_decrypt_proto_rawDescOnce.Do(func() { + file_decrypt_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_decrypt_proto_rawDesc), len(file_decrypt_proto_rawDesc))) + }) + return file_decrypt_proto_rawDescData +} + +var file_decrypt_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_decrypt_proto_goTypes = []any{ + (*SecureValueDecryptRequest)(nil), // 0: decrypt.SecureValueDecryptRequest + (*SecureValueDecryptResponseCollection)(nil), // 1: decrypt.SecureValueDecryptResponseCollection + nil, // 2: decrypt.SecureValueDecryptResponseCollection.DecryptedValuesEntry +} +var file_decrypt_proto_depIdxs = []int32{ + 2, // 0: decrypt.SecureValueDecryptResponseCollection.decrypted_values:type_name -> decrypt.SecureValueDecryptResponseCollection.DecryptedValuesEntry + 0, // 1: decrypt.SecureValueDecrypter.DecryptSecureValues:input_type -> decrypt.SecureValueDecryptRequest + 1, // 2: decrypt.SecureValueDecrypter.DecryptSecureValues:output_type -> decrypt.SecureValueDecryptResponseCollection + 2, // [2:3] is the sub-list for method output_type + 1, // [1:2] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name +} + +func init() { file_decrypt_proto_init() } +func file_decrypt_proto_init() { + if File_decrypt_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: unsafe.Slice(unsafe.StringData(file_decrypt_proto_rawDesc), len(file_decrypt_proto_rawDesc)), + NumEnums: 0, + NumMessages: 3, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_decrypt_proto_goTypes, + DependencyIndexes: file_decrypt_proto_depIdxs, + MessageInfos: file_decrypt_proto_msgTypes, + }.Build() + File_decrypt_proto = out.File + file_decrypt_proto_goTypes = nil + file_decrypt_proto_depIdxs = nil +} diff --git a/pkg/apis/secret/v0alpha1/decrypt/decrypt.proto b/pkg/apis/secret/v0alpha1/decrypt/decrypt.proto new file mode 100644 index 00000000000..402ef684efd --- /dev/null +++ b/pkg/apis/secret/v0alpha1/decrypt/decrypt.proto @@ -0,0 +1,25 @@ +syntax = "proto3"; + +package decrypt; + +option go_package = "github.com/grafana/grafana/pkg/apis/secret/v0alpha1/decrypt"; + +message SecureValueDecryptRequest { + // The stack_id or org_id. + string namespace = 1; + + // A list of secure value names to decrypt. + repeated string names = 2; +} + +message SecureValueDecryptResponseCollection { + // A map of secure value names and their decrypted values. + // The value may be empty if the requestor does not have permissions to read it, or if the value does not exist. + // It will never return a 404 Not Found to avoid scanning of valid secure values. + map decrypted_values = 1; +} + +service SecureValueDecrypter { + // Decrypts a list of secure values and returns them as a map. + rpc DecryptSecureValues(SecureValueDecryptRequest) returns (SecureValueDecryptResponseCollection); +} diff --git a/pkg/apis/secret/v0alpha1/decrypt/decrypt_grpc.pb.go b/pkg/apis/secret/v0alpha1/decrypt/decrypt_grpc.pb.go new file mode 100644 index 00000000000..9b14a013678 --- /dev/null +++ b/pkg/apis/secret/v0alpha1/decrypt/decrypt_grpc.pb.go @@ -0,0 +1,110 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.4.0 +// - protoc (unknown) +// source: decrypt.proto + +package decrypt + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.62.0 or later. +const _ = grpc.SupportPackageIsVersion8 + +const ( + SecureValueDecrypter_DecryptSecureValues_FullMethodName = "/decrypt.SecureValueDecrypter/DecryptSecureValues" +) + +// SecureValueDecrypterClient is the client API for SecureValueDecrypter service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type SecureValueDecrypterClient interface { + // Decrypts a list of secure values and returns them as a map. + DecryptSecureValues(ctx context.Context, in *SecureValueDecryptRequest, opts ...grpc.CallOption) (*SecureValueDecryptResponseCollection, error) +} + +type secureValueDecrypterClient struct { + cc grpc.ClientConnInterface +} + +func NewSecureValueDecrypterClient(cc grpc.ClientConnInterface) SecureValueDecrypterClient { + return &secureValueDecrypterClient{cc} +} + +func (c *secureValueDecrypterClient) DecryptSecureValues(ctx context.Context, in *SecureValueDecryptRequest, opts ...grpc.CallOption) (*SecureValueDecryptResponseCollection, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(SecureValueDecryptResponseCollection) + err := c.cc.Invoke(ctx, SecureValueDecrypter_DecryptSecureValues_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// SecureValueDecrypterServer is the server API for SecureValueDecrypter service. +// All implementations should embed UnimplementedSecureValueDecrypterServer +// for forward compatibility +type SecureValueDecrypterServer interface { + // Decrypts a list of secure values and returns them as a map. + DecryptSecureValues(context.Context, *SecureValueDecryptRequest) (*SecureValueDecryptResponseCollection, error) +} + +// UnimplementedSecureValueDecrypterServer should be embedded to have forward compatible implementations. +type UnimplementedSecureValueDecrypterServer struct { +} + +func (UnimplementedSecureValueDecrypterServer) DecryptSecureValues(context.Context, *SecureValueDecryptRequest) (*SecureValueDecryptResponseCollection, error) { + return nil, status.Errorf(codes.Unimplemented, "method DecryptSecureValues not implemented") +} + +// UnsafeSecureValueDecrypterServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to SecureValueDecrypterServer will +// result in compilation errors. +type UnsafeSecureValueDecrypterServer interface { + mustEmbedUnimplementedSecureValueDecrypterServer() +} + +func RegisterSecureValueDecrypterServer(s grpc.ServiceRegistrar, srv SecureValueDecrypterServer) { + s.RegisterService(&SecureValueDecrypter_ServiceDesc, srv) +} + +func _SecureValueDecrypter_DecryptSecureValues_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SecureValueDecryptRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SecureValueDecrypterServer).DecryptSecureValues(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SecureValueDecrypter_DecryptSecureValues_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SecureValueDecrypterServer).DecryptSecureValues(ctx, req.(*SecureValueDecryptRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// SecureValueDecrypter_ServiceDesc is the grpc.ServiceDesc for SecureValueDecrypter service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var SecureValueDecrypter_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "decrypt.SecureValueDecrypter", + HandlerType: (*SecureValueDecrypterServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "DecryptSecureValues", + Handler: _SecureValueDecrypter_DecryptSecureValues_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "decrypt.proto", +} diff --git a/pkg/apis/secret/v0alpha1/decrypt/go.mod b/pkg/apis/secret/v0alpha1/decrypt/go.mod new file mode 100644 index 00000000000..3a12c5c052a --- /dev/null +++ b/pkg/apis/secret/v0alpha1/decrypt/go.mod @@ -0,0 +1,18 @@ +module github.com/grafana/grafana/apis/secret/v0alpha1/decrypt + +go 1.23.5 + +require ( + google.golang.org/grpc v1.70.0 + google.golang.org/protobuf v1.36.5 +) + +require ( + github.com/google/go-cmp v0.7.0 // indirect + go.opentelemetry.io/otel v1.34.0 // indirect + go.opentelemetry.io/otel/sdk v1.34.0 // indirect + golang.org/x/net v0.36.0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/text v0.22.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6 // indirect +) diff --git a/pkg/apis/secret/v0alpha1/decrypt/go.sum b/pkg/apis/secret/v0alpha1/decrypt/go.sum new file mode 100644 index 00000000000..0307d41f5ed --- /dev/null +++ b/pkg/apis/secret/v0alpha1/decrypt/go.sum @@ -0,0 +1,34 @@ +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= +go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= +go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= +go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= +go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= +go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= +go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= +golang.org/x/net v0.36.0 h1:vWF2fRbw4qslQsQzgFqZff+BItCvGFQqKzKIzx1rmoA= +golang.org/x/net v0.36.0/go.mod h1:bFmbeoIPfrw4sMHNhb4J9f6+tPziuGjq7Jk/38fxi1I= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6 h1:2duwAxN2+k0xLNpjnHTXoMUgnv6VPSp5fiqTuwSxjmI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk= +google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ= +google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw= +google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= +google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= diff --git a/pkg/apis/secret/v0alpha1/doc.go b/pkg/apis/secret/v0alpha1/doc.go new file mode 100644 index 00000000000..f986c4ac24c --- /dev/null +++ b/pkg/apis/secret/v0alpha1/doc.go @@ -0,0 +1,6 @@ +// +k8s:deepcopy-gen=package +// +k8s:openapi-gen=true +// +k8s:defaulter-gen=TypeMeta +// +groupName=secret.grafana.app + +package v0alpha1 // import "github.com/grafana/grafana/pkg/apis/secret/v0alpha1" diff --git a/pkg/apis/secret/v0alpha1/exposed_secure_value.go b/pkg/apis/secret/v0alpha1/exposed_secure_value.go new file mode 100644 index 00000000000..1f77cca2112 --- /dev/null +++ b/pkg/apis/secret/v0alpha1/exposed_secure_value.go @@ -0,0 +1,66 @@ +package v0alpha1 + +import ( + "encoding/json" + "fmt" + "strconv" + + "gopkg.in/yaml.v3" +) + +const redacted = "[REDACTED]" + +// ExposedSecureValue contains the raw decrypted secure value. +type ExposedSecureValue string + +var ( + _ fmt.Stringer = (*ExposedSecureValue)(nil) + _ fmt.Formatter = (*ExposedSecureValue)(nil) + _ fmt.GoStringer = (*ExposedSecureValue)(nil) + _ json.Marshaler = (*ExposedSecureValue)(nil) + _ yaml.Marshaler = (*ExposedSecureValue)(nil) +) + +// NewExposedSecureValue creates a new exposed secure value wrapper. +func NewExposedSecureValue(v string) ExposedSecureValue { + return ExposedSecureValue(v) +} + +// DangerouslyExposeAndConsumeValue will move the decrypted secure value out of the wrapper and return it. +// Further attempts to call this method will panic. +// The function name is intentionally kept long and weird because this is a dangerous operation and should be used carefully! +func (s *ExposedSecureValue) DangerouslyExposeAndConsumeValue() string { + if *s == "" { + panic("underlying value is empty or was consumed") + } + + tmp := *s + *s = "" + + return string(tmp) +} + +// String must not return the exposed secure value. +func (s ExposedSecureValue) String() string { + return redacted +} + +// Format must not return the exposed secure value. +func (s ExposedSecureValue) Format(f fmt.State, _verb rune) { + _, _ = fmt.Fprint(f, redacted) +} + +// GoString must not return the exposed secure value. +func (s ExposedSecureValue) GoString() string { + return redacted +} + +// MarshalJSON must not return the exposed secure value. +func (s ExposedSecureValue) MarshalJSON() ([]byte, error) { + return []byte(strconv.Quote(redacted)), nil +} + +// MarshalYAML must not return the exposed secure value. +func (s ExposedSecureValue) MarshalYAML() (any, error) { + return redacted, nil +} diff --git a/pkg/apis/secret/v0alpha1/exposed_secure_value_test.go b/pkg/apis/secret/v0alpha1/exposed_secure_value_test.go new file mode 100644 index 00000000000..1d21e0505bc --- /dev/null +++ b/pkg/apis/secret/v0alpha1/exposed_secure_value_test.go @@ -0,0 +1,48 @@ +package v0alpha1_test + +import ( + "bytes" + "encoding/json" + "fmt" + "testing" + + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1" + "github.com/stretchr/testify/require" + "gopkg.in/yaml.v3" +) + +func TestExposedSecureValue(t *testing.T) { + expected := "[REDACTED]" + + rawValue := "a-password" + esv := v0alpha1.NewExposedSecureValue(rawValue) + + // String must not return the exposed secure value. + require.Equal(t, expected, esv.String()) + + // Format/GoString must not return the exposed secure value. + require.Equal(t, expected, fmt.Sprintf("%+#v", esv)) + require.Equal(t, expected, fmt.Sprintf("%v", esv)) + require.Equal(t, expected, fmt.Sprintf("%s", esv)) + + buf := new(bytes.Buffer) + _, err := fmt.Fprintf(buf, "%#v", esv) + require.NoError(t, err) + require.Equal(t, expected, buf.String()) + + // MarshalJSON must not return the exposed secure value. + bytes, err := json.Marshal(esv) + require.NoError(t, err) + require.Equal(t, `"`+expected+`"`, string(bytes)) + + // MarshalYAML must not return the exposed secure value. + bytes, err = yaml.Marshal(esv) + require.NoError(t, err) + require.Equal(t, "'"+expected+"'\n", string(bytes)) + + // DangerouslyExposeAndConsumeValue returns the raw value. + require.Equal(t, rawValue, esv.DangerouslyExposeAndConsumeValue()) + + // Further calls to DangerouslyExposeAndConsumeValue will panic. + require.Panics(t, func() { esv.DangerouslyExposeAndConsumeValue() }) +} diff --git a/pkg/apis/secret/v0alpha1/keeper.go b/pkg/apis/secret/v0alpha1/keeper.go new file mode 100644 index 00000000000..d45e481db3a --- /dev/null +++ b/pkg/apis/secret/v0alpha1/keeper.go @@ -0,0 +1,145 @@ +package v0alpha1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +type Keeper struct { + metav1.TypeMeta `json:",inline"` + + // Standard object's metadata. It can only be one of `metav1.ObjectMeta` or `metav1.ListMeta`. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + metav1.ObjectMeta `json:"metadata,omitempty"` + + // This is the actual keeper schema. + // +patchStrategy=replace + // +patchMergeKey=name + Spec KeeperSpec `json:"spec,omitempty" patchStrategy:"replace" patchMergeKey:"name"` +} + +func (k *Keeper) IsSqlKeeper() bool { + return k.Spec.SQL != nil && k.Spec.SQL.Encryption != nil +} + +type KeeperConfig interface { + Type() string +} + +type KeeperSpec struct { + // Human friendly name for the keeper. + Title string `json:"title"` + + // You can only chose one of the following. + SQL *SQLKeeperConfig `json:"sql,omitempty"` + AWS *AWSKeeperConfig `json:"aws,omitempty"` + Azure *AzureKeeperConfig `json:"azurekeyvault,omitempty"` + GCP *GCPKeeperConfig `json:"gcp,omitempty"` + HashiCorp *HashiCorpKeeperConfig `json:"hashivault,omitempty"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +type KeeperList struct { + metav1.TypeMeta `json:",inline"` + + // Standard list's metadata. It can only be one of `metav1.ObjectMeta` or `metav1.ListMeta`. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + metav1.ListMeta `json:"metadata,omitempty"` + + // Slice containing all keepers. + Items []Keeper `json:"items,omitempty"` +} + +// The default SQL keeper. +type SQLKeeperConfig struct { + Encryption *Encryption `json:"encryption,omitempty"` +} + +func (s *SQLKeeperConfig) Type() string { + return "sql" +} + +// Encryption of default SQL keeper. +type Encryption struct { + Envelope *Envelope `json:"envelope,omitempty"` // TODO: what would this be + + AWS *AWSCredentials `json:"aws,omitempty"` + Azure *AzureCredentials `json:"azure,omitempty"` + GCP *GCPCredentials `json:"gcp,omitempty"` + HashiCorp *HashiCorpCredentials `json:"hashicorp,omitempty"` +} + +// Credentials of remote keepers. +type AWSCredentials struct { + AccessKeyID CredentialValue `json:"accessKeyId"` + SecretAccessKey CredentialValue `json:"secretAccessKey"` + KMSKeyID string `json:"kmsKeyId,omitempty"` +} + +type AzureCredentials struct { + KeyVaultName string `json:"keyVaultName"` + TenantID string `json:"tenantId"` + ClientID string `json:"clientId"` + ClientSecret CredentialValue `json:"clientSecret"` +} + +type GCPCredentials struct { + ProjectID string `json:"projectId"` + CredentialsFile string `json:"credentialsFile"` +} + +type HashiCorpCredentials struct { + Address string `json:"address"` + Token CredentialValue `json:"token"` +} + +// Envelope encrytion details. +type Envelope struct{} + +// Holds the way credentials are obtained. +type CredentialValue struct { + // The name of the secure value that holds the actual value. + SecureValueName string `json:"secureValueName,omitempty"` + + // The value is taken from the environment variable. + ValueFromEnv string `json:"valueFromEnv,omitempty"` + + // The value is taken from the Grafana config file. + // TODO: how do we explain that this is a path to the config file? + ValueFromConfig string `json:"valueFromConfig,omitempty"` +} + +// Remote Keepers. +type AWSKeeperConfig struct { + AWSCredentials `json:",inline"` +} + +type AzureKeeperConfig struct { + AzureCredentials `json:",inline"` +} + +type GCPKeeperConfig struct { + GCPCredentials `json:",inline"` +} + +type HashiCorpKeeperConfig struct { + HashiCorpCredentials `json:",inline"` +} + +func (s *AWSKeeperConfig) Type() string { + return "aws" +} + +func (s *AzureKeeperConfig) Type() string { + return "azure" +} + +func (s *GCPKeeperConfig) Type() string { + return "gcp" +} + +func (s *HashiCorpKeeperConfig) Type() string { + return "hashicorp" +} diff --git a/pkg/apis/secret/v0alpha1/register.go b/pkg/apis/secret/v0alpha1/register.go new file mode 100644 index 00000000000..e2d7c065487 --- /dev/null +++ b/pkg/apis/secret/v0alpha1/register.go @@ -0,0 +1,131 @@ +package v0alpha1 + +import ( + "fmt" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/fields" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apiserver/pkg/registry/generic" + + "github.com/grafana/grafana/pkg/apimachinery/utils" +) + +const ( + GROUP = "secret.grafana.app" + VERSION = "v0alpha1" +) + +// SecureValuesResourceInfo is used when registering the API service. +var SecureValuesResourceInfo = utils.NewResourceInfo( + GROUP, + VERSION, + "securevalues", // resource name (e.g. `kubectl get securevalues`). + "securevalue", // singular name. Used when creating a resource (e.g. `securevalue-xxx`). + "SecureValue", // kind. + func() runtime.Object { return &SecureValue{} }, // constructor for single object. This is used by the rest storage layer `Create` method. + func() runtime.Object { return &SecureValueList{} }, // constructor for list object. This is used by the rest storage layer `List` method. + utils.TableColumns{ + // This defines the fields we view in `kubectl get`. Not related with the storage layer. + Definition: []metav1.TableColumnDefinition{ + {Name: "Name", Type: "string", Format: "name"}, + {Name: "Title", Type: "string", Format: "string", Description: "The display name of the secure value"}, + {Name: "Keeper", Type: "string", Format: "string", Description: "Storage of the secure value"}, + {Name: "Ref", Type: "string", Format: "string", Description: "If present, the reference to a secret"}, + {Name: "Status", Type: "string", Format: "string", Description: "The status of the secure value"}, + }, + // Decodes the object into a concrete type. Return order in the slice must be the same as in `Definition`. + Reader: func(obj any) ([]interface{}, error) { + r, ok := obj.(*SecureValue) + if ok { + return []interface{}{ + r.Name, + r.Spec.Title, + r.Spec.Keeper, + r.Spec.Ref, + r.Status.Phase, + }, nil + } + + return nil, fmt.Errorf("expected SecureValue but got %T", obj) + }, + }, +) + +var KeeperResourceInfo = utils.NewResourceInfo( + GROUP, + VERSION, + "keepers", // resource name (e.g. `kubectl get keepers`). + "keeper", // singular name. Used when creating a resource (e.g. `keeper-xxx`). + "Keeper", // kind. + func() runtime.Object { return &Keeper{} }, // constructor for single object. This is used by the rest storage layer `Create` method. + func() runtime.Object { return &KeeperList{} }, // constructor for list object. This is used by the rest storage layer `List` method. + utils.TableColumns{ + // This defines the fields we view in `kubectl get`. Not related with the storage layer. + Definition: []metav1.TableColumnDefinition{ + {Name: "Name", Type: "string", Format: "name"}, + {Name: "Title", Type: "string", Format: "string", Description: "The display name of the keeper"}, + }, + // Decodes the object into a concrete type. Return order in the slice must be the same as in `Definition`. + Reader: func(obj any) ([]interface{}, error) { + r, ok := obj.(*Keeper) + if ok { + return []interface{}{ + r.Name, + r.Spec.Title, + }, nil + } + + return nil, fmt.Errorf("expected Keeper but got %T", obj) + }, + }, +) + +var ( + // SchemeGroupVersion is group version used to register these objects. + SchemeGroupVersion = schema.GroupVersion{Group: GROUP, Version: VERSION} + + // SchemaBuilder is used by standard codegen, this is not used in the code otherwise. + SchemeBuilder runtime.SchemeBuilder + localSchemeBuilder = &SchemeBuilder + AddToScheme = localSchemeBuilder.AddToScheme +) + +// Adds the status phase to the selectable fields, besides the generic metadata name and namespace. +func SelectableSecureValueFields(obj *SecureValue) fields.Set { + return generic.MergeFieldsSets(generic.ObjectMetaFieldsSet(&obj.ObjectMeta, false), fields.Set{ + "status.phase": string(obj.Status.Phase), + }) +} + +// Adds the list of known types to the given scheme. +func AddKnownTypes(scheme *runtime.Scheme, version string) error { + // TODO: do we need a type for the secure value decrypt? + // Since it is a subresource, it could be interesting to not use `SecureValue`, but rather something distinct like `DecryptedSecureValue`? + scheme.AddKnownTypes( + schema.GroupVersion{Group: GROUP, Version: version}, + &SecureValue{}, + &SecureValueList{}, + &Keeper{}, + &KeeperList{}, + // &secretV0.SecureValueActivityList{}, + ) + + err := scheme.AddFieldLabelConversionFunc( + SecureValuesResourceInfo.GroupVersionKind(), + func(label, value string) (string, string, error) { + fieldSet := SelectableSecureValueFields(&SecureValue{}) + for key := range fieldSet { + if label == key { + return label, value, nil + } + } + return "", "", fmt.Errorf("field label not supported for %s: %s", SecureValuesResourceInfo.GroupVersionKind(), label) + }, + ) + if err != nil { + return err + } + return nil +} diff --git a/pkg/apis/secret/v0alpha1/secure_value.go b/pkg/apis/secret/v0alpha1/secure_value.go new file mode 100644 index 00000000000..9e476f298a7 --- /dev/null +++ b/pkg/apis/secret/v0alpha1/secure_value.go @@ -0,0 +1,91 @@ +package v0alpha1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +type SecureValue struct { + metav1.TypeMeta `json:",inline"` + + // Standard object's metadata. It can only be one of `metav1.ObjectMeta` or `metav1.ListMeta`. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + metav1.ObjectMeta `json:"metadata,omitempty"` + + // This is the actual secure value schema. + Spec SecureValueSpec `json:"spec,omitempty"` + + // Read-only observed status of the `SecureValue`. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status + Status SecureValueStatus `json:"status"` +} + +// +enum +type SecureValuePhase string + +const ( + // When the `SecureValue` is created, it will start in `Pending` phase to create the underlying secret asynchronously. + SecureValuePhasePending SecureValuePhase = "Pending" + + // If the creation of the secret is successful, it will move to the `Succeeded` phase. + SecureValuePhaseSucceeded SecureValuePhase = "Succeeded" + + // If the creation of the secret fails, it will move to the `Failed` phase. + // Check the additional `status` fields for more information on what caused the failure. + // This state is unrecoverable. + SecureValuePhaseFailed SecureValuePhase = "Failed" +) + +type SecureValueStatus struct { + // High-level summary of where the `SecureValue` is in its lifecycle. + // One of: `Pending`, `Succeeded` or `Failed`. + Phase SecureValuePhase `json:"phase"` + + // A human readable message indicating details about why the `SecureValue` is in this phase. + // Only applicable if the `phase=Failed`. + // +optional + Message string `json:"message,omitempty"` +} + +type SecureValueSpec struct { + // Human friendly name for the secure value. + Title string `json:"title"` + + // The raw value is only valid for write. Read/List will always be empty. + // There is no support for mixing `value` and `ref`, you can't create a secret in a third-party keeper with a specified `ref`. + Value ExposedSecureValue `json:"value,omitempty"` + + // When using a remote Key manager, the ref is used to reference a value inside the remote storage. + // This should not contain sensitive information. + Ref string `json:"ref,omitempty"` + + // Name of the keeper, being the actual storage of the secure value. + Keeper string `json:"keeper,omitempty"` + + // The Decrypters that are allowed to decrypt this secret. + // An empty list means no service can decrypt it. + // Support and behavior is still TBD, but could likely look like: + // * testdata.grafana.app/{name1} + // * testdata.grafana.app/{name2} + // * runner.k6.grafana.app/* -- allow any k6 test runner + // Rather than a string pattern, we may want a more explicit object: + // [{ group:"testdata.grafana.app", name="name1"}, + // { group:"runner.k6.grafana.app"}] + // +listType=atomic + // +optional + Decrypters []string `json:"decrypters"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +type SecureValueList struct { + metav1.TypeMeta `json:",inline"` + + // Standard list's metadata. It can only be one of `metav1.ObjectMeta` or `metav1.ListMeta`. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + metav1.ListMeta `json:"metadata,omitempty"` + + // Slice containing all secure values. This will NOT output decrypted values. + Items []SecureValue `json:"items,omitempty"` +} diff --git a/pkg/apis/secret/v0alpha1/zz_generated.deepcopy.go b/pkg/apis/secret/v0alpha1/zz_generated.deepcopy.go new file mode 100644 index 00000000000..96491535452 --- /dev/null +++ b/pkg/apis/secret/v0alpha1/zz_generated.deepcopy.go @@ -0,0 +1,441 @@ +//go:build !ignore_autogenerated +// +build !ignore_autogenerated + +// SPDX-License-Identifier: AGPL-3.0-only + +// Code generated by deepcopy-gen. DO NOT EDIT. + +package v0alpha1 + +import ( + runtime "k8s.io/apimachinery/pkg/runtime" +) + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AWSCredentials) DeepCopyInto(out *AWSCredentials) { + *out = *in + out.AccessKeyID = in.AccessKeyID + out.SecretAccessKey = in.SecretAccessKey + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AWSCredentials. +func (in *AWSCredentials) DeepCopy() *AWSCredentials { + if in == nil { + return nil + } + out := new(AWSCredentials) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AWSKeeperConfig) DeepCopyInto(out *AWSKeeperConfig) { + *out = *in + out.AWSCredentials = in.AWSCredentials + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AWSKeeperConfig. +func (in *AWSKeeperConfig) DeepCopy() *AWSKeeperConfig { + if in == nil { + return nil + } + out := new(AWSKeeperConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AzureCredentials) DeepCopyInto(out *AzureCredentials) { + *out = *in + out.ClientSecret = in.ClientSecret + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureCredentials. +func (in *AzureCredentials) DeepCopy() *AzureCredentials { + if in == nil { + return nil + } + out := new(AzureCredentials) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AzureKeeperConfig) DeepCopyInto(out *AzureKeeperConfig) { + *out = *in + out.AzureCredentials = in.AzureCredentials + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureKeeperConfig. +func (in *AzureKeeperConfig) DeepCopy() *AzureKeeperConfig { + if in == nil { + return nil + } + out := new(AzureKeeperConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CredentialValue) DeepCopyInto(out *CredentialValue) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CredentialValue. +func (in *CredentialValue) DeepCopy() *CredentialValue { + if in == nil { + return nil + } + out := new(CredentialValue) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Encryption) DeepCopyInto(out *Encryption) { + *out = *in + if in.Envelope != nil { + in, out := &in.Envelope, &out.Envelope + *out = new(Envelope) + **out = **in + } + if in.AWS != nil { + in, out := &in.AWS, &out.AWS + *out = new(AWSCredentials) + **out = **in + } + if in.Azure != nil { + in, out := &in.Azure, &out.Azure + *out = new(AzureCredentials) + **out = **in + } + if in.GCP != nil { + in, out := &in.GCP, &out.GCP + *out = new(GCPCredentials) + **out = **in + } + if in.HashiCorp != nil { + in, out := &in.HashiCorp, &out.HashiCorp + *out = new(HashiCorpCredentials) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Encryption. +func (in *Encryption) DeepCopy() *Encryption { + if in == nil { + return nil + } + out := new(Encryption) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Envelope) DeepCopyInto(out *Envelope) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Envelope. +func (in *Envelope) DeepCopy() *Envelope { + if in == nil { + return nil + } + out := new(Envelope) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *GCPCredentials) DeepCopyInto(out *GCPCredentials) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GCPCredentials. +func (in *GCPCredentials) DeepCopy() *GCPCredentials { + if in == nil { + return nil + } + out := new(GCPCredentials) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *GCPKeeperConfig) DeepCopyInto(out *GCPKeeperConfig) { + *out = *in + out.GCPCredentials = in.GCPCredentials + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GCPKeeperConfig. +func (in *GCPKeeperConfig) DeepCopy() *GCPKeeperConfig { + if in == nil { + return nil + } + out := new(GCPKeeperConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *HashiCorpCredentials) DeepCopyInto(out *HashiCorpCredentials) { + *out = *in + out.Token = in.Token + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HashiCorpCredentials. +func (in *HashiCorpCredentials) DeepCopy() *HashiCorpCredentials { + if in == nil { + return nil + } + out := new(HashiCorpCredentials) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *HashiCorpKeeperConfig) DeepCopyInto(out *HashiCorpKeeperConfig) { + *out = *in + out.HashiCorpCredentials = in.HashiCorpCredentials + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HashiCorpKeeperConfig. +func (in *HashiCorpKeeperConfig) DeepCopy() *HashiCorpKeeperConfig { + if in == nil { + return nil + } + out := new(HashiCorpKeeperConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Keeper) DeepCopyInto(out *Keeper) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Keeper. +func (in *Keeper) DeepCopy() *Keeper { + if in == nil { + return nil + } + out := new(Keeper) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Keeper) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *KeeperList) DeepCopyInto(out *KeeperList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Keeper, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KeeperList. +func (in *KeeperList) DeepCopy() *KeeperList { + if in == nil { + return nil + } + out := new(KeeperList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *KeeperList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *KeeperSpec) DeepCopyInto(out *KeeperSpec) { + *out = *in + if in.SQL != nil { + in, out := &in.SQL, &out.SQL + *out = new(SQLKeeperConfig) + (*in).DeepCopyInto(*out) + } + if in.AWS != nil { + in, out := &in.AWS, &out.AWS + *out = new(AWSKeeperConfig) + **out = **in + } + if in.Azure != nil { + in, out := &in.Azure, &out.Azure + *out = new(AzureKeeperConfig) + **out = **in + } + if in.GCP != nil { + in, out := &in.GCP, &out.GCP + *out = new(GCPKeeperConfig) + **out = **in + } + if in.HashiCorp != nil { + in, out := &in.HashiCorp, &out.HashiCorp + *out = new(HashiCorpKeeperConfig) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KeeperSpec. +func (in *KeeperSpec) DeepCopy() *KeeperSpec { + if in == nil { + return nil + } + out := new(KeeperSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SQLKeeperConfig) DeepCopyInto(out *SQLKeeperConfig) { + *out = *in + if in.Encryption != nil { + in, out := &in.Encryption, &out.Encryption + *out = new(Encryption) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SQLKeeperConfig. +func (in *SQLKeeperConfig) DeepCopy() *SQLKeeperConfig { + if in == nil { + return nil + } + out := new(SQLKeeperConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SecureValue) DeepCopyInto(out *SecureValue) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + out.Status = in.Status + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecureValue. +func (in *SecureValue) DeepCopy() *SecureValue { + if in == nil { + return nil + } + out := new(SecureValue) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *SecureValue) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SecureValueList) DeepCopyInto(out *SecureValueList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]SecureValue, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecureValueList. +func (in *SecureValueList) DeepCopy() *SecureValueList { + if in == nil { + return nil + } + out := new(SecureValueList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *SecureValueList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SecureValueSpec) DeepCopyInto(out *SecureValueSpec) { + *out = *in + if in.Decrypters != nil { + in, out := &in.Decrypters, &out.Decrypters + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecureValueSpec. +func (in *SecureValueSpec) DeepCopy() *SecureValueSpec { + if in == nil { + return nil + } + out := new(SecureValueSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SecureValueStatus) DeepCopyInto(out *SecureValueStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecureValueStatus. +func (in *SecureValueStatus) DeepCopy() *SecureValueStatus { + if in == nil { + return nil + } + out := new(SecureValueStatus) + in.DeepCopyInto(out) + return out +} diff --git a/pkg/apis/secret/v0alpha1/zz_generated.defaults.go b/pkg/apis/secret/v0alpha1/zz_generated.defaults.go new file mode 100644 index 00000000000..238fc2f4edc --- /dev/null +++ b/pkg/apis/secret/v0alpha1/zz_generated.defaults.go @@ -0,0 +1,19 @@ +//go:build !ignore_autogenerated +// +build !ignore_autogenerated + +// SPDX-License-Identifier: AGPL-3.0-only + +// Code generated by defaulter-gen. DO NOT EDIT. + +package v0alpha1 + +import ( + runtime "k8s.io/apimachinery/pkg/runtime" +) + +// RegisterDefaults adds defaulters functions to the given scheme. +// Public to allow building arbitrary schemes. +// All generated defaulters are covering - they call all nested defaulters. +func RegisterDefaults(scheme *runtime.Scheme) error { + return nil +} diff --git a/pkg/apis/secret/v0alpha1/zz_generated.openapi.go b/pkg/apis/secret/v0alpha1/zz_generated.openapi.go new file mode 100644 index 00000000000..dab5ab27215 --- /dev/null +++ b/pkg/apis/secret/v0alpha1/zz_generated.openapi.go @@ -0,0 +1,740 @@ +//go:build !ignore_autogenerated +// +build !ignore_autogenerated + +// SPDX-License-Identifier: AGPL-3.0-only + +// Code generated by openapi-gen. DO NOT EDIT. + +package v0alpha1 + +import ( + common "k8s.io/kube-openapi/pkg/common" + spec "k8s.io/kube-openapi/pkg/validation/spec" +) + +func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenAPIDefinition { + return map[string]common.OpenAPIDefinition{ + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.AWSCredentials": schema_pkg_apis_secret_v0alpha1_AWSCredentials(ref), + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.AWSKeeperConfig": schema_pkg_apis_secret_v0alpha1_AWSKeeperConfig(ref), + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.AzureCredentials": schema_pkg_apis_secret_v0alpha1_AzureCredentials(ref), + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.AzureKeeperConfig": schema_pkg_apis_secret_v0alpha1_AzureKeeperConfig(ref), + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.CredentialValue": schema_pkg_apis_secret_v0alpha1_CredentialValue(ref), + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.Encryption": schema_pkg_apis_secret_v0alpha1_Encryption(ref), + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.Envelope": schema_pkg_apis_secret_v0alpha1_Envelope(ref), + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.GCPCredentials": schema_pkg_apis_secret_v0alpha1_GCPCredentials(ref), + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.GCPKeeperConfig": schema_pkg_apis_secret_v0alpha1_GCPKeeperConfig(ref), + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.HashiCorpCredentials": schema_pkg_apis_secret_v0alpha1_HashiCorpCredentials(ref), + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.HashiCorpKeeperConfig": schema_pkg_apis_secret_v0alpha1_HashiCorpKeeperConfig(ref), + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.Keeper": schema_pkg_apis_secret_v0alpha1_Keeper(ref), + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.KeeperList": schema_pkg_apis_secret_v0alpha1_KeeperList(ref), + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.KeeperSpec": schema_pkg_apis_secret_v0alpha1_KeeperSpec(ref), + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.SQLKeeperConfig": schema_pkg_apis_secret_v0alpha1_SQLKeeperConfig(ref), + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.SecureValue": schema_pkg_apis_secret_v0alpha1_SecureValue(ref), + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.SecureValueList": schema_pkg_apis_secret_v0alpha1_SecureValueList(ref), + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.SecureValueSpec": schema_pkg_apis_secret_v0alpha1_SecureValueSpec(ref), + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.SecureValueStatus": schema_pkg_apis_secret_v0alpha1_SecureValueStatus(ref), + } +} + +func schema_pkg_apis_secret_v0alpha1_AWSCredentials(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "Credentials of remote keepers.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "accessKeyId": { + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/grafana/grafana/pkg/apis/secret/v0alpha1.CredentialValue"), + }, + }, + "secretAccessKey": { + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/grafana/grafana/pkg/apis/secret/v0alpha1.CredentialValue"), + }, + }, + "kmsKeyId": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + }, + Required: []string{"accessKeyId", "secretAccessKey"}, + }, + }, + Dependencies: []string{ + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.CredentialValue"}, + } +} + +func schema_pkg_apis_secret_v0alpha1_AWSKeeperConfig(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "Remote Keepers.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "accessKeyId": { + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/grafana/grafana/pkg/apis/secret/v0alpha1.CredentialValue"), + }, + }, + "secretAccessKey": { + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/grafana/grafana/pkg/apis/secret/v0alpha1.CredentialValue"), + }, + }, + "kmsKeyId": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + }, + Required: []string{"accessKeyId", "secretAccessKey"}, + }, + }, + Dependencies: []string{ + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.CredentialValue"}, + } +} + +func schema_pkg_apis_secret_v0alpha1_AzureCredentials(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "keyVaultName": { + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "tenantId": { + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "clientId": { + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "clientSecret": { + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/grafana/grafana/pkg/apis/secret/v0alpha1.CredentialValue"), + }, + }, + }, + Required: []string{"keyVaultName", "tenantId", "clientId", "clientSecret"}, + }, + }, + Dependencies: []string{ + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.CredentialValue"}, + } +} + +func schema_pkg_apis_secret_v0alpha1_AzureKeeperConfig(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "keyVaultName": { + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "tenantId": { + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "clientId": { + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "clientSecret": { + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/grafana/grafana/pkg/apis/secret/v0alpha1.CredentialValue"), + }, + }, + }, + Required: []string{"keyVaultName", "tenantId", "clientId", "clientSecret"}, + }, + }, + Dependencies: []string{ + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.CredentialValue"}, + } +} + +func schema_pkg_apis_secret_v0alpha1_CredentialValue(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "Holds the way credentials are obtained.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "secureValueName": { + SchemaProps: spec.SchemaProps{ + Description: "The name of the secure value that holds the actual value.", + Type: []string{"string"}, + Format: "", + }, + }, + "valueFromEnv": { + SchemaProps: spec.SchemaProps{ + Description: "The value is taken from the environment variable.", + Type: []string{"string"}, + Format: "", + }, + }, + "valueFromConfig": { + SchemaProps: spec.SchemaProps{ + Description: "The value is taken from the Grafana config file.", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + } +} + +func schema_pkg_apis_secret_v0alpha1_Encryption(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "Encryption of default SQL keeper.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "envelope": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/grafana/grafana/pkg/apis/secret/v0alpha1.Envelope"), + }, + }, + "aws": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/grafana/grafana/pkg/apis/secret/v0alpha1.AWSCredentials"), + }, + }, + "azure": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/grafana/grafana/pkg/apis/secret/v0alpha1.AzureCredentials"), + }, + }, + "gcp": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/grafana/grafana/pkg/apis/secret/v0alpha1.GCPCredentials"), + }, + }, + "hashicorp": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/grafana/grafana/pkg/apis/secret/v0alpha1.HashiCorpCredentials"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.AWSCredentials", "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.AzureCredentials", "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.Envelope", "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.GCPCredentials", "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.HashiCorpCredentials"}, + } +} + +func schema_pkg_apis_secret_v0alpha1_Envelope(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "Envelope encrytion details.", + Type: []string{"object"}, + }, + }, + } +} + +func schema_pkg_apis_secret_v0alpha1_GCPCredentials(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "projectId": { + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "credentialsFile": { + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + Required: []string{"projectId", "credentialsFile"}, + }, + }, + } +} + +func schema_pkg_apis_secret_v0alpha1_GCPKeeperConfig(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "projectId": { + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "credentialsFile": { + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + Required: []string{"projectId", "credentialsFile"}, + }, + }, + } +} + +func schema_pkg_apis_secret_v0alpha1_HashiCorpCredentials(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "address": { + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "token": { + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/grafana/grafana/pkg/apis/secret/v0alpha1.CredentialValue"), + }, + }, + }, + Required: []string{"address", "token"}, + }, + }, + Dependencies: []string{ + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.CredentialValue"}, + } +} + +func schema_pkg_apis_secret_v0alpha1_HashiCorpKeeperConfig(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "address": { + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "token": { + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/grafana/grafana/pkg/apis/secret/v0alpha1.CredentialValue"), + }, + }, + }, + Required: []string{"address", "token"}, + }, + }, + Dependencies: []string{ + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.CredentialValue"}, + } +} + +func schema_pkg_apis_secret_v0alpha1_Keeper(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Description: "Standard object's metadata. It can only be one of `metav1.ObjectMeta` or `metav1.ListMeta`. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), + }, + }, + "spec": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-patch-merge-key": "name", + "x-kubernetes-patch-strategy": "replace", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "This is the actual keeper schema.", + Default: map[string]interface{}{}, + Ref: ref("github.com/grafana/grafana/pkg/apis/secret/v0alpha1.KeeperSpec"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.KeeperSpec", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + } +} + +func schema_pkg_apis_secret_v0alpha1_KeeperList(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Description: "Standard list's metadata. It can only be one of `metav1.ObjectMeta` or `metav1.ListMeta`. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), + }, + }, + "items": { + SchemaProps: spec.SchemaProps{ + Description: "Slice containing all keepers.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/grafana/grafana/pkg/apis/secret/v0alpha1.Keeper"), + }, + }, + }, + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.Keeper", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + } +} + +func schema_pkg_apis_secret_v0alpha1_KeeperSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "title": { + SchemaProps: spec.SchemaProps{ + Description: "Human friendly name for the keeper.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "sql": { + SchemaProps: spec.SchemaProps{ + Description: "You can only chose one of the following.", + Ref: ref("github.com/grafana/grafana/pkg/apis/secret/v0alpha1.SQLKeeperConfig"), + }, + }, + "aws": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/grafana/grafana/pkg/apis/secret/v0alpha1.AWSKeeperConfig"), + }, + }, + "azurekeyvault": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/grafana/grafana/pkg/apis/secret/v0alpha1.AzureKeeperConfig"), + }, + }, + "gcp": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/grafana/grafana/pkg/apis/secret/v0alpha1.GCPKeeperConfig"), + }, + }, + "hashivault": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/grafana/grafana/pkg/apis/secret/v0alpha1.HashiCorpKeeperConfig"), + }, + }, + }, + Required: []string{"title"}, + }, + }, + Dependencies: []string{ + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.AWSKeeperConfig", "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.AzureKeeperConfig", "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.GCPKeeperConfig", "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.HashiCorpKeeperConfig", "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.SQLKeeperConfig"}, + } +} + +func schema_pkg_apis_secret_v0alpha1_SQLKeeperConfig(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "The default SQL keeper.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "encryption": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/grafana/grafana/pkg/apis/secret/v0alpha1.Encryption"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.Encryption"}, + } +} + +func schema_pkg_apis_secret_v0alpha1_SecureValue(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Description: "Standard object's metadata. It can only be one of `metav1.ObjectMeta` or `metav1.ListMeta`. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), + }, + }, + "spec": { + SchemaProps: spec.SchemaProps{ + Description: "This is the actual secure value schema.", + Default: map[string]interface{}{}, + Ref: ref("github.com/grafana/grafana/pkg/apis/secret/v0alpha1.SecureValueSpec"), + }, + }, + "status": { + SchemaProps: spec.SchemaProps{ + Description: "Read-only observed status of the `SecureValue`. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status", + Default: map[string]interface{}{}, + Ref: ref("github.com/grafana/grafana/pkg/apis/secret/v0alpha1.SecureValueStatus"), + }, + }, + }, + Required: []string{"status"}, + }, + }, + Dependencies: []string{ + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.SecureValueSpec", "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.SecureValueStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + } +} + +func schema_pkg_apis_secret_v0alpha1_SecureValueList(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Description: "Standard list's metadata. It can only be one of `metav1.ObjectMeta` or `metav1.ListMeta`. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), + }, + }, + "items": { + SchemaProps: spec.SchemaProps{ + Description: "Slice containing all secure values. This will NOT output decrypted values.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/grafana/grafana/pkg/apis/secret/v0alpha1.SecureValue"), + }, + }, + }, + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/grafana/grafana/pkg/apis/secret/v0alpha1.SecureValue", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + } +} + +func schema_pkg_apis_secret_v0alpha1_SecureValueSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "title": { + SchemaProps: spec.SchemaProps{ + Description: "Human friendly name for the secure value.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "value": { + SchemaProps: spec.SchemaProps{ + Description: "The raw value is only valid for write. Read/List will always be empty. There is no support for mixing `value` and `ref`, you can't create a secret in a third-party keeper with a specified `ref`.", + Type: []string{"string"}, + Format: "", + }, + }, + "ref": { + SchemaProps: spec.SchemaProps{ + Description: "When using a remote Key manager, the ref is used to reference a value inside the remote storage. This should not contain sensitive information.", + Type: []string{"string"}, + Format: "", + }, + }, + "keeper": { + SchemaProps: spec.SchemaProps{ + Description: "Name of the keeper, being the actual storage of the secure value.", + Type: []string{"string"}, + Format: "", + }, + }, + "decrypters": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "The Decrypters that are allowed to decrypt this secret. An empty list means no service can decrypt it. Support and behavior is still TBD, but could likely look like: * testdata.grafana.app/{name1} * testdata.grafana.app/{name2} * runner.k6.grafana.app/* -- allow any k6 test runner Rather than a string pattern, we may want a more explicit object: [{ group:\"testdata.grafana.app\", name=\"name1\"},\n { group:\"runner.k6.grafana.app\"}]", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + }, + Required: []string{"title"}, + }, + }, + } +} + +func schema_pkg_apis_secret_v0alpha1_SecureValueStatus(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "phase": { + SchemaProps: spec.SchemaProps{ + Description: "High-level summary of where the `SecureValue` is in its lifecycle. One of: `Pending`, `Succeeded` or `Failed`.\n\nPossible enum values:\n - `\"Failed\"` If the creation of the secret fails, it will move to the `Failed` phase. Check the additional `status` fields for more information on what caused the failure. This state is unrecoverable.\n - `\"Pending\"` When the `SecureValue` is created, it will start in `Pending` phase to create the underlying secret asynchronously.\n - `\"Succeeded\"` If the creation of the secret is successful, it will move to the `Succeeded` phase.", + Default: "", + Type: []string{"string"}, + Format: "", + Enum: []interface{}{"Failed", "Pending", "Succeeded"}, + }, + }, + "message": { + SchemaProps: spec.SchemaProps{ + Description: "A human readable message indicating details about why the `SecureValue` is in this phase. Only applicable if the `phase=Failed`.", + Type: []string{"string"}, + Format: "", + }, + }, + }, + Required: []string{"phase"}, + }, + }, + } +} diff --git a/pkg/apis/secret/v0alpha1/zz_generated.openapi_violation_exceptions.list b/pkg/apis/secret/v0alpha1/zz_generated.openapi_violation_exceptions.list new file mode 100644 index 00000000000..48af67bb3b5 --- /dev/null +++ b/pkg/apis/secret/v0alpha1/zz_generated.openapi_violation_exceptions.list @@ -0,0 +1,8 @@ +API rule violation: names_match,github.com/grafana/grafana/pkg/apis/secret/v0alpha1,AWSCredentials,AccessKeyID +API rule violation: names_match,github.com/grafana/grafana/pkg/apis/secret/v0alpha1,AWSCredentials,KMSKeyID +API rule violation: names_match,github.com/grafana/grafana/pkg/apis/secret/v0alpha1,AzureCredentials,ClientID +API rule violation: names_match,github.com/grafana/grafana/pkg/apis/secret/v0alpha1,AzureCredentials,TenantID +API rule violation: names_match,github.com/grafana/grafana/pkg/apis/secret/v0alpha1,Encryption,HashiCorp +API rule violation: names_match,github.com/grafana/grafana/pkg/apis/secret/v0alpha1,GCPCredentials,ProjectID +API rule violation: names_match,github.com/grafana/grafana/pkg/apis/secret/v0alpha1,KeeperSpec,Azure +API rule violation: names_match,github.com/grafana/grafana/pkg/apis/secret/v0alpha1,KeeperSpec,HashiCorp From 1ee0473db62e945239c86fa5de9fe2b5044b3307 Mon Sep 17 00:00:00 2001 From: "grafana-pr-automation[bot]" <140550294+grafana-pr-automation[bot]@users.noreply.github.com> Date: Fri, 14 Mar 2025 02:30:10 +0200 Subject: [PATCH 045/117] I18n: Download translations from Crowdin (#102164) New Crowdin translations by GitHub Action Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- public/locales/cs-CZ/grafana.json | 69 +++++++++++++++++++++-------- public/locales/de-DE/grafana.json | 69 +++++++++++++++++++++-------- public/locales/es-ES/grafana.json | 69 +++++++++++++++++++++-------- public/locales/fr-FR/grafana.json | 69 +++++++++++++++++++++-------- public/locales/hu-HU/grafana.json | 69 +++++++++++++++++++++-------- public/locales/id-ID/grafana.json | 69 +++++++++++++++++++++-------- public/locales/it-IT/grafana.json | 69 +++++++++++++++++++++-------- public/locales/ja-JP/grafana.json | 69 +++++++++++++++++++++-------- public/locales/ko-KR/grafana.json | 69 +++++++++++++++++++++-------- public/locales/nl-NL/grafana.json | 69 +++++++++++++++++++++-------- public/locales/pl-PL/grafana.json | 69 +++++++++++++++++++++-------- public/locales/pt-BR/grafana.json | 69 +++++++++++++++++++++-------- public/locales/pt-PT/grafana.json | 69 +++++++++++++++++++++-------- public/locales/ru-RU/grafana.json | 69 +++++++++++++++++++++-------- public/locales/sv-SE/grafana.json | 69 +++++++++++++++++++++-------- public/locales/tr-TR/grafana.json | 69 +++++++++++++++++++++-------- public/locales/zh-Hans/grafana.json | 69 +++++++++++++++++++++-------- public/locales/zh-Hant/grafana.json | 69 +++++++++++++++++++++-------- 18 files changed, 900 insertions(+), 342 deletions(-) diff --git a/public/locales/cs-CZ/grafana.json b/public/locales/cs-CZ/grafana.json index 59e3cfc998b..bbd6770fd5c 100644 --- a/public/locales/cs-CZ/grafana.json +++ b/public/locales/cs-CZ/grafana.json @@ -1038,6 +1038,46 @@ "redirect-link": "", "subtitle": "" }, + "conditional-rendering": { + "data": { + "disable": "", + "enable": "", + "label": "" + }, + "group": { + "add": { + "button": "", + "data": "", + "interval": "", + "variable": "" + }, + "condition": { + "label": "", + "meet-all": "", + "meet-any": "" + }, + "label": "" + }, + "interval": { + "input-label": "", + "invalid-message": "", + "label": "" + }, + "shared": { + "delete-condition": "" + }, + "title": "", + "variable": { + "label": "", + "operator": { + "equals": "", + "not-equal": "" + }, + "select-operator": "", + "select-variable": "", + "value-input": "" + } + }, "default-layout": { "description": "", "item-options": { @@ -1212,16 +1252,6 @@ }, "responsive-layout": { "description": "", - "item-options": { - "hide-no-data": "", - "repeat": { - "variable": { - "description": "", - "title": "" - } - }, - "title": "" - }, "name": "", "options": { "columns": "", @@ -1846,31 +1876,32 @@ "data-source-http-settings": { "access-help": "", "access-help-details": "", + "access-help-title": "", "access-label": "", - "access-options-browser": "", - "access-options-proxy": "", "allowed-cookies": "", - "allowed-cookies-tooltip": "", + "allowed-cookies-description": "", "auth": "", "azure-auth-label": "", "azure-auth-tooltip": "", "basic-auth": "", "basic-auth-label": "", "browser-mode-description": "", + "browser-mode-label": "", "browser-mode-title": "", - "default-url-access-select": "", "default-url-tooltip": "", "direct-url-tooltip": "", "heading": "", + "invalid-url-error": "", "proxy-url-tooltip": "", "server-mode-description": "", + "server-mode-label": "", "server-mode-title": "", - "timeout-form-label": "", + "sigv4-auth-label": "", + "timeout-description": "", "timeout-label": "", - "timeout-tooltip": "", - "url-label": "", - "with-credential-label": "", - "with-credential-tooltip": "" + "timeout-placeholder": "", + "with-credentials-label": "", + "with-credentials-tooltip": "" }, "data-source-settings": { "alerting-settings-heading": "", diff --git a/public/locales/de-DE/grafana.json b/public/locales/de-DE/grafana.json index cf03a0f966e..c6b2626f03b 100644 --- a/public/locales/de-DE/grafana.json +++ b/public/locales/de-DE/grafana.json @@ -1020,6 +1020,46 @@ "redirect-link": "Liste in Grafana Alerting", "subtitle": "Benachrichtigungsregeln im Zusammenhang mit diesem Dashboard" }, + "conditional-rendering": { + "data": { + "disable": "", + "enable": "", + "label": "" + }, + "group": { + "add": { + "button": "", + "data": "", + "interval": "", + "variable": "" + }, + "condition": { + "label": "", + "meet-all": "", + "meet-any": "" + }, + "label": "" + }, + "interval": { + "input-label": "", + "invalid-message": "", + "label": "" + }, + "shared": { + "delete-condition": "" + }, + "title": "", + "variable": { + "label": "", + "operator": { + "equals": "", + "not-equal": "" + }, + "select-operator": "", + "select-variable": "", + "value-input": "" + } + }, "default-layout": { "description": "", "item-options": { @@ -1194,16 +1234,6 @@ }, "responsive-layout": { "description": "", - "item-options": { - "hide-no-data": "", - "repeat": { - "variable": { - "description": "", - "title": "" - } - }, - "title": "" - }, "name": "", "options": { "columns": "", @@ -1828,31 +1858,32 @@ "data-source-http-settings": { "access-help": "", "access-help-details": "", + "access-help-title": "", "access-label": "", - "access-options-browser": "", - "access-options-proxy": "", "allowed-cookies": "", - "allowed-cookies-tooltip": "", + "allowed-cookies-description": "", "auth": "", "azure-auth-label": "", "azure-auth-tooltip": "", "basic-auth": "", "basic-auth-label": "", "browser-mode-description": "", + "browser-mode-label": "", "browser-mode-title": "", - "default-url-access-select": "", "default-url-tooltip": "", "direct-url-tooltip": "", "heading": "", + "invalid-url-error": "", "proxy-url-tooltip": "", "server-mode-description": "", + "server-mode-label": "", "server-mode-title": "", - "timeout-form-label": "", + "sigv4-auth-label": "", + "timeout-description": "", "timeout-label": "", - "timeout-tooltip": "", - "url-label": "", - "with-credential-label": "", - "with-credential-tooltip": "" + "timeout-placeholder": "", + "with-credentials-label": "", + "with-credentials-tooltip": "" }, "data-source-settings": { "alerting-settings-heading": "", diff --git a/public/locales/es-ES/grafana.json b/public/locales/es-ES/grafana.json index 8f66fa81185..aba19309ebe 100644 --- a/public/locales/es-ES/grafana.json +++ b/public/locales/es-ES/grafana.json @@ -1020,6 +1020,46 @@ "redirect-link": "Lista en Alertas de Grafana", "subtitle": "Reglas de alerta relacionadas con este tablero" }, + "conditional-rendering": { + "data": { + "disable": "", + "enable": "", + "label": "" + }, + "group": { + "add": { + "button": "", + "data": "", + "interval": "", + "variable": "" + }, + "condition": { + "label": "", + "meet-all": "", + "meet-any": "" + }, + "label": "" + }, + "interval": { + "input-label": "", + "invalid-message": "", + "label": "" + }, + "shared": { + "delete-condition": "" + }, + "title": "", + "variable": { + "label": "", + "operator": { + "equals": "", + "not-equal": "" + }, + "select-operator": "", + "select-variable": "", + "value-input": "" + } + }, "default-layout": { "description": "", "item-options": { @@ -1194,16 +1234,6 @@ }, "responsive-layout": { "description": "", - "item-options": { - "hide-no-data": "", - "repeat": { - "variable": { - "description": "", - "title": "" - } - }, - "title": "" - }, "name": "", "options": { "columns": "", @@ -1828,31 +1858,32 @@ "data-source-http-settings": { "access-help": "", "access-help-details": "", + "access-help-title": "", "access-label": "", - "access-options-browser": "", - "access-options-proxy": "", "allowed-cookies": "", - "allowed-cookies-tooltip": "", + "allowed-cookies-description": "", "auth": "", "azure-auth-label": "", "azure-auth-tooltip": "", "basic-auth": "", "basic-auth-label": "", "browser-mode-description": "", + "browser-mode-label": "", "browser-mode-title": "", - "default-url-access-select": "", "default-url-tooltip": "", "direct-url-tooltip": "", "heading": "", + "invalid-url-error": "", "proxy-url-tooltip": "", "server-mode-description": "", + "server-mode-label": "", "server-mode-title": "", - "timeout-form-label": "", + "sigv4-auth-label": "", + "timeout-description": "", "timeout-label": "", - "timeout-tooltip": "", - "url-label": "", - "with-credential-label": "", - "with-credential-tooltip": "" + "timeout-placeholder": "", + "with-credentials-label": "", + "with-credentials-tooltip": "" }, "data-source-settings": { "alerting-settings-heading": "", diff --git a/public/locales/fr-FR/grafana.json b/public/locales/fr-FR/grafana.json index 35687ea4242..d81e7295363 100644 --- a/public/locales/fr-FR/grafana.json +++ b/public/locales/fr-FR/grafana.json @@ -1020,6 +1020,46 @@ "redirect-link": "Liste dans Alertes Grafana", "subtitle": "Règles d'alerte liées à ce tableau de bord" }, + "conditional-rendering": { + "data": { + "disable": "", + "enable": "", + "label": "" + }, + "group": { + "add": { + "button": "", + "data": "", + "interval": "", + "variable": "" + }, + "condition": { + "label": "", + "meet-all": "", + "meet-any": "" + }, + "label": "" + }, + "interval": { + "input-label": "", + "invalid-message": "", + "label": "" + }, + "shared": { + "delete-condition": "" + }, + "title": "", + "variable": { + "label": "", + "operator": { + "equals": "", + "not-equal": "" + }, + "select-operator": "", + "select-variable": "", + "value-input": "" + } + }, "default-layout": { "description": "", "item-options": { @@ -1194,16 +1234,6 @@ }, "responsive-layout": { "description": "", - "item-options": { - "hide-no-data": "", - "repeat": { - "variable": { - "description": "", - "title": "" - } - }, - "title": "" - }, "name": "", "options": { "columns": "", @@ -1828,31 +1858,32 @@ "data-source-http-settings": { "access-help": "", "access-help-details": "", + "access-help-title": "", "access-label": "", - "access-options-browser": "", - "access-options-proxy": "", "allowed-cookies": "", - "allowed-cookies-tooltip": "", + "allowed-cookies-description": "", "auth": "", "azure-auth-label": "", "azure-auth-tooltip": "", "basic-auth": "", "basic-auth-label": "", "browser-mode-description": "", + "browser-mode-label": "", "browser-mode-title": "", - "default-url-access-select": "", "default-url-tooltip": "", "direct-url-tooltip": "", "heading": "", + "invalid-url-error": "", "proxy-url-tooltip": "", "server-mode-description": "", + "server-mode-label": "", "server-mode-title": "", - "timeout-form-label": "", + "sigv4-auth-label": "", + "timeout-description": "", "timeout-label": "", - "timeout-tooltip": "", - "url-label": "", - "with-credential-label": "", - "with-credential-tooltip": "" + "timeout-placeholder": "", + "with-credentials-label": "", + "with-credentials-tooltip": "" }, "data-source-settings": { "alerting-settings-heading": "", diff --git a/public/locales/hu-HU/grafana.json b/public/locales/hu-HU/grafana.json index 1d5359a25d1..ebc007fa448 100644 --- a/public/locales/hu-HU/grafana.json +++ b/public/locales/hu-HU/grafana.json @@ -1020,6 +1020,46 @@ "redirect-link": "", "subtitle": "" }, + "conditional-rendering": { + "data": { + "disable": "", + "enable": "", + "label": "" + }, + "group": { + "add": { + "button": "", + "data": "", + "interval": "", + "variable": "" + }, + "condition": { + "label": "", + "meet-all": "", + "meet-any": "" + }, + "label": "" + }, + "interval": { + "input-label": "", + "invalid-message": "", + "label": "" + }, + "shared": { + "delete-condition": "" + }, + "title": "", + "variable": { + "label": "", + "operator": { + "equals": "", + "not-equal": "" + }, + "select-operator": "", + "select-variable": "", + "value-input": "" + } + }, "default-layout": { "description": "", "item-options": { @@ -1194,16 +1234,6 @@ }, "responsive-layout": { "description": "", - "item-options": { - "hide-no-data": "", - "repeat": { - "variable": { - "description": "", - "title": "" - } - }, - "title": "" - }, "name": "", "options": { "columns": "", @@ -1828,31 +1858,32 @@ "data-source-http-settings": { "access-help": "", "access-help-details": "", + "access-help-title": "", "access-label": "", - "access-options-browser": "", - "access-options-proxy": "", "allowed-cookies": "", - "allowed-cookies-tooltip": "", + "allowed-cookies-description": "", "auth": "", "azure-auth-label": "", "azure-auth-tooltip": "", "basic-auth": "", "basic-auth-label": "", "browser-mode-description": "", + "browser-mode-label": "", "browser-mode-title": "", - "default-url-access-select": "", "default-url-tooltip": "", "direct-url-tooltip": "", "heading": "", + "invalid-url-error": "", "proxy-url-tooltip": "", "server-mode-description": "", + "server-mode-label": "", "server-mode-title": "", - "timeout-form-label": "", + "sigv4-auth-label": "", + "timeout-description": "", "timeout-label": "", - "timeout-tooltip": "", - "url-label": "", - "with-credential-label": "", - "with-credential-tooltip": "" + "timeout-placeholder": "", + "with-credentials-label": "", + "with-credentials-tooltip": "" }, "data-source-settings": { "alerting-settings-heading": "", diff --git a/public/locales/id-ID/grafana.json b/public/locales/id-ID/grafana.json index e8239d9d29c..b2ca703bccd 100644 --- a/public/locales/id-ID/grafana.json +++ b/public/locales/id-ID/grafana.json @@ -1011,6 +1011,46 @@ "redirect-link": "", "subtitle": "" }, + "conditional-rendering": { + "data": { + "disable": "", + "enable": "", + "label": "" + }, + "group": { + "add": { + "button": "", + "data": "", + "interval": "", + "variable": "" + }, + "condition": { + "label": "", + "meet-all": "", + "meet-any": "" + }, + "label": "" + }, + "interval": { + "input-label": "", + "invalid-message": "", + "label": "" + }, + "shared": { + "delete-condition": "" + }, + "title": "", + "variable": { + "label": "", + "operator": { + "equals": "", + "not-equal": "" + }, + "select-operator": "", + "select-variable": "", + "value-input": "" + } + }, "default-layout": { "description": "", "item-options": { @@ -1185,16 +1225,6 @@ }, "responsive-layout": { "description": "", - "item-options": { - "hide-no-data": "", - "repeat": { - "variable": { - "description": "", - "title": "" - } - }, - "title": "" - }, "name": "", "options": { "columns": "", @@ -1819,31 +1849,32 @@ "data-source-http-settings": { "access-help": "", "access-help-details": "", + "access-help-title": "", "access-label": "", - "access-options-browser": "", - "access-options-proxy": "", "allowed-cookies": "", - "allowed-cookies-tooltip": "", + "allowed-cookies-description": "", "auth": "", "azure-auth-label": "", "azure-auth-tooltip": "", "basic-auth": "", "basic-auth-label": "", "browser-mode-description": "", + "browser-mode-label": "", "browser-mode-title": "", - "default-url-access-select": "", "default-url-tooltip": "", "direct-url-tooltip": "", "heading": "", + "invalid-url-error": "", "proxy-url-tooltip": "", "server-mode-description": "", + "server-mode-label": "", "server-mode-title": "", - "timeout-form-label": "", + "sigv4-auth-label": "", + "timeout-description": "", "timeout-label": "", - "timeout-tooltip": "", - "url-label": "", - "with-credential-label": "", - "with-credential-tooltip": "" + "timeout-placeholder": "", + "with-credentials-label": "", + "with-credentials-tooltip": "" }, "data-source-settings": { "alerting-settings-heading": "", diff --git a/public/locales/it-IT/grafana.json b/public/locales/it-IT/grafana.json index 1d5359a25d1..ebc007fa448 100644 --- a/public/locales/it-IT/grafana.json +++ b/public/locales/it-IT/grafana.json @@ -1020,6 +1020,46 @@ "redirect-link": "", "subtitle": "" }, + "conditional-rendering": { + "data": { + "disable": "", + "enable": "", + "label": "" + }, + "group": { + "add": { + "button": "", + "data": "", + "interval": "", + "variable": "" + }, + "condition": { + "label": "", + "meet-all": "", + "meet-any": "" + }, + "label": "" + }, + "interval": { + "input-label": "", + "invalid-message": "", + "label": "" + }, + "shared": { + "delete-condition": "" + }, + "title": "", + "variable": { + "label": "", + "operator": { + "equals": "", + "not-equal": "" + }, + "select-operator": "", + "select-variable": "", + "value-input": "" + } + }, "default-layout": { "description": "", "item-options": { @@ -1194,16 +1234,6 @@ }, "responsive-layout": { "description": "", - "item-options": { - "hide-no-data": "", - "repeat": { - "variable": { - "description": "", - "title": "" - } - }, - "title": "" - }, "name": "", "options": { "columns": "", @@ -1828,31 +1858,32 @@ "data-source-http-settings": { "access-help": "", "access-help-details": "", + "access-help-title": "", "access-label": "", - "access-options-browser": "", - "access-options-proxy": "", "allowed-cookies": "", - "allowed-cookies-tooltip": "", + "allowed-cookies-description": "", "auth": "", "azure-auth-label": "", "azure-auth-tooltip": "", "basic-auth": "", "basic-auth-label": "", "browser-mode-description": "", + "browser-mode-label": "", "browser-mode-title": "", - "default-url-access-select": "", "default-url-tooltip": "", "direct-url-tooltip": "", "heading": "", + "invalid-url-error": "", "proxy-url-tooltip": "", "server-mode-description": "", + "server-mode-label": "", "server-mode-title": "", - "timeout-form-label": "", + "sigv4-auth-label": "", + "timeout-description": "", "timeout-label": "", - "timeout-tooltip": "", - "url-label": "", - "with-credential-label": "", - "with-credential-tooltip": "" + "timeout-placeholder": "", + "with-credentials-label": "", + "with-credentials-tooltip": "" }, "data-source-settings": { "alerting-settings-heading": "", diff --git a/public/locales/ja-JP/grafana.json b/public/locales/ja-JP/grafana.json index e8239d9d29c..b2ca703bccd 100644 --- a/public/locales/ja-JP/grafana.json +++ b/public/locales/ja-JP/grafana.json @@ -1011,6 +1011,46 @@ "redirect-link": "", "subtitle": "" }, + "conditional-rendering": { + "data": { + "disable": "", + "enable": "", + "label": "" + }, + "group": { + "add": { + "button": "", + "data": "", + "interval": "", + "variable": "" + }, + "condition": { + "label": "", + "meet-all": "", + "meet-any": "" + }, + "label": "" + }, + "interval": { + "input-label": "", + "invalid-message": "", + "label": "" + }, + "shared": { + "delete-condition": "" + }, + "title": "", + "variable": { + "label": "", + "operator": { + "equals": "", + "not-equal": "" + }, + "select-operator": "", + "select-variable": "", + "value-input": "" + } + }, "default-layout": { "description": "", "item-options": { @@ -1185,16 +1225,6 @@ }, "responsive-layout": { "description": "", - "item-options": { - "hide-no-data": "", - "repeat": { - "variable": { - "description": "", - "title": "" - } - }, - "title": "" - }, "name": "", "options": { "columns": "", @@ -1819,31 +1849,32 @@ "data-source-http-settings": { "access-help": "", "access-help-details": "", + "access-help-title": "", "access-label": "", - "access-options-browser": "", - "access-options-proxy": "", "allowed-cookies": "", - "allowed-cookies-tooltip": "", + "allowed-cookies-description": "", "auth": "", "azure-auth-label": "", "azure-auth-tooltip": "", "basic-auth": "", "basic-auth-label": "", "browser-mode-description": "", + "browser-mode-label": "", "browser-mode-title": "", - "default-url-access-select": "", "default-url-tooltip": "", "direct-url-tooltip": "", "heading": "", + "invalid-url-error": "", "proxy-url-tooltip": "", "server-mode-description": "", + "server-mode-label": "", "server-mode-title": "", - "timeout-form-label": "", + "sigv4-auth-label": "", + "timeout-description": "", "timeout-label": "", - "timeout-tooltip": "", - "url-label": "", - "with-credential-label": "", - "with-credential-tooltip": "" + "timeout-placeholder": "", + "with-credentials-label": "", + "with-credentials-tooltip": "" }, "data-source-settings": { "alerting-settings-heading": "", diff --git a/public/locales/ko-KR/grafana.json b/public/locales/ko-KR/grafana.json index e8239d9d29c..b2ca703bccd 100644 --- a/public/locales/ko-KR/grafana.json +++ b/public/locales/ko-KR/grafana.json @@ -1011,6 +1011,46 @@ "redirect-link": "", "subtitle": "" }, + "conditional-rendering": { + "data": { + "disable": "", + "enable": "", + "label": "" + }, + "group": { + "add": { + "button": "", + "data": "", + "interval": "", + "variable": "" + }, + "condition": { + "label": "", + "meet-all": "", + "meet-any": "" + }, + "label": "" + }, + "interval": { + "input-label": "", + "invalid-message": "", + "label": "" + }, + "shared": { + "delete-condition": "" + }, + "title": "", + "variable": { + "label": "", + "operator": { + "equals": "", + "not-equal": "" + }, + "select-operator": "", + "select-variable": "", + "value-input": "" + } + }, "default-layout": { "description": "", "item-options": { @@ -1185,16 +1225,6 @@ }, "responsive-layout": { "description": "", - "item-options": { - "hide-no-data": "", - "repeat": { - "variable": { - "description": "", - "title": "" - } - }, - "title": "" - }, "name": "", "options": { "columns": "", @@ -1819,31 +1849,32 @@ "data-source-http-settings": { "access-help": "", "access-help-details": "", + "access-help-title": "", "access-label": "", - "access-options-browser": "", - "access-options-proxy": "", "allowed-cookies": "", - "allowed-cookies-tooltip": "", + "allowed-cookies-description": "", "auth": "", "azure-auth-label": "", "azure-auth-tooltip": "", "basic-auth": "", "basic-auth-label": "", "browser-mode-description": "", + "browser-mode-label": "", "browser-mode-title": "", - "default-url-access-select": "", "default-url-tooltip": "", "direct-url-tooltip": "", "heading": "", + "invalid-url-error": "", "proxy-url-tooltip": "", "server-mode-description": "", + "server-mode-label": "", "server-mode-title": "", - "timeout-form-label": "", + "sigv4-auth-label": "", + "timeout-description": "", "timeout-label": "", - "timeout-tooltip": "", - "url-label": "", - "with-credential-label": "", - "with-credential-tooltip": "" + "timeout-placeholder": "", + "with-credentials-label": "", + "with-credentials-tooltip": "" }, "data-source-settings": { "alerting-settings-heading": "", diff --git a/public/locales/nl-NL/grafana.json b/public/locales/nl-NL/grafana.json index 1d5359a25d1..ebc007fa448 100644 --- a/public/locales/nl-NL/grafana.json +++ b/public/locales/nl-NL/grafana.json @@ -1020,6 +1020,46 @@ "redirect-link": "", "subtitle": "" }, + "conditional-rendering": { + "data": { + "disable": "", + "enable": "", + "label": "" + }, + "group": { + "add": { + "button": "", + "data": "", + "interval": "", + "variable": "" + }, + "condition": { + "label": "", + "meet-all": "", + "meet-any": "" + }, + "label": "" + }, + "interval": { + "input-label": "", + "invalid-message": "", + "label": "" + }, + "shared": { + "delete-condition": "" + }, + "title": "", + "variable": { + "label": "", + "operator": { + "equals": "", + "not-equal": "" + }, + "select-operator": "", + "select-variable": "", + "value-input": "" + } + }, "default-layout": { "description": "", "item-options": { @@ -1194,16 +1234,6 @@ }, "responsive-layout": { "description": "", - "item-options": { - "hide-no-data": "", - "repeat": { - "variable": { - "description": "", - "title": "" - } - }, - "title": "" - }, "name": "", "options": { "columns": "", @@ -1828,31 +1858,32 @@ "data-source-http-settings": { "access-help": "", "access-help-details": "", + "access-help-title": "", "access-label": "", - "access-options-browser": "", - "access-options-proxy": "", "allowed-cookies": "", - "allowed-cookies-tooltip": "", + "allowed-cookies-description": "", "auth": "", "azure-auth-label": "", "azure-auth-tooltip": "", "basic-auth": "", "basic-auth-label": "", "browser-mode-description": "", + "browser-mode-label": "", "browser-mode-title": "", - "default-url-access-select": "", "default-url-tooltip": "", "direct-url-tooltip": "", "heading": "", + "invalid-url-error": "", "proxy-url-tooltip": "", "server-mode-description": "", + "server-mode-label": "", "server-mode-title": "", - "timeout-form-label": "", + "sigv4-auth-label": "", + "timeout-description": "", "timeout-label": "", - "timeout-tooltip": "", - "url-label": "", - "with-credential-label": "", - "with-credential-tooltip": "" + "timeout-placeholder": "", + "with-credentials-label": "", + "with-credentials-tooltip": "" }, "data-source-settings": { "alerting-settings-heading": "", diff --git a/public/locales/pl-PL/grafana.json b/public/locales/pl-PL/grafana.json index 59e3cfc998b..bbd6770fd5c 100644 --- a/public/locales/pl-PL/grafana.json +++ b/public/locales/pl-PL/grafana.json @@ -1038,6 +1038,46 @@ "redirect-link": "", "subtitle": "" }, + "conditional-rendering": { + "data": { + "disable": "", + "enable": "", + "label": "" + }, + "group": { + "add": { + "button": "", + "data": "", + "interval": "", + "variable": "" + }, + "condition": { + "label": "", + "meet-all": "", + "meet-any": "" + }, + "label": "" + }, + "interval": { + "input-label": "", + "invalid-message": "", + "label": "" + }, + "shared": { + "delete-condition": "" + }, + "title": "", + "variable": { + "label": "", + "operator": { + "equals": "", + "not-equal": "" + }, + "select-operator": "", + "select-variable": "", + "value-input": "" + } + }, "default-layout": { "description": "", "item-options": { @@ -1212,16 +1252,6 @@ }, "responsive-layout": { "description": "", - "item-options": { - "hide-no-data": "", - "repeat": { - "variable": { - "description": "", - "title": "" - } - }, - "title": "" - }, "name": "", "options": { "columns": "", @@ -1846,31 +1876,32 @@ "data-source-http-settings": { "access-help": "", "access-help-details": "", + "access-help-title": "", "access-label": "", - "access-options-browser": "", - "access-options-proxy": "", "allowed-cookies": "", - "allowed-cookies-tooltip": "", + "allowed-cookies-description": "", "auth": "", "azure-auth-label": "", "azure-auth-tooltip": "", "basic-auth": "", "basic-auth-label": "", "browser-mode-description": "", + "browser-mode-label": "", "browser-mode-title": "", - "default-url-access-select": "", "default-url-tooltip": "", "direct-url-tooltip": "", "heading": "", + "invalid-url-error": "", "proxy-url-tooltip": "", "server-mode-description": "", + "server-mode-label": "", "server-mode-title": "", - "timeout-form-label": "", + "sigv4-auth-label": "", + "timeout-description": "", "timeout-label": "", - "timeout-tooltip": "", - "url-label": "", - "with-credential-label": "", - "with-credential-tooltip": "" + "timeout-placeholder": "", + "with-credentials-label": "", + "with-credentials-tooltip": "" }, "data-source-settings": { "alerting-settings-heading": "", diff --git a/public/locales/pt-BR/grafana.json b/public/locales/pt-BR/grafana.json index 5b9c466b56e..7dd6efeb712 100644 --- a/public/locales/pt-BR/grafana.json +++ b/public/locales/pt-BR/grafana.json @@ -1020,6 +1020,46 @@ "redirect-link": "Lista no alerta do Grafana", "subtitle": "Regras de alerta relacionadas a este painel de controle" }, + "conditional-rendering": { + "data": { + "disable": "", + "enable": "", + "label": "" + }, + "group": { + "add": { + "button": "", + "data": "", + "interval": "", + "variable": "" + }, + "condition": { + "label": "", + "meet-all": "", + "meet-any": "" + }, + "label": "" + }, + "interval": { + "input-label": "", + "invalid-message": "", + "label": "" + }, + "shared": { + "delete-condition": "" + }, + "title": "", + "variable": { + "label": "", + "operator": { + "equals": "", + "not-equal": "" + }, + "select-operator": "", + "select-variable": "", + "value-input": "" + } + }, "default-layout": { "description": "", "item-options": { @@ -1194,16 +1234,6 @@ }, "responsive-layout": { "description": "", - "item-options": { - "hide-no-data": "", - "repeat": { - "variable": { - "description": "", - "title": "" - } - }, - "title": "" - }, "name": "", "options": { "columns": "", @@ -1828,31 +1858,32 @@ "data-source-http-settings": { "access-help": "", "access-help-details": "", + "access-help-title": "", "access-label": "", - "access-options-browser": "", - "access-options-proxy": "", "allowed-cookies": "", - "allowed-cookies-tooltip": "", + "allowed-cookies-description": "", "auth": "", "azure-auth-label": "", "azure-auth-tooltip": "", "basic-auth": "", "basic-auth-label": "", "browser-mode-description": "", + "browser-mode-label": "", "browser-mode-title": "", - "default-url-access-select": "", "default-url-tooltip": "", "direct-url-tooltip": "", "heading": "", + "invalid-url-error": "", "proxy-url-tooltip": "", "server-mode-description": "", + "server-mode-label": "", "server-mode-title": "", - "timeout-form-label": "", + "sigv4-auth-label": "", + "timeout-description": "", "timeout-label": "", - "timeout-tooltip": "", - "url-label": "", - "with-credential-label": "", - "with-credential-tooltip": "" + "timeout-placeholder": "", + "with-credentials-label": "", + "with-credentials-tooltip": "" }, "data-source-settings": { "alerting-settings-heading": "", diff --git a/public/locales/pt-PT/grafana.json b/public/locales/pt-PT/grafana.json index 1d5359a25d1..ebc007fa448 100644 --- a/public/locales/pt-PT/grafana.json +++ b/public/locales/pt-PT/grafana.json @@ -1020,6 +1020,46 @@ "redirect-link": "", "subtitle": "" }, + "conditional-rendering": { + "data": { + "disable": "", + "enable": "", + "label": "" + }, + "group": { + "add": { + "button": "", + "data": "", + "interval": "", + "variable": "" + }, + "condition": { + "label": "", + "meet-all": "", + "meet-any": "" + }, + "label": "" + }, + "interval": { + "input-label": "", + "invalid-message": "", + "label": "" + }, + "shared": { + "delete-condition": "" + }, + "title": "", + "variable": { + "label": "", + "operator": { + "equals": "", + "not-equal": "" + }, + "select-operator": "", + "select-variable": "", + "value-input": "" + } + }, "default-layout": { "description": "", "item-options": { @@ -1194,16 +1234,6 @@ }, "responsive-layout": { "description": "", - "item-options": { - "hide-no-data": "", - "repeat": { - "variable": { - "description": "", - "title": "" - } - }, - "title": "" - }, "name": "", "options": { "columns": "", @@ -1828,31 +1858,32 @@ "data-source-http-settings": { "access-help": "", "access-help-details": "", + "access-help-title": "", "access-label": "", - "access-options-browser": "", - "access-options-proxy": "", "allowed-cookies": "", - "allowed-cookies-tooltip": "", + "allowed-cookies-description": "", "auth": "", "azure-auth-label": "", "azure-auth-tooltip": "", "basic-auth": "", "basic-auth-label": "", "browser-mode-description": "", + "browser-mode-label": "", "browser-mode-title": "", - "default-url-access-select": "", "default-url-tooltip": "", "direct-url-tooltip": "", "heading": "", + "invalid-url-error": "", "proxy-url-tooltip": "", "server-mode-description": "", + "server-mode-label": "", "server-mode-title": "", - "timeout-form-label": "", + "sigv4-auth-label": "", + "timeout-description": "", "timeout-label": "", - "timeout-tooltip": "", - "url-label": "", - "with-credential-label": "", - "with-credential-tooltip": "" + "timeout-placeholder": "", + "with-credentials-label": "", + "with-credentials-tooltip": "" }, "data-source-settings": { "alerting-settings-heading": "", diff --git a/public/locales/ru-RU/grafana.json b/public/locales/ru-RU/grafana.json index 59e3cfc998b..bbd6770fd5c 100644 --- a/public/locales/ru-RU/grafana.json +++ b/public/locales/ru-RU/grafana.json @@ -1038,6 +1038,46 @@ "redirect-link": "", "subtitle": "" }, + "conditional-rendering": { + "data": { + "disable": "", + "enable": "", + "label": "" + }, + "group": { + "add": { + "button": "", + "data": "", + "interval": "", + "variable": "" + }, + "condition": { + "label": "", + "meet-all": "", + "meet-any": "" + }, + "label": "" + }, + "interval": { + "input-label": "", + "invalid-message": "", + "label": "" + }, + "shared": { + "delete-condition": "" + }, + "title": "", + "variable": { + "label": "", + "operator": { + "equals": "", + "not-equal": "" + }, + "select-operator": "", + "select-variable": "", + "value-input": "" + } + }, "default-layout": { "description": "", "item-options": { @@ -1212,16 +1252,6 @@ }, "responsive-layout": { "description": "", - "item-options": { - "hide-no-data": "", - "repeat": { - "variable": { - "description": "", - "title": "" - } - }, - "title": "" - }, "name": "", "options": { "columns": "", @@ -1846,31 +1876,32 @@ "data-source-http-settings": { "access-help": "", "access-help-details": "", + "access-help-title": "", "access-label": "", - "access-options-browser": "", - "access-options-proxy": "", "allowed-cookies": "", - "allowed-cookies-tooltip": "", + "allowed-cookies-description": "", "auth": "", "azure-auth-label": "", "azure-auth-tooltip": "", "basic-auth": "", "basic-auth-label": "", "browser-mode-description": "", + "browser-mode-label": "", "browser-mode-title": "", - "default-url-access-select": "", "default-url-tooltip": "", "direct-url-tooltip": "", "heading": "", + "invalid-url-error": "", "proxy-url-tooltip": "", "server-mode-description": "", + "server-mode-label": "", "server-mode-title": "", - "timeout-form-label": "", + "sigv4-auth-label": "", + "timeout-description": "", "timeout-label": "", - "timeout-tooltip": "", - "url-label": "", - "with-credential-label": "", - "with-credential-tooltip": "" + "timeout-placeholder": "", + "with-credentials-label": "", + "with-credentials-tooltip": "" }, "data-source-settings": { "alerting-settings-heading": "", diff --git a/public/locales/sv-SE/grafana.json b/public/locales/sv-SE/grafana.json index 1d5359a25d1..ebc007fa448 100644 --- a/public/locales/sv-SE/grafana.json +++ b/public/locales/sv-SE/grafana.json @@ -1020,6 +1020,46 @@ "redirect-link": "", "subtitle": "" }, + "conditional-rendering": { + "data": { + "disable": "", + "enable": "", + "label": "" + }, + "group": { + "add": { + "button": "", + "data": "", + "interval": "", + "variable": "" + }, + "condition": { + "label": "", + "meet-all": "", + "meet-any": "" + }, + "label": "" + }, + "interval": { + "input-label": "", + "invalid-message": "", + "label": "" + }, + "shared": { + "delete-condition": "" + }, + "title": "", + "variable": { + "label": "", + "operator": { + "equals": "", + "not-equal": "" + }, + "select-operator": "", + "select-variable": "", + "value-input": "" + } + }, "default-layout": { "description": "", "item-options": { @@ -1194,16 +1234,6 @@ }, "responsive-layout": { "description": "", - "item-options": { - "hide-no-data": "", - "repeat": { - "variable": { - "description": "", - "title": "" - } - }, - "title": "" - }, "name": "", "options": { "columns": "", @@ -1828,31 +1858,32 @@ "data-source-http-settings": { "access-help": "", "access-help-details": "", + "access-help-title": "", "access-label": "", - "access-options-browser": "", - "access-options-proxy": "", "allowed-cookies": "", - "allowed-cookies-tooltip": "", + "allowed-cookies-description": "", "auth": "", "azure-auth-label": "", "azure-auth-tooltip": "", "basic-auth": "", "basic-auth-label": "", "browser-mode-description": "", + "browser-mode-label": "", "browser-mode-title": "", - "default-url-access-select": "", "default-url-tooltip": "", "direct-url-tooltip": "", "heading": "", + "invalid-url-error": "", "proxy-url-tooltip": "", "server-mode-description": "", + "server-mode-label": "", "server-mode-title": "", - "timeout-form-label": "", + "sigv4-auth-label": "", + "timeout-description": "", "timeout-label": "", - "timeout-tooltip": "", - "url-label": "", - "with-credential-label": "", - "with-credential-tooltip": "" + "timeout-placeholder": "", + "with-credentials-label": "", + "with-credentials-tooltip": "" }, "data-source-settings": { "alerting-settings-heading": "", diff --git a/public/locales/tr-TR/grafana.json b/public/locales/tr-TR/grafana.json index 1d5359a25d1..ebc007fa448 100644 --- a/public/locales/tr-TR/grafana.json +++ b/public/locales/tr-TR/grafana.json @@ -1020,6 +1020,46 @@ "redirect-link": "", "subtitle": "" }, + "conditional-rendering": { + "data": { + "disable": "", + "enable": "", + "label": "" + }, + "group": { + "add": { + "button": "", + "data": "", + "interval": "", + "variable": "" + }, + "condition": { + "label": "", + "meet-all": "", + "meet-any": "" + }, + "label": "" + }, + "interval": { + "input-label": "", + "invalid-message": "", + "label": "" + }, + "shared": { + "delete-condition": "" + }, + "title": "", + "variable": { + "label": "", + "operator": { + "equals": "", + "not-equal": "" + }, + "select-operator": "", + "select-variable": "", + "value-input": "" + } + }, "default-layout": { "description": "", "item-options": { @@ -1194,16 +1234,6 @@ }, "responsive-layout": { "description": "", - "item-options": { - "hide-no-data": "", - "repeat": { - "variable": { - "description": "", - "title": "" - } - }, - "title": "" - }, "name": "", "options": { "columns": "", @@ -1828,31 +1858,32 @@ "data-source-http-settings": { "access-help": "", "access-help-details": "", + "access-help-title": "", "access-label": "", - "access-options-browser": "", - "access-options-proxy": "", "allowed-cookies": "", - "allowed-cookies-tooltip": "", + "allowed-cookies-description": "", "auth": "", "azure-auth-label": "", "azure-auth-tooltip": "", "basic-auth": "", "basic-auth-label": "", "browser-mode-description": "", + "browser-mode-label": "", "browser-mode-title": "", - "default-url-access-select": "", "default-url-tooltip": "", "direct-url-tooltip": "", "heading": "", + "invalid-url-error": "", "proxy-url-tooltip": "", "server-mode-description": "", + "server-mode-label": "", "server-mode-title": "", - "timeout-form-label": "", + "sigv4-auth-label": "", + "timeout-description": "", "timeout-label": "", - "timeout-tooltip": "", - "url-label": "", - "with-credential-label": "", - "with-credential-tooltip": "" + "timeout-placeholder": "", + "with-credentials-label": "", + "with-credentials-tooltip": "" }, "data-source-settings": { "alerting-settings-heading": "", diff --git a/public/locales/zh-Hans/grafana.json b/public/locales/zh-Hans/grafana.json index e86e0e71840..970b797b062 100644 --- a/public/locales/zh-Hans/grafana.json +++ b/public/locales/zh-Hans/grafana.json @@ -1011,6 +1011,46 @@ "redirect-link": "Grafana Alerting 中的列表", "subtitle": "与此仪表板相关的警报规则" }, + "conditional-rendering": { + "data": { + "disable": "", + "enable": "", + "label": "" + }, + "group": { + "add": { + "button": "", + "data": "", + "interval": "", + "variable": "" + }, + "condition": { + "label": "", + "meet-all": "", + "meet-any": "" + }, + "label": "" + }, + "interval": { + "input-label": "", + "invalid-message": "", + "label": "" + }, + "shared": { + "delete-condition": "" + }, + "title": "", + "variable": { + "label": "", + "operator": { + "equals": "", + "not-equal": "" + }, + "select-operator": "", + "select-variable": "", + "value-input": "" + } + }, "default-layout": { "description": "", "item-options": { @@ -1185,16 +1225,6 @@ }, "responsive-layout": { "description": "", - "item-options": { - "hide-no-data": "", - "repeat": { - "variable": { - "description": "", - "title": "" - } - }, - "title": "" - }, "name": "", "options": { "columns": "", @@ -1819,31 +1849,32 @@ "data-source-http-settings": { "access-help": "", "access-help-details": "", + "access-help-title": "", "access-label": "", - "access-options-browser": "", - "access-options-proxy": "", "allowed-cookies": "", - "allowed-cookies-tooltip": "", + "allowed-cookies-description": "", "auth": "", "azure-auth-label": "", "azure-auth-tooltip": "", "basic-auth": "", "basic-auth-label": "", "browser-mode-description": "", + "browser-mode-label": "", "browser-mode-title": "", - "default-url-access-select": "", "default-url-tooltip": "", "direct-url-tooltip": "", "heading": "", + "invalid-url-error": "", "proxy-url-tooltip": "", "server-mode-description": "", + "server-mode-label": "", "server-mode-title": "", - "timeout-form-label": "", + "sigv4-auth-label": "", + "timeout-description": "", "timeout-label": "", - "timeout-tooltip": "", - "url-label": "", - "with-credential-label": "", - "with-credential-tooltip": "" + "timeout-placeholder": "", + "with-credentials-label": "", + "with-credentials-tooltip": "" }, "data-source-settings": { "alerting-settings-heading": "", diff --git a/public/locales/zh-Hant/grafana.json b/public/locales/zh-Hant/grafana.json index e8239d9d29c..b2ca703bccd 100644 --- a/public/locales/zh-Hant/grafana.json +++ b/public/locales/zh-Hant/grafana.json @@ -1011,6 +1011,46 @@ "redirect-link": "", "subtitle": "" }, + "conditional-rendering": { + "data": { + "disable": "", + "enable": "", + "label": "" + }, + "group": { + "add": { + "button": "", + "data": "", + "interval": "", + "variable": "" + }, + "condition": { + "label": "", + "meet-all": "", + "meet-any": "" + }, + "label": "" + }, + "interval": { + "input-label": "", + "invalid-message": "", + "label": "" + }, + "shared": { + "delete-condition": "" + }, + "title": "", + "variable": { + "label": "", + "operator": { + "equals": "", + "not-equal": "" + }, + "select-operator": "", + "select-variable": "", + "value-input": "" + } + }, "default-layout": { "description": "", "item-options": { @@ -1185,16 +1225,6 @@ }, "responsive-layout": { "description": "", - "item-options": { - "hide-no-data": "", - "repeat": { - "variable": { - "description": "", - "title": "" - } - }, - "title": "" - }, "name": "", "options": { "columns": "", @@ -1819,31 +1849,32 @@ "data-source-http-settings": { "access-help": "", "access-help-details": "", + "access-help-title": "", "access-label": "", - "access-options-browser": "", - "access-options-proxy": "", "allowed-cookies": "", - "allowed-cookies-tooltip": "", + "allowed-cookies-description": "", "auth": "", "azure-auth-label": "", "azure-auth-tooltip": "", "basic-auth": "", "basic-auth-label": "", "browser-mode-description": "", + "browser-mode-label": "", "browser-mode-title": "", - "default-url-access-select": "", "default-url-tooltip": "", "direct-url-tooltip": "", "heading": "", + "invalid-url-error": "", "proxy-url-tooltip": "", "server-mode-description": "", + "server-mode-label": "", "server-mode-title": "", - "timeout-form-label": "", + "sigv4-auth-label": "", + "timeout-description": "", "timeout-label": "", - "timeout-tooltip": "", - "url-label": "", - "with-credential-label": "", - "with-credential-tooltip": "" + "timeout-placeholder": "", + "with-credentials-label": "", + "with-credentials-tooltip": "" }, "data-source-settings": { "alerting-settings-heading": "", From ef5cc12b331e3cfe5a64f9e3ad2f5898b5ee3c71 Mon Sep 17 00:00:00 2001 From: Alexander Akhmetov Date: Fri, 14 Mar 2025 07:22:41 +0100 Subject: [PATCH 046/117] Alerting: Add HMAC signature config to the webhook integration (#100960) Adds HMAC-SHA256 signature support to webhook notifications, providing a way to verify the authenticity and integrity of webhook requests. The implementation allows to specify the header in which the signature will be sent. The signature is calculated from the request body. An optional timestamp header name can be provided. If set, the HMAC signature will be generated by concatenating the timestamp, a ":" and the request body: {timestamp}:{body}. The timestamp will also be sent in the provided header name. --- .../administration/provisioning/index.md | 32 +++++++++++++---- .../integrations/webhook-notifier.md | 32 +++++++++++++++++ .../file-provisioning/index.md | 7 ++++ .../channels_config/available_channels.go | 36 +++++++++++++++++++ .../available_channels_test.go | 2 +- 5 files changed, 101 insertions(+), 8 deletions(-) diff --git a/docs/sources/administration/provisioning/index.md b/docs/sources/administration/provisioning/index.md index dcec3f915d7..6145d69a761 100644 --- a/docs/sources/administration/provisioning/index.md +++ b/docs/sources/administration/provisioning/index.md @@ -617,13 +617,31 @@ Grafana encrypts secure settings in the database. #### Alert notification `webhook` -| Name | Secure setting | -| ------------ | -------------- | -| `url` | | -| `httpMethod` | | -| `username` | | -| `password` | yes | -| `tls_config` | | +| Name | Secure setting | +| ------------- | -------------- | +| `url` | | +| `http_method` | | +| `username` | | +| `password` | yes | +| `tls_config` | | +| `hmac_config` | | + +##### TLS configuration + +| Name | Secure setting | +| -------------------- | -------------- | +| `insecureSkipVerify` | | +| `clientCertificate` | yes | +| `clientKey` | yes | +| `caCertificate` | yes | + +##### HMAC signature configuration + +| Name | Secure setting | +| ----------------- | -------------- | +| `secret` | yes | +| `header` | | +| `timestampHeader` | | #### Alert notification `googlechat` diff --git a/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/webhook-notifier.md b/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/webhook-notifier.md index e7741ac3b56..bf4e0cc90fe 100644 --- a/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/webhook-notifier.md +++ b/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/webhook-notifier.md @@ -72,6 +72,7 @@ For more details on contact points, including how to test them and enable notifi | Authentication Header Credentials | Credentials for the `Authorization` Request header. | | Max Alerts | Maximum number of alerts to include in a notification. Any alerts exceeding this limit are ignored. `0` means no limit. | | TLS | TLS configuration options, including CA certificate, client certificate, and client key. | +| HMAC Signature | HMAC signature configuration options. | {{< admonition type="note" >}} @@ -79,6 +80,37 @@ You can configure either HTTP Basic Authentication or the Authorization request {{< /admonition >}} +#### HMAC signature + +You can secure your webhook notifications using HMAC signatures to verify the authenticity and integrity of the requests. When enabled, Grafana signs the webhook payload with a shared secret using HMAC-SHA256. + +| Option | Description | +| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Secret | The shared secret key used to generate the HMAC signature. | +| Header | The HTTP header where the signature will be set. Default is `X-Grafana-Alerting-Signature`. | +| Timestamp Header | Optional header to include a timestamp in the signature calculation. When specified, Grafana will set a Unix timestamp in this header and include it in the HMAC calculation. This provides protection against replay attacks. | + +When HMAC signing is configured, Grafana generates a signature using HMAC-SHA256 with your secret key. If a timestamp header is specified, a Unix timestamp is included in the signature calculation. The signature is calculated as: + +``` +HMAC(timestamp + ":" + body) +``` + +The timestamp is sent in the specified header. If no timestamp header is specified, the signature is calculated just from the request body. The signature is sent as a hex-encoded string in the specified signature header. + +##### Validate a request + +To validate incoming webhook requests from Grafana, follow these steps: + +1. Extract the signature from the header (default is `X-Grafana-Alerting-Signature`). +2. If you configured a timestamp header, extract the timestamp value and verify it's recent to prevent replay attacks. +3. Calculate the expected signature: + - Create an HMAC-SHA256 hash using your shared secret + - If using timestamps, include the timestamp followed by a colon (`:`) before the request body + - Hash the raw request body + - Convert the result to a hexadecimal string +4. Compare the calculated signature with the one in the request header. + #### Optional settings using templates Use the following settings to include custom data within the [JSON payload](#body). Both options support using [notification templates](ref:notification-templates). diff --git a/docs/sources/alerting/set-up/provision-alerting-resources/file-provisioning/index.md b/docs/sources/alerting/set-up/provision-alerting-resources/file-provisioning/index.md index f7cb4a0e174..898fdf894bf 100644 --- a/docs/sources/alerting/set-up/provision-alerting-resources/file-provisioning/index.md +++ b/docs/sources/alerting/set-up/provision-alerting-resources/file-provisioning/index.md @@ -628,6 +628,13 @@ settings: clientKey: key in PEM format # caCertificate: CA certificate in PEM format + hmacConfig: + # + secret: secret-key + # + header: X-Grafana-Alerting-Signature + # + timestampHeader: X-Grafana-Alerting-Signature-Timestamp ``` {{< /collapse >}} diff --git a/pkg/services/ngalert/notifier/channels_config/available_channels.go b/pkg/services/ngalert/notifier/channels_config/available_channels.go index 2e2ce80d24d..7adfb84c095 100644 --- a/pkg/services/ngalert/notifier/channels_config/available_channels.go +++ b/pkg/services/ngalert/notifier/channels_config/available_channels.go @@ -1016,6 +1016,42 @@ func GetAvailableNotifiers() []*NotifierPlugin { }, }, }, + { + Label: "HMAC Signature", + PropertyName: "hmacConfig", + Description: "HMAC signature configuration options", + Element: ElementTypeSubform, + SubformOptions: []NotifierOption{ + { + Label: "Secret", + Element: ElementTypeInput, + Description: "", + InputType: InputTypeText, + PropertyName: "secret", + Required: true, + Secure: true, + }, + { + Label: "Header", + Element: ElementTypeInput, + Description: "The header in which the HMAC signature will be included.", + InputType: InputTypeText, + PropertyName: "header", + Placeholder: "X-Grafana-Alerting-Signature", + Required: false, + Secure: false, + }, + { + Label: "Timestamp header", + Element: ElementTypeInput, + Description: "If set, the timestamp will be included in the HMAC signature. The value should be the name of the header to use.", + InputType: InputTypeText, + PropertyName: "timestampHeader", + Required: false, + Secure: false, + }, + }, + }, }, }, { diff --git a/pkg/services/ngalert/notifier/channels_config/available_channels_test.go b/pkg/services/ngalert/notifier/channels_config/available_channels_test.go index cc2defa2c80..0fe4330faf6 100644 --- a/pkg/services/ngalert/notifier/channels_config/available_channels_test.go +++ b/pkg/services/ngalert/notifier/channels_config/available_channels_test.go @@ -22,7 +22,7 @@ func TestGetSecretKeysForContactPointType(t *testing.T) { {receiverType: "sensugo", expectedSecretFields: []string{"apikey"}}, {receiverType: "teams", expectedSecretFields: []string{}}, {receiverType: "telegram", expectedSecretFields: []string{"bottoken"}}, - {receiverType: "webhook", expectedSecretFields: []string{"password", "authorization_credentials", "tlsConfig.caCertificate", "tlsConfig.clientCertificate", "tlsConfig.clientKey"}}, + {receiverType: "webhook", expectedSecretFields: []string{"password", "authorization_credentials", "tlsConfig.caCertificate", "tlsConfig.clientCertificate", "tlsConfig.clientKey", "hmacConfig.secret"}}, {receiverType: "wecom", expectedSecretFields: []string{"url", "secret"}}, {receiverType: "prometheus-alertmanager", expectedSecretFields: []string{"basicAuthPassword"}}, {receiverType: "discord", expectedSecretFields: []string{"url"}}, From 14e2784e69799c570052500f5607ee1d5e71fb3e Mon Sep 17 00:00:00 2001 From: Alex Khomenko Date: Fri, 14 Mar 2025 09:19:11 +0200 Subject: [PATCH 047/117] Chore: Add .cursor to .gitignore (#102166) --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 1a8be100668..eabffd1dbf4 100644 --- a/.gitignore +++ b/.gitignore @@ -68,6 +68,8 @@ public/css/*.min.css .vscode/ !.vscode/launch.json .vs/ +.cursor/ + .eslintcache .stylelintcache From d3a9c045627089d8de8aca2dc9afed3754253848 Mon Sep 17 00:00:00 2001 From: Eric Leijonmarck Date: Fri, 14 Mar 2025 08:38:48 +0000 Subject: [PATCH 048/117] Config: Removes setting `viewers_can_edit` (#101767) Reapply "Authz: Removes setting `viewers_can_edit`" (#101528) This reverts commit 5f6b00a72f2cebc154ac5f1bbb9b4c655fb0afea. --- pkg/api/accesscontrol.go | 5 --- .../guardian/accesscontrol_guardian.go | 10 ------ .../guardian/accesscontrol_guardian_test.go | 35 +++---------------- pkg/services/queryhistory/api.go | 4 +-- .../scene/NavToolbarActions.tsx | 8 ++++- 5 files changed, 12 insertions(+), 50 deletions(-) diff --git a/pkg/api/accesscontrol.go b/pkg/api/accesscontrol.go index fba8973eaa3..8fec8c2d2f7 100644 --- a/pkg/api/accesscontrol.go +++ b/pkg/api/accesscontrol.go @@ -71,11 +71,6 @@ func (hs *HTTPServer) declareFixedRoles() error { Grants: []string{string(org.RoleEditor)}, } - //nolint:staticcheck // ViewersCanEdit is deprecated but still used for backward compatibility - if hs.Cfg.ViewersCanEdit { - datasourcesExplorerRole.Grants = append(datasourcesExplorerRole.Grants, string(org.RoleViewer)) - } - datasourcesReaderRole := ac.RoleRegistration{ Role: ac.RoleDTO{ Name: "fixed:datasources:reader", diff --git a/pkg/services/guardian/accesscontrol_guardian.go b/pkg/services/guardian/accesscontrol_guardian.go index e889118c6dd..88d29ec72b1 100644 --- a/pkg/services/guardian/accesscontrol_guardian.go +++ b/pkg/services/guardian/accesscontrol_guardian.go @@ -221,11 +221,6 @@ func (a *accessControlDashboardGuardian) CanEdit() (bool, error) { return false, ErrGuardianDashboardNotFound.Errorf("failed to check edit permissions for dashboard") } - //nolint:staticcheck // ViewersCanEdit is deprecated but still used for backward compatibility - if a.cfg.ViewersCanEdit { - return a.CanView() - } - return a.evaluate( accesscontrol.EvalPermission(dashboards.ActionDashboardsWrite, dashboards.ScopeDashboardsProvider.GetResourceScopeUID(a.dashboard.UID)), ) @@ -236,11 +231,6 @@ func (a *accessControlFolderGuardian) CanEdit() (bool, error) { return false, ErrGuardianFolderNotFound.Errorf("failed to check edit permissions for folder") } - //nolint:staticcheck // ViewersCanEdit is deprecated but still used for backward compatibility - if a.cfg.ViewersCanEdit { - return a.CanView() - } - return a.evaluate(accesscontrol.EvalPermission(dashboards.ActionFoldersWrite, dashboards.ScopeFoldersProvider.GetResourceScopeUID(a.folder.UID))) } diff --git a/pkg/services/guardian/accesscontrol_guardian_test.go b/pkg/services/guardian/accesscontrol_guardian_test.go index 2e37ca224e7..2171d2bbbac 100644 --- a/pkg/services/guardian/accesscontrol_guardian_test.go +++ b/pkg/services/guardian/accesscontrol_guardian_test.go @@ -36,11 +36,10 @@ var ( ) type accessControlGuardianTestCase struct { - desc string - dashboard *dashboards.Dashboard - permissions []accesscontrol.Permission - viewersCanEdit bool - expected bool + desc string + dashboard *dashboards.Dashboard + permissions []accesscontrol.Permission + expected bool } func TestAccessControlDashboardGuardian_CanSave(t *testing.T) { @@ -257,18 +256,6 @@ func TestAccessControlDashboardGuardian_CanEdit(t *testing.T) { }, expected: false, }, - { - desc: "should be able to edit dashboard with read action when viewer_can_edit is true", - dashboard: dashboard, - permissions: []accesscontrol.Permission{ - { - Action: dashboards.ActionDashboardsRead, - Scope: "dashboards:uid:1", - }, - }, - viewersCanEdit: true, - expected: true, - }, { desc: "should not be able to edit folder with folder write and dashboard wildcard scope", dashboard: fldr, @@ -324,25 +311,11 @@ func TestAccessControlDashboardGuardian_CanEdit(t *testing.T) { }, expected: false, }, - { - desc: "should be able to edit folder with folder read action when viewer_can_edit is true", - dashboard: fldr, - permissions: []accesscontrol.Permission{ - { - Action: dashboards.ActionFoldersRead, - Scope: folderUIDScope, - }, - }, - viewersCanEdit: true, - expected: true, - }, } for _, tt := range tests { t.Run(tt.desc, func(t *testing.T) { cfg := setting.NewCfg() - //nolint:staticcheck - cfg.ViewersCanEdit = tt.viewersCanEdit guardian := setupAccessControlGuardianTest(t, tt.dashboard, tt.permissions, cfg) can, err := guardian.CanEdit() diff --git a/pkg/services/queryhistory/api.go b/pkg/services/queryhistory/api.go index a3783357f4e..0b39e4c9f30 100644 --- a/pkg/services/queryhistory/api.go +++ b/pkg/services/queryhistory/api.go @@ -30,9 +30,7 @@ type CallbackHandler func(c *contextmodel.ReqContext) response.Response func (s *QueryHistoryService) permissionsMiddleware(handler CallbackHandler, errorMessage string) CallbackHandler { return func(c *contextmodel.ReqContext) response.Response { hasAccess := ac.HasAccess(s.accessControl, c) - // ViewersCanEdit is deprecated but still used for backward compatibility - //nolint:staticcheck - if c.GetOrgRole() == org.RoleViewer && !s.Cfg.ViewersCanEdit && !hasAccess(ac.EvalPermission(ac.ActionDatasourcesExplore)) { + if c.GetOrgRole() == org.RoleViewer && !hasAccess(ac.EvalPermission(ac.ActionDatasourcesExplore)) { return response.Error(http.StatusUnauthorized, errorMessage, nil) } return handler(c) diff --git a/public/app/features/dashboard-scene/scene/NavToolbarActions.tsx b/public/app/features/dashboard-scene/scene/NavToolbarActions.tsx index 8fdf5f3a9bf..9bf45e8a142 100644 --- a/public/app/features/dashboard-scene/scene/NavToolbarActions.tsx +++ b/public/app/features/dashboard-scene/scene/NavToolbarActions.tsx @@ -20,6 +20,7 @@ import { } from '@grafana/ui'; import { AppChromeUpdate } from 'app/core/components/AppChrome/AppChromeUpdate'; import { NavToolbarSeparator } from 'app/core/components/AppChrome/NavToolbar/NavToolbarSeparator'; +import grafanaConfig from 'app/core/config'; import { LS_PANEL_COPY_KEY } from 'app/core/constants'; import { contextSrv } from 'app/core/core'; import { Trans, t } from 'app/core/internationalization'; @@ -78,6 +79,11 @@ export function ToolbarActions({ dashboard }: Props) { const dashboardNewLayouts = config.featureToggles.dashboardNewLayouts; const isManaged = Boolean(dashboard.isManaged()); + // Internal only; + // allows viewer editing without ability to save + // used for grafana play + const canEdit = grafanaConfig.viewersCanEdit; + if (!isEditingPanel) { // This adds the presence indicators in enterprise addDynamicActions(toolbarActions, dynamicDashNavActions.left, 'left-actions'); @@ -364,7 +370,7 @@ export function ToolbarActions({ dashboard }: Props) { toolbarActions.push({ group: 'main-buttons', - condition: !isEditing && dashboard.canEditDashboard() && !isViewingPanel && !isPlaying && editable, + condition: !isEditing && (dashboard.canEditDashboard() || canEdit) && !isViewingPanel && !isPlaying && editable, render: () => ( @@ -179,6 +189,10 @@ export function InstallControlsButton({ } function shouldDisableUninstall(isUninstalling: boolean, plugin: CatalogPlugin) { + if (isDisabledAngularPlugin(plugin)) { + return true; + } + if (config.pluginAdminExternalManageEnabled) { return plugin.isUninstallingFromInstance || !plugin.isFullyInstalled || plugin.isUpdatingFromInstance; } diff --git a/public/app/features/plugins/admin/components/PluginActions.test.tsx b/public/app/features/plugins/admin/components/PluginActions.test.tsx new file mode 100644 index 00000000000..3e09ba45fd9 --- /dev/null +++ b/public/app/features/plugins/admin/components/PluginActions.test.tsx @@ -0,0 +1,277 @@ +import { render, screen } from 'test/test-utils'; + +import { PluginErrorCode, PluginSignatureStatus, PluginSignatureType } from '@grafana/data'; + +import * as helpers from '../helpers'; +import * as hooks from '../state/hooks'; +import { initialState } from '../state/reducer'; +import { CatalogPlugin, PluginStatus, ReducerState, Version } from '../types'; + +import { getInstallControlsDisabled, getPluginStatus, PluginActions } from './PluginActions'; + +describe('PluginActions', () => { + let plugins: ReducerState; + + beforeEach(() => { + plugins = { ...initialState }; + jest.spyOn(helpers, 'isInstallControlsEnabled').mockReturnValue(true); + jest.spyOn(helpers, 'hasInstallControlWarning').mockReturnValue(false); + jest.spyOn(hooks, 'useIsRemotePluginsAvailable').mockReturnValue(true); + }); + + afterEach(() => { + jest.restoreAllMocks(); + }); + + describe('render', () => { + it('should render nothing when no plugin is provided', () => { + render(, { preloadedState: { plugins } }); + + expect(screen.queryByRole('button')).not.toBeInTheDocument(); + }); + + it('should render install button for non-installed plugin', () => { + render(, { preloadedState: { plugins } }); + + expect(screen.getByRole('button', { name: /install/i })).toBeInTheDocument(); + }); + + it('should render uninstall button for installed plugin', () => { + const installedPlugin = createPluginStub({ isInstalled: true }); + render(, { preloadedState: { plugins } }); + + expect(screen.getByRole('button', { name: /uninstall/i })).toBeInTheDocument(); + }); + + it('should render update button for plugin with update', () => { + const pluginWithUpdate = createPluginStub({ isInstalled: true, hasUpdate: true }); + render(, { preloadedState: { plugins } }); + + expect(screen.getByRole('button', { name: /update/i })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /uninstall/i })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /uninstall/i })).toHaveAttribute('aria-disabled', 'false'); + }); + + it('should not render install controls for core plugins', () => { + const corePlugin = createPluginStub({ isCore: true }); + render(, { preloadedState: { plugins } }); + + expect(screen.queryByRole('button', { name: /install|uninstall|update/i })).not.toBeInTheDocument(); + }); + + it('should not render install controls for disabled plugins', () => { + const disabledPlugin = createPluginStub({ isDisabled: true }); + render(, { preloadedState: { plugins } }); + + expect(screen.queryByRole('button', { name: /install|uninstall|update/i })).not.toBeInTheDocument(); + }); + + it('should not render install controls for provisioned plugins', () => { + const provisionedPlugin = createPluginStub({ isProvisioned: true }); + render(, { preloadedState: { plugins } }); + + expect(screen.queryByRole('button', { name: /install|uninstall|update/i })).not.toBeInTheDocument(); + }); + + it('should not render install controls when install controls are disabled', () => { + jest.spyOn(helpers, 'isInstallControlsEnabled').mockReturnValue(false); + render(, { preloadedState: { plugins } }); + + expect(screen.queryByRole('button', { name: /install|uninstall|update/i })).not.toBeInTheDocument(); + }); + + it('should render install controls when there is an installed disabled angular plugin with a non-angular version available', async () => { + jest.spyOn(helpers, 'getLatestCompatibleVersion').mockReturnValue(createVersion({ angularDetected: false })); + const disabledAngularPlugin = createPluginStub({ + isInstalled: true, + isDisabled: true, + error: PluginErrorCode.angular, + }); + render(, { preloadedState: { plugins } }); + + expect(screen.getByRole('button', { name: /update/i })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /uninstall/i })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /uninstall/i })).toHaveAttribute('aria-disabled', 'true'); + }); + + it('should not render install controls when there is an installed disabled angular plugin with no non-angular version available', () => { + jest.spyOn(helpers, 'getLatestCompatibleVersion').mockReturnValue(createVersion({ angularDetected: true })); + const disabledAngularPlugin = createPluginStub({ + isInstalled: true, + isDisabled: true, + error: PluginErrorCode.angular, + }); + render(, { preloadedState: { plugins } }); + + expect(screen.queryByRole('button', { name: /install|uninstall|update/i })).not.toBeInTheDocument(); + }); + }); + + describe('getPluginStatus', () => { + describe('regular plugins', () => { + it('should return INSTALL for non-installed plugins', () => { + const plugin = createPluginStub({ isInstalled: false }); + + expect(getPluginStatus(plugin, undefined)).toBe(PluginStatus.INSTALL); + }); + + it('should return UPDATE for installed plugins with updates', () => { + const plugin = createPluginStub({ isInstalled: true, hasUpdate: true }); + + expect(getPluginStatus(plugin, undefined)).toBe(PluginStatus.UPDATE); + }); + + it('should return UNINSTALL for installed plugins without updates', () => { + const plugin = createPluginStub({ isInstalled: true, hasUpdate: false }); + + expect(getPluginStatus(plugin, undefined)).toBe(PluginStatus.UNINSTALL); + }); + }); + + describe('angular plugins', () => { + it('should return INSTALL for non-installed angular plugins', () => { + const plugin = createPluginStub({ + isInstalled: false, + error: PluginErrorCode.angular, + }); + + expect(getPluginStatus(plugin, undefined)).toBe(PluginStatus.INSTALL); + }); + + it('should return UPDATE for installed angular plugins with non-angular version available', () => { + const plugin = createPluginStub({ + isInstalled: true, + error: PluginErrorCode.angular, + }); + const latestVersion = createVersion({ angularDetected: false }); + + expect(getPluginStatus(plugin, latestVersion)).toBe(PluginStatus.UPDATE); + }); + + it('should return UNINSTALL for installed angular plugins with only angular versions available', () => { + const plugin = createPluginStub({ + isInstalled: true, + error: PluginErrorCode.angular, + }); + const latestVersion = createVersion({ angularDetected: true }); + + expect(getPluginStatus(plugin, latestVersion)).toBe(PluginStatus.UNINSTALL); + }); + + it('should return UNINSTALL for installed angular plugins with no version info', () => { + const plugin = createPluginStub({ + isInstalled: true, + error: PluginErrorCode.angular, + }); + + expect(getPluginStatus(plugin, undefined)).toBe(PluginStatus.UNINSTALL); + }); + }); + + describe('disabled plugins', () => { + it('should handle disabled angular plugins', () => { + const plugin = createPluginStub({ + isInstalled: true, + isDisabled: true, + error: PluginErrorCode.angular, + }); + + expect(getPluginStatus(plugin, undefined)).toBe(PluginStatus.UNINSTALL); + }); + + it('should handle disabled regular plugins', () => { + const plugin = createPluginStub({ + isInstalled: true, + isDisabled: true, + }); + + expect(getPluginStatus(plugin, undefined)).toBe(PluginStatus.UNINSTALL); + }); + }); + }); + + describe('getInstallControlsDisabled', () => { + it('should return false for disabled angular plugins that have a non-angular version available', () => { + const plugin = createPluginStub({ isDisabled: true, error: PluginErrorCode.angular }); + const latestVersion = createVersion({ angularDetected: false }); + + expect(getInstallControlsDisabled(plugin, latestVersion)).toBe(false); + }); + + it('should return true for disabled regular plugins', () => { + const plugin = createPluginStub({ isDisabled: true }); + + expect(getInstallControlsDisabled(plugin, undefined)).toBe(true); + }); + + it('should return true for core plugins', () => { + const plugin = createPluginStub({ isCore: true }); + + expect(getInstallControlsDisabled(plugin, undefined)).toBe(true); + }); + + it('should return true for provisioned plugins', () => { + const plugin = createPluginStub({ isProvisioned: true }); + + expect(getInstallControlsDisabled(plugin, undefined)).toBe(true); + }); + + it('should return false for regular plugins', () => { + const plugin = createPluginStub({}); + + expect(getInstallControlsDisabled(plugin, undefined)).toBe(false); + }); + + it('should return true when install controls are not enabled', () => { + jest.spyOn(helpers, 'isInstallControlsEnabled').mockReturnValue(false); + const plugin = createPluginStub({}); + + expect(getInstallControlsDisabled(plugin, undefined)).toBe(true); + }); + }); +}); + +function createPluginStub(overrides?: Partial): CatalogPlugin { + return { + name: 'Test Plugin', + id: 'test-plugin', + description: 'Test plugin', + isCore: false, + isInstalled: false, + isDisabled: false, + isProvisioned: false, + hasUpdate: false, + signature: PluginSignatureStatus.valid, + signatureType: PluginSignatureType.grafana, + signatureOrg: 'grafana', + info: { + logos: { small: '', large: '' }, + keywords: [], + }, + error: undefined, + downloads: 0, + popularity: 0, + orgName: 'Test Org', + publishedAt: '', + updatedAt: '', + isPublished: true, + isDev: false, + isEnterprise: false, + isDeprecated: false, + isManaged: false, + isPreinstalled: { found: false, withVersion: false }, + ...overrides, + }; +} + +function createVersion(overrides?: Partial): Version { + return { + version: '1.0.0', + createdAt: '', + updatedAt: '', + isCompatible: true, + grafanaDependency: '', + angularDetected: false, + ...overrides, + }; +} diff --git a/public/app/features/plugins/admin/components/PluginActions.tsx b/public/app/features/plugins/admin/components/PluginActions.tsx index 1e993c75856..3403071f42a 100644 --- a/public/app/features/plugins/admin/components/PluginActions.tsx +++ b/public/app/features/plugins/admin/components/PluginActions.tsx @@ -1,14 +1,20 @@ import { css } from '@emotion/css'; import { useState } from 'react'; -import { GrafanaTheme2 } from '@grafana/data'; +import { GrafanaTheme2, PluginErrorCode } from '@grafana/data'; import { Icon, Stack, useStyles2 } from '@grafana/ui'; import { GetStartedWithPlugin } from '../components/GetStartedWithPlugin'; import { InstallControlsButton } from '../components/InstallControls'; -import { getLatestCompatibleVersion, hasInstallControlWarning, isInstallControlsEnabled } from '../helpers'; +import { + getLatestCompatibleVersion, + hasInstallControlWarning, + isDisabledAngularPlugin, + isInstallControlsEnabled, + isNonAngularVersion, +} from '../helpers'; import { useIsRemotePluginsAvailable } from '../state/hooks'; -import { CatalogPlugin, PluginStatus } from '../types'; +import { CatalogPlugin, PluginStatus, Version } from '../types'; interface Props { plugin?: CatalogPlugin; @@ -25,13 +31,8 @@ export const PluginActions = ({ plugin }: Props) => { } const hasInstallWarning = hasInstallControlWarning(plugin, isRemotePluginsAvailable, latestCompatibleVersion); - const pluginStatus = plugin.isInstalled - ? plugin.hasUpdate - ? PluginStatus.UPDATE - : PluginStatus.UNINSTALL - : PluginStatus.INSTALL; - const isInstallControlsDisabled = - plugin.isCore || plugin.isDisabled || plugin.isProvisioned || !isInstallControlsEnabled(); + const pluginStatus = getPluginStatus(plugin, latestCompatibleVersion); + const isInstallControlsDisabled = getInstallControlsDisabled(plugin, latestCompatibleVersion); return ( @@ -64,3 +65,41 @@ const getStyles = (theme: GrafanaTheme2) => { }), }; }; + +function getAngularPluginStatus(plugin: CatalogPlugin, latestCompatibleVersion: Version | undefined): PluginStatus { + if (!plugin.isInstalled) { + return PluginStatus.INSTALL; + } + + if (isNonAngularVersion(latestCompatibleVersion)) { + return PluginStatus.UPDATE; + } + + return PluginStatus.UNINSTALL; +} + +function getPluginStatus(plugin: CatalogPlugin, latestCompatibleVersion: Version | undefined) { + if (plugin.error === PluginErrorCode.angular) { + return getAngularPluginStatus(plugin, latestCompatibleVersion); + } + + if (!plugin.isInstalled) { + return PluginStatus.INSTALL; + } + + if (plugin.hasUpdate) { + return PluginStatus.UPDATE; + } + + return PluginStatus.UNINSTALL; +} + +function getInstallControlsDisabled(plugin: CatalogPlugin, latestCompatibleVersion: Version | undefined) { + if (isDisabledAngularPlugin(plugin) && isNonAngularVersion(latestCompatibleVersion)) { + return false; + } + + return plugin.isCore || plugin.isDisabled || plugin.isProvisioned || !isInstallControlsEnabled(); +} + +export { getPluginStatus, getInstallControlsDisabled }; diff --git a/public/app/features/plugins/admin/components/PluginDetailsDisabledError.tsx b/public/app/features/plugins/admin/components/PluginDetailsDisabledError.tsx index 333241a6634..15cef149c32 100644 --- a/public/app/features/plugins/admin/components/PluginDetailsDisabledError.tsx +++ b/public/app/features/plugins/admin/components/PluginDetailsDisabledError.tsx @@ -2,8 +2,10 @@ import { ReactElement } from 'react'; import { PluginErrorCode } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; -import { Alert } from '@grafana/ui'; +import { Alert, Stack } from '@grafana/ui'; +import { t, Trans } from 'app/core/internationalization'; +import { getLatestCompatibleVersion, isDisabledAngularPlugin, isNonAngularVersion } from '../helpers'; import { CatalogPlugin } from '../types'; type Props = { @@ -16,66 +18,122 @@ export function PluginDetailsDisabledError({ className, plugin }: Props): ReactE return null; } + const title = t('plugins.details.disabled-error.title', 'Plugin disabled'); + const isLatestCompatibleNotAngular = isNonAngularVersion(getLatestCompatibleVersion(plugin?.details?.versions)); + return ( - - {renderDescriptionFromError(plugin.error)} -

Please contact your server administrator to get this resolved.

- - Read more about managing plugins - + + {renderDescriptionFromError(plugin.error, plugin.id, isLatestCompatibleNotAngular)} + {!isDisabledAngularPlugin(plugin) && ( +

+ + Please contact your server administrator to get this resolved. + +

+ )} + + + Read more about managing plugins + + {plugin.error === PluginErrorCode.angular && ( + + + Read more about angular deprecation + + + )} +
); } -function renderDescriptionFromError(error?: PluginErrorCode): ReactElement { +function renderDescriptionFromError( + error?: PluginErrorCode, + id?: string, + isLatestCompatibleNotAngular?: boolean +): ReactElement { switch (error) { case PluginErrorCode.modifiedSignature: return (

- Grafana Labs checks each plugin to verify that it has a valid digital signature. While doing this, we - discovered that the content of this plugin does not match its signature. We can not guarantee the trustworthy - of this plugin and have therefore disabled it. We recommend you to reinstall the plugin to make sure you are - running a verified version of this plugin. + + Grafana Labs checks each plugin to verify that it has a valid digital signature. While doing this, we + discovered that the content of this plugin does not match its signature. We can not guarantee the + trustworthy of this plugin and have therefore disabled it. We recommend you to reinstall the plugin to make + sure you are running a verified version of this plugin. +

); case PluginErrorCode.invalidSignature: return (

- Grafana Labs checks each plugin to verify that it has a valid digital signature. While doing this, we - discovered that it was invalid. We can not guarantee the trustworthy of this plugin and have therefore - disabled it. We recommend you to reinstall the plugin to make sure you are running a verified version of this - plugin. + + Grafana Labs checks each plugin to verify that it has a valid digital signature. While doing this, we + discovered that it was invalid. We can not guarantee the trustworthy of this plugin and have therefore + disabled it. We recommend you to reinstall the plugin to make sure you are running a verified version of + this plugin. +

); case PluginErrorCode.missingSignature: return (

- Grafana Labs checks each plugin to verify that it has a valid digital signature. While doing this, we - discovered that there is no signature for this plugin. We can not guarantee the trustworthy of this plugin and - have therefore disabled it. We recommend you to reinstall the plugin to make sure you are running a verified - version of this plugin. + + Grafana Labs checks each plugin to verify that it has a valid digital signature. While doing this, we + discovered that there is no signature for this plugin. We can not guarantee the trustworthy of this plugin + and have therefore disabled it. We recommend you to reinstall the plugin to make sure you are running a + verified version of this plugin. +

); case PluginErrorCode.failedBackendStart: - return

This plugin failed to start. Server logs can provide more information.

; + return ( +

+ + This plugin failed to start. Server logs can provide more information. + +

+ ); case PluginErrorCode.angular: - // Error message already rendered by AngularDeprecationPluginNotice - return <>; + if (isLatestCompatibleNotAngular) { + return ( +

+ + This plugin has been disabled as Grafana no longer supports Angular based plugins. You can try updating + the plugin to the latest version to resolve this issue. You should then test to confirm it works as + expected. + +

+ ); + } + + return ( +

+ + This plugin has been disabled as Grafana no longer supports Angular based plugins. Unfortunately, the latest + version of this plugin still uses Angular so you need to wait for the plugin author to migrate to continue + using this plugin. + +

+ ); + default: return (

- We failed to run this plugin due to an unkown reason and have therefore disabled it. We recommend you to - reinstall the plugin to make sure you are running a working version of this plugin. + + We failed to run this plugin due to an unkown reason and have therefore disabled it. We recommend you to + reinstall the plugin to make sure you are running a working version of this plugin. +

); } diff --git a/public/app/features/plugins/admin/helpers.test.ts b/public/app/features/plugins/admin/helpers.test.ts index 4976659623a..d59a1b80835 100644 --- a/public/app/features/plugins/admin/helpers.test.ts +++ b/public/app/features/plugins/admin/helpers.test.ts @@ -1,4 +1,4 @@ -import { PluginSignatureStatus, PluginSignatureType, PluginType } from '@grafana/data'; +import { PluginErrorCode, PluginSignatureStatus, PluginSignatureType, PluginType } from '@grafana/data'; import { config } from '@grafana/runtime'; import { getLocalPluginMock, getRemotePluginMock, getCatalogPluginMock } from './__mocks__'; @@ -12,8 +12,10 @@ import { Sorters, isLocalPluginVisibleByConfig, isRemotePluginVisibleByConfig, + isNonAngularVersion, + isDisabledAngularPlugin, } from './helpers'; -import { RemotePlugin, LocalPlugin, RemotePluginStatus } from './types'; +import { RemotePlugin, LocalPlugin, RemotePluginStatus, Version, CatalogPlugin } from './types'; describe('Plugins/Helpers', () => { let remotePlugin: RemotePlugin; @@ -876,4 +878,35 @@ describe('Plugins/Helpers', () => { expect(isRemotePluginVisibleByConfig(plugin)).toBe(false); }); }); + + describe('isNonAngularVersion()', () => { + test('should return TRUE if the version is not using angular', () => { + expect(isNonAngularVersion({ angularDetected: false } as Version)).toBe(true); + }); + + test('should return FALSE if the version is using angular', () => { + expect(isNonAngularVersion({ angularDetected: true } as Version)).toBe(false); + }); + + test('should return FALSE if the version is not set', () => { + expect(isNonAngularVersion(undefined)).toBe(false); + }); + }); + + describe('isDisabledAngularPlugin', () => { + it('should return true for disabled angular plugins', () => { + const plugin = { isDisabled: true, error: PluginErrorCode.angular } as CatalogPlugin; + expect(isDisabledAngularPlugin(plugin)).toBe(true); + }); + + it('should return false for non-angular plugins', () => { + const plugin = { isDisabled: true, error: undefined } as CatalogPlugin; + expect(isDisabledAngularPlugin(plugin)).toBe(false); + }); + + it('should return false for plugins that are not disabled', () => { + const plugin = { isDisabled: false, error: undefined } as CatalogPlugin; + expect(isDisabledAngularPlugin(plugin)).toBe(false); + }); + }); }); diff --git a/public/app/features/plugins/admin/helpers.ts b/public/app/features/plugins/admin/helpers.ts index 8b0bfe80cfd..561f6ce04ee 100644 --- a/public/app/features/plugins/admin/helpers.ts +++ b/public/app/features/plugins/admin/helpers.ts @@ -480,3 +480,15 @@ export function shouldDisablePluginInstall(plugin: CatalogPlugin) { return false; } + +export function isNonAngularVersion(version?: Version) { + if (!version) { + return false; + } + + return version.angularDetected === false; +} + +export function isDisabledAngularPlugin(plugin: CatalogPlugin) { + return plugin.isDisabled && plugin.error === PluginErrorCode.angular; +} diff --git a/public/locales/en-US/grafana.json b/public/locales/en-US/grafana.json index cfd0d0f453d..693b3e5f120 100644 --- a/public/locales/en-US/grafana.json +++ b/public/locales/en-US/grafana.json @@ -3102,6 +3102,19 @@ "connections-tab": { "description": "You currently have the following data sources configured for {{pluginName}}, click a tile to view the configuration details. You can find all of your data source connections in <4><0>Connections - <3>Data sources." }, + "disabled-error": { + "angular-deprecation-link": "Read more about angular deprecation", + "angular-error-text": "This plugin has been disabled as Grafana no longer supports Angular based plugins. You can try updating the plugin to the latest version to resolve this issue. You should then test to confirm it works as expected.", + "angular-error-text-no-non-angular-version": "This plugin has been disabled as Grafana no longer supports Angular based plugins. Unfortunately, the latest version of this plugin still uses Angular so you need to wait for the plugin author to migrate to continue using this plugin.", + "contact-server-admin": "Please contact your server administrator to get this resolved.", + "failed-backend-start-text": "This plugin failed to start. Server logs can provide more information.", + "invalid-signature-text": "Grafana Labs checks each plugin to verify that it has a valid digital signature. While doing this, we discovered that it was invalid. We can not guarantee the trustworthy of this plugin and have therefore disabled it. We recommend you to reinstall the plugin to make sure you are running a verified version of this plugin.", + "manage-plugins-link": "Read more about managing plugins", + "missing-signature-text": "Grafana Labs checks each plugin to verify that it has a valid digital signature. While doing this, we discovered that there is no signature for this plugin. We can not guarantee the trustworthy of this plugin and have therefore disabled it. We recommend you to reinstall the plugin to make sure you are running a verified version of this plugin.", + "modified-signature-text": "Grafana Labs checks each plugin to verify that it has a valid digital signature. While doing this, we discovered that the content of this plugin does not match its signature. We can not guarantee the trustworthy of this plugin and have therefore disabled it. We recommend you to reinstall the plugin to make sure you are running a verified version of this plugin.", + "title": "Plugin disabled", + "unknown-error-text": "We failed to run this plugin due to an unkown reason and have therefore disabled it. We recommend you to reinstall the plugin to make sure you are running a working version of this plugin." + }, "labels": { "contactGrafanaLabs": "Contact Grafana Labs", "customLinks": "Custom links ", From 16934bca81d7dfb82dfdecae17c4d5df098d6f34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=A4ggmark?= Date: Mon, 17 Mar 2025 03:25:02 -0400 Subject: [PATCH 081/117] Update HALL_OF_FAME.md (#102267) --- HALL_OF_FAME.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HALL_OF_FAME.md b/HALL_OF_FAME.md index ec3ac31b6ae..dc14715d6eb 100644 --- a/HALL_OF_FAME.md +++ b/HALL_OF_FAME.md @@ -2,6 +2,6 @@ List of previous team members that have had a big impact on the company or the product and contributed during a long period of time. -- Hugo Häggmark ([Björn Lundén](https://www.bjornlunden.se/)) +- [Hugo Häggmark](https://github.com/hugohaggmark) - [Marcus Efraimsson](https://github.com/marefr) - [Giordano Ricci](https://github.com/elfo404) From 077f9e90d54728bb062318efeba757c4bac5d432 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20=C5=A0tibran=C3=BD?= Date: Mon, 17 Mar 2025 09:27:11 +0100 Subject: [PATCH 082/117] Fix format of timestamps sent to Spanner. (#102227) --- pkg/util/xorm/engine.go | 11 +++++++---- pkg/util/xorm/xorm.go | 28 ++++++++++++++++++---------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/pkg/util/xorm/engine.go b/pkg/util/xorm/engine.go index c64b7b29f4f..8db50041ae2 100644 --- a/pkg/util/xorm/engine.go +++ b/pkg/util/xorm/engine.go @@ -36,9 +36,10 @@ type Engine struct { showSQL bool showExecTime bool - logger core.ILogger - TZLocation *time.Location // The timezone of the application - DatabaseTZ *time.Location // The timezone of the database + logger core.ILogger + TZLocation *time.Location // The timezone of the application + DatabaseTZ *time.Location // The timezone of the database + timestampFormat string // Format applied to time.Time before passing it to database in Timestamp and DateTime columns. tagHandlers map[string]tagHandler @@ -748,7 +749,9 @@ func (engine *Engine) formatTime(sqlTypeName string, t time.Time) (v any) { v = s[11:19] case core.Date: v = t.Format("2006-01-02") - case core.DateTime, core.TimeStamp, core.Varchar: // !DarthPestilane! format time when sqlTypeName is core.Varchar. + case core.DateTime, core.TimeStamp: + v = t.Format(engine.timestampFormat) + case core.Varchar: // !DarthPestilane! format time when sqlTypeName is core.Varchar. v = t.Format("2006-01-02 15:04:05") case core.TimeStampz: v = t.Format(time.RFC3339Nano) diff --git a/pkg/util/xorm/xorm.go b/pkg/util/xorm/xorm.go index 40c1552cec5..25ce8bd952f 100644 --- a/pkg/util/xorm/xorm.go +++ b/pkg/util/xorm/xorm.go @@ -83,19 +83,27 @@ func NewEngine(driverName string, dataSourceName string) (*Engine, error) { } engine := &Engine{ - db: db, - dialect: dialect, - Tables: make(map[reflect.Type]*core.Table), - mutex: &sync.RWMutex{}, - TagIdentifier: "xorm", - TZLocation: time.Local, - tagHandlers: defaultTagHandlers, - defaultContext: context.Background(), + db: db, + dialect: dialect, + Tables: make(map[reflect.Type]*core.Table), + mutex: &sync.RWMutex{}, + TagIdentifier: "xorm", + TZLocation: time.Local, + tagHandlers: defaultTagHandlers, + defaultContext: context.Background(), + timestampFormat: "2006-01-02 15:04:05", } - if uri.DbType == core.SQLITE { + switch uri.DbType { + case core.SQLITE: engine.DatabaseTZ = time.UTC - } else { + case "spanner": + engine.DatabaseTZ = time.UTC + // We need to specify "Z" to indicate that timestamp is in UTC. + // Otherwise Spanner uses default America/Los_Angeles timezone. + // https://cloud.google.com/spanner/docs/reference/standard-sql/data-types#time_zones + engine.timestampFormat = "2006-01-02 15:04:05Z" + default: engine.DatabaseTZ = time.Local } From de6a48a233c7945e74373a496c6bb2091166e5f1 Mon Sep 17 00:00:00 2001 From: Denis Vodopianov Date: Mon, 17 Mar 2025 09:48:41 +0100 Subject: [PATCH 083/117] Chore: Replace bingo-managed tools with go tool directive. (#101890) --- .citools/bra/go.mod | 22 + .citools/bra/go.sum | 69 +++ .citools/cog/go.mod | 50 ++ .citools/cog/go.sum | 106 ++++ .citools/cue/go.mod | 37 ++ .citools/cue/go.sum | 74 +++ .citools/drone/go.mod | 77 +++ .citools/drone/go.sum | 338 ++++++++++++ .citools/golangci-lint/go.mod | 191 +++++++ .citools/golangci-lint/go.sum | 957 ++++++++++++++++++++++++++++++++++ .citools/jb/go.mod | 20 + .citools/jb/go.sum | 70 +++ .citools/lefthook/go.mod | 51 ++ .citools/lefthook/go.sum | 117 +++++ .github/CODEOWNERS | 1 + .github/workflows/go-lint.yml | 2 +- Dockerfile | 9 +- Makefile | 26 +- go.work | 9 +- go.work.sum | 224 ++++++-- kindsv2/Makefile | 4 +- 21 files changed, 2395 insertions(+), 59 deletions(-) create mode 100644 .citools/bra/go.mod create mode 100644 .citools/bra/go.sum create mode 100644 .citools/cog/go.mod create mode 100644 .citools/cog/go.sum create mode 100644 .citools/cue/go.mod create mode 100644 .citools/cue/go.sum create mode 100644 .citools/drone/go.mod create mode 100644 .citools/drone/go.sum create mode 100644 .citools/golangci-lint/go.mod create mode 100644 .citools/golangci-lint/go.sum create mode 100644 .citools/jb/go.mod create mode 100644 .citools/jb/go.sum create mode 100644 .citools/lefthook/go.mod create mode 100644 .citools/lefthook/go.sum diff --git a/.citools/bra/go.mod b/.citools/bra/go.mod new file mode 100644 index 00000000000..7562899364f --- /dev/null +++ b/.citools/bra/go.mod @@ -0,0 +1,22 @@ +module bra + +go 1.24.1 + +tool github.com/unknwon/bra + +require ( + github.com/BurntSushi/toml v1.4.0 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/smartystreets/goconvey v1.6.4 // indirect + github.com/stretchr/testify v1.10.0 // indirect + github.com/unknwon/bra v0.0.0-20200517080246-1e3013ecaff8 // indirect + github.com/unknwon/com v1.0.1 // indirect + github.com/unknwon/log v0.0.0-20200308114134-929b1006e34a // indirect + github.com/urfave/cli v1.22.16 // indirect + golang.org/x/sys v0.30.0 // indirect + gopkg.in/fsnotify/fsnotify.v1 v1.4.7 // indirect +) diff --git a/.citools/bra/go.sum b/.citools/bra/go.sum new file mode 100644 index 00000000000..c96783ededd --- /dev/null +++ b/.citools/bra/go.sum @@ -0,0 +1,69 @@ +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= +github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e h1:JKmoR8x90Iww1ks85zJ1lfDGgIiMDuIptTOhJq+zKyg= +github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304 h1:Jpy1PXuP99tXNrhbq2BaPz9B+jNAvH1JPQQpG/9GCXY= +github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/unknwon/bra v0.0.0-20200517080246-1e3013ecaff8 h1:aVGB3YnaS/JNfOW3tiHIlmNmTDg618va+eT0mVomgyI= +github.com/unknwon/bra v0.0.0-20200517080246-1e3013ecaff8/go.mod h1:fVle4kNr08ydeohzYafr20oZzbAkhQT39gKK/pFQ5M4= +github.com/unknwon/com v1.0.1 h1:3d1LTxD+Lnf3soQiD4Cp/0BRB+Rsa/+RTvz8GMMzIXs= +github.com/unknwon/com v1.0.1/go.mod h1:tOOxU81rwgoCLoOVVPHb6T/wt8HZygqH5id+GNnlCXM= +github.com/unknwon/log v0.0.0-20150304194804-e617c87089d3/go.mod h1:1xEUf2abjfP92w2GZTV+GgaRxXErwRXcClbUwrNJffU= +github.com/unknwon/log v0.0.0-20200308114134-929b1006e34a h1:vcrhXnj9g9PIE+cmZgaPSwOyJ8MAQTRmsgGrB0x5rF4= +github.com/unknwon/log v0.0.0-20200308114134-929b1006e34a/go.mod h1:1xEUf2abjfP92w2GZTV+GgaRxXErwRXcClbUwrNJffU= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.16 h1:MH0k6uJxdwdeWQTwhSO42Pwr4YLrNLwBtg1MRgTqPdQ= +github.com/urfave/cli v1.22.16/go.mod h1:EeJR6BKodywf4zciqrdw6hpCPk68JO9z5LazXZMn5Po= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20191020152052-9984515f0562/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify/fsnotify.v1 v1.4.7 h1:XNNYLJHt73EyYiCZi6+xjupS9CpvmiDgjPTAjrBlQbo= +gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/.citools/cog/go.mod b/.citools/cog/go.mod new file mode 100644 index 00000000000..51da6f35a87 --- /dev/null +++ b/.citools/cog/go.mod @@ -0,0 +1,50 @@ +module cog + +go 1.24.1 + +tool github.com/grafana/cog/cmd/cli + +require ( + cuelabs.dev/go/oci/ociregistry v0.0.0-20240906074133-82eb438dd565 // indirect + cuelang.org/go v0.11.1 // indirect + github.com/cockroachdb/apd/v3 v3.2.1 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/emicklei/proto v1.13.2 // indirect + github.com/expr-lang/expr v1.16.9 // indirect + github.com/getkin/kin-openapi v0.129.0 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/swag v0.23.0 // indirect + github.com/google/go-cmp v0.7.0 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/grafana/codejen v0.0.4-0.20230321061741-77f656893a3d // indirect + github.com/grafana/cog v0.0.27 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/huandu/xstrings v1.5.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/lib/pq v1.10.9 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/mitchellh/go-wordwrap v1.0.1 // indirect + github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect + github.com/oasdiff/yaml v0.0.0-20241210131133-6b86fb107d80 // indirect + github.com/oasdiff/yaml3 v0.0.0-20241210130736-a94c01f36349 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.1.0 // indirect + github.com/pelletier/go-toml/v2 v2.2.3 // indirect + github.com/perimeterx/marshmallow v1.1.5 // indirect + github.com/protocolbuffers/txtpbfmt v0.0.0-20241112170944-20d2c9ebc01d // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect + github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 // indirect + github.com/spf13/cobra v1.9.1 // indirect + github.com/spf13/pflag v1.0.6 // indirect + github.com/ugorji/go/codec v1.2.11 // indirect + github.com/yalue/merged_fs v1.3.0 // indirect + golang.org/x/mod v0.23.0 // indirect + golang.org/x/net v0.36.0 // indirect + golang.org/x/oauth2 v0.24.0 // indirect + golang.org/x/sync v0.11.0 // indirect + golang.org/x/text v0.22.0 // indirect + golang.org/x/tools v0.30.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/.citools/cog/go.sum b/.citools/cog/go.sum new file mode 100644 index 00000000000..2c12a9e6eac --- /dev/null +++ b/.citools/cog/go.sum @@ -0,0 +1,106 @@ +cuelabs.dev/go/oci/ociregistry v0.0.0-20240906074133-82eb438dd565 h1:R5wwEcbEZSBmeyg91MJZTxfd7WpBo2jPof3AYjRbxwY= +cuelabs.dev/go/oci/ociregistry v0.0.0-20240906074133-82eb438dd565/go.mod h1:5A4xfTzHTXfeVJBU6RAUf+QrlfTCW+017q/QiW+sMLg= +cuelang.org/go v0.11.1 h1:pV+49MX1mmvDm8Qh3Za3M786cty8VKPWzQ1Ho4gZRP0= +cuelang.org/go v0.11.1/go.mod h1:PBY6XvPUswPPJ2inpvUozP9mebDVTXaeehQikhZPBz0= +github.com/cockroachdb/apd/v3 v3.2.1 h1:U+8j7t0axsIgvQUqthuNm82HIrYXodOV2iWLWtEaIwg= +github.com/cockroachdb/apd/v3 v3.2.1/go.mod h1:klXJcjp+FffLTHlhIG69tezTDvdP065naDsHzKhYSqc= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/emicklei/proto v1.13.2 h1:z/etSFO3uyXeuEsVPzfl56WNgzcvIr42aQazXaQmFZY= +github.com/emicklei/proto v1.13.2/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A= +github.com/expr-lang/expr v1.16.9 h1:WUAzmR0JNI9JCiF0/ewwHB1gmcGw5wW7nWt8gc6PpCI= +github.com/expr-lang/expr v1.16.9/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= +github.com/getkin/kin-openapi v0.129.0 h1:QGYTNcmyP5X0AtFQ2Dkou9DGBJsUETeLH9rFrJXZh30= +github.com/getkin/kin-openapi v0.129.0/go.mod h1:gmWI+b/J45xqpyK5wJmRRZse5wefA5H0RDMK46kLUtI= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-quicktest/qt v1.101.0 h1:O1K29Txy5P2OK0dGo59b7b0LR6wKfIhttaAhHUyn7eI= +github.com/go-quicktest/qt v1.101.0/go.mod h1:14Bz/f7NwaXPtdYEgzsx46kqSxVwTbzVZsDC26tQJow= +github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= +github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/grafana/codejen v0.0.4-0.20230321061741-77f656893a3d h1:hrXbGJ5jgp6yNITzs5o+zXq0V5yT3siNJ+uM8LGwWKk= +github.com/grafana/codejen v0.0.4-0.20230321061741-77f656893a3d/go.mod h1:zmwwM/DRyQB7pfuBjTWII3CWtxcXh8LTwAYGfDfpR6s= +github.com/grafana/cog v0.0.27 h1:ZKipAtp6KuB08R16nZbqEjnje3e2r1O1bzOp1CetDEo= +github.com/grafana/cog v0.0.27/go.mod h1:JB5lhdn4Hqc0ztYCaNOTKZXoojzJvydBxMkMCGWS6+Q= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI= +github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/oasdiff/yaml v0.0.0-20241210131133-6b86fb107d80 h1:nZspmSkneBbtxU9TopEAE0CY+SBJLxO8LPUlw2vG4pU= +github.com/oasdiff/yaml v0.0.0-20241210131133-6b86fb107d80/go.mod h1:7tFDb+Y51LcDpn26GccuUgQXUk6t0CXZsivKjyimYX8= +github.com/oasdiff/yaml3 v0.0.0-20241210130736-a94c01f36349 h1:t05Ww3DxZutOqbMN+7OIuqDwXbhl32HiZGpLy26BAPc= +github.com/oasdiff/yaml3 v0.0.0-20241210130736-a94c01f36349/go.mod h1:y5+oSEHCPT/DGrS++Wc/479ERge0zTFxaF8PbGKcg2o= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= +github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= +github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/protocolbuffers/txtpbfmt v0.0.0-20241112170944-20d2c9ebc01d h1:HWfigq7lB31IeJL8iy7jkUmU/PG1Sr8jVGhS749dbUA= +github.com/protocolbuffers/txtpbfmt v0.0.0-20241112170944-20d2c9ebc01d/go.mod h1:jgxiZysxFPM+iWKwQwPR+y+Jvo54ARd4EisXxKYpB5c= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY= +github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= +github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/yalue/merged_fs v1.3.0 h1:qCeh9tMPNy/i8cwDsQTJ5bLr6IRxbs6meakNE5O+wyY= +github.com/yalue/merged_fs v1.3.0/go.mod h1:WqqchfVYQyclV2tnR7wtRhBddzBvLVR83Cjw9BKQw0M= +golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM= +golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/net v0.36.0 h1:vWF2fRbw4qslQsQzgFqZff+BItCvGFQqKzKIzx1rmoA= +golang.org/x/net v0.36.0/go.mod h1:bFmbeoIPfrw4sMHNhb4J9f6+tPziuGjq7Jk/38fxi1I= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= +golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY= +golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/.citools/cue/go.mod b/.citools/cue/go.mod new file mode 100644 index 00000000000..0584e0a256e --- /dev/null +++ b/.citools/cue/go.mod @@ -0,0 +1,37 @@ +module cue + +go 1.24.1 + +tool cuelang.org/go/cmd/cue + +require ( + cuelabs.dev/go/oci/ociregistry v0.0.0-20240906074133-82eb438dd565 // indirect + cuelang.org/go v0.11.1 // indirect + github.com/cockroachdb/apd/v3 v3.2.1 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/emicklei/proto v1.13.2 // indirect + github.com/google/go-cmp v0.7.0 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/lib/pq v1.10.9 // indirect + github.com/mitchellh/go-wordwrap v1.0.1 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.1.0 // indirect + github.com/pelletier/go-toml/v2 v2.2.3 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/protocolbuffers/txtpbfmt v0.0.0-20241112170944-20d2c9ebc01d // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect + github.com/spf13/cobra v1.9.1 // indirect + github.com/spf13/pflag v1.0.6 // indirect + github.com/stretchr/testify v1.10.0 // indirect + github.com/tetratelabs/wazero v1.6.0 // indirect + golang.org/x/mod v0.23.0 // indirect + golang.org/x/net v0.36.0 // indirect + golang.org/x/oauth2 v0.24.0 // indirect + golang.org/x/sync v0.11.0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/text v0.22.0 // indirect + golang.org/x/tools v0.30.0 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/.citools/cue/go.sum b/.citools/cue/go.sum new file mode 100644 index 00000000000..c535a6ae5eb --- /dev/null +++ b/.citools/cue/go.sum @@ -0,0 +1,74 @@ +cuelabs.dev/go/oci/ociregistry v0.0.0-20240906074133-82eb438dd565 h1:R5wwEcbEZSBmeyg91MJZTxfd7WpBo2jPof3AYjRbxwY= +cuelabs.dev/go/oci/ociregistry v0.0.0-20240906074133-82eb438dd565/go.mod h1:5A4xfTzHTXfeVJBU6RAUf+QrlfTCW+017q/QiW+sMLg= +cuelang.org/go v0.11.1 h1:pV+49MX1mmvDm8Qh3Za3M786cty8VKPWzQ1Ho4gZRP0= +cuelang.org/go v0.11.1/go.mod h1:PBY6XvPUswPPJ2inpvUozP9mebDVTXaeehQikhZPBz0= +github.com/cockroachdb/apd/v3 v3.2.1 h1:U+8j7t0axsIgvQUqthuNm82HIrYXodOV2iWLWtEaIwg= +github.com/cockroachdb/apd/v3 v3.2.1/go.mod h1:klXJcjp+FffLTHlhIG69tezTDvdP065naDsHzKhYSqc= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/emicklei/proto v1.13.2 h1:z/etSFO3uyXeuEsVPzfl56WNgzcvIr42aQazXaQmFZY= +github.com/emicklei/proto v1.13.2/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A= +github.com/go-quicktest/qt v1.101.0 h1:O1K29Txy5P2OK0dGo59b7b0LR6wKfIhttaAhHUyn7eI= +github.com/go-quicktest/qt v1.101.0/go.mod h1:14Bz/f7NwaXPtdYEgzsx46kqSxVwTbzVZsDC26tQJow= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/protocolbuffers/txtpbfmt v0.0.0-20241112170944-20d2c9ebc01d h1:HWfigq7lB31IeJL8iy7jkUmU/PG1Sr8jVGhS749dbUA= +github.com/protocolbuffers/txtpbfmt v0.0.0-20241112170944-20d2c9ebc01d/go.mod h1:jgxiZysxFPM+iWKwQwPR+y+Jvo54ARd4EisXxKYpB5c= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= +github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tetratelabs/wazero v1.6.0 h1:z0H1iikCdP8t+q341xqepY4EWvHEw8Es7tlqiVzlP3g= +github.com/tetratelabs/wazero v1.6.0/go.mod h1:0U0G41+ochRKoPKCJlh0jMg1CHkyfK8kDqiirMmKY8A= +golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM= +golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/net v0.36.0 h1:vWF2fRbw4qslQsQzgFqZff+BItCvGFQqKzKIzx1rmoA= +golang.org/x/net v0.36.0/go.mod h1:bFmbeoIPfrw4sMHNhb4J9f6+tPziuGjq7Jk/38fxi1I= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= +golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY= +golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/.citools/drone/go.mod b/.citools/drone/go.mod new file mode 100644 index 00000000000..4c1fba053f9 --- /dev/null +++ b/.citools/drone/go.mod @@ -0,0 +1,77 @@ +module drone + +go 1.24.1 + +tool github.com/drone/drone-cli/drone + +replace github.com/docker/docker => github.com/moby/moby v27.5.1+incompatible + +require ( + github.com/99designs/httpsignatures-go v0.0.0-20170731043157-88528bf4ca7e // indirect + github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/bmatcuk/doublestar v1.3.4 // indirect + github.com/buildkite/yaml v2.1.0+incompatible // indirect + github.com/containerd/log v0.1.0 // indirect + github.com/coreos/go-semver v0.3.1 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dchest/uniuri v1.2.0 // indirect + github.com/distribution/reference v0.6.0 // indirect + github.com/docker/distribution v2.8.2+incompatible // indirect + github.com/docker/docker v27.5.1+incompatible // indirect + github.com/docker/go-connections v0.5.0 // indirect + github.com/docker/go-units v0.5.0 // indirect + github.com/drone-runners/drone-runner-docker v1.8.3 // indirect + github.com/drone/drone-cli v1.8.0 // indirect + github.com/drone/drone-go v1.7.1 // indirect + github.com/drone/envsubst v1.0.3 // indirect + github.com/drone/funcmap v0.0.0-20220929084810-72602997d16f // indirect + github.com/drone/runner-go v1.12.0 // indirect + github.com/drone/signal v1.0.0 // indirect + github.com/fatih/color v1.18.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/google/go-jsonnet v0.18.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/jackspirou/syscerts v0.0.0-20160531025014-b68f5469dff1 // indirect + github.com/joho/godotenv v1.5.1 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect + github.com/moby/term v0.5.0 // indirect + github.com/natessilva/dag v0.0.0-20180124060714-7194b8dcc5c4 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.1.0 // indirect + github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/urfave/cli v1.22.16 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect + go.opentelemetry.io/otel v1.35.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 // indirect + go.opentelemetry.io/otel/metric v1.35.0 // indirect + go.opentelemetry.io/otel/trace v1.35.0 // indirect + go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect + golang.org/x/net v0.36.0 // indirect + golang.org/x/oauth2 v0.27.0 // indirect + golang.org/x/sync v0.11.0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/time v0.9.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250204164813-702378808489 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6 // indirect + google.golang.org/grpc v1.70.0 // indirect + google.golang.org/protobuf v1.36.5 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gotest.tools/v3 v3.5.1 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect +) diff --git a/.citools/drone/go.sum b/.citools/drone/go.sum new file mode 100644 index 00000000000..4e6b0dba301 --- /dev/null +++ b/.citools/drone/go.sum @@ -0,0 +1,338 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/99designs/basicauth-go v0.0.0-20160802081356-2a93ba0f464d/go.mod h1:3cARGAK9CfW3HoxCy1a0G4TKrdiKke8ftOMEOHyySYs= +github.com/99designs/httpsignatures-go v0.0.0-20170731043157-88528bf4ca7e h1:rl2Aq4ZODqTDkeSqQBy+fzpZPamacO1Srp8zq7jf2Sc= +github.com/99designs/httpsignatures-go v0.0.0-20170731043157-88528bf4ca7e/go.mod h1:Xa6lInWHNQnuWoF0YPSsx+INFA9qk7/7pTjwb3PInkY= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= +github.com/bmatcuk/doublestar v1.3.4 h1:gPypJ5xD31uhX6Tf54sDPUOBXTqKH4c9aPY66CyQrS0= +github.com/bmatcuk/doublestar v1.3.4/go.mod h1:wiQtGV+rzVYxB7WIlirSN++5HPtPlXEo9MEoZQC/PmE= +github.com/buildkite/yaml v2.1.0+incompatible h1:xirI+ql5GzfikVNDmt+yeiXpf/v1Gt03qXTtT5WXdr8= +github.com/buildkite/yaml v2.1.0+incompatible/go.mod h1:UoU8vbcwu1+vjZq01+KrpSeLBgQQIjL/H7Y6KwikUrI= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/containerd/containerd v1.3.4/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= +github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= +github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dchest/uniuri v0.0.0-20160212164326-8902c56451e9/go.mod h1:GgB8SF9nRG+GqaDtLcwJZsQFhcogVCJ79j4EdT0c2V4= +github.com/dchest/uniuri v1.2.0 h1:koIcOUdrTIivZgSLhHQvKgqdWZq5d7KdMEWF1Ud6+5g= +github.com/dchest/uniuri v1.2.0/go.mod h1:fSzm4SLHzNZvWLvWJew423PhAzkpNQYq+uNLq4kxhkY= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= +github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/drone-runners/drone-runner-docker v1.8.3 h1:uUnC45C1JMSLW+9uy6RoKG5ugzeXWN89pygs9BMLObY= +github.com/drone-runners/drone-runner-docker v1.8.3/go.mod h1:JR3pZeVZKKpkbTajiq0YtAx9WutkODdVKZGNR83kEwE= +github.com/drone/drone-cli v1.8.0 h1:tpp+GPonS87IKMZCGbIoa+zfDwiuJDL3NIC6S7neNrU= +github.com/drone/drone-cli v1.8.0/go.mod h1:zu6/7OpQjWBw/5VG0M3K4iJc6kSoTrjnY7CRLBrGH84= +github.com/drone/drone-go v1.7.1 h1:ZX+3Rs8YHUSUQ5mkuMLmm1zr1ttiiE2YGNxF3AnyDKw= +github.com/drone/drone-go v1.7.1/go.mod h1:fxCf9jAnXDZV1yDr0ckTuWd1intvcQwfJmTRpTZ1mXg= +github.com/drone/envsubst v1.0.2/go.mod h1:bkZbnc/2vh1M12Ecn7EYScpI4YGYU0etwLJICOWi8Z0= +github.com/drone/envsubst v1.0.3 h1:PCIBwNDYjs50AsLZPYdfhSATKaRg/FJmDc2D6+C2x8g= +github.com/drone/envsubst v1.0.3/go.mod h1:N2jZmlMufstn1KEqvbHjw40h1KyTmnVzHcSc9bFiJ2g= +github.com/drone/funcmap v0.0.0-20220929084810-72602997d16f h1:/jEs7lulqVO2u1+XI5rW4oFwIIusxuDOVKD9PAzlW2E= +github.com/drone/funcmap v0.0.0-20220929084810-72602997d16f/go.mod h1:nDRkX7PHq+p39AD5/usv3KZMerxZTYU/9rfLS5IDspU= +github.com/drone/runner-go v1.12.0 h1:zUjDj9ylsJ4n4Mvy4znddq/Z4EBzcUXzTltpzokKtgs= +github.com/drone/runner-go v1.12.0/go.mod h1:vu4pPPYDoeN6vdYQAY01GGGsAIW4aLganJNaa8Fx8zE= +github.com/drone/signal v1.0.0 h1:NrnM2M/4yAuU/tXs6RP1a1ZfxnaHwYkd0kJurA1p6uI= +github.com/drone/signal v1.0.0/go.mod h1:S8t92eFT0g4WUgEc/LxG+LCuiskpMNsG0ajAMGnyZpc= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 h1:Mn26/9ZMNWSw9C9ERFA1PUxfmGpolnw2v0bKOREu5ew= +github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32/go.mod h1:GIjDIg/heH5DOkXY3YJ/wNhfHsQHoXGjl8G8amsYQ1I= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/gogo/protobuf v0.0.0-20170307180453-100ba4e88506/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/go-jsonnet v0.18.0 h1:/6pTy6g+Jh1a1I2UMoAODkqELFiVIdOxbNwv0DDzoOg= +github.com/google/go-jsonnet v0.18.0/go.mod h1:C3fTzyVJDslXdiTqw/bTFk7vSGyCtH3MGRbDfvEwGd0= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 h1:e9Rjr40Z98/clHv5Yg79Is0NtosR5LXRvdr7o/6NwbA= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1/go.mod h1:tIxuGz/9mpox++sgp9fJjHO0+q1X9/UOWd798aAm22M= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/jackspirou/syscerts v0.0.0-20160531025014-b68f5469dff1 h1:9Xm8CKtMZIXgcopfdWk/qZ1rt0HjMgfMR9nxxSeK6vk= +github.com/jackspirou/syscerts v0.0.0-20160531025014-b68f5469dff1/go.mod h1:zuHl3Hh+e9P6gmBPvcqR1HjkaWHC/csgyskg6IaFKFo= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= +github.com/moby/moby v27.5.1+incompatible h1:/pN59F/t3U7Q4FPzV88nzqf7Fp0qqCSL2KzhZaiKcKw= +github.com/moby/moby v27.5.1+incompatible/go.mod h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/natessilva/dag v0.0.0-20180124060714-7194b8dcc5c4 h1:dnMxwus89s86tI8rcGVp2HwZzlz7c5o92VOy7dSckBQ= +github.com/natessilva/dag v0.0.0-20180124060714-7194b8dcc5c4/go.mod h1:cojhOHk1gbMeklOyDP2oKKLftefXoJreOQGOrXk+Z38= +github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/urfave/cli v1.22.16 h1:MH0k6uJxdwdeWQTwhSO42Pwr4YLrNLwBtg1MRgTqPdQ= +github.com/urfave/cli v1.22.16/go.mod h1:EeJR6BKodywf4zciqrdw6hpCPk68JO9z5LazXZMn5Po= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ= +go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= +go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 h1:BEj3SPM81McUZHYjRS5pEgNgnmzGJ5tRpU5krWnV8Bs= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0/go.mod h1:9cKLGBDzI/F3NoHLQGm4ZrYdIHsvGt6ej6hUowxY0J4= +go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= +go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE= +go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY= +go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg= +go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o= +go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w= +go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= +go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= +go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= +go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= +go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= +go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.36.0 h1:vWF2fRbw4qslQsQzgFqZff+BItCvGFQqKzKIzx1rmoA= +golang.org/x/net v0.36.0/go.mod h1:bFmbeoIPfrw4sMHNhb4J9f6+tPziuGjq7Jk/38fxi1I= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M= +golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY= +golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto/googleapis/api v0.0.0-20250204164813-702378808489 h1:fCuMM4fowGzigT89NCIsW57Pk9k2D12MMi2ODn+Nk+o= +google.golang.org/genproto/googleapis/api v0.0.0-20250204164813-702378808489/go.mod h1:iYONQfRdizDB8JJBybql13nArx91jcUk7zCXEsOofM4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6 h1:2duwAxN2+k0xLNpjnHTXoMUgnv6VPSp5fiqTuwSxjmI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ= +google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= +google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/.citools/golangci-lint/go.mod b/.citools/golangci-lint/go.mod new file mode 100644 index 00000000000..93df12ec8c3 --- /dev/null +++ b/.citools/golangci-lint/go.mod @@ -0,0 +1,191 @@ +module golangci-lint + +go 1.24.1 + +tool github.com/golangci/golangci-lint/cmd/golangci-lint + +require ( + 4d63.com/gocheckcompilerdirectives v1.2.1 // indirect + 4d63.com/gochecknoglobals v0.2.1 // indirect + github.com/4meepo/tagalign v1.3.4 // indirect + github.com/Abirdcfly/dupword v0.1.3 // indirect + github.com/Antonboom/errname v1.0.0 // indirect + github.com/Antonboom/nilnil v1.0.0 // indirect + github.com/Antonboom/testifylint v1.5.0 // indirect + github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c // indirect + github.com/Crocmagnon/fatcontext v0.5.2 // indirect + github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect + github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.0 // indirect + github.com/Masterminds/semver/v3 v3.3.0 // indirect + github.com/OpenPeeDeeP/depguard/v2 v2.2.0 // indirect + github.com/alecthomas/go-check-sumtype v0.2.0 // indirect + github.com/alexkohler/nakedret/v2 v2.0.5 // indirect + github.com/alexkohler/prealloc v1.0.0 // indirect + github.com/alingse/asasalint v0.0.11 // indirect + github.com/ashanbrown/forbidigo v1.6.0 // indirect + github.com/ashanbrown/makezero v1.1.1 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bkielbasa/cyclop v1.2.3 // indirect + github.com/blizzy78/varnamelen v0.8.0 // indirect + github.com/bombsimon/wsl/v4 v4.4.1 // indirect + github.com/breml/bidichk v0.3.2 // indirect + github.com/breml/errchkjson v0.4.0 // indirect + github.com/butuzov/ireturn v0.3.0 // indirect + github.com/butuzov/mirror v1.2.0 // indirect + github.com/catenacyber/perfsprint v0.7.1 // indirect + github.com/ccojocar/zxcvbn-go v1.0.2 // indirect + github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/charithe/durationcheck v0.0.10 // indirect + github.com/chavacava/garif v0.1.0 // indirect + github.com/ckaznocha/intrange v0.2.1 // indirect + github.com/curioswitch/go-reassign v0.2.0 // indirect + github.com/daixiang0/gci v0.13.5 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/denis-tingaikin/go-header v0.5.0 // indirect + github.com/ettle/strcase v0.2.0 // indirect + github.com/fatih/color v1.18.0 // indirect + github.com/fatih/structtag v1.2.0 // indirect + github.com/firefart/nonamedreturns v1.0.5 // indirect + github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/fzipp/gocyclo v0.6.0 // indirect + github.com/ghostiam/protogetter v0.3.8 // indirect + github.com/go-critic/go-critic v0.11.5 // indirect + github.com/go-toolsmith/astcast v1.1.0 // indirect + github.com/go-toolsmith/astcopy v1.1.0 // indirect + github.com/go-toolsmith/astequal v1.2.0 // indirect + github.com/go-toolsmith/astfmt v1.1.0 // indirect + github.com/go-toolsmith/astp v1.1.0 // indirect + github.com/go-toolsmith/strparse v1.1.0 // indirect + github.com/go-toolsmith/typep v1.1.0 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/go-xmlfmt/xmlfmt v1.1.2 // indirect + github.com/gobwas/glob v0.2.3 // indirect + github.com/gofrs/flock v0.12.1 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a // indirect + github.com/golangci/go-printf-func-name v0.1.0 // indirect + github.com/golangci/gofmt v0.0.0-20240816233607-d8596aa466a9 // indirect + github.com/golangci/golangci-lint v1.62.0 // indirect + github.com/golangci/misspell v0.6.0 // indirect + github.com/golangci/modinfo v0.3.4 // indirect + github.com/golangci/plugin-module-register v0.1.1 // indirect + github.com/golangci/revgrep v0.5.3 // indirect + github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/gordonklaus/ineffassign v0.1.0 // indirect + github.com/gostaticanalysis/analysisutil v0.7.1 // indirect + github.com/gostaticanalysis/comment v1.4.2 // indirect + github.com/gostaticanalysis/forcetypeassert v0.1.0 // indirect + github.com/gostaticanalysis/nilerr v0.1.1 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/hexops/gotextdiff v1.0.3 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/jgautheron/goconst v1.7.1 // indirect + github.com/jingyugao/rowserrcheck v1.1.1 // indirect + github.com/jjti/go-spancheck v0.6.2 // indirect + github.com/julz/importas v0.1.0 // indirect + github.com/karamaru-alpha/copyloopvar v1.1.0 // indirect + github.com/kisielk/errcheck v1.8.0 // indirect + github.com/kkHAIKE/contextcheck v1.1.5 // indirect + github.com/kulti/thelper v0.6.3 // indirect + github.com/kunwardeep/paralleltest v1.0.10 // indirect + github.com/kyoh86/exportloopref v0.1.11 // indirect + github.com/lasiar/canonicalheader v1.1.2 // indirect + github.com/ldez/gomoddirectives v0.2.4 // indirect + github.com/ldez/tagliatelle v0.5.0 // indirect + github.com/leonklingele/grouper v1.1.2 // indirect + github.com/macabu/inamedparam v0.1.3 // indirect + github.com/magiconair/properties v1.8.6 // indirect + github.com/maratori/testableexamples v1.0.0 // indirect + github.com/maratori/testpackage v1.1.1 // indirect + github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect + github.com/mgechev/revive v1.5.0 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/moricho/tparallel v0.3.2 // indirect + github.com/nakabonne/nestif v0.3.1 // indirect + github.com/nishanths/exhaustive v0.12.0 // indirect + github.com/nishanths/predeclared v0.2.2 // indirect + github.com/nunnatsa/ginkgolinter v0.18.0 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/pelletier/go-toml/v2 v2.2.3 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/polyfloyd/go-errorlint v1.6.0 // indirect + github.com/prometheus/client_golang v1.12.1 // indirect + github.com/prometheus/client_model v0.2.0 // indirect + github.com/prometheus/common v0.32.1 // indirect + github.com/prometheus/procfs v0.7.3 // indirect + github.com/quasilyte/go-ruleguard v0.4.3-0.20240823090925-0fe6f58b47b1 // indirect + github.com/quasilyte/go-ruleguard/dsl v0.3.22 // indirect + github.com/quasilyte/gogrep v0.5.0 // indirect + github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect + github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect + github.com/raeperd/recvcheck v0.1.2 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect + github.com/ryancurrah/gomodguard v1.3.5 // indirect + github.com/ryanrolds/sqlclosecheck v0.5.1 // indirect + github.com/sanposhiho/wastedassign/v2 v2.0.7 // indirect + github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 // indirect + github.com/sashamelentyev/interfacebloat v1.1.0 // indirect + github.com/sashamelentyev/usestdlibvars v1.27.0 // indirect + github.com/securego/gosec/v2 v2.21.4 // indirect + github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/sivchari/containedctx v1.0.3 // indirect + github.com/sivchari/tenv v1.12.1 // indirect + github.com/sonatard/noctx v0.1.0 // indirect + github.com/sourcegraph/go-diff v0.7.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/cobra v1.8.1 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/viper v1.12.0 // indirect + github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect + github.com/stbenjam/no-sprintf-host-port v0.1.1 // indirect + github.com/stretchr/objx v0.5.2 // indirect + github.com/stretchr/testify v1.9.0 // indirect + github.com/subosito/gotenv v1.4.1 // indirect + github.com/tdakkota/asciicheck v0.2.0 // indirect + github.com/tetafro/godot v1.4.18 // indirect + github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966 // indirect + github.com/timonwong/loggercheck v0.10.1 // indirect + github.com/tomarrell/wrapcheck/v2 v2.9.0 // indirect + github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect + github.com/ultraware/funlen v0.1.0 // indirect + github.com/ultraware/whitespace v0.1.1 // indirect + github.com/uudashr/gocognit v1.1.3 // indirect + github.com/uudashr/iface v1.2.0 // indirect + github.com/xen0n/gosmopolitan v1.2.2 // indirect + github.com/yagipy/maintidx v1.0.0 // indirect + github.com/yeya24/promlinter v0.3.0 // indirect + github.com/ykadowak/zerologlint v0.1.5 // indirect + gitlab.com/bosi/decorder v0.4.2 // indirect + go-simpler.org/musttag v0.13.0 // indirect + go-simpler.org/sloglint v0.7.2 // indirect + go.uber.org/atomic v1.7.0 // indirect + go.uber.org/automaxprocs v1.6.0 // indirect + go.uber.org/multierr v1.6.0 // indirect + go.uber.org/zap v1.24.0 // indirect + golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect + golang.org/x/exp/typeparams v0.0.0-20240909161429-701f63a606c0 // indirect + golang.org/x/mod v0.22.0 // indirect + golang.org/x/sync v0.9.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.18.0 // indirect + golang.org/x/tools v0.27.0 // indirect + google.golang.org/protobuf v1.34.2 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + honnef.co/go/tools v0.5.1 // indirect + mvdan.cc/gofumpt v0.7.0 // indirect + mvdan.cc/unparam v0.0.0-20240528143540-8a5130ca722f // indirect +) diff --git a/.citools/golangci-lint/go.sum b/.citools/golangci-lint/go.sum new file mode 100644 index 00000000000..c8205a75d73 --- /dev/null +++ b/.citools/golangci-lint/go.sum @@ -0,0 +1,957 @@ +4d63.com/gocheckcompilerdirectives v1.2.1 h1:AHcMYuw56NPjq/2y615IGg2kYkBdTvOaojYCBcRE7MA= +4d63.com/gocheckcompilerdirectives v1.2.1/go.mod h1:yjDJSxmDTtIHHCqX0ufRYZDL6vQtMG7tJdKVeWwsqvs= +4d63.com/gochecknoglobals v0.2.1 h1:1eiorGsgHOFOuoOiJDy2psSrQbRdIHrlge0IJIkUgDc= +4d63.com/gochecknoglobals v0.2.1/go.mod h1:KRE8wtJB3CXCsb1xy421JfTHIIbmT3U5ruxw2Qu8fSU= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/4meepo/tagalign v1.3.4 h1:P51VcvBnf04YkHzjfclN6BbsopfJR5rxs1n+5zHt+w8= +github.com/4meepo/tagalign v1.3.4/go.mod h1:M+pnkHH2vG8+qhE5bVc/zeP7HS/j910Fwa9TUSyZVI0= +github.com/Abirdcfly/dupword v0.1.3 h1:9Pa1NuAsZvpFPi9Pqkd93I7LIYRURj+A//dFd5tgBeE= +github.com/Abirdcfly/dupword v0.1.3/go.mod h1:8VbB2t7e10KRNdwTVoxdBaxla6avbhGzb8sCTygUMhw= +github.com/Antonboom/errname v1.0.0 h1:oJOOWR07vS1kRusl6YRSlat7HFnb3mSfMl6sDMRoTBA= +github.com/Antonboom/errname v1.0.0/go.mod h1:gMOBFzK/vrTiXN9Oh+HFs+e6Ndl0eTFbtsRTSRdXyGI= +github.com/Antonboom/nilnil v1.0.0 h1:n+v+B12dsE5tbAqRODXmEKfZv9j2KcTBrp+LkoM4HZk= +github.com/Antonboom/nilnil v1.0.0/go.mod h1:fDJ1FSFoLN6yoG65ANb1WihItf6qt9PJVTn/s2IrcII= +github.com/Antonboom/testifylint v1.5.0 h1:dlUIsDMtCrZWUnvkaCz3quJCoIjaGi41GzjPBGkkJ8A= +github.com/Antonboom/testifylint v1.5.0/go.mod h1:wqaJbu0Blb5Wag2wv7Z5xt+CIV+eVLxtGZrlK13z3AE= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c h1:pxW6RcqyfI9/kWtOwnv/G+AzdKuy2ZrqINhenH4HyNs= +github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/Crocmagnon/fatcontext v0.5.2 h1:vhSEg8Gqng8awhPju2w7MKHqMlg4/NI+gSDHtR3xgwA= +github.com/Crocmagnon/fatcontext v0.5.2/go.mod h1:87XhRMaInHP44Q7Tlc7jkgKKB7kZAOPiDkFMdKCC+74= +github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rWPdisA5ynNEsoARbiCBOyGcJM4/OzsM= +github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.0 h1:/fTUt5vmbkAcMBt4YQiuC23cV0kEsN1MVMNqeOW43cU= +github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.0/go.mod h1:ONJg5sxcbsdQQ4pOW8TGdTidT2TMAUy/2Xhr8mrYaao= +github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0= +github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/OpenPeeDeeP/depguard/v2 v2.2.0 h1:vDfG60vDtIuf0MEOhmLlLLSzqaRM8EMcgJPdp74zmpA= +github.com/OpenPeeDeeP/depguard/v2 v2.2.0/go.mod h1:CIzddKRvLBC4Au5aYP/i3nyaWQ+ClszLIuVocRiCYFQ= +github.com/alecthomas/assert/v2 v2.2.2 h1:Z/iVC0xZfWTaFNE6bA3z07T86hd45Xe2eLt6WVy2bbk= +github.com/alecthomas/assert/v2 v2.2.2/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= +github.com/alecthomas/go-check-sumtype v0.2.0 h1:Bo+e4DFf3rs7ME9w/0SU/g6nmzJaphduP8Cjiz0gbwY= +github.com/alecthomas/go-check-sumtype v0.2.0/go.mod h1:WyYPfhfkdhyrdaligV6svFopZV8Lqdzn5pyVBaV6jhQ= +github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk= +github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alexkohler/nakedret/v2 v2.0.5 h1:fP5qLgtwbx9EJE8dGEERT02YwS8En4r9nnZ71RK+EVU= +github.com/alexkohler/nakedret/v2 v2.0.5/go.mod h1:bF5i0zF2Wo2o4X4USt9ntUWve6JbFv02Ff4vlkmS/VU= +github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pOcUuw= +github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= +github.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQRnw= +github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I= +github.com/ashanbrown/forbidigo v1.6.0 h1:D3aewfM37Yb3pxHujIPSpTf6oQk9sc9WZi8gerOIVIY= +github.com/ashanbrown/forbidigo v1.6.0/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1MUyfOKL+AjcU= +github.com/ashanbrown/makezero v1.1.1 h1:iCQ87C0V0vSyO+M9E/FZYbu65auqH0lnsOkf5FcB28s= +github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI= +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bkielbasa/cyclop v1.2.3 h1:faIVMIGDIANuGPWH031CZJTi2ymOQBULs9H21HSMa5w= +github.com/bkielbasa/cyclop v1.2.3/go.mod h1:kHTwA9Q0uZqOADdupvcFJQtp/ksSnytRMe8ztxG8Fuo= +github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M= +github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= +github.com/bombsimon/wsl/v4 v4.4.1 h1:jfUaCkN+aUpobrMO24zwyAMwMAV5eSziCkOKEauOLdw= +github.com/bombsimon/wsl/v4 v4.4.1/go.mod h1:Xu/kDxGZTofQcDGCtQe9KCzhHphIe0fDuyWTxER9Feo= +github.com/breml/bidichk v0.3.2 h1:xV4flJ9V5xWTqxL+/PMFF6dtJPvZLPsyixAoPe8BGJs= +github.com/breml/bidichk v0.3.2/go.mod h1:VzFLBxuYtT23z5+iVkamXO386OB+/sVwZOpIj6zXGos= +github.com/breml/errchkjson v0.4.0 h1:gftf6uWZMtIa/Is3XJgibewBm2ksAQSY/kABDNFTAdk= +github.com/breml/errchkjson v0.4.0/go.mod h1:AuBOSTHyLSaaAFlWsRSuRBIroCh3eh7ZHh5YeelDIk8= +github.com/butuzov/ireturn v0.3.0 h1:hTjMqWw3y5JC3kpnC5vXmFJAWI/m31jaCYQqzkS6PL0= +github.com/butuzov/ireturn v0.3.0/go.mod h1:A09nIiwiqzN/IoVo9ogpa0Hzi9fex1kd9PSD6edP5ZA= +github.com/butuzov/mirror v1.2.0 h1:9YVK1qIjNspaqWutSv8gsge2e/Xpq1eqEkslEUHy5cs= +github.com/butuzov/mirror v1.2.0/go.mod h1:DqZZDtzm42wIAIyHXeN8W/qb1EPlb9Qn/if9icBOpdQ= +github.com/catenacyber/perfsprint v0.7.1 h1:PGW5G/Kxn+YrN04cRAZKC+ZuvlVwolYMrIyyTJ/rMmc= +github.com/catenacyber/perfsprint v0.7.1/go.mod h1:/wclWYompEyjUD2FuIIDVKNkqz7IgBIWXIH3V0Zol50= +github.com/ccojocar/zxcvbn-go v1.0.2 h1:na/czXU8RrhXO4EZme6eQJLR4PzcGsahsBOAwU6I3Vg= +github.com/ccojocar/zxcvbn-go v1.0.2/go.mod h1:g1qkXtUSvHP8lhHp5GrSmTz6uWALGRMQdw6Qnz/hi60= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/charithe/durationcheck v0.0.10 h1:wgw73BiocdBDQPik+zcEoBG/ob8uyBHf2iyoHGPf5w4= +github.com/charithe/durationcheck v0.0.10/go.mod h1:bCWXb7gYRysD1CU3C+u4ceO49LoGOY1C1L6uouGNreQ= +github.com/chavacava/garif v0.1.0 h1:2JHa3hbYf5D9dsgseMKAmc/MZ109otzgNFk5s87H9Pc= +github.com/chavacava/garif v0.1.0/go.mod h1:XMyYCkEL58DF0oyW4qDjjnPWONs2HBqYKI+UIPD+Gww= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/ckaznocha/intrange v0.2.1 h1:M07spnNEQoALOJhwrImSrJLaxwuiQK+hA2DeajBlwYk= +github.com/ckaznocha/intrange v0.2.1/go.mod h1:7NEhVyf8fzZO5Ds7CRaqPEm52Ut83hsTiL5zbER/HYk= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/curioswitch/go-reassign v0.2.0 h1:G9UZyOcpk/d7Gd6mqYgd8XYWFMw/znxwGDUstnC9DIo= +github.com/curioswitch/go-reassign v0.2.0/go.mod h1:x6OpXuWvgfQaMGks2BZybTngWjT84hqJfKoO8Tt/Roc= +github.com/daixiang0/gci v0.13.5 h1:kThgmH1yBmZSBCh1EJVxQ7JsHpm5Oms0AMed/0LaH4c= +github.com/daixiang0/gci v0.13.5/go.mod h1:12etP2OniiIdP4q+kjUGrC/rUagga7ODbqsom5Eo5Yk= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denis-tingaikin/go-header v0.5.0 h1:SRdnP5ZKvcO9KKRP1KJrhFR3RrlGuD+42t4429eC9k8= +github.com/denis-tingaikin/go-header v0.5.0/go.mod h1:mMenU5bWrok6Wl2UsZjy+1okegmwQ3UgWl4V1D8gjlY= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/ettle/strcase v0.2.0 h1:fGNiVF21fHXpX1niBgk0aROov1LagYsOwV/xqKDKR/Q= +github.com/ettle/strcase v0.2.0/go.mod h1:DajmHElDSaX76ITe3/VHVyMin4LWSJN5Z909Wp+ED1A= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= +github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= +github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= +github.com/firefart/nonamedreturns v1.0.5 h1:tM+Me2ZaXs8tfdDw3X6DOX++wMCOqzYUho6tUTYIdRA= +github.com/firefart/nonamedreturns v1.0.5/go.mod h1:gHJjDqhGM4WyPt639SOZs+G89Ko7QKH5R5BhnO6xJhw= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= +github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= +github.com/ghostiam/protogetter v0.3.8 h1:LYcXbYvybUyTIxN2Mj9h6rHrDZBDwZloPoKctWrFyJY= +github.com/ghostiam/protogetter v0.3.8/go.mod h1:WZ0nw9pfzsgxuRsPOFQomgDVSWtDLJRfQJEhsGbmQMA= +github.com/go-critic/go-critic v0.11.5 h1:TkDTOn5v7EEngMxu8KbuFqFR43USaaH8XRJLz1jhVYA= +github.com/go-critic/go-critic v0.11.5/go.mod h1:wu6U7ny9PiaHaZHcvMDmdysMqvDem162Rh3zWTrqk8M= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-quicktest/qt v1.101.0 h1:O1K29Txy5P2OK0dGo59b7b0LR6wKfIhttaAhHUyn7eI= +github.com/go-quicktest/qt v1.101.0/go.mod h1:14Bz/f7NwaXPtdYEgzsx46kqSxVwTbzVZsDC26tQJow= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/go-toolsmith/astcast v1.1.0 h1:+JN9xZV1A+Re+95pgnMgDboWNVnIMMQXwfBwLRPgSC8= +github.com/go-toolsmith/astcast v1.1.0/go.mod h1:qdcuFWeGGS2xX5bLM/c3U9lewg7+Zu4mr+xPwZIB4ZU= +github.com/go-toolsmith/astcopy v1.1.0 h1:YGwBN0WM+ekI/6SS6+52zLDEf8Yvp3n2seZITCUBt5s= +github.com/go-toolsmith/astcopy v1.1.0/go.mod h1:hXM6gan18VA1T/daUEHCFcYiW8Ai1tIwIzHY6srfEAw= +github.com/go-toolsmith/astequal v1.0.3/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4= +github.com/go-toolsmith/astequal v1.1.0/go.mod h1:sedf7VIdCL22LD8qIvv7Nn9MuWJruQA/ysswh64lffQ= +github.com/go-toolsmith/astequal v1.2.0 h1:3Fs3CYZ1k9Vo4FzFhwwewC3CHISHDnVUPC4x0bI2+Cw= +github.com/go-toolsmith/astequal v1.2.0/go.mod h1:c8NZ3+kSFtFY/8lPso4v8LuJjdJiUFVnSuU3s0qrrDY= +github.com/go-toolsmith/astfmt v1.1.0 h1:iJVPDPp6/7AaeLJEruMsBUlOYCmvg0MoCfJprsOmcco= +github.com/go-toolsmith/astfmt v1.1.0/go.mod h1:OrcLlRwu0CuiIBp/8b5PYF9ktGVZUjlNMV634mhwuQ4= +github.com/go-toolsmith/astp v1.1.0 h1:dXPuCl6u2llURjdPLLDxJeZInAeZ0/eZwFJmqZMnpQA= +github.com/go-toolsmith/astp v1.1.0/go.mod h1:0T1xFGz9hicKs8Z5MfAqSUitoUYS30pDMsRVIDHs8CA= +github.com/go-toolsmith/pkgload v1.2.2 h1:0CtmHq/02QhxcF7E9N5LIFcYFsMR5rdovfqTtRKkgIk= +github.com/go-toolsmith/pkgload v1.2.2/go.mod h1:R2hxLNRKuAsiXCo2i5J6ZQPhnPMOVtU+f0arbFPWCus= +github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= +github.com/go-toolsmith/strparse v1.1.0 h1:GAioeZUK9TGxnLS+qfdqNbA4z0SSm5zVNtCQiyP2Bvw= +github.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJin1rfoPS4lBSQ= +github.com/go-toolsmith/typep v1.1.0 h1:fIRYDyF+JywLfqzyhdiHzRop/GQDxxNhLGQ6gFUNHus= +github.com/go-toolsmith/typep v1.1.0/go.mod h1:fVIw+7zjdsMxDA3ITWnH1yOiw1rnTQKCsF/sk2H/qig= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-xmlfmt/xmlfmt v1.1.2 h1:Nea7b4icn8s57fTx1M5AI4qQT5HEM3rVUO8MuE6g80U= +github.com/go-xmlfmt/xmlfmt v1.1.2/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E= +github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= +github.com/golangci/go-printf-func-name v0.1.0 h1:dVokQP+NMTO7jwO4bwsRwLWeudOVUPPyAKJuzv8pEJU= +github.com/golangci/go-printf-func-name v0.1.0/go.mod h1:wqhWFH5mUdJQhweRnldEywnR5021wTdZSNgwYceV14s= +github.com/golangci/gofmt v0.0.0-20240816233607-d8596aa466a9 h1:/1322Qns6BtQxUZDTAT4SdcoxknUki7IAoK4SAXr8ME= +github.com/golangci/gofmt v0.0.0-20240816233607-d8596aa466a9/go.mod h1:Oesb/0uFAyWoaw1U1qS5zyjCg5NP9C9iwjnI4tIsXEE= +github.com/golangci/golangci-lint v1.62.0 h1:/G0g+bi1BhmGJqLdNQkKBWjcim8HjOPc4tsKuHDOhcI= +github.com/golangci/golangci-lint v1.62.0/go.mod h1:jtoOhQcKTz8B6dGNFyfQV3WZkQk+YvBDewDtNpiAJts= +github.com/golangci/misspell v0.6.0 h1:JCle2HUTNWirNlDIAUO44hUsKhOFqGPoC4LZxlaSXDs= +github.com/golangci/misspell v0.6.0/go.mod h1:keMNyY6R9isGaSAu+4Q8NMBwMPkh15Gtc8UCVoDtAWo= +github.com/golangci/modinfo v0.3.4 h1:oU5huX3fbxqQXdfspamej74DFX0kyGLkw1ppvXoJ8GA= +github.com/golangci/modinfo v0.3.4/go.mod h1:wytF1M5xl9u0ij8YSvhkEVPP3M5Mc7XLl1pxH3B2aUM= +github.com/golangci/plugin-module-register v0.1.1 h1:TCmesur25LnyJkpsVrupv1Cdzo+2f7zX0H6Jkw1Ol6c= +github.com/golangci/plugin-module-register v0.1.1/go.mod h1:TTpqoB6KkwOJMV8u7+NyXMrkwwESJLOkfl9TxR1DGFc= +github.com/golangci/revgrep v0.5.3 h1:3tL7c1XBMtWHHqVpS5ChmiAAoe4PF/d5+ULzV9sLAzs= +github.com/golangci/revgrep v0.5.3/go.mod h1:U4R/s9dlXZsg8uJmaR1GrloUr14D7qDl8gi2iPXJH8k= +github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed h1:IURFTjxeTfNFP0hTEi1YKjB/ub8zkpaOqFFMApi2EAs= +github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed/go.mod h1:XLXN8bNw4CGRPaqgl3bv/lhz7bsGPh4/xSaMTbo2vkQ= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5 h1:5iH8iuqE5apketRbSFBy+X1V0o+l+8NF1avt4HWl7cA= +github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gordonklaus/ineffassign v0.1.0 h1:y2Gd/9I7MdY1oEIt+n+rowjBNDcLQq3RsH5hwJd0f9s= +github.com/gordonklaus/ineffassign v0.1.0/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= +github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk= +github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= +github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= +github.com/gostaticanalysis/comment v1.4.2 h1:hlnx5+S2fY9Zo9ePo4AhgYsYHbM2+eAv8m/s1JiCd6Q= +github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= +github.com/gostaticanalysis/forcetypeassert v0.1.0 h1:6eUflI3DiGusXGK6X7cCcIgVCpZ2CiZ1Q7jl6ZxNV70= +github.com/gostaticanalysis/forcetypeassert v0.1.0/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= +github.com/gostaticanalysis/nilerr v0.1.1 h1:ThE+hJP0fEp4zWLkWHWcRyI2Od0p7DlgYG3Uqrmrcpk= +github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= +github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= +github.com/gostaticanalysis/testutil v0.4.0 h1:nhdCmubdmDF6VEatUNjgUZBJKWRqugoISdUv3PPQgHY= +github.com/gostaticanalysis/testutil v0.4.0/go.mod h1:bLIoPefWXrRi/ssLFWX1dx7Repi5x3CuviD3dgAZaBU= +github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= +github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/jgautheron/goconst v1.7.1 h1:VpdAG7Ca7yvvJk5n8dMwQhfEZJh95kl/Hl9S1OI5Jkk= +github.com/jgautheron/goconst v1.7.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= +github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= +github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= +github.com/jjti/go-spancheck v0.6.2 h1:iYtoxqPMzHUPp7St+5yA8+cONdyXD3ug6KK15n7Pklk= +github.com/jjti/go-spancheck v0.6.2/go.mod h1:+X7lvIrR5ZdUTkxFYqzJ0abr8Sb5LOo80uOhWNqIrYA= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/julz/importas v0.1.0 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY= +github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= +github.com/karamaru-alpha/copyloopvar v1.1.0 h1:x7gNyKcC2vRBO1H2Mks5u1VxQtYvFiym7fCjIP8RPos= +github.com/karamaru-alpha/copyloopvar v1.1.0/go.mod h1:u7CIfztblY0jZLOQZgH3oYsJzpC2A7S6u/lfgSXHy0k= +github.com/kisielk/errcheck v1.8.0 h1:ZX/URYa7ilESY19ik/vBmCn6zdGQLxACwjAcWbHlYlg= +github.com/kisielk/errcheck v1.8.0/go.mod h1:1kLL+jV4e+CFfueBmI1dSK2ADDyQnlrnrY/FqKluHJQ= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kkHAIKE/contextcheck v1.1.5 h1:CdnJh63tcDe53vG+RebdpdXJTc9atMgGqdx8LXxiilg= +github.com/kkHAIKE/contextcheck v1.1.5/go.mod h1:O930cpht4xb1YQpK+1+AgoM3mFsvxr7uyFptcnWTYUA= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kulti/thelper v0.6.3 h1:ElhKf+AlItIu+xGnI990no4cE2+XaSu1ULymV2Yulxs= +github.com/kulti/thelper v0.6.3/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I= +github.com/kunwardeep/paralleltest v1.0.10 h1:wrodoaKYzS2mdNVnc4/w31YaXFtsc21PCTdvWJ/lDDs= +github.com/kunwardeep/paralleltest v1.0.10/go.mod h1:2C7s65hONVqY7Q5Efj5aLzRCNLjw2h4eMc9EcypGjcY= +github.com/kyoh86/exportloopref v0.1.11 h1:1Z0bcmTypkL3Q4k+IDHMWTcnCliEZcaPiIe0/ymEyhQ= +github.com/kyoh86/exportloopref v0.1.11/go.mod h1:qkV4UF1zGl6EkF1ox8L5t9SwyeBAZ3qLMd6up458uqA= +github.com/lasiar/canonicalheader v1.1.2 h1:vZ5uqwvDbyJCnMhmFYimgMZnJMjwljN5VGY0VKbMXb4= +github.com/lasiar/canonicalheader v1.1.2/go.mod h1:qJCeLFS0G/QlLQ506T+Fk/fWMa2VmBUiEI2cuMK4djI= +github.com/ldez/gomoddirectives v0.2.4 h1:j3YjBIjEBbqZ0NKtBNzr8rtMHTOrLPeiwTkfUJZ3alg= +github.com/ldez/gomoddirectives v0.2.4/go.mod h1:oWu9i62VcQDYp9EQ0ONTfqLNh+mDLWWDO+SO0qSQw5g= +github.com/ldez/tagliatelle v0.5.0 h1:epgfuYt9v0CG3fms0pEgIMNPuFf/LpPIfjk4kyqSioo= +github.com/ldez/tagliatelle v0.5.0/go.mod h1:rj1HmWiL1MiKQuOONhd09iySTEkUuE/8+5jtPYz9xa4= +github.com/leonklingele/grouper v1.1.2 h1:o1ARBDLOmmasUaNDesWqWCIFH3u7hoFlM84YrjT3mIY= +github.com/leonklingele/grouper v1.1.2/go.mod h1:6D0M/HVkhs2yRKRFZUoGjeDy7EZTfFBE9gl4kjmIGkA= +github.com/macabu/inamedparam v0.1.3 h1:2tk/phHkMlEL/1GNe/Yf6kkR/hkcUdAEY3L0hjYV1Mk= +github.com/macabu/inamedparam v0.1.3/go.mod h1:93FLICAIk/quk7eaPPQvbzihUdn/QkGDwIZEoLtpH6I= +github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/maratori/testableexamples v1.0.0 h1:dU5alXRrD8WKSjOUnmJZuzdxWOEQ57+7s93SLMxb2vI= +github.com/maratori/testableexamples v1.0.0/go.mod h1:4rhjL1n20TUTT4vdh3RDqSizKLyXp7K2u6HgraZCGzE= +github.com/maratori/testpackage v1.1.1 h1:S58XVV5AD7HADMmD0fNnziNHqKvSdDuEKdPD1rNTU04= +github.com/maratori/testpackage v1.1.1/go.mod h1:s4gRK/ym6AMrqpOa/kEbQTV4Q4jb7WeLZzVhVVVOQMc= +github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 h1:gWg6ZQ4JhDfJPqlo2srm/LN17lpybq15AryXIRcWYLE= +github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= +github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= +github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mgechev/revive v1.5.0 h1:oaSmjA7rP8+HyoRuCgC531VHwnLH1AlJdjj+1AnQceQ= +github.com/mgechev/revive v1.5.0/go.mod h1:L6T3H8EoerRO86c7WuGpvohIUmiploGiyoYbtIWFmV8= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/moricho/tparallel v0.3.2 h1:odr8aZVFA3NZrNybggMkYO3rgPRcqjeQUlBBFVxKHTI= +github.com/moricho/tparallel v0.3.2/go.mod h1:OQ+K3b4Ln3l2TZveGCywybl68glfLEwFGqvnjok8b+U= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U= +github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= +github.com/nishanths/exhaustive v0.12.0 h1:vIY9sALmw6T/yxiASewa4TQcFsVYZQQRUQJhKRf3Swg= +github.com/nishanths/exhaustive v0.12.0/go.mod h1:mEZ95wPIZW+x8kC4TgC+9YCUgiST7ecevsVDTgc2obs= +github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk= +github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= +github.com/nunnatsa/ginkgolinter v0.18.0 h1:ZXO1wKhPg3A6LpbN5dMuqwhfOjN5c3ous8YdKOuqk9k= +github.com/nunnatsa/ginkgolinter v0.18.0/go.mod h1:vPrWafSULmjMGCMsfGA908if95VnHQNAahvSBOjTuWs= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo/v2 v2.20.2 h1:7NVCeyIWROIAheY21RLS+3j2bb52W0W82tkberYytp4= +github.com/onsi/ginkgo/v2 v2.20.2/go.mod h1:K9gyxPIlb+aIvnZ8bd9Ak+YP18w3APlR+5coaZoE2ag= +github.com/onsi/gomega v1.34.2 h1:pNCwDkzrsv7MS9kpaQvVb1aVLahQXyJ/Tv5oAZMI3i8= +github.com/onsi/gomega v1.34.2/go.mod h1:v1xfxRgk0KIsG+QOdm7p8UosrOzPYRo60fd3B/1Dukc= +github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= +github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU= +github.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc4qc4w= +github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= +github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= +github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= +github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/polyfloyd/go-errorlint v1.6.0 h1:tftWV9DE7txiFzPpztTAwyoRLKNj9gpVm2cg8/OwcYY= +github.com/polyfloyd/go-errorlint v1.6.0/go.mod h1:HR7u8wuP1kb1NeN1zqTd1ZMlqUKPPHF+Id4vIPvDqVw= +github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= +github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= +github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= +github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/quasilyte/go-ruleguard v0.4.3-0.20240823090925-0fe6f58b47b1 h1:+Wl/0aFp0hpuHM3H//KMft64WQ1yX9LdJY64Qm/gFCo= +github.com/quasilyte/go-ruleguard v0.4.3-0.20240823090925-0fe6f58b47b1/go.mod h1:GJLgqsLeo4qgavUoL8JeGFNS7qcisx3awV/w9eWTmNI= +github.com/quasilyte/go-ruleguard/dsl v0.3.22 h1:wd8zkOhSNr+I+8Qeciml08ivDt1pSXe60+5DqOpCjPE= +github.com/quasilyte/go-ruleguard/dsl v0.3.22/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/gogrep v0.5.0 h1:eTKODPXbI8ffJMN+W2aE0+oL0z/nh8/5eNdiO34SOAo= +github.com/quasilyte/gogrep v0.5.0/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng= +github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 h1:TCg2WBOl980XxGFEZSS6KlBGIV0diGdySzxATTWoqaU= +github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= +github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4lu7Gd+PU1fV2/qnDNfzT635KRSObncs= +github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= +github.com/raeperd/recvcheck v0.1.2 h1:SjdquRsRXJc26eSonWIo8b7IMtKD3OAT2Lb5G3ZX1+4= +github.com/raeperd/recvcheck v0.1.2/go.mod h1:n04eYkwIR0JbgD73wT8wL4JjPC3wm0nFtzBnWNocnYU= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryancurrah/gomodguard v1.3.5 h1:cShyguSwUEeC0jS7ylOiG/idnd1TpJ1LfHGpV3oJmPU= +github.com/ryancurrah/gomodguard v1.3.5/go.mod h1:MXlEPQRxgfPQa62O8wzK3Ozbkv9Rkqr+wKjSxTdsNJE= +github.com/ryanrolds/sqlclosecheck v0.5.1 h1:dibWW826u0P8jNLsLN+En7+RqWWTYrjCB9fJfSfdyCU= +github.com/ryanrolds/sqlclosecheck v0.5.1/go.mod h1:2g3dUjoS6AL4huFdv6wn55WpLIDjY7ZgUR4J8HOO/XQ= +github.com/sanposhiho/wastedassign/v2 v2.0.7 h1:J+6nrY4VW+gC9xFzUc+XjPD3g3wF3je/NsJFwFK7Uxc= +github.com/sanposhiho/wastedassign/v2 v2.0.7/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY= +github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tMEOsumirXcOJqAw= +github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= +github.com/sashamelentyev/usestdlibvars v1.27.0 h1:t/3jZpSXtRPRf2xr0m63i32ZrusyurIGT9E5wAvXQnI= +github.com/sashamelentyev/usestdlibvars v1.27.0/go.mod h1:9nl0jgOfHKWNFS43Ojw0i7aRoS4j6EBye3YBhmAIRF8= +github.com/securego/gosec/v2 v2.21.4 h1:Le8MSj0PDmOnHJgUATjD96PaXRvCpKC+DGJvwyy0Mlk= +github.com/securego/gosec/v2 v2.21.4/go.mod h1:Jtb/MwRQfRxCXyCm1rfM1BEiiiTfUOdyzzAhlr6lUTA= +github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU= +github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sivchari/containedctx v1.0.3 h1:x+etemjbsh2fB5ewm5FeLNi5bUjK0V8n0RB+Wwfd0XE= +github.com/sivchari/containedctx v1.0.3/go.mod h1:c1RDvCbnJLtH4lLcYD/GqwiBSSf4F5Qk0xld2rBqzJ4= +github.com/sivchari/tenv v1.12.1 h1:+E0QzjktdnExv/wwsnnyk4oqZBUfuh89YMQT1cyuvSY= +github.com/sivchari/tenv v1.12.1/go.mod h1:1LjSOUCc25snIr5n3DtGGrENhX3LuWefcplwVGC24mw= +github.com/sonatard/noctx v0.1.0 h1:JjqOc2WN16ISWAjAk8M5ej0RfExEXtkEyExl2hLW+OM= +github.com/sonatard/noctx v0.1.0/go.mod h1:0RvBxqY8D4j9cTTTWE8ylt2vqj2EPI8fHmrxHdsaZ2c= +github.com/sourcegraph/go-diff v0.7.0 h1:9uLlrd5T46OXs5qpp8L/MTltk0zikUGi0sNNyCpA8G0= +github.com/sourcegraph/go-diff v0.7.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= +github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= +github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= +github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= +github.com/stbenjam/no-sprintf-host-port v0.1.1 h1:tYugd/yrm1O0dV+ThCbaKZh195Dfm07ysF0U6JQXczc= +github.com/stbenjam/no-sprintf-host-port v0.1.1/go.mod h1:TLhvtIvONRzdmkFiio4O8LHsN9N74I+PhRquPsxpL0I= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= +github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/tdakkota/asciicheck v0.2.0 h1:o8jvnUANo0qXtnslk2d3nMKTFNlOnJjRrNcj0j9qkHM= +github.com/tdakkota/asciicheck v0.2.0/go.mod h1:Qb7Y9EgjCLJGup51gDHFzbI08/gbGhL/UVhYIPWG2rg= +github.com/tenntenn/modver v1.0.1 h1:2klLppGhDgzJrScMpkj9Ujy3rXPUspSjAcev9tSEBgA= +github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= +github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpRQGxTSkNYKJ51yaw6ChIqO+Je8UqsTKN/cDag= +github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= +github.com/tetafro/godot v1.4.18 h1:ouX3XGiziKDypbpXqShBfnNLTSjR8r3/HVzrtJ+bHlI= +github.com/tetafro/godot v1.4.18/go.mod h1:2oVxTBSftRTh4+MVfUaUXR6bn2GDXCaMcOG4Dk3rfio= +github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966 h1:quvGphlmUVU+nhpFa4gg4yJyTRJ13reZMDHrKwYw53M= +github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966/go.mod h1:27bSVNWSBOHm+qRp1T9qzaIpsWEP6TbUnei/43HK+PQ= +github.com/timonwong/loggercheck v0.10.1 h1:uVZYClxQFpw55eh+PIoqM7uAOHMrhVcDoWDery9R8Lg= +github.com/timonwong/loggercheck v0.10.1/go.mod h1:HEAWU8djynujaAVX7QI65Myb8qgfcZ1uKbdpg3ZzKl8= +github.com/tomarrell/wrapcheck/v2 v2.9.0 h1:801U2YCAjLhdN8zhZ/7tdjB3EnAoRlJHt/s+9hijLQ4= +github.com/tomarrell/wrapcheck/v2 v2.9.0/go.mod h1:g9vNIyhb5/9TQgumxQyOEqDHsmGYcGsVMOx/xGkqdMo= +github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw= +github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= +github.com/ultraware/funlen v0.1.0 h1:BuqclbkY6pO+cvxoq7OsktIXZpgBSkYTQtmwhAK81vI= +github.com/ultraware/funlen v0.1.0/go.mod h1:XJqmOQja6DpxarLj6Jj1U7JuoS8PvL4nEqDaQhy22p4= +github.com/ultraware/whitespace v0.1.1 h1:bTPOGejYFulW3PkcrqkeQwOd6NKOOXvmGD9bo/Gk8VQ= +github.com/ultraware/whitespace v0.1.1/go.mod h1:XcP1RLD81eV4BW8UhQlpaR+SDc2givTvyI8a586WjW8= +github.com/uudashr/gocognit v1.1.3 h1:l+a111VcDbKfynh+airAy/DJQKaXh2m9vkoysMPSZyM= +github.com/uudashr/gocognit v1.1.3/go.mod h1:aKH8/e8xbTRBwjbCkwZ8qt4l2EpKXl31KMHgSS+lZ2U= +github.com/uudashr/iface v1.2.0 h1:ECJjh5q/1Zmnv/2yFpWV6H3oMg5+Mo+vL0aqw9Gjazo= +github.com/uudashr/iface v1.2.0/go.mod h1:Ux/7d/rAF3owK4m53cTVXL4YoVHKNqnoOeQHn2xrlp0= +github.com/xen0n/gosmopolitan v1.2.2 h1:/p2KTnMzwRexIW8GlKawsTWOxn7UHA+jCMF/V8HHtvU= +github.com/xen0n/gosmopolitan v1.2.2/go.mod h1:7XX7Mj61uLYrj0qmeN0zi7XDon9JRAEhYQqAPLVNTeg= +github.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM= +github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= +github.com/yeya24/promlinter v0.3.0 h1:JVDbMp08lVCP7Y6NP3qHroGAO6z2yGKQtS5JsjqtoFs= +github.com/yeya24/promlinter v0.3.0/go.mod h1:cDfJQQYv9uYciW60QT0eeHlFodotkYZlL+YcPQN+mW4= +github.com/ykadowak/zerologlint v0.1.5 h1:Gy/fMz1dFQN9JZTPjv1hxEk+sRWm05row04Yoolgdiw= +github.com/ykadowak/zerologlint v0.1.5/go.mod h1:KaUskqF3e/v59oPmdq1U1DnKcuHokl2/K1U4pmIELKg= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +gitlab.com/bosi/decorder v0.4.2 h1:qbQaV3zgwnBZ4zPMhGLW4KZe7A7NwxEhJx39R3shffo= +gitlab.com/bosi/decorder v0.4.2/go.mod h1:muuhHoaJkA9QLcYHq4Mj8FJUwDZ+EirSHRiaTcTf6T8= +go-simpler.org/assert v0.9.0 h1:PfpmcSvL7yAnWyChSjOz6Sp6m9j5lyK8Ok9pEL31YkQ= +go-simpler.org/assert v0.9.0/go.mod h1:74Eqh5eI6vCK6Y5l3PI8ZYFXG4Sa+tkr70OIPJAUr28= +go-simpler.org/musttag v0.13.0 h1:Q/YAW0AHvaoaIbsPj3bvEI5/QFP7w696IMUpnKXQfCE= +go-simpler.org/musttag v0.13.0/go.mod h1:FTzIGeK6OkKlUDVpj0iQUXZLUO1Js9+mvykDQy9C5yM= +go-simpler.org/sloglint v0.7.2 h1:Wc9Em/Zeuu7JYpl+oKoYOsQSy2X560aVueCW/m6IijY= +go-simpler.org/sloglint v0.7.2/go.mod h1:US+9C80ppl7VsThQclkM7BkCHQAzuz8kHLsW3ppuluo= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= +go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= +go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= +go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk= +golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY= +golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20240909161429-701f63a606c0 h1:bVwtbF629Xlyxk6xLQq2TDYmqP0uiWaet5LwRebuY0k= +golang.org/x/exp/typeparams v0.0.0-20240909161429-701f63a606c0/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ= +golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= +golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= +golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= +golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.27.0 h1:qEKojBykQkQ4EynWy4S8Weg69NumxKdn40Fce3uc/8o= +golang.org/x/tools v0.27.0/go.mod h1:sUi0ZgbwW9ZPAq26Ekut+weQPR5eIM6GQLQ1Yjm1H0Q= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.5.1 h1:4bH5o3b5ZULQ4UrBmP+63W9r7qIkqJClEA9ko5YKx+I= +honnef.co/go/tools v0.5.1/go.mod h1:e9irvo83WDG9/irijV44wr3tbhcFeRnfpVlRqVwpzMs= +mvdan.cc/gofumpt v0.7.0 h1:bg91ttqXmi9y2xawvkuMXyvAA/1ZGJqYAEGjXuP0JXU= +mvdan.cc/gofumpt v0.7.0/go.mod h1:txVFJy/Sc/mvaycET54pV8SW8gWxTlUuGHVEcncmNUo= +mvdan.cc/unparam v0.0.0-20240528143540-8a5130ca722f h1:lMpcwN6GxNbWtbpI1+xzFLSW8XzX0u72NttUGVFjO3U= +mvdan.cc/unparam v0.0.0-20240528143540-8a5130ca722f/go.mod h1:RSLa7mKKCNeTTMHBw5Hsy2rfJmd6O2ivt9Dw9ZqCQpQ= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/.citools/jb/go.mod b/.citools/jb/go.mod new file mode 100644 index 00000000000..a8df6197a17 --- /dev/null +++ b/.citools/jb/go.mod @@ -0,0 +1,20 @@ +module jb + +go 1.24.1 + +tool github.com/jsonnet-bundler/jsonnet-bundler/cmd/jb + +require ( + github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect + github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/fatih/color v1.17.0 // indirect + github.com/jsonnet-bundler/jsonnet-bundler v0.5.1 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/stretchr/testify v1.10.0 // indirect + golang.org/x/sys v0.30.0 // indirect + gopkg.in/alecthomas/kingpin.v2 v2.2.6 // indirect +) diff --git a/.citools/jb/go.sum b/.citools/jb/go.sum new file mode 100644 index 00000000000..fa93a05ce6a --- /dev/null +++ b/.citools/jb/go.sum @@ -0,0 +1,70 @@ +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b h1:mimo19zliBX/vSQ6PWWSL9lK8qwHozUj03+zLoEB8O0= +github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs= +github.com/campoy/embedmd v1.0.0/go.mod h1:oxyr9RCiSXg0M3VJ3ks0UGfp98BpSSGr0kpiX3MzVl8= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= +github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= +github.com/jsonnet-bundler/jsonnet-bundler v0.5.1 h1:eUd6EA1Qzz73Q4NLNLOrNkMb96+6NTTERbX9lqaxVwk= +github.com/jsonnet-bundler/jsonnet-bundler v0.5.1/go.mod h1:Qrdw/7mOFS2SKCOALKFfEH8gdvXJi8XZjw9g5ilpf4I= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.4/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/.citools/lefthook/go.mod b/.citools/lefthook/go.mod new file mode 100644 index 00000000000..2fbfd58e665 --- /dev/null +++ b/.citools/lefthook/go.mod @@ -0,0 +1,51 @@ +module lefthook + +go 1.24.1 + +tool github.com/evilmartians/lefthook + +require ( + github.com/MakeNowJust/heredoc v1.0.0 // indirect + github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect + github.com/briandowns/spinner v1.23.0 // indirect + github.com/charmbracelet/lipgloss v0.6.0 // indirect + github.com/creack/pty v1.1.18 // indirect + github.com/evilmartians/lefthook v1.4.8 // indirect + github.com/fatih/color v1.17.0 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/gobwas/glob v0.2.3 // indirect + github.com/google/go-cmp v0.7.0 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/lucasb-eyer/go-colorful v1.2.0 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c // indirect + github.com/muesli/reflow v0.3.0 // indirect + github.com/muesli/termenv v0.15.1 // indirect + github.com/pelletier/go-toml/v2 v2.2.3 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.7.0 // indirect + github.com/spf13/cobra v1.9.1 // indirect + github.com/spf13/pflag v1.0.6 // indirect + github.com/spf13/viper v1.19.0 // indirect + github.com/stretchr/testify v1.10.0 // indirect + github.com/subosito/gotenv v1.6.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/term v0.29.0 // indirect + golang.org/x/text v0.22.0 // indirect + golang.org/x/tools v0.30.0 // indirect + gopkg.in/alessio/shellescape.v1 v1.0.0-20170105083845-52074bc9df61 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/.citools/lefthook/go.sum b/.citools/lefthook/go.sum new file mode 100644 index 00000000000..1b0fbdb81ce --- /dev/null +++ b/.citools/lefthook/go.sum @@ -0,0 +1,117 @@ +github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= +github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= +github.com/alessio/shellescape v1.4.1 h1:V7yhSDDn8LP4lc4jS8pFkt0zCnzVJlG5JXy9BVKJUX0= +github.com/alessio/shellescape v1.4.1/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30= +github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= +github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= +github.com/briandowns/spinner v1.23.0 h1:alDF2guRWqa/FOZZYWjlMIx2L6H0wyewPxo/CH4Pt2A= +github.com/briandowns/spinner v1.23.0/go.mod h1:rPG4gmXeN3wQV/TsAY4w8lPdIM6RX3yqeBQJSrbXjuE= +github.com/charmbracelet/lipgloss v0.6.0 h1:1StyZB9vBSOyuZxQUcUwGr17JmojPNm87inij9N3wJY= +github.com/charmbracelet/lipgloss v0.6.0/go.mod h1:tHh2wr34xcHjC2HCXIlGSG1jaDF0S0atAUvBMP6Ppuk= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= +github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/evilmartians/lefthook v1.4.8 h1:8FmXWtfFiEZw3w18JbhVrp3g+Iy/j2XEo6gcC25+4KA= +github.com/evilmartians/lefthook v1.4.8/go.mod h1:anwwu2QiCEnsOCBHfRgGOB3/sd9FMVNhmY8l9DDQAG8= +github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= +github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= +github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c h1:cqn374mizHuIWj+OSJCajGr/phAmuMug9qIX3l9CflE= +github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/muesli/reflow v0.2.1-0.20210115123740-9e1d0d53df68/go.mod h1:Xk+z4oIWdQqJzsxyjgl3P22oYZnHdZ8FFTHAQQt5BMQ= +github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= +github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= +github.com/muesli/termenv v0.11.1-0.20220204035834-5ac8409525e0/go.mod h1:Bd5NYQ7pd+SrtBSrSNoBBmXlcY8+Xj4BMJgh8qcZrvs= +github.com/muesli/termenv v0.15.1 h1:UzuTb/+hhlBugQz28rpzey4ZuKcZ03MeKsoG7IJZIxs= +github.com/muesli/termenv v0.15.1/go.mod h1:HeAQPTzpfs016yGtA4g00CsdYnVLJvxsS4ANqrZs2sQ= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w= +github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= +github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= +github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk= +golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= +golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= +golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY= +golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY= +gopkg.in/alessio/shellescape.v1 v1.0.0-20170105083845-52074bc9df61 h1:8ajkpB4hXVftY5ko905id+dOnmorcS2CHNxxHLLDcFM= +gopkg.in/alessio/shellescape.v1 v1.0.0-20170105083845-52074bc9df61/go.mod h1:IfMagxm39Ys4ybJrDb7W3Ob8RwxftP0Yy+or/NVz1O8= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index a485a1f6061..a5fb8a5803b 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -57,6 +57,7 @@ /go.work @grafana/grafana-app-platform-squad /go.work.sum @grafana/grafana-app-platform-squad /.bingo/ @grafana/grafana-backend-group +/.citools @grafana/grafana-developer-enablement-squad /pkg/README.md @grafana/grafana-backend-group /pkg/ruleguard.rules.go @grafana/grafana-backend-group /.bra.toml @grafana/grafana-backend-group diff --git a/.github/workflows/go-lint.yml b/.github/workflows/go-lint.yml index 439ff2de2da..0925dcf02d0 100644 --- a/.github/workflows/go-lint.yml +++ b/.github/workflows/go-lint.yml @@ -24,7 +24,7 @@ jobs: - name: golangci-lint uses: golangci/golangci-lint-action@v6 with: - version: v1.62.0 + version: v1.64.2 args: | --verbose $(go list -m -f '{{.Dir}}' | xargs -I{} sh -c 'test ! -f {}/.nolint && echo {}/...') install-mode: binary diff --git a/Dockerfile b/Dockerfile index f5e45b6259d..08360d8b06c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ ARG BASE_IMAGE=alpine:3.21 ARG JS_IMAGE=node:22-alpine ARG JS_PLATFORM=linux/amd64 -ARG GO_IMAGE=golang:1.23.7-alpine +ARG GO_IMAGE=golang:1.24.1-alpine # Default to building locally ARG GO_SRC=go-builder @@ -60,6 +60,13 @@ WORKDIR /tmp/grafana COPY go.* ./ COPY .bingo .bingo +COPY .citools/bra .citools/bra +COPY .citools/cue .citools/cue +COPY .citools/cog .citools/cog +COPY .citools/lefthook .citools/lefthook +COPY .citools/jb .citools/jb +COPY .citools/drone .citools/drone +COPY .citools/golangci-lint .citools/golangci-lint # Include vendored dependencies COPY pkg/util/xorm pkg/util/xorm diff --git a/Makefile b/Makefile index 96839b5c323..3a060c3601e 100644 --- a/Makefile +++ b/Makefile @@ -110,12 +110,12 @@ cleanup-old-git-hooks: ./scripts/cleanup-husky.sh .PHONY: lefthook-install -lefthook-install: cleanup-old-git-hooks $(LEFTHOOK) # install lefthook for pre-commit hooks - $(LEFTHOOK) install -f +lefthook-install: cleanup-old-git-hooks # install lefthook for pre-commit hooks + $(GO) tool lefthook install -f .PHONY: lefthook-uninstall -lefthook-uninstall: $(LEFTHOOK) - $(LEFTHOOK) uninstall +lefthook-uninstall: + $(GO) tool lefthook uninstall ##@ OpenAPI 3 OAPI_SPEC_TARGET = public/openapi3.json @@ -171,10 +171,10 @@ gen-go: $(GO) run $(GO_RACE_FLAG) ./pkg/build/wire/cmd/wire/main.go gen -tags $(WIRE_TAGS) ./pkg/server .PHONY: fix-cue -fix-cue: $(CUE) +fix-cue: @echo "formatting cue files" - $(CUE) fix kinds/**/*.cue - $(CUE) fix public/app/plugins/**/**/*.cue + $(GO) tool cue fix kinds/**/*.cue + $(GO) tool cue fix public/app/plugins/**/**/*.cue .PHONY: gen-jsonnet gen-jsonnet: @@ -230,8 +230,8 @@ build-plugin-go: ## Build decoupled plugins build: build-go build-js ## Build backend and frontend. .PHONY: run -run: $(BRA) ## Build and run web server on filesystem changes. See /.bra.toml for configuration. - $(BRA) run +run: ## Build and run web server on filesystem changes. See /.bra.toml for configuration. + $(GO) tool bra run .PHONY: run-go run-go: ## Build and run web server immediately. @@ -320,9 +320,9 @@ test: test-go test-js ## Run all tests. ##@ Linting .PHONY: golangci-lint -golangci-lint: $(GOLANGCI_LINT) +golangci-lint: @echo "lint via golangci-lint" - $(GOLANGCI_LINT) run \ + $(GO) tool golangci-lint run \ --config .golangci.yml \ $(GO_LINT_FILES) @@ -330,13 +330,13 @@ golangci-lint: $(GOLANGCI_LINT) lint-go: golangci-lint ## Run all code checks for backend. You can use GO_LINT_FILES to specify exact files to check .PHONY: lint-go-diff -lint-go-diff: $(GOLANGCI_LINT) +lint-go-diff: git diff --name-only $(GIT_BASE) | \ grep '\.go$$' | \ $(XARGSR) dirname | \ sort -u | \ sed 's,^,./,' | \ - $(XARGSR) $(GOLANGCI_LINT) run --config .golangci.toml + $(XARGSR) $(GO) tool golangci-lint run --config .golangci.toml # with disabled SC1071 we are ignored some TCL,Expect `/usr/bin/env expect` scripts .PHONY: shellcheck diff --git a/go.work b/go.work index df840ed9405..dbda98bd6dd 100644 --- a/go.work +++ b/go.work @@ -1,10 +1,17 @@ -go 1.23.7 +go 1.24.1 // The `skip:golangci-lint` comment tag is used to exclude the package from the `golangci-lint` GitHub Action. // The module at the root of the repo (`.`) is excluded because ./pkg/... is included manually in the `golangci-lint` configuration. use ( . // skip:golangci-lint + ./.citools/bra + ./.citools/cog + ./.citools/cue + ./.citools/drone + ./.citools/golangci-lint + ./.citools/jb + ./.citools/lefthook ./apps/advisor ./apps/alerting/notifications ./apps/dashboard diff --git a/go.work.sum b/go.work.sum index 2062d7330a6..8aeda713a66 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,3 +1,4 @@ +bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898 h1:SC+c6A1qTFstO9qmB86mPV2IpYme/2ZoEQ0hrP+wo+Q= buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20230802163732-1c33ebd9ecfa.1 h1:tdpHgTbmbvEIARu+bixzmleMi14+3imnpoFXz+Qzjp4= buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20230802163732-1c33ebd9ecfa.1/go.mod h1:xafc+XIsTxTy76GJQ1TKgvJWsSugFBqMaN27WhUblew= buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.4-20250130201111-63bb56e20495.1 h1:4erM3WLgEG/HIBrpBDmRbs1puhd7p0z7kNXDuhHthwM= @@ -8,6 +9,7 @@ cel.dev/expr v0.16.1/go.mod h1:AsGA5zb3WruAEQeQng1RZdGEXmBj0jvMWh6l5SnNuC8= cel.dev/expr v0.18.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= cel.dev/expr v0.19.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= cloud.google.com/go v0.110.10/go.mod h1:v1OoFqYxiBkUrruItNM3eT4lLByNjxmJSV/xDKJNnic= +cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4= cloud.google.com/go v0.112.2/go.mod h1:iEqjp//KquGIJV/m+Pk3xecgKNhV+ry+vVTsy4TbDms= cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U= cloud.google.com/go v0.117.0/go.mod h1:ZbwhVTb1DBGt2Iwb3tNO6SEK4q+cplHZmLWH+DelYYc= @@ -21,6 +23,8 @@ cloud.google.com/go/accesscontextmanager v1.9.1 h1:+C7HM05/h80znK+8VNu25wAimueda cloud.google.com/go/accesscontextmanager v1.9.1/go.mod h1:wUVSoz8HmG7m9miQTh6smbyYuNOJrvZukK5g6WxSOp0= cloud.google.com/go/accesscontextmanager v1.9.3 h1:8zVoeiBa4erMCLEXltOcqVEsZhS26JZ5/Vrgs59eQiI= cloud.google.com/go/accesscontextmanager v1.9.3/go.mod h1:S1MEQV5YjkAKBoMekpGrkXKfrBdsi4x6Dybfq6gZ8BU= +cloud.google.com/go/ai v0.8.0 h1:rXUEz8Wp2OlrM8r1bfmpF2+VKqc1VJpafE3HgzRnD/w= +cloud.google.com/go/ai v0.8.0/go.mod h1:t3Dfk4cM61sytiggo2UyGsDVW3RF1qGZaUKDrZFyqkE= cloud.google.com/go/aiplatform v1.68.0 h1:EPPqgHDJpBZKRvv+OsB3cr0jYz3EL2pZ+802rBPcG8U= cloud.google.com/go/aiplatform v1.68.0/go.mod h1:105MFA3svHjC3Oazl7yjXAmIR89LKhRAeNdnDKJczME= cloud.google.com/go/aiplatform v1.70.0 h1:vnqsPkgcwlDEpWl9t6C3/HLfHeweuGXs2gcYTzH6dMs= @@ -124,6 +128,7 @@ cloud.google.com/go/cloudtasks v1.13.3 h1:rXdznKjCa7WpzmvR2plrn2KJ+RZC1oYxPiRWNQ cloud.google.com/go/cloudtasks v1.13.3/go.mod h1:f9XRvmuFTm3VhIKzkzLCPyINSU3rjjvFUsFVGR5wi24= cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute v1.23.4/go.mod h1:/EJMj55asU6kAFnuZET8zqgwgJ9FvXWXOkkfQZa4ioI= +cloud.google.com/go/compute v1.24.0/go.mod h1:kw1/T+h/+tK2LJK0wiPPx1intgdAM3j/g3hFDlscY40= cloud.google.com/go/compute v1.28.1 h1:XwPcZjgMCnU2tkwY10VleUjSAfpTj9RDn+kGrbYsi8o= cloud.google.com/go/compute v1.28.1/go.mod h1:b72iXMY4FucVry3NR3Li4kVyyTvbMDE7x5WsqvxjsYk= cloud.google.com/go/compute v1.31.1 h1:SObuy8Fs6woazArpXp1fsHCw+ZH4iJ/8dGGTxUhHZQA= @@ -224,6 +229,7 @@ cloud.google.com/go/filestore v1.9.1 h1:s8DPPSV80FzIB7rduoMJAgknktms9hZGE3+X9KFU cloud.google.com/go/filestore v1.9.1/go.mod h1:g/FNHBABpxjL1M9nNo0nW6vLYIMVlyOKhBKtYGgcKUI= cloud.google.com/go/filestore v1.9.3 h1:vTXQI5qYKZ8dmCyHN+zVfaMyXCYbyZNM0CkPzpPUn7Q= cloud.google.com/go/filestore v1.9.3/go.mod h1:Me0ZRT5JngT/aZPIKpIK6N4JGMzrFHRtGHd9ayUS4R4= +cloud.google.com/go/firestore v1.15.0/go.mod h1:GWOxFXcv8GZUtYpWHw/w6IuYNux/BtmeVTMmjrm4yhk= cloud.google.com/go/firestore v1.17.0 h1:iEd1LBbkDZTFsLw3sTH50eyg4qe8eoG6CjocmEXO9aQ= cloud.google.com/go/firestore v1.17.0/go.mod h1:69uPx1papBsY8ZETooc71fOhoKkD70Q1DwMrtKuOT/Y= cloud.google.com/go/firestore v1.18.0 h1:cuydCaLS7Vl2SatAeivXyhbhDEIR8BDmtn4egDhIn2s= @@ -281,6 +287,7 @@ cloud.google.com/go/lifesciences v0.10.3 h1:Z05C+Ui953f0EQx9hJ1la6+QQl8ADrIs3iNw cloud.google.com/go/lifesciences v0.10.3/go.mod h1:hnUUFht+KcZcliixAg+iOh88FUwAzDQQt5tWd7iIpNg= cloud.google.com/go/logging v1.12.0 h1:ex1igYcGFd4S/RZWOCU51StlIEuey5bjqwH9ZYjHibk= cloud.google.com/go/logging v1.12.0/go.mod h1:wwYBt5HlYP1InnrtYI0wtwttpVU1rifnMT7RejksUAM= +cloud.google.com/go/longrunning v0.5.5/go.mod h1:WV2LAxD8/rg5Z1cNW6FJ/ZpX4E4VnDnoTk0yawPBB7s= cloud.google.com/go/longrunning v0.5.6/go.mod h1:vUaDrWYOMKRuhiv6JBnn49YxCPz2Ayn9GqyjaBT8/mA= cloud.google.com/go/longrunning v0.6.2/go.mod h1:k/vIs83RN4bE3YCswdXC5PFfWVILjm3hpEUlSko4PiI= cloud.google.com/go/managedidentities v1.7.1 h1:9hC4E7JnWn/jSUls022Sj9ri+vriGnLzvDXo0cs1zcA= @@ -496,11 +503,11 @@ contrib.go.opencensus.io/exporter/stackdriver v0.13.14/go.mod h1:5pSSGY0Bhuk7waT contrib.go.opencensus.io/integrations/ocsql v0.1.7 h1:G3k7C0/W44zcqkpRSFyjU9f6HZkbwIrL//qqnlqWZ60= contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= +docker.io/go-docker v1.0.0 h1:VdXS/aNYQxyA9wdLD5z8Q8Ro688/hG8HzKxYVEVbE6s= gioui.org v0.0.0-20210308172011-57750fc8a0a6 h1:K72hopUosKG3ntOPNG4OzzbuhxGuVf06fa2la1/H/Ho= git.sr.ht/~sbinet/gg v0.5.0 h1:6V43j30HM623V329xA9Ntq+WJrMjDxRjuAB1LFWF5m8= git.sr.ht/~sbinet/gg v0.5.0/go.mod h1:G2C0eRESqlKhS7ErsNey6HHrqU1PwsnCQlekFi9Q2Oo= github.com/99designs/basicauth-go v0.0.0-20160802081356-2a93ba0f464d h1:j6oB/WPCigdOkxtuPl1VSIiLpy7Mdsu6phQffbF19Ng= -github.com/99designs/httpsignatures-go v0.0.0-20170731043157-88528bf4ca7e h1:rl2Aq4ZODqTDkeSqQBy+fzpZPamacO1Srp8zq7jf2Sc= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/Azure/azure-amqp-common-go/v3 v3.2.3 h1:uDF62mbd9bypXWi19V1bN5NZEO84JqgmI5G73ibAmrk= @@ -513,6 +520,7 @@ github.com/Azure/go-autorest/autorest/azure/auth v0.5.13 h1:Ov8avRZi2vmrE2JcXw+t github.com/Azure/go-autorest/autorest/azure/auth v0.5.13/go.mod h1:5BAVfWLWXihP47vYrPuBKKf4cS0bXI+KM9Qx6ETDJYo= github.com/Azure/go-autorest/autorest/azure/cli v0.4.6 h1:w77/uPk80ZET2F+AfQExZyEWtn+0Rk/uw17m9fv5Ajc= github.com/Azure/go-autorest/autorest/azure/cli v0.4.6/go.mod h1:piCfgPho7BiIDdEQ1+g4VmKyD5y+p/XtSNqE6Hc4QD0= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= github.com/ClickHouse/ch-go v0.61.5 h1:zwR8QbYI0tsMiEcze/uIMK+Tz1D3XZXLdNrlaOpeEI4= github.com/ClickHouse/ch-go v0.61.5/go.mod h1:s1LJW/F/LcFs5HJnuogFMta50kKDO0lf9zzfrbl0RQg= @@ -544,7 +552,11 @@ github.com/KimMachineGun/automemlimit v0.6.1 h1:ILa9j1onAAMadBsyyUJv5cack8Y1WT26 github.com/KimMachineGun/automemlimit v0.6.1/go.mod h1:T7xYht7B8r6AG/AqFcUdc7fzd2bIdBKmepfP2S1svPY= github.com/MicahParks/keyfunc/v2 v2.1.0 h1:6ZXKb9Rp6qp1bDbJefnG7cTH8yMN1IC/4nf+GVjO99k= github.com/MicahParks/keyfunc/v2 v2.1.0/go.mod h1:rW42fi+xgLJ2FRRXAfNx9ZA8WpD4OeE/yHVMteCkw9k= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Microsoft/hcsshim v0.9.6 h1:VwnDOgLeoi2du6dAznfmspNqTiwczvjv4K7NxuY9jsY= +github.com/Microsoft/hcsshim v0.9.6/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= +github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3 h1:4FA+QBaydEHlwxg0lMN3rhwoDaQy6LKhVWR4qvq4BuA= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= github.com/PuerkitoBio/goquery v1.8.1 h1:uQxhNlArOIdbrH1tr0UXwdVFgDcZDrZVdcpygAcwmWM= github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJsnnd3H7Ho5jQ= @@ -555,6 +567,7 @@ github.com/RoaringBitmap/gocroaring v0.4.0 h1:5nufXUgWpBEUNEJXw7926YAA58ZAQRpWPr github.com/RoaringBitmap/real-roaring-datasets v0.0.0-20190726190000-eb7c87156f76 h1:ZYlhPbqQFU+AHfgtCdHGDTtRW1a8geZyiE8c6Q+Sl1s= github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06 h1:KkH3I3sJuOLP3TjA/dfr4NAY8bghDwnXiU7cTKxQqo0= github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= github.com/Shopify/sarama v1.38.1 h1:lqqPUPQZ7zPqYlWpTh+LQ9bhYNu2xJL6k1SJN4WVe2A= github.com/Shopify/sarama v1.38.1/go.mod h1:iwv9a67Ha8VNa+TifujYoWGxWnu2kNVAQdSdZ4X2o5g= github.com/Shopify/toxiproxy v2.1.4+incompatible h1:TKdv8HiTLgE5wdJuEML90aBgNWsokNbMijUGhmcoBJc= @@ -572,9 +585,9 @@ github.com/alecthomas/kong v0.8.0 h1:ryDCzutfIqJPnNn0omnrgHLbAggDQM2VWHikE1xqK7s github.com/alecthomas/kong v0.8.0/go.mod h1:n1iCIO2xS46oE8ZfYCNDqdR0b0wZNrXAIAqro/2132U= github.com/alecthomas/participle/v2 v2.1.1 h1:hrjKESvSqGHzRb4yW1ciisFJ4p3MGYih6icjJvbsmV8= github.com/alecthomas/participle/v2 v2.1.1/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= github.com/alexflint/go-arg v1.4.2 h1:lDWZAXxpAnZUq4qwb86p/3rIJJ2Li81EoMbTMujhVa0= github.com/alexflint/go-arg v1.4.2/go.mod h1:9iRbDxne7LcR/GSvEr7ma++GLpdIU1zrghf2y2768kM= +github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae h1:AMzIhMUqU3jMrZiTuW0zkYeKlKDAFD+DG20IoO421/Y= github.com/alexflint/go-scalar v1.0.0 h1:NGupf1XV/Xb04wXskDFzS0KWOLH632W/EO4fAFi+A70= github.com/alexflint/go-scalar v1.0.0/go.mod h1:GpHzbCOZXEKMEcygYQ5n/aa4Aq84zbxjy3MxYW0gjYw= github.com/alicebob/miniredis v2.5.0+incompatible h1:yBHoLpsyjupjz3NL3MhKMVkR41j82Yjf3KFv7ApYzUI= @@ -617,6 +630,8 @@ github.com/benbjohnson/immutable v0.4.0 h1:CTqXbEerYso8YzVPxmWxh2gnoRQbbB9X1quUC github.com/benbjohnson/immutable v0.4.0/go.mod h1:iAr8OjJGLnLmVUr9MZ/rz4PWUy6Ouc2JLYuMArmvAJM= github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY= +github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y= +github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blevesearch/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:kDy+zgJFJJoJYBvdfBSiZYBbdsUL0XcjHYWezpQBGPA= github.com/blevesearch/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:9eJDeqxJ3E7WnLebQUlPD7ZjSce7AnDb9vjGmMCbD0A= github.com/blevesearch/goleveldb v1.0.1 h1:iAtV2Cu5s0GD1lwUiekkFHe2gTMCCNVj2foPclDLIFI= @@ -631,16 +646,21 @@ github.com/bradleyjkemp/cupaloy/v2 v2.6.0 h1:knToPYa2xtfg42U3I6punFEjaGFKWQRXJwj github.com/bradleyjkemp/cupaloy/v2 v2.6.0/go.mod h1:bm7JXdkRd4BHJk9HpwqAI8BoAY1lps46Enkdqw6aRX0= github.com/brianvoe/gofakeit/v6 v6.25.0 h1:ZpFjktOpLZUeF8q223o0rUuXtA+m5qW5srjvVi+JkXk= github.com/brianvoe/gofakeit/v6 v6.25.0/go.mod h1:Xj58BMSnFqcn/fAQeSK+/PLtC5kSb7FJIq4JyGa8vEs= +github.com/bshuster-repo/logrus-logstash-hook v0.4.1 h1:pgAtgj+A31JBVtEHu2uHuEx0n+2ukqUJnS2vVe5pQNA= github.com/bufbuild/protovalidate-go v0.2.1 h1:pJr07sYhliyfj/STAM7hU4J3FKpVeLVKvOBmOTN8j+s= github.com/bufbuild/protovalidate-go v0.2.1/go.mod h1:e7XXDtlxj5vlEyAgsrxpzayp4cEMKCSSb8ZCkin+MVA= github.com/bufbuild/protovalidate-go v0.9.1 h1:cdrIA33994yCcJyEIZRL36ZGTe9UDM/WHs5MBHEimiE= github.com/bufbuild/protovalidate-go v0.9.1/go.mod h1:5jptBxfvlY51RhX32zR6875JfPBRXUsQjyZjm/NqkLQ= +github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd h1:rFt+Y/IK1aEZkEHchZRSq9OQbsSzIT/OrI8YFFmRIng= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembjv71DPz3uX/V/6MMlSyD9JBQ6kQ= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o= github.com/bwesterb/go-ristretto v1.2.3 h1:1w53tCkGhCQ5djbat3+MH0BAQ5Kfgbt56UZQ/JMzngw= github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/bytedance/sonic v1.10.0-rc3 h1:uNSnscRapXTwUgTyOF0GVljYD08p9X/Lbr9MweSV3V0= github.com/bytedance/sonic v1.10.0-rc3/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= github.com/campoy/embedmd v1.0.0 h1:V4kI2qTJJLf4J29RzI/MAt2c3Bl4dQSYPuflzwFH2hY= -github.com/campoy/embedmd v1.0.0/go.mod h1:oxyr9RCiSXg0M3VJ3ks0UGfp98BpSSGr0kpiX3MzVl8= +github.com/checkpoint-restore/go-criu/v4 v4.1.0 h1:WW2B2uxx9KWF6bGlHqhm8Okiafwwx7Y2kcpn8lCpjgo= +github.com/checkpoint-restore/go-criu/v5 v5.0.0 h1:TW8f/UvntYoVDMN1K2HlT82qH1rb0sOjpGw3m6Ym+i4= github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0= github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA= github.com/chenzhuoyu/iasm v0.9.0 h1:9fhXjVzq5hUy2gkhhgHl95zG2cEAhw9OSGs8toWWAwo= @@ -664,6 +684,7 @@ github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJ github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nCtnAiZdYFd45cYZPs8vOOIYKfk= github.com/cncf/xds/go v0.0.0-20240723142845-024c85f92f20/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/cockroachdb/cockroach-go v0.0.0-20181001143604-e0a95dfd547c h1:2zRrJWIt/f9c9HhNHAgrRgq0San5gRRUJTBXLkchal0= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa h1:OaNxuTZr7kxeODyLWsRMC+OD03aFUH+mW6r2d+MWa5Y= github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd h1:qMd81Ts1T2OTKmB4acZcyKaMtRnY5Y44NuXGX2GFJ1w= @@ -672,17 +693,44 @@ github.com/coder/quartz v0.1.0 h1:cLL+0g5l7xTf6ordRnUMMiZtRE8Sq5LxpghS63vEXrQ= github.com/coder/quartz v0.1.0/go.mod h1:vsiCc+AHViMKH2CQpGIpFgdHIEQsxwm8yCscqKmzbRA= github.com/coder/websocket v1.8.12 h1:5bUXkEPPIbewrnkU8LTCLVaxi4N4J8ahufH2vlo4NAo= github.com/coder/websocket v1.8.12/go.mod h1:LNVeNrXQZfe5qhS9ALED3uA+l5pPqvwXg3CKoDBB2gs= +github.com/containerd/aufs v1.0.0 h1:2oeJiwX5HstO7shSrPZjrohJZLzK36wvpdmzDRkL/LY= +github.com/containerd/btrfs v1.0.0 h1:osn1exbzdub9L5SouXO5swW4ea/xVdJZ3wokxN5GrnA= +github.com/containerd/cgroups v1.0.4 h1:jN/mbWBEaz+T1pi5OFtnkQ+8qnmEbAr1Oo1FRm5B0dA= +github.com/containerd/cgroups v1.0.4/go.mod h1:nLNQtsF7Sl2HxNebu77i1R0oDlhiTG+kO4JTrUzo6IA= github.com/containerd/cgroups/v3 v3.0.3 h1:S5ByHZ/h9PMe5IOQoN7E+nMc2UcLEM/V48DGDJ9kip0= github.com/containerd/cgroups/v3 v3.0.3/go.mod h1:8HBe7V3aWGLFPd/k03swSIsGjZhHI2WzJmticMgVuz0= +github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/containerd v1.6.18 h1:qZbsLvmyu+Vlty0/Ex5xc0z2YtKpIsb5n45mAMI+2Ns= github.com/containerd/containerd v1.6.18/go.mod h1:1RdCUu95+gc2v9t3IL+zIlpClSmew7/0YS8O5eQZrOw= +github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= +github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= github.com/containerd/fifo v1.1.0 h1:4I2mbh5stb1u6ycIABlBw9zgtlK8viPI9QkQNRQEEmY= github.com/containerd/fifo v1.1.0/go.mod h1:bmC4NWMbXlt2EZ0Hc7Fx7QzTFxgPID13eH0Qu+MAb2o= +github.com/containerd/go-cni v1.1.6 h1:el5WPymG5nRRLQF1EfB97FWob4Tdc8INg8RZMaXWZlo= +github.com/containerd/go-cni v1.1.6/go.mod h1:BWtoWl5ghVymxu6MBjg79W9NZrCRyHIdUtk4cauMe34= +github.com/containerd/go-runc v1.0.0 h1:oU+lLv1ULm5taqgV/CJivypVODI4SUz1znWjv3nNYS0= +github.com/containerd/imgcrypt v1.1.4 h1:iKTstFebwy3Ak5UF0RHSeuCTahC5OIrPJa6vjMAM81s= +github.com/containerd/imgcrypt v1.1.4/go.mod h1:LorQnPtzL/T0IyCeftcsMEO7AqxUDbdO8j/tSUpgxvo= +github.com/containerd/nri v0.1.0 h1:6QioHRlThlKh2RkRTR4kIT3PKAcrLo3gIWnjkM4dQmQ= +github.com/containerd/ttrpc v1.1.0 h1:GbtyLRxb0gOLR0TYQWt3O6B0NvT8tMdorEHqIQo/lWI= +github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY= +github.com/containerd/zfs v1.0.0 h1:cXLJbx+4Jj7rNsTiqVfm6i+RNLx6FFA2fMmDlEf+Wm8= +github.com/containernetworking/cni v1.1.1 h1:ky20T7c0MvKvbMOwS/FrlbNwjEoqJEUUYfsL4b0mc4k= +github.com/containernetworking/cni v1.1.1/go.mod h1:sDpYKmGVENF3s6uvMvGgldDWeG8dMxakj/u+i9ht9vw= +github.com/containernetworking/plugins v1.1.1 h1:+AGfFigZ5TiQH00vhR8qPeSatj53eNGz0C1d3wVYlHE= +github.com/containernetworking/plugins v1.1.1/go.mod h1:Sr5TH/eBsGLXK/h71HeLfX19sZPp3ry5uHSkI4LPxV8= +github.com/containers/ocicrypt v1.1.3 h1:uMxn2wTb4nDR7GqG3rnZSfpJXqWURfzZ7nKydzIeKpA= +github.com/containers/ocicrypt v1.1.3/go.mod h1:xpdkbVAuaH3WzbEabUd5yDsl9SwJA5pABH85425Es2g= +github.com/coreos/bbolt v1.3.2 h1:wZwiHHUieZCquLkDL0B8UhzreNWsPHooDAG3q34zk0s= github.com/coreos/etcd v3.3.27+incompatible h1:QIudLb9KeBsE5zyYxd1mjzRSkzLg9Wf9QlRwFgd6oTA= github.com/coreos/etcd v3.3.27+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible h1:bXhRBIXoTm9BYHS3gE0TtQuyNZyeEMux2sDi4oo5YOo= +github.com/coreos/go-iptables v0.5.0 h1:mw6SAibtHKZcNzAsOxjoHIG0gy5YFHhypWSSNc6EjbQ= github.com/coreos/go-oidc v2.2.1+incompatible h1:mh48q/BqXqgjVHpy2ZY7WnWAbenxRjsz9N1i1YxjHAk= github.com/coreos/go-oidc v2.2.1+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-oidc/v3 v3.9.0 h1:0J/ogVOd4y8P0f0xUh8l9t07xRP/d8tccvjHl2dcsSo= +github.com/coreos/go-oidc/v3 v3.9.0/go.mod h1:rTKz2PYwftcrtoCzV5g5kvfJoWcm0Mk8AF8y1iAQro4= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20220810130054-c7d1c02cb6cf h1:GOPo6vn/vTN+3IwZBvXX0y5doJfSC7My0cdzelyOCsQ= @@ -692,12 +740,13 @@ github.com/couchbase/ghistogram v0.1.0/go.mod h1:s1Jhy76zqfEecpNWJfWUiKZookAFaiG github.com/couchbase/moss v0.2.0 h1:VCYrMzFwEryyhRSeI+/b3tRBSeTpi/8gn5Kf6dxqn+o= github.com/couchbase/moss v0.2.0/go.mod h1:9MaHIaRuy9pvLPUJxB8sh8OrLfyDczECVL37grCIubs= github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= -github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= -github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= +github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creasty/defaults v1.8.0 h1:z27FJxCAa0JKt3utc0sCImAEb+spPucmKoOdLHvHYKk= github.com/creasty/defaults v1.8.0/go.mod h1:iGzKe6pbEHnpMPtfDXZEr0NVxWnPTjb1bbDy08fPzYM= github.com/crewjam/httperr v0.2.0 h1:b2BfXR8U3AlIHwNeFFvZ+BV1LFvKLlzMjzaTnZMybNo= github.com/crewjam/httperr v0.2.0/go.mod h1:Jlz+Sg/XqBQhyMjdDiC+GNNRzZTD7x39Gu3pglZ5oH4= +github.com/cristalhq/acmd v0.12.0 h1:RdlKnxjN+txbQosg8p/TRNZ+J1Rdne43MVQZ1zDhGWk= +github.com/cristalhq/acmd v0.12.0/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= github.com/cristalhq/hedgedhttp v0.9.1 h1:g68L9cf8uUyQKQJwciD0A1Vgbsz+QgCjuB1I8FAsCDs= github.com/cristalhq/hedgedhttp v0.9.1/go.mod h1:XkqWU6qVMutbhW68NnzjWrGtH8NUx1UfYqGYtHVKIsI= github.com/cucumber/gherkin/go/v26 v26.2.0 h1:EgIjePLWiPeslwIWmNQ3XHcypPsWAHoMCz/YEBKP4GI= @@ -706,6 +755,7 @@ github.com/cucumber/godog v0.15.0 h1:51AL8lBXF3f0cyA5CV4TnJFCTHpgiy+1x1Hb3TtZUmo github.com/cucumber/godog v0.15.0/go.mod h1:FX3rzIDybWABU4kuIXLZ/qtqEe1Ac5RdXmqvACJOces= github.com/cucumber/messages/go/v21 v21.0.1 h1:wzA0LxwjlWQYZd32VTlAVDTkW6inOFmSM+RuOwHZiMI= github.com/cucumber/messages/go/v21 v21.0.1/go.mod h1:zheH/2HS9JLVFukdrsPWoPdmUtmYQAQPLk7w5vWsk5s= +github.com/cyphar/filepath-securejoin v0.2.2 h1:jCwT2GTP+PY5nBz3c/YL5PAIbusElVrPujOBSCj8xRg= github.com/cznic/b v0.0.0-20180115125044-35e9bbe41f07 h1:UHFGPvSxX4C4YBApSPvmUfL8tTvWLj2ryqvT9K4Jcuk= github.com/cznic/fileutil v0.0.0-20180108211300-6a051e75936f h1:7uSNgsgcarNk4oiN/nNkO0J7KAjlsF5Yv5Gf/tFdHas= github.com/cznic/golex v0.0.0-20170803123110-4ab7c5e190e4 h1:CVAqftqbj+exlab+8KJQrE+kNIVlQfJt58j4GxCMF1s= @@ -716,6 +766,10 @@ github.com/cznic/ql v1.2.0 h1:lcKp95ZtdF0XkWhGnVIXGF8dVD2X+ClS08tglKtf+ak= github.com/cznic/sortutil v0.0.0-20150617083342-4c7342852e65 h1:hxuZop6tSoOi0sxFzoGGYdRqNrPubyaIf9KoBG9tPiE= github.com/cznic/strutil v0.0.0-20171016134553-529a34b1c186 h1:0rkFMAbn5KBKNpJyHQ6Prb95vIKanmAe62KxsrN+sqA= github.com/cznic/zappy v0.0.0-20160723133515-2533cb5b45cc h1:YKKpTb2BrXN2GYyGaygIdis1vXbE7SSAG9axGWIMClg= +github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c h1:Xo2rK1pzOm0jO6abTPIQwbAmqBIOj132otexc1mmzFc= +github.com/d2g/dhcp4client v1.0.0 h1:suYBsYZIkSlUMEz4TAYCczKf62IA2UWC+O8+KtdOhCo= +github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5 h1:+CpLbZIeUn94m02LdEKPcgErLJ347NUwxPKs5u8ieiY= +github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4 h1:itqmmf1PFpC4n5JW+j4BU7X4MTfVurhYRTjODoPb2Y8= github.com/d4l3k/messagediff v1.2.1 h1:ZcAIMYsUg0EAp9X+tt8/enBE/Q8Yd5kzPynLyKptt9U= github.com/d4l3k/messagediff v1.2.1/go.mod h1:Oozbb1TVXFac9FtSIxHBMnBCq2qeH/2KkEQxENCrlLo= github.com/dave/astrid v0.0.0-20170323122508-8c2895878b14 h1:YI1gOOdmMk3xodBao7fehcvoZsEeOyy/cfhlpCSPgM4= @@ -732,9 +786,9 @@ github.com/dave/patsy v0.0.0-20210517141501-957256f50cba h1:1o36L4EKbZzazMk8iGC4 github.com/dave/patsy v0.0.0-20210517141501-957256f50cba/go.mod h1:qfR88CgEGLoiqDaE+xxDCi5QA5v4vUoW0UCX2Nd5Tlc= github.com/dave/rebecca v0.9.1 h1:jxVfdOxRirbXL28vXMvUvJ1in3djwkVKXCq339qhBL0= github.com/dave/rebecca v0.9.1/go.mod h1:N6XYdMD/OKw3lkF3ywh8Z6wPGuwNFDNtWYEMFWEmXBA= -github.com/dchest/uniuri v1.2.0 h1:koIcOUdrTIivZgSLhHQvKgqdWZq5d7KdMEWF1Ud6+5g= -github.com/dchest/uniuri v1.2.0/go.mod h1:fSzm4SLHzNZvWLvWJew423PhAzkpNQYq+uNLq4kxhkY= github.com/denisenkom/go-mssqldb v0.0.0-20190515213511-eb9f6a1743f3 h1:tkum0XDgfR0jcVVXuTsYv/erY2NnEDqwRojbxR1rBYA= +github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba h1:p6poVbjHDkKa+wtC8frBMwQtT3BmqGYBjzMwJ63tuR4= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgryski/go-sip13 v0.0.0-20190329191031-25c5027a8c7b h1:Yqiad0+sloMPdd/0Fg22actpFx0dekpzt1xJmVNVkU0= github.com/dhui/dktest v0.3.0 h1:kwX5a7EkLcjo7VpsPQSYJcKGbXBXdjI9FGjuUj1jn6I= github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= @@ -744,21 +798,18 @@ github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= -github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8= github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-plugins-helpers v0.0.0-20240701071450-45e2431495c8 h1:IMfrF5LCzP2Vhw7j4IIH3HxPsCLuZYjDqFAM/C88ulg= github.com/docker/go-plugins-helpers v0.0.0-20240701071450-45e2431495c8/go.mod h1:LFyLie6XcDbyKGeVK6bHe+9aJTYCxWLBg5IrJZOaXKA= +github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1 h1:ZClxb8laGDf5arXfYcAtECDFgAgHklGI8CxgjHnXKJ4= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96 h1:cenwrSVm+Z7QLSV/BsnenAOcDXdX4cMv4wP0B/5QbPg= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815 h1:bWDMxwH3px2JBh6AyO7hdCn/PkvCZXii8TGj7sbtEbQ= github.com/dolthub/sqllogictest/go v0.0.0-20201107003712-816f3ae12d81 h1:7/v8q9XGFa6q5Ap4Z/OhNkAMBaK5YeuEzwJt+NZdhiE= github.com/dolthub/sqllogictest/go v0.0.0-20201107003712-816f3ae12d81/go.mod h1:siLfyv2c92W1eN/R4QqG/+RjjX5W2+gCTRjZxBjI3TY= github.com/dolthub/swiss v0.2.1 h1:gs2osYs5SJkAaH5/ggVJqXQxRXtWshF6uE0lgR/Y3Gw= github.com/dolthub/swiss v0.2.1/go.mod h1:8AhKZZ1HK7g18j7v7k6c5cYIGEZJcPn0ARsai8cUrh0= -github.com/drone/funcmap v0.0.0-20220929084810-72602997d16f h1:/jEs7lulqVO2u1+XI5rW4oFwIIusxuDOVKD9PAzlW2E= -github.com/drone/funcmap v0.0.0-20220929084810-72602997d16f/go.mod h1:nDRkX7PHq+p39AD5/usv3KZMerxZTYU/9rfLS5IDspU= -github.com/drone/signal v1.0.0 h1:NrnM2M/4yAuU/tXs6RP1a1ZfxnaHwYkd0kJurA1p6uI= github.com/dvyukov/go-fuzz v0.0.0-20210103155950-6a8e9d1f2415 h1:q1oJaUPdmpDm/VyXosjgPgr6wS7c5iV2p0PwJD73bUI= github.com/dvyukov/go-fuzz v0.0.0-20210103155950-6a8e9d1f2415/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= github.com/eapache/go-resiliency v1.6.0 h1:CqGDTLtpwuWKn6Nj3uNUdflaq+/kIPsg0gfNzHton30= @@ -777,8 +828,11 @@ github.com/elastic/go-windows v1.0.1/go.mod h1:FoVvqWSun28vaDQPbj2Elfc0JahhPB7WQ github.com/elazarl/goproxy v1.3.0/go.mod h1:X/5W/t+gzDyLfHW4DrMdpjqYjpXsURlBt9lpBDxZZZQ= github.com/elazarl/goproxy v1.7.1/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633 h1:H2pdYOb3KQ1/YsqVWoWNLQO+fusocsw354rqGTZtAgw= +github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk= +github.com/emicklei/proto v1.10.0/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A= github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= +github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= @@ -793,8 +847,10 @@ github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/fsouza/fake-gcs-server v1.7.0 h1:Un0BXUXrRWYSmYyC1Rqm2e2WJfTPyDy/HGMz31emTi8= +github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa h1:RDBNVkRviHZtvDvId8XSGPu3rmpmSe+wKRcEWNgsfWU= github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7 h1:LofdAjjjqCSXMwLGgOgnE+rdPuvX9DxCqaHwKy7i/ko= github.com/getkin/kin-openapi v0.126.0 h1:c2cSgLnAsS0xYfKsgt5oBV6MYRM/giU8/RtwUY4wyfY= github.com/getkin/kin-openapi v0.126.0/go.mod h1:7mONz8IwmSRg6RttPu6v8U/OJ+gr+J99qSFNjPGSQqw= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= @@ -837,6 +893,8 @@ github.com/go-playground/validator/v10 v10.19.0 h1:ol+5Fu+cSq9JD7SoSqe04GMI92cbn github.com/go-playground/validator/v10 v10.19.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= +github.com/go-swagger/scan-repo-boundary v0.0.0-20180623220736-973b3573c013 h1:l9rI6sNaZgNC0LnF3MiE+qTmyBA/tZAg1rtyrGbUMK0= +github.com/go-swagger/scan-repo-boundary v0.0.0-20180623220736-973b3573c013/go.mod h1:b65mBPzqzZWxOZGxSWrqs4GInLIn+u99Q9q7p+GKni0= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= @@ -848,7 +906,10 @@ github.com/gocql/gocql v0.0.0-20200526081602-cd04bd7f22a7 h1:TvUE5vjfoa7fFHMlmGO github.com/gocql/gocql v0.0.0-20200526081602-cd04bd7f22a7/go.mod h1:DL0ekTmBSTdlNF25Orwt/JMzqIq3EJ4MVa/J/uK64OY= github.com/gocraft/dbr/v2 v2.7.2 h1:ccUxMuz6RdZvD7VPhMRRMSS/ECF3gytPhPtcavjktHk= github.com/gocraft/dbr/v2 v2.7.2/go.mod h1:5bCqyIXO5fYn3jEp/L06QF4K1siFdhxChMjdNu6YJrg= +github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e h1:BWhy2j3IXJhjCbC68FptL43tDKIq8FladmaTs3Xs7Z8= github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= +github.com/godbus/dbus/v5 v5.0.6 h1:mkgN1ofwASrYnJ5W6U/BxG15eXXXjirgZc7CLqkcaro= +github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/golang-jwt/jwt v3.2.1+incompatible h1:73Z+4BJcrTC+KczS6WvTPvRGOp1WmfEP4Q1lOd9Z/+c= @@ -862,21 +923,18 @@ github.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs0 github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/cel-go v0.22.0/go.mod h1:BuznPXXfQDpXKWQ9sPW3TzlAJN5zzFe+i9tIs0yC4s8= +github.com/google/generative-ai-go v0.18.0 h1:6ybg9vOCLcI/UpBBYXOTVgvKmcUKFRNj+2Cj3GnebSo= +github.com/google/generative-ai-go v0.18.0/go.mod h1:JYolL13VG7j79kM5BtHz4qwONHkeJQzOCkKXnpqtS/E= github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY= -github.com/google/go-jsonnet v0.18.0 h1:/6pTy6g+Jh1a1I2UMoAODkqELFiVIdOxbNwv0DDzoOg= -github.com/google/go-jsonnet v0.18.0/go.mod h1:C3fTzyVJDslXdiTqw/bTFk7vSGyCtH3MGRbDfvEwGd0= github.com/google/go-pkcs11 v0.3.0 h1:PVRnTgtArZ3QQqTGtbtjtnIkzl2iY2kt24yqbrf7td8= github.com/google/go-pkcs11 v0.3.0/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= -github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= github.com/google/renameio/v2 v2.0.0 h1:UifI23ZTGY8Tt29JbYFiuyIU3eX+RNFtUwefq9qAhxg= github.com/google/renameio/v2 v2.0.0/go.mod h1:BtmJXm5YlszgC+TD4HOEEUFgkJP3nLxehU6hfe7jRt4= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/googleapis/cloud-bigtable-clients-test v0.0.2 h1:S+sCHWAiAc+urcEnvg5JYJUOdlQEm/SEzQ/c/IdAH5M= github.com/googleapis/cloud-bigtable-clients-test v0.0.2/go.mod h1:mk3CrkrouRgtnhID6UZQDK3DrFFa7cYCAJcEmNsHYrY= github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= @@ -885,16 +943,18 @@ github.com/googleapis/gax-go/v2 v2.12.3/go.mod h1:AKloxT6GtNbaLm8QTNSidHUVsHYcBH github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A= github.com/googleapis/gax-go/v2 v2.14.0/go.mod h1:lhBCnjdLrWRaPvLWhmc8IS24m9mr07qSYnHncrgo+zk= github.com/googleapis/gnostic v0.3.0 h1:CcQijm0XKekKjP/YCz28LXVSpgguuB+nCxaSjCe09y0= +github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I= github.com/googleapis/go-type-adapters v1.0.0 h1:9XdMn+d/G57qq1s8dNc5IesGCXHf6V2HZ2JwRxfA2tA= github.com/googleapis/google-cloud-go-testing v0.0.0-20210719221736-1c9a4c676720 h1:zC34cGQu69FG7qzJ3WiKW244WfhDC3xxYMeNOX2gtUQ= github.com/googleapis/google-cloud-go-testing v0.0.0-20210719221736-1c9a4c676720/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0= +github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w= github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grafana/alerting v0.0.0-20250129195454-3e5b80036b7a/go.mod h1:QsnoKX/iYZxA4Cv+H+wC7uxutBD8qi8ZW5UJvD2TYmU= github.com/grafana/authlib v0.0.0-20250123104008-e99947858901/go.mod h1:/gYfphsNu9v1qYWXxpv1NSvMEMSwvdf8qb8YlgwIRl8= @@ -932,12 +992,15 @@ github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 h1 github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= github.com/hamba/avro/v2 v2.27.0 h1:IAM4lQ0VzUIKBuo4qlAiLKfqALSrFC+zi1iseTtbBKU= github.com/hamba/avro/v2 v2.27.0/go.mod h1:jN209lopfllfrz7IGoZErlDz+AyUJ3vrBePQFZwYf5I= +github.com/hashicorp/consul/api v1.28.2/go.mod h1:KyzqzgMEya+IZPcD65YFoOVAgPpbfERu4I/tzG6/ueE= github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-memdb v1.3.4 h1:XSL3NR682X/cVk2IeV0d70N4DZ9ljI885xAEU8IoK3c= github.com/hashicorp/go-memdb v1.3.4/go.mod h1:uBTr1oQbtuMgd1SSGoR8YV27eT3sBHbYiNm53bMpgSg= github.com/hashicorp/go-msgpack/v2 v2.1.1 h1:xQEY9yB2wnHitoSzk/B9UjXWRQ67QKu5AOm8aFp8N3I= github.com/hashicorp/go-msgpack/v2 v2.1.1/go.mod h1:upybraOAblm4S7rx0+jeNy+CWWhzywQsSRV5033mMu4= github.com/hashicorp/go-plugin v1.6.2/go.mod h1:CkgLQ5CZqNmdL9U9JzM532t8ZiYQ35+pj3b1FD37R0Q= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-syslog v1.0.0 h1:KaodqZuhUoZereWVIYmpUgZysurB1kBLX2j0MwMrUAE= github.com/hashicorp/go.net v0.0.1 h1:sNCoNyDEvN1xa+X0baata4RdcpKwcMS6DH+xwfqPgjw= github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= @@ -960,14 +1023,15 @@ github.com/influxdata/tdigest v0.0.2-0.20210216194612-fc98d27c9e8b h1:i44CesU68Z github.com/influxdata/tdigest v0.0.2-0.20210216194612-fc98d27c9e8b/go.mod h1:Z0kXnxzbTC2qrx4NaIzYkE1k66+6oEDQTvL95hQFh5Y= github.com/influxdata/telegraf v1.16.3 h1:x0qeuSGGMg5y+YqP/5ZHwXZu3bcBrO8AAQOTNlYEb1c= github.com/influxdata/telegraf v1.16.3/go.mod h1:fX/6k7qpIqzVPWyeIamb0wN5hbwc0ANUaTS80lPYFB8= +github.com/intel/goresctrl v0.2.0 h1:JyZjdMQu9Kl/wLXe9xA6s1X+tF6BWsQPFGJMEeCfWzE= +github.com/intel/goresctrl v0.2.0/go.mod h1:+CZdzouYFn5EsxgqAQTEzMfwKwuc0fVdMrT9FCCAVRQ= github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= github.com/iris-contrib/schema v0.0.6 h1:CPSBLyx2e91H2yJzPuhGuifVRnZBBJ3pCOMbOvPZaTw= github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= +github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56 h1:742eGXur0715JMq73aD95/FU0XpVKXqNuTnEfXsLOYQ= github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 h1:vr3AYkKovP8uR8AvSGGUK1IDqRa5lAAvEkZG1LKaCRc= github.com/jackc/pgx v3.2.0+incompatible h1:0Vihzu20St42/UDsvZGdNE6jak7oi/UOeMzwMPHkgFY= github.com/jackc/pgx/v5 v5.7.1/go.mod h1:e7O26IywZZ+naJtWWos6i6fvWK+29etgITqrqHLfoZA= -github.com/jackspirou/syscerts v0.0.0-20160531025014-b68f5469dff1 h1:9Xm8CKtMZIXgcopfdWk/qZ1rt0HjMgfMR9nxxSeK6vk= -github.com/jackspirou/syscerts v0.0.0-20160531025014-b68f5469dff1/go.mod h1:zuHl3Hh+e9P6gmBPvcqR1HjkaWHC/csgyskg6IaFKFo= github.com/jaegertracing/jaeger v1.57.0 h1:3wDtUUPs6NRYH7+d+y8MilDkLHdpPrVlQ2wbcsA62bs= github.com/jaegertracing/jaeger v1.57.0/go.mod h1:p/1fxIU9hKHl7qEhKC72p2ZYVhvvZvNB73y6V7YyuTs= github.com/jedib0t/go-pretty/v6 v6.2.4 h1:wdaj2KHD2W+mz8JgJ/Q6L/T5dB7kyqEFI16eLq7GEmk= @@ -979,8 +1043,6 @@ github.com/jhump/gopoet v0.1.0 h1:gYjOPnzHd2nzB37xYQZxj4EIQNpBrBskRqQQ3q4ZgSg= github.com/jhump/goprotoc v0.5.0 h1:Y1UgUX+txUznfqcGdDef8ZOVlyQvnV0pKWZH08RmZuo= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= -github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= -github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jon-whit/go-grpc-prometheus v1.4.0 h1:/wmpGDJcLXuEjXryWhVYEGt9YBRhtLwFEN7T+Flr8sw= github.com/jon-whit/go-grpc-prometheus v1.4.0/go.mod h1:iTPm+Iuhh3IIqR0iGZ91JJEg5ax6YQEe1I0f6vtBuao= github.com/joncrlsn/dque v0.0.0-20211108142734-c2ef48c5192a h1:sfe532Ipn7GX0V6mHdynBk393rDmqgI0QmjLK7ct7TU= @@ -1011,6 +1073,7 @@ github.com/kevinmbeaulieu/eq-go v1.0.0/go.mod h1:G3S8ajA56gKBZm4UB9AOyoOS37JO3ro github.com/kisielk/errcheck v1.5.0 h1:e8esj/e4R+SAOwFwN+n3zr0nYeCyeweozKfO23MvHzY= github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= github.com/kisielk/sqlstruct v0.0.0-20201105191214-5f3e10d3ab46 h1:veS9QfglfvqAw2e+eeNT/SbGySq8ajECXJ9e4fPoLhY= +github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/klauspost/cpuid v1.3.1 h1:5JNjFYYQrZeKRJ0734q51WCEEn2huer72Dc7K+R/b6s= @@ -1046,35 +1109,54 @@ github.com/lyft/protoc-gen-star/v2 v2.0.4-0.20230330145011-496ad1ac90a4 h1:sIXJO github.com/lyft/protoc-gen-star/v2 v2.0.4-0.20230330145011-496ad1ac90a4/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= github.com/mailgun/raymond/v2 v2.0.48 h1:5dmlB680ZkFG2RN/0lvTAghrSxIESeu9/2aeDqACtjw= github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= +github.com/marstr/guid v1.1.0 h1:/M4H/1G4avsieL6BbUwCOBzulmoeKVP5ux/3mQNnbyI= github.com/matryer/moq v0.3.3 h1:pScMH9VyrdT4S93yiLpVyU8rCDqGQr24uOyBxmktG5Q= github.com/matryer/moq v0.3.3/go.mod h1:RJ75ZZZD71hejp39j4crZLsEDszGk6iH4v4YsWFKH4s= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-shellwords v1.0.3 h1:K/VxK7SZ+cvuPgFSLKi5QPI9Vr/ipOf4C1gN+ntueUk= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= github.com/mfridman/xflag v0.1.0 h1:TWZrZwG1QklFX5S4j1vxfF1sZbZeZSGofMwPMLAF29M= github.com/mfridman/xflag v0.1.0/go.mod h1:/483ywM5ZO5SuMVjrIGquYNE5CzLrj5Ux/LxWWnjRaE= +github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517 h1:zpIH83+oKzcpryru8ceC6BxnoG8TBrhgAvRg8obzup0= +github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= github.com/microcosm-cc/bluemonday v1.0.25 h1:4NEwSfiJ+Wva0VxN5B8OwMicaJvD8r9tlJWm9rtloEg= github.com/microcosm-cc/bluemonday v1.0.25/go.mod h1:ZIOjCQp1OrzBBPIJmfX4qDYFuhU02nx4bn030ixfHLE= github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= +github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= +github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= +github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible h1:aKW/4cBs+yK6gpqU3K/oIwk9Q/XICqd3zOX/UFuvqmk= github.com/mitchellh/cli v1.1.5 h1:OxRIeJXpAMztws/XHlN2vu6imG5Dpq+j61AzAX5fLng= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= +github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc= +github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/gox v0.4.0 h1:lfGJxY7ToLJQjHHwi0EX6uYBdK78egf954SQl13PQJc= github.com/mitchellh/iochan v1.0.0 h1:C+X3KsSTLFVBr/tK1eYN/vs4rJcvsiLU338UhYPJWeY= +github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f h1:2+myh5ml7lgEU/51gbeLHfKGNfgEQQIWrlbdaOsidbQ= github.com/mithrandie/readline-csvq v1.3.0 h1:VTJEOGouJ8j27jJCD4kBBbNTxM0OdBvE1aY1tMhlqE8= github.com/mithrandie/readline-csvq v1.3.0/go.mod h1:FKyYqDgf/G4SNov7SMFXRWO6LQLXIOeTog/NB97FZl0= +github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= +github.com/moby/sys/mountinfo v0.5.0 h1:2Ks8/r6lopsxWi9m58nlwjaeSzUX9iiL1vj5qB/9ObI= +github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= +github.com/moby/sys/signal v0.6.0 h1:aDpY94H8VlhTGa9sNYUFCFsMZIUh5wm0B6XkIoJj/iY= +github.com/moby/sys/signal v0.6.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= +github.com/moby/sys/symlink v0.2.0 h1:tk1rOM+Ljp0nFmfOIBtlV3rTDlWOwFRhjEeAhZB0nZc= +github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/mostynb/go-grpc-compression v1.2.3 h1:42/BKWMy0KEJGSdWvzqIyOZ95YcR9mLPqKctH7Uo//I= github.com/mostynb/go-grpc-compression v1.2.3/go.mod h1:AghIxF3P57umzqM9yz795+y1Vjs47Km/Y2FE6ouQ7Lg= +github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5 h1:0KqC6/sLy7fDpBdybhVkkv4Yz+PmB7c9Dz9z3dLW804= +github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= +github.com/mrunalp/fileutils v0.5.0 h1:NKzVxiH7eSk+OQ4M+ZYW1K6h27RUV3MI6NUTsHhU6Z4= github.com/nakagami/firebirdsql v0.0.0-20190310045651-3c02a58cfed8 h1:P48LjvUQpTReR3TQRbxSeSBsMXzfK0uol7eRcr7VBYQ= -github.com/natessilva/dag v0.0.0-20180124060714-7194b8dcc5c4 h1:dnMxwus89s86tI8rcGVp2HwZzlz7c5o92VOy7dSckBQ= github.com/nats-io/nats.go v1.34.0 h1:fnxnPCNiwIG5w08rlMcEKTUw4AV/nKyGCOJE8TdhSPk= github.com/nats-io/nats.go v1.34.0/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8= github.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI= @@ -1089,7 +1171,6 @@ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWb github.com/nsf/jsondiff v0.0.0-20230430225905-43f6cf3098c1 h1:dOYG7LS/WK00RWZc8XGgcUTlTxpp3mKhdR2Q9z9HbXM= github.com/nsf/jsondiff v0.0.0-20230430225905-43f6cf3098c1/go.mod h1:mpRZBD8SJ55OIICQ3iWH0Yz3cjzA61JdqMLoWXeB2+8= github.com/onsi/ginkgo/v2 v2.20.1/go.mod h1:lG9ey2Z29hR41WMVthyJBGUBcBhGOtoPF2VFMvBXFCI= -github.com/onsi/gomega v1.34.2/go.mod h1:v1xfxRgk0KIsG+QOdm7p8UosrOzPYRo60fd3B/1Dukc= github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter v0.102.0 h1:R70PpK14trQfL/Vj5oAiGRqX09s2gOWuf6t1Ae5fevQ= github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter v0.102.0/go.mod h1:xmy/yFFmB1Epy+czrYMbA+4xeOKvhFqNqYWU6qINeis= github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.102.0 h1:N3vWsp3xealy4AX8TovfHG5EKi/k7z+F/8LFP4SVAgo= @@ -1128,13 +1209,22 @@ github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusrec github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.102.0/go.mod h1:WNFjuquVqyi+WEoa6L0J3DzPLRsP24ZlbZYwKv49VwY= github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.102.0 h1:Pemo9pZa3VMYdrM/bss3f0qqVyBzPSulOBQL8VQcgN8= github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.102.0/go.mod h1:fvjAM+jOQdiXCmAENKH/eWxBBqTaImbq3lpoBI4X5Ek= +github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v1.1.2 h1:2VSZwLx5k/BfsBxMMipG/LYUnmqOD/BPkIVgQUcTlLw= +github.com/opencontainers/runc v1.1.2/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 h1:3snG66yBm59tKhhSPQrQ/0bCrv1LQbKt40LnUPiUxdc= +github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39 h1:H7DMc6FAjgwZZi8BRqjrAAHWoqEr5e5L6pS4V0ezet4= +github.com/opencontainers/selinux v1.10.1 h1:09LIPVRP3uuZGQvgR+SgMSNBd1Eb3vlRbGqQpoHsF8w= +github.com/opencontainers/selinux v1.10.1/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/openfga/api/proto v0.0.0-20240905181937-3583905f61a6/go.mod h1:gil5LBD8tSdFQbUkCQdnXsoeU9kDJdJgbGdHkgJfcd0= github.com/oschwald/geoip2-golang v1.11.0 h1:hNENhCn1Uyzhf9PTmquXENiWS6AlxAEnBII6r8krA3w= github.com/oschwald/geoip2-golang v1.11.0/go.mod h1:P9zG+54KPEFOliZ29i7SeYZ/GM6tfEL+rgSn03hYuUo= github.com/oschwald/maxminddb-golang v1.13.0 h1:R8xBorY71s84yO06NgTmQvqvTvlS/bnYZrrWX1MElnU= github.com/oschwald/maxminddb-golang v1.13.0/go.mod h1:BU0z8BfFVhi1LQaonTwwGQlsHUEu9pWNdMfmq4ztm0o= +github.com/otiai10/curr v1.0.0 h1:TJIWdbX0B+kpNagQrjgq8bCMrbhiuX73M2XwgtDMoOI= +github.com/otiai10/mint v1.3.1 h1:BCmzIS3n71sGfHB5NMNDB3lHYPz8fWSkCAErHed//qc= github.com/parquet-go/parquet-go v0.23.0 h1:dyEU5oiHCtbASyItMCD2tXtT2nPmoPbKpqf0+nnGrmk= github.com/parquet-go/parquet-go v0.23.0/go.mod h1:MnwbUcFHU6uBYMymKAlPPAw9yh3kE1wWl6Gl1uLdkNk= github.com/paulmach/orb v0.11.1 h1:3koVegMC4X/WeiXYz9iswopaTwMem53NzTJuTF20JzU= @@ -1144,12 +1234,15 @@ github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2D github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30 h1:BHT1/DKsYDGkUgQ2jmMaozVcdk+sVfz0+1ZJq4zkWgw= github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/petar/GoLLRB v0.0.0-20130427215148-53be0d36a84c h1:AwcgVYzW1T+QuJ2fc55ceOSCiVaOpdYUNpFj9t7+n9U= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d h1:CdDQnGF8Nq9ocOS/xlSptM1N3BbrA6/kmaep5ggwaIA= +github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= github.com/phpdave11/gofpdf v1.4.2 h1:KPKiIbfwbvC/wOncwhrpRdXVj2CZTCFlw4wnoyjtHfQ= github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= github.com/pkg/sftp v1.13.6 h1:JFZT4XbOU7l77xGSpOdW+pwIMqP044IyjXX6FGyEKFo= github.com/pkg/sftp v1.13.6/go.mod h1:tz1ryNURKu77RL+GuCzmoJYxQczL3wLNNpPWagdg4Qk= @@ -1165,6 +1258,9 @@ github.com/prometheus/common/assets v0.2.0 h1:0P5OrzoHrYBOSM1OigWL3mY8ZvV2N4zIE/ github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/statsd_exporter v0.26.0 h1:SQl3M6suC6NWQYEzOvIv+EF6dAMYEqIuZy+o4H9F5Ig= github.com/prometheus/statsd_exporter v0.26.0/go.mod h1:GXFLADOmBTVDrHc7b04nX8ooq3azG61pnECNqT7O5DM= +github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= +github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71 h1:CNooiryw5aisadVfzneSZPswRWvnVW8hF1bS/vo8ReI= +github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= github.com/rabbitmq/amqp091-go v1.9.0 h1:qrQtyzB4H8BQgEuJwhmVQqVHB9O4+MNDJCCAcpc3Aoo= github.com/rabbitmq/amqp091-go v1.9.0/go.mod h1:+jPrT9iY2eLjRaMSRHUhc3z14E/l85kv/f+6luSD3pc= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= @@ -1178,7 +1274,9 @@ github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99 github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245 h1:K1Xf3bKttbF+koVGaX5xngRIZ5bVjbmPnaxE/dR08uY= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.2+incompatible h1:C89EOx/XBWwIXl8wm8OPJBd7kPF25UfsK2X7Ph/zCAk= +github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8 h1:2c1EFnZHIPCW8qKWgHMH/fX2PkSabFc5mrVzfUNdg5U= github.com/sagikazarmark/crypt v0.19.0 h1:WMyLTjHBo64UvNcWqpzY3pbZTYgnemZU8FBZigKc42E= github.com/sagikazarmark/crypt v0.19.0/go.mod h1:c6vimRziqqERhtSe0MhIvzE1w54FrCHtrXb5NH/ja78= github.com/samuel/go-zookeeper v0.0.0-20190810000440-0ceca61e4d75 h1:cA+Ubq9qEVIQhIWvP2kNuSZ2CmnfBJFSRq+kO1pu2cc= @@ -1187,20 +1285,25 @@ github.com/schollz/closestmatch v2.1.0+incompatible h1:Uel2GXEpJqOWBrlyI+oY9LTiy github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/schollz/progressbar/v3 v3.14.6 h1:GyjwcWBAf+GFDMLziwerKvpuS7ZF+mNTAXIB2aspiZs= github.com/schollz/progressbar/v3 v3.14.6/go.mod h1:Nrzpuw3Nl0srLY0VlTvC4V6RL50pcEymjy6qyJAaLa0= +github.com/seccomp/libseccomp-golang v0.9.1 h1:NJjM5DNFOs0s3kYE1WUOr6G8V97sdt46rlXTMfXGWBo= github.com/segmentio/fasthash v1.0.3 h1:EI9+KE1EwvMLBWwjpRDc+fEM+prwxDYbslddQGtrmhM= github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU= github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8= +github.com/shirou/gopsutil/v3 v3.24.5 h1:i0t8kL+kQTvpAYToeuiVk3TgDeKOFioZO3Ztz/iZ9pI= +github.com/shirou/gopsutil/v3 v3.24.5/go.mod h1:bsoOS1aStSs9ErQ1WWfxllSeS1K5D+U30r2NfcubMVk= github.com/shirou/gopsutil/v4 v4.24.0-alpha.1 h1:lLPAdP4TpfgJ5byoc3EFwNSKZj8kCnDFHtuWTktWl0s= github.com/shirou/gopsutil/v4 v4.24.0-alpha.1/go.mod h1:GVpYUxBee6CTWux2/JslZ7fYPwqkQ8YDJSXmGAryYy4= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e h1:MZM7FHLqUHYI0Y/mQAt3d2aYa0SiNms/hFqC9qJYolM= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041 h1:llrF3Fs4018ePo4+G/HV/uQUqEI1HMDjCeOf2V6puPc= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad h1:fiWzISvDn0Csy5H0iwgAuJGQTUpVfEMJJd4nRFXogbc= +github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980 h1:lIOOHPEbXzO3vnmx2gok1Tfs31Q8GQqKLc8vVqyQq/I= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stoewer/parquet-cli v0.0.7 h1:rhdZODIbyMS3twr4OM3am8BPPT5pbfMcHLH93whDM5o= github.com/stoewer/parquet-cli v0.0.7/go.mod h1:bskxHdj8q3H1EmfuCqjViFoeO3NEvs5lzZAQvI8Nfjk= @@ -1208,6 +1311,8 @@ github.com/substrait-io/substrait v0.57.1 h1:GW8nnYfSowMseHR8Os82/X6lNtQGIK7p4p+ github.com/substrait-io/substrait v0.57.1/go.mod h1:q9s+tjo+gK0lsA+SqYB0lhojNuxvdPdfYlGUP0hjbrA= github.com/substrait-io/substrait-go v1.2.0 h1:3ZNRkc8FYD7ifCagKEOZQtUcgMceMQfwo2N1NGaK4Q4= github.com/substrait-io/substrait-go v1.2.0/go.mod h1:IPsy24rdjp/buXR+T8ENl6QCnSCS6h+uM8P+GaZez7c= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= +github.com/tchap/go-patricia v2.2.6+incompatible h1:JvoDL7JSoIP2HDE8AbDH3zC8QBPxmzYe32HHy5yQ+Ck= github.com/tdewolff/minify/v2 v2.12.8 h1:Q2BqOTmlMjoutkuD/OPCnJUpIqrzT3nRPkw+q+KpXS0= github.com/tdewolff/minify/v2 v2.12.8/go.mod h1:YRgk7CC21LZnbuke2fmYnCTq+zhCgpb0yJACOTUNJ1E= github.com/tdewolff/parse/v2 v2.6.7 h1:WrFllrqmzAcrKHzoYgMupqgUBIfBVOb0yscFzDf8bBg= @@ -1237,10 +1342,18 @@ github.com/twmb/franz-go/plugin/kprom v1.1.0 h1:grGeIJbm4llUBF8jkDjTb/b8rKllWSXj github.com/twmb/franz-go/plugin/kprom v1.1.0/go.mod h1:cTDrPMSkyrO99LyGx3AtiwF9W6+THHjZrkDE2+TEBIU= github.com/uber-go/atomic v1.4.0 h1:yOuPqEq4ovnhEjpHmfFwsqBXDYbQeT6Nb0bwD6XnD5o= github.com/uber-go/atomic v1.4.0/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= +github.com/ugorji/go v1.1.4 h1:j4s+tAvLfL3bZyefP2SEWmhBzmuIlH/eqNuPdFPgngw= +github.com/urfave/cli v1.22.14/go.mod h1:X0eDS6pD6Exaclxm99NJ3FiCDRED7vIHpx2mDOHLvkA= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/valyala/quicktemplate v1.8.0 h1:zU0tjbIqTRgKQzFY1L42zq0qR3eh4WoQQdIdqCysW5k= +github.com/valyala/quicktemplate v1.8.0/go.mod h1:qIqW8/igXt8fdrUln5kOSb+KWMaJ4Y8QUsfd1k6L2jM= github.com/vertica/vertica-sql-go v1.3.3 h1:fL+FKEAEy5ONmsvya2WH5T8bhkvY27y/Ik3ReR2T+Qw= github.com/vertica/vertica-sql-go v1.3.3/go.mod h1:jnn2GFuv+O2Jcjktb7zyc4Utlbu9YVqpHH/lx63+1M4= +github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5 h1:+UB2BJA852UkGH42H+Oee69djmxS3ANzl2b/JtT1YiA= +github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f h1:p4VB7kIXpOQvVn1ZaTIVp+3vuYAXFe3OJEvjbUYJLaA= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU= github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= @@ -1265,6 +1378,8 @@ github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17 github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xhit/go-str2duration v1.2.0 h1:BcV5u025cITWxEQKGWr1URRzrcXtu7uk8+luz3Yuhwc= github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= +github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8= +github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwYZvkeru3RtdrYueztKhOBCSAAzS4Gf+k0tEow= github.com/ydb-platform/ydb-go-genproto v0.0.0-20241112172322-ea1f63298f77 h1:LY6cI8cP4B9rrpTleZk95+08kl2gF4rixG7+V/dwL6Q= github.com/ydb-platform/ydb-go-genproto v0.0.0-20241112172322-ea1f63298f77/go.mod h1:Er+FePu1dNUieD+XTMDduGpQuCPssK5Q4BjF+IIXJ3I= @@ -1275,6 +1390,9 @@ github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+ github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43 h1:+lm10QQTNSBd8DVTNGHx7o/IKu9HYDvLMffDhbyLccI= +github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50 h1:hlE8//ciYMztlGpl/VA+Zm1AcTPHYkHJPbHqE6WJUXE= +github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f h1:ERexzlUfuTvpE74urLSbIQW0Z/6hF9t8U4NsJLaioAY= github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b h1:FosyBZYxY34Wul7O/MSKey3txpPYyCqVO5ZyceuQJEI= github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b/go.mod h1:ZRKQfBXbGkpdV6QMzT3rU1kSTAnfu1dO8dPKjYprgj8= github.com/zenazn/goji v1.0.1 h1:4lbD8Mx2h7IvloP7r2C0D6ltZP6Ufip8Hn0wmSK5LR8= @@ -1282,10 +1400,15 @@ github.com/zenazn/goji v1.0.1/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxt gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b h1:7gd+rd8P3bqcn/96gOZa3F5dpJr/vEiDQYlNb/y2uNs= go.einride.tech/aip v0.68.0 h1:4seM66oLzTpz50u4K1zlJyOXQ3tCzcJN7I22tKkjipw= go.einride.tech/aip v0.68.0/go.mod h1:7y9FF8VtPWqpxuAxl0KQWqaULxW4zFIesD6zF5RIHHg= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489 h1:1JFLBqwIgdyHN1ZtgjTBwO+blA6gVOmZurpiMEsETKo= +go.etcd.io/etcd/api/v3 v3.5.12/go.mod h1:Ot+o0SWSyT6uHhA56al1oCED0JImsRiU9Dc26+C2a+4= +go.etcd.io/etcd/client/pkg/v3 v3.5.12/go.mod h1:seTzl2d9APP8R5Y2hFL3NVlD6qC/dOT+3kvrqPyTas4= +go.etcd.io/etcd/client/v2 v2.305.12/go.mod h1:aQ/yhsxMu+Oht1FOupSr60oBvcS9cKXHrzBpDsPTf9E= +go.etcd.io/etcd/client/v3 v3.5.12/go.mod h1:tSbBCakoWmmddL+BKVAJHa9km+O/E+bumDe9mSbPiqw= go.etcd.io/gofail v0.1.0 h1:XItAMIhOojXFQMgrxjnd2EIIHun/d5qL0Pf7FzVTkFg= go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g= -go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= +go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1 h1:A/5uWzF44DlIgdm/PQFwfMkW0JX+cIcQi/SwLAmZP5M= go.opentelemetry.io/collector v0.102.1 h1:M/ciCcReQsSDYG9bJ2Qwqk7pQILDJ2bM/l0MdeCAvJE= go.opentelemetry.io/collector v0.102.1/go.mod h1:yF1lDRgL/Eksb4/LUnkMjvLvHHpi6wqBVlzp+dACnPM= go.opentelemetry.io/collector/component v0.102.1 h1:66z+LN5dVCXhvuVKD1b56/3cYLK+mtYSLIwlskYA9IQ= @@ -1383,6 +1506,8 @@ go.opentelemetry.io/otel/bridge/opencensus v1.27.0 h1:ao9aGGHd+G4YfjBpGs6vbkvt5h go.opentelemetry.io/otel/bridge/opencensus v1.27.0/go.mod h1:uRvWtAAXzyVOST0WMPX5JHGBaAvBws+2F8PcC5gMnTk= go.opentelemetry.io/otel/bridge/opentracing v1.26.0 h1:Q/dHj0DOhfLMAs5u5ucAbC7gy66x9xxsZRLpHCJ4XhI= go.opentelemetry.io/otel/bridge/opentracing v1.26.0/go.mod h1:HfypvOw/8rqu4lXDhwaxVK1ibBAi1lTMXBHV9rywOCw= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0 h1:R/OBkMoGgfy2fLhs2QhkCI1w4HLEQX92GCcJB6SSdNk= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 h1:U2guen0GhqH8o/G2un8f/aG/y++OuW6MyCo6hT9prXk= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0/go.mod h1:yeGZANgEcpdx/WK0IvvRFC+2oLiMS2u4L/0Rj2M2Qr0= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.28.0 h1:aLmmtjRke7LPDQ3lvpFz+kNEH43faFhzW7v8BFIEydg= @@ -1418,14 +1543,14 @@ go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+M go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= -go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.starlark.net v0.0.0-20221020143700-22309ac47eac/go.mod h1:kIVgS18CjmEC3PqMd5kaJSGEifyV/CeB9x506ZJ1Vbk= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= golang.org/x/arch v0.4.0 h1:A8WCeEWhLwPBKNbFi5Wv5UTCBx5zzubnXDlMOFAzFMc= golang.org/x/arch v0.4.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= @@ -1436,6 +1561,8 @@ golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5 golang.org/x/exp v0.0.0-20230315142452-642cacee5cc0/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= +golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= @@ -1446,17 +1573,18 @@ golang.org/x/image v0.14.0 h1:tNgSxAFe3jC4uYqvZdTr84SZoM1KfwdC9SKIFrLjFn4= golang.org/x/image v0.14.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= -golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= +golang.org/x/mod v0.6.0-dev.0.20220818022119-ed83ed61efb9/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= -golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= @@ -1466,6 +1594,7 @@ golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= +golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= golang.org/x/oauth2 v0.19.0/go.mod h1:vYi7skDa1x015PmRRYZ7+s1cWyPgrPiSYRe4rnsexc8= golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= @@ -1473,9 +1602,11 @@ golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbht golang.org/x/oauth2 v0.26.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= @@ -1483,20 +1614,18 @@ golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457 h1:zf5N6UOrA487eEFacMePxjXAJctxKmyjKUsjA11Uzuk= golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= -golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= @@ -1510,6 +1639,7 @@ gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0 h1:OE9mWmgKkjJyEmDAAtGMPj gonum.org/v1/plot v0.14.0 h1:+LBDVFYwFe4LHhdP8coW6296MBEY4nQ+Y4vuUpJopcE= gonum.org/v1/plot v0.14.0/go.mod h1:MLdR9424SJed+5VqC6MsouEpig9pZX2VZ57H9ko2bXU= google.golang.org/api v0.152.0/go.mod h1:3qNJX5eOmhiWYc67jRA/3GsDw97UFb5ivv7Y2PrriAY= +google.golang.org/api v0.171.0/go.mod h1:Hnq5AHm4OTMt2BUVjael2CWZFD6vksJdWCWiUAmjC9o= google.golang.org/api v0.177.0/go.mod h1:srbhue4MLjkjbkux5p3dw/ocYOSZTaIEvf7bCOnFQDw= google.golang.org/api v0.203.0/go.mod h1:BuOVyCSYEPwJb3npWvDnNmFI92f3GeRnHNkETneT3SI= google.golang.org/api v0.211.0/go.mod h1:XOloB4MXFH4UTlQSGuNUxw0UT74qdENK8d6JNsXKLi0= @@ -1518,14 +1648,18 @@ google.golang.org/api v0.217.0/go.mod h1:qMc2E8cBAbQlRypBTBWHklNJlaZZJBwDv81B1Iu google.golang.org/api v0.218.0/go.mod h1:5VGHBAkxrA/8EFjLVEYmMUJ8/8+gWWQ3s4cFH0FxG2M= google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8 h1:Cpp2P6TPjujNoC5M2KHY6g7wfyLYfIWRZaSdIKfDasA= google.golang.org/genproto v0.0.0-20230731193218-e0aa005b6bdf/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= +google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro= +google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:mqHbVIp48Muh7Ywss/AD6I5kNVKZMmAa/QEW58Gxp2s= google.golang.org/genproto v0.0.0-20241015192408-796eee8c2d53/go.mod h1:fheguH3Am2dGp1LfXkrvwqC/KlFq8F0nLq3LryOMrrE= google.golang.org/genproto v0.0.0-20241118233622-e639e219e697/go.mod h1:JJrvXBWRZaFMxBufik1a4RpFw4HhgVtBBWQeQgUj2cc= google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= +google.golang.org/genproto/googleapis/api v0.0.0-20240311132316-a219d84964c2/go.mod h1:O1cOfN1Cy6QEYr7VxtjOyP5AdAuR0aJ/MYZaaof623Y= google.golang.org/genproto/googleapis/api v0.0.0-20240429193739-8cf5692501f6/go.mod h1:10yRODfgim2/T8csjQsMPgZOMvtytXKTDRzH6HRGzRw= google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157/go.mod h1:99sLkeliLXfdj2J75X3Ho+rrVCaJze0uwN7zDDkjPVU= google.golang.org/genproto/googleapis/api v0.0.0-20240604185151-ef581f913117/go.mod h1:OimBR/bc1wPO9iV4NC2bpyjy3VnAwZh5EBPQdtaE5oo= @@ -1544,7 +1678,9 @@ google.golang.org/genproto/googleapis/bytestream v0.0.0-20250102185135-698230207 google.golang.org/genproto/googleapis/bytestream v0.0.0-20250127172529-29210b9bc287 h1:c/HGC2hBfwgjeBtQMLjfmuS2KG28ngtUpn5XiX8o3rY= google.golang.org/genproto/googleapis/bytestream v0.0.0-20250127172529-29210b9bc287/go.mod h1:7VGktjvijnuhf2AobFqsoaBGnG8rImcxqoL+QPBPRq4= google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f/go.mod h1:L9KNLi232K1/xB6f7AlSX692koaRnKaWSR0stBki0Yc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240314234333-6e1732d8331c/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= @@ -1574,14 +1710,15 @@ google.golang.org/grpc v1.69.2/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= google.golang.org/protobuf v1.36.0/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= -gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= +gopkg.in/airbrake/gobrake.v2 v2.0.9 h1:7z2uVWwn7oVeeugY1DtlPAy5H+KYgB1KeKTnqjNatLo= +gopkg.in/cheggaaa/pb.v1 v1.0.25 h1:Ev7yu1/f6+d+b3pi5vPdRPc6nNtP1umSfcWiEfRqv6I= gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 h1:OAj3g0cR6Dx/R07QgQe8wkA9RNjB2u4i700xBkIT4e0= gopkg.in/resty.v1 v1.12.0 h1:CuXP0Pjfw9rOuY6EP+UvtNvt5DSqHpIxILZKT/quCZI= gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI= gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= @@ -1595,14 +1732,19 @@ honnef.co/go/tools v0.3.2/go.mod h1:jzwdWgg7Jdq75wlfblQxO4neNaFFSvgc1tD5Wv8U0Yw= howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM= howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= +k8s.io/client-go v9.0.0+incompatible h1:2kqW3X2xQ9SbFvWZjGEHBLlWc1LG9JIJNXWkuqwdZ3A= k8s.io/code-generator v0.32.1 h1:4lw1kFNDuFYXquTkB7Sl5EwPMUP2yyW9hh6BnFfRZFY= k8s.io/code-generator v0.32.1/go.mod h1:zaILfm00CVyP/6/pJMJ3zxRepXkxyDfUV5SNG4CjZI4= +k8s.io/cri-api v0.25.0 h1:INwdXsCDSA/0hGNdPxdE2dQD6ft/5K1EaKXZixvSQxg= +k8s.io/cri-api v0.25.0/go.mod h1:J1rAyQkSJ2Q6I+aBMOVgg2/cbbebso6FNa0UagiR0kc= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6 h1:4s3/R4+OYYYUKptXPhZKjQ04WJ6EhQQVFdjOFvCazDk= +k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac h1:sAvhNk5RRuc6FNYGqe7Ygz3PSo/2wGWbulskmzRX8Vs= k8s.io/gengo/v2 v2.0.0-20240911193312-2b36238f13e9 h1:si3PfKm8dDYxgfbeA6orqrtLkvvIeH8UqffFJDl0bz4= k8s.io/gengo/v2 v2.0.0-20240911193312-2b36238f13e9/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kubernetes v1.13.0 h1:qTfB+u5M92k2fCCCVP2iuhgwwSOv1EkAkvQY1tQODD8= k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= lukechampine.com/uint128 v1.2.0 h1:mBi/5l91vocEN8otkC5bDLhi2KdCticRiwbdB0O+rjI= modernc.org/cc/v3 v3.36.3 h1:uISP3F66UlixxWEcKuIWERa4TwrZENHSL8tWxZz8bHg= diff --git a/kindsv2/Makefile b/kindsv2/Makefile index 5a6d72bf528..1e72c98cd5f 100644 --- a/kindsv2/Makefile +++ b/kindsv2/Makefile @@ -4,5 +4,5 @@ include ../.bingo/Variables.mk all: dashboards .PHONY: dashboards -dashboards: $(COG) ## Dashboards – Typescript - @$(COG) generate --config ./dashboard-ts.yaml +dashboards: ## Dashboards – Typescript + go tool github.com/grafana/cog/cmd/cli generate --config ./dashboard-ts.yaml From 3e5975367c705f6442044ee7593800d5317283aa Mon Sep 17 00:00:00 2001 From: aishyandapalli Date: Mon, 17 Mar 2025 02:14:55 -0700 Subject: [PATCH 084/117] Prometheus: Add SpanID while clicking on TraceID datalink for Exemplar (#101541) Add Span context to Exemplar data links --- packages/grafana-prometheus/src/result_transformer.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/grafana-prometheus/src/result_transformer.ts b/packages/grafana-prometheus/src/result_transformer.ts index 4c43a891719..5db8a31d95b 100644 --- a/packages/grafana-prometheus/src/result_transformer.ts +++ b/packages/grafana-prometheus/src/result_transformer.ts @@ -278,6 +278,11 @@ function getDataLinks(options: ExemplarTraceIdDestination): DataLink[] { url: '', internal: { query: { query: '${__value.raw}', queryType: 'traceql' }, + panelsState: { + trace: { + spanId: '${__data.fields["span_id"]}', + }, + }, datasourceUid: options.datasourceUid, datasourceName: dsSettings?.name ?? 'Data source not found', }, From 3ec3085416b417d89cd52804f0bf6c7e8fee93e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20=C5=A0tibran=C3=BD?= Date: Mon, 17 Mar 2025 10:47:27 +0100 Subject: [PATCH 085/117] Pass build tags to golangci-lint and go test commands. (#102206) * Pass build tag to golangci-lint. * Pass build tags to go test command. --- Makefile | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 3a060c3601e..8b0c6664c18 100644 --- a/Makefile +++ b/Makefile @@ -17,6 +17,7 @@ GO_RACE_FLAG := $(if $(GO_RACE),-race) GO_BUILD_FLAGS += $(if $(GO_BUILD_DEV),-dev) GO_BUILD_FLAGS += $(if $(GO_BUILD_TAGS),-build-tags=$(GO_BUILD_TAGS)) GO_BUILD_FLAGS += $(GO_RACE_FLAG) +GO_TEST_FLAGS += $(if $(GO_BUILD_TAGS),-tags=$(GO_BUILD_TAGS)) GO_TEST_OUTPUT := $(shell [ -n "$(GO_TEST_OUTPUT)" ] && echo '-json | tee $(GO_TEST_OUTPUT) | tparse -all') GO_UNIT_COVERAGE ?= true GO_UNIT_COVER_PROFILE ?= unit.cov @@ -250,12 +251,12 @@ test-go: test-go-unit test-go-integration .PHONY: test-go-unit test-go-unit: ## Run unit tests for backend with flags. @echo "backend unit tests" - $(GO) test $(GO_RACE_FLAG) -v -short -timeout=30m $(GO_TEST_FILES) $(GO_TEST_OUTPUT) + $(GO) test $(GO_RACE_FLAG) $(GO_TEST_FLAGS) -v -short -timeout=30m $(GO_TEST_FILES) $(GO_TEST_OUTPUT) .PHONY: test-go-unit-cov test-go-unit-cov: ## Run unit tests for backend with flags and coverage @echo "backend unit tests with coverage" - $(GO) test $(GO_RACE_FLAG) -v -short $(if $(filter true,$(GO_UNIT_COVERAGE)),-covermode=atomic -coverprofile=$(GO_UNIT_COVER_PROFILE) $(if $(GO_UNIT_TEST_COVERPKG),-coverpkg=$(GO_UNIT_TEST_COVERPKG)),) -timeout=30m $(GO_TEST_FILES) $(GO_TEST_OUTPUT) + $(GO) test $(GO_RACE_FLAG) $(GO_TEST_FLAGS) -v -short $(if $(filter true,$(GO_UNIT_COVERAGE)),-covermode=atomic -coverprofile=$(GO_UNIT_COVER_PROFILE) $(if $(GO_UNIT_TEST_COVERPKG),-coverpkg=$(GO_UNIT_TEST_COVERPKG)),) -timeout=30m $(GO_TEST_FILES) $(GO_TEST_OUTPUT) .PHONY: test-go-unit-pretty test-go-unit-pretty: check-tparse @@ -263,12 +264,12 @@ test-go-unit-pretty: check-tparse echo "Notice: FILES variable is not set. Try \"make test-go-unit-pretty FILES=./pkg/services/mysvc\""; \ exit 1; \ fi - $(GO) test $(GO_RACE_FLAG) -timeout=10s $(FILES) -json | tparse -all + $(GO) test $(GO_RACE_FLAG) $(GO_TEST_FLAGS) -timeout=10s $(FILES) -json | tparse -all .PHONY: test-go-integration test-go-integration: ## Run integration tests for backend with flags. @echo "test backend integration tests" - $(GO) test $(GO_RACE_FLAG) -count=1 -run "^TestIntegration" -covermode=atomic -coverprofile=$(GO_INTEGRATION_COVER_PROFILE) -timeout=5m $(GO_INTEGRATION_TESTS) $(GO_TEST_OUTPUT) + $(GO) test $(GO_RACE_FLAG) $(GO_TEST_FLAGS) -count=1 -run "^TestIntegration" -covermode=atomic -coverprofile=$(GO_INTEGRATION_COVER_PROFILE) -timeout=5m $(GO_INTEGRATION_TESTS) $(GO_TEST_OUTPUT) .PHONY: test-go-integration-alertmanager test-go-integration-alertmanager: ## Run integration tests for the remote alertmanager (config taken from the mimir_backend block). @@ -290,25 +291,25 @@ test-go-integration-postgres: devenv-postgres ## Run integration tests for postg @echo "test backend integration postgres tests" $(GO) clean -testcache GRAFANA_TEST_DB=postgres \ - $(GO) test $(GO_RACE_FLAG) -p=1 -count=1 -run "^TestIntegration" -covermode=atomic -timeout=10m $(GO_INTEGRATION_TESTS) + $(GO) test $(GO_RACE_FLAG) $(GO_TEST_FLAGS) -p=1 -count=1 -run "^TestIntegration" -covermode=atomic -timeout=10m $(GO_INTEGRATION_TESTS) .PHONY: test-go-integration-mysql test-go-integration-mysql: devenv-mysql ## Run integration tests for mysql backend with flags. @echo "test backend integration mysql tests" GRAFANA_TEST_DB=mysql \ - $(GO) test $(GO_RACE_FLAG) -p=1 -count=1 -run "^TestIntegration" -covermode=atomic -timeout=10m $(GO_INTEGRATION_TESTS) + $(GO) test $(GO_RACE_FLAG) $(GO_TEST_FLAGS) -p=1 -count=1 -run "^TestIntegration" -covermode=atomic -timeout=10m $(GO_INTEGRATION_TESTS) .PHONY: test-go-integration-redis test-go-integration-redis: ## Run integration tests for redis cache. @echo "test backend integration redis tests" $(GO) clean -testcache - REDIS_URL=localhost:6379 $(GO) test $(GO_RACE_FLAG) -run IntegrationRedis -covermode=atomic -timeout=2m $(GO_INTEGRATION_TESTS) + REDIS_URL=localhost:6379 $(GO) test $(GO_TEST_FLAGS) -run IntegrationRedis -covermode=atomic -timeout=2m $(GO_INTEGRATION_TESTS) .PHONY: test-go-integration-memcached test-go-integration-memcached: ## Run integration tests for memcached cache. @echo "test backend integration memcached tests" $(GO) clean -testcache - MEMCACHED_HOSTS=localhost:11211 $(GO) test $(GO_RACE_FLAG) -run IntegrationMemcached -covermode=atomic -timeout=2m $(GO_INTEGRATION_TESTS) + MEMCACHED_HOSTS=localhost:11211 $(GO) test $(GO_RACE_FLAG) $(GO_TEST_FLAGS) -run IntegrationMemcached -covermode=atomic -timeout=2m $(GO_INTEGRATION_TESTS) .PHONY: test-js test-js: ## Run tests for frontend. @@ -324,6 +325,7 @@ golangci-lint: @echo "lint via golangci-lint" $(GO) tool golangci-lint run \ --config .golangci.yml \ + $(if $(GO_BUILD_TAGS),--build-tags $(GO_BUILD_TAGS)) \ $(GO_LINT_FILES) .PHONY: lint-go From f2518a2c459231e0052b979c6924f6721a6810be Mon Sep 17 00:00:00 2001 From: Timur Olzhabayev Date: Mon, 17 Mar 2025 10:49:51 +0100 Subject: [PATCH 086/117] Chore: Promote pluginsDetailsRightPanel to private preview (#102211) promote FeatureStagePrivatePreview to private preview --- .../configure-grafana/feature-toggles/index.md | 1 - pkg/services/featuremgmt/registry.go | 2 +- pkg/services/featuremgmt/toggles_gen.csv | 2 +- pkg/services/featuremgmt/toggles_gen.json | 6 +++--- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md b/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md index c5210a70273..af1cc8f1b5d 100644 --- a/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md +++ b/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md @@ -147,7 +147,6 @@ Experimental features might be changed or removed without prior notice. | `extraThemes` | Enables extra themes | | `lokiPredefinedOperations` | Adds predefined query operations to Loki query editor | | `frontendSandboxMonitorOnly` | Enables monitor only in the plugin frontend sandbox (if enabled) | -| `pluginsDetailsRightPanel` | Enables right panel for the plugins details page | | `awsDatasourcesTempCredentials` | Support temporary security credentials in AWS plugins for Grafana Cloud customers | | `mlExpressions` | Enable support for Machine Learning in server-side expressions | | `metricsSummary` | Enables metrics summary queries in the Tempo data source | diff --git a/pkg/services/featuremgmt/registry.go b/pkg/services/featuremgmt/registry.go index 1ef6f4bef32..c6abe10a09a 100644 --- a/pkg/services/featuremgmt/registry.go +++ b/pkg/services/featuremgmt/registry.go @@ -382,7 +382,7 @@ var ( { Name: "pluginsDetailsRightPanel", Description: "Enables right panel for the plugins details page", - Stage: FeatureStageExperimental, + Stage: FeatureStagePrivatePreview, FrontendOnly: true, Owner: grafanaPluginsPlatformSquad, }, diff --git a/pkg/services/featuremgmt/toggles_gen.csv b/pkg/services/featuremgmt/toggles_gen.csv index 84efa8a1ad1..f2c41c26500 100644 --- a/pkg/services/featuremgmt/toggles_gen.csv +++ b/pkg/services/featuremgmt/toggles_gen.csv @@ -50,7 +50,7 @@ extraThemes,experimental,@grafana/grafana-frontend-platform,false,false,true lokiPredefinedOperations,experimental,@grafana/observability-logs,false,false,true pluginsFrontendSandbox,privatePreview,@grafana/plugins-platform-backend,false,false,false frontendSandboxMonitorOnly,experimental,@grafana/plugins-platform-backend,false,false,true -pluginsDetailsRightPanel,experimental,@grafana/plugins-platform-backend,false,false,true +pluginsDetailsRightPanel,privatePreview,@grafana/plugins-platform-backend,false,false,true sqlDatasourceDatabaseSelection,preview,@grafana/dataviz-squad,false,false,true recordedQueriesMulti,GA,@grafana/observability-metrics,false,false,false logsExploreTableVisualisation,GA,@grafana/observability-logs,false,false,true diff --git a/pkg/services/featuremgmt/toggles_gen.json b/pkg/services/featuremgmt/toggles_gen.json index 1564aeeec0b..ce2d9c3dcfa 100644 --- a/pkg/services/featuremgmt/toggles_gen.json +++ b/pkg/services/featuremgmt/toggles_gen.json @@ -3238,15 +3238,15 @@ { "metadata": { "name": "pluginsDetailsRightPanel", - "resourceVersion": "1720788722220", + "resourceVersion": "1741965023728", "creationTimestamp": "2024-08-13T09:55:30Z", "annotations": { - "grafana.app/updatedTimestamp": "2024-07-12 12:52:02.22099 +0000 UTC" + "grafana.app/updatedTimestamp": "2025-03-14 15:10:23.728257 +0000 UTC" } }, "spec": { "description": "Enables right panel for the plugins details page", - "stage": "experimental", + "stage": "privatePreview", "codeowner": "@grafana/plugins-platform-backend", "frontend": true } From 91116de790c6c59248abd262721c40f169be6661 Mon Sep 17 00:00:00 2001 From: Jack Westbrook Date: Mon, 17 Mar 2025 11:27:17 +0100 Subject: [PATCH 087/117] Grafana Data: Use package.json exports for internal code (#102036) * refactor(frontend): rename all @grafana/data/src imports to @grafana/data * feat(grafana-data): introduce internal entrypoint for sharing code only with grafana * feat(grafana-data): add test entrypoint for data test utils usage in core * refactor(frontend): update import paths to use grafana/data exports entrypoints * docs(grafana-data): update comment in internal/index.ts * refactor(frontend): prefer public namespaced exports over re-exporting via internal --- .betterer.results | 469 +++++------------- packages/grafana-data/package.json | 20 + packages/grafana-data/src/internal/index.ts | 100 ++++ .../panel/getPanelOptionsWithDefaults.test.ts | 3 +- .../{__mocks__ => helpers}/pluginMocks.ts | 2 +- packages/grafana-data/test/index.ts | 2 + .../src/querybuilder/operationUtils.ts | 2 +- public/app/core/components/GraphNG/utils.ts | 6 +- .../core/components/OptionsUI/registry.tsx | 2 +- .../core/components/TimelineChart/timeline.ts | 5 +- .../core/components/TimelineChart/utils.ts | 6 +- .../GrafanaJavascriptAgentBackend.test.ts | 2 +- public/app/core/services/theme.ts | 2 +- public/app/core/utils/explore.test.ts | 11 +- public/app/core/utils/richHistory.ts | 10 +- .../DashboardsListModalButton.tsx | 2 +- .../DeleteUserModalButton.tsx | 2 +- .../unified/GrafanaRuleQueryViewer.tsx | 5 +- .../GrafanaAlertmanagerDeliveryWarning.tsx | 2 +- .../rule-editor/CloudAlertPreview.tsx | 2 +- .../rule-editor/DashboardPicker.tsx | 2 +- .../components/rule-editor/QueryOptions.tsx | 5 +- .../rule-editor/rule-types/RuleTypePicker.tsx | 2 +- .../rules/AlertInstanceStateFilter.tsx | 2 +- .../components/rules/RuleConfigStatus.tsx | 2 +- .../rules/central-state-history/utils.ts | 2 +- .../state-history/useRuleHistoryRecords.tsx | 2 +- .../unified/home/PluginIntegrations.tsx | 2 +- .../alerting/unified/styles/pagination.ts | 2 +- .../features/alerting/unified/utils/misc.ts | 2 +- .../alerting/unified/utils/routeTree.ts | 6 +- .../features/alerting/unified/utils/time.ts | 4 +- .../StandardAnnotationQueryEditor.test.tsx | 2 +- .../auth-config/AuthProvidersListPage.tsx | 2 +- public/app/features/canvas/element.ts | 2 +- .../app/features/canvas/elements/button.tsx | 3 +- public/app/features/canvas/types.ts | 2 +- .../inspect/HelpWizard/HelpWizard.test.tsx | 2 +- .../inspect/InspectJsonTab.test.tsx | 2 +- .../pages/DashboardScenePage.test.tsx | 2 +- .../pages/PublicDashboardScenePage.test.tsx | 2 +- .../PanelDataQueriesTab.test.tsx | 2 +- .../panel-edit/PanelEditor.test.ts | 2 +- .../panel-edit/PanelOptions.test.tsx | 2 +- .../DashboardDatasourceBehaviour.test.tsx | 2 +- .../scene/DashboardLinksControls.tsx | 2 +- .../scene/DashboardSceneRenderer.test.tsx | 2 +- .../scene/LibraryPanelBehavior.test.tsx | 2 +- .../scene/PanelMenuBehavior.test.tsx | 2 +- .../layout-default/DashboardGridItem.test.tsx | 2 +- .../RowRepeaterBehavior.test.tsx | 2 +- .../RowItemRepeaterBehavior.test.tsx | 2 +- .../serialization/angularMigration.test.ts | 2 +- .../transformSaveModelToScene.test.ts | 2 +- .../transformSceneToSaveModel.test.ts | 2 +- .../settings/VariablesEditView.test.tsx | 2 +- .../share-externally/ShareExternally.test.tsx | 2 +- .../sharing/ShareDrawer/ShareDrawer.test.tsx | 2 +- .../sharing/ShareLinkTab.test.tsx | 2 +- .../panel-share/SharePanelInternally.test.tsx | 2 +- .../DashboardPrompt/DashboardPrompt.test.tsx | 2 +- .../components/HelpWizard/HelpWizard.test.tsx | 2 +- .../PanelEditor/OptionsPaneOptions.test.tsx | 2 +- .../PanelEditor/PanelHeaderCorner.tsx | 3 +- .../PanelEditor/getVisualizationOptions.tsx | 8 +- .../PanelEditor/state/actions.test.ts | 2 +- .../PublicDashboardNotAvailable.tsx | 2 +- .../ConfigPublicDashboard.tsx | 2 +- .../ConfigPublicDashboard/Configuration.tsx | 2 +- .../AcknowledgeCheckboxes.tsx | 2 +- .../UnsupportedDataSourcesAlert.tsx | 2 +- .../SharePublicDashboard.test.tsx | 2 +- .../SharePublicDashboard.tsx | 2 +- .../SharePublicDashboardUtils.test.tsx | 3 +- .../components/SubMenu/DashboardLinks.tsx | 2 +- .../SubMenu/DashboardLinksDashboard.tsx | 2 +- .../dashboard/state/DashboardMigrator.test.ts | 2 +- .../dashboard/state/DashboardMigrator.ts | 3 +- .../dashboard/state/PanelModel.test.ts | 3 +- .../features/dashboard/utils/panel.test.ts | 2 +- .../app/features/dashboard/utils/timeRange.ts | 3 +- .../datasources/components/CloudInfoBox.tsx | 2 +- .../datasources/state/buildCategories.test.ts | 2 +- public/app/features/dimensions/context.ts | 2 +- public/app/features/dimensions/scale.ts | 3 +- .../app/features/explore/Logs/Logs.test.tsx | 2 +- .../explore/Logs/LogsColumnSearch.tsx | 2 +- .../explore/Logs/LogsMetaRow.test.tsx | 2 +- .../app/features/explore/Logs/LogsMetaRow.tsx | 2 +- .../features/explore/Logs/LogsTable.test.tsx | 2 +- .../explore/Logs/LogsTableActiveFields.tsx | 2 +- .../explore/Logs/LogsTableMultiSelect.tsx | 2 +- .../explore/Logs/LogsTableWrap.test.tsx | 10 +- .../explore/Logs/utils/testMocks.test.ts | 2 +- public/app/features/explore/NoData.tsx | 2 +- .../explore/PrometheusListView/ItemLabels.tsx | 2 +- .../explore/PrometheusListView/ItemValues.tsx | 2 +- .../RawListContainer.test.tsx | 2 +- .../PrometheusListView/RawListContainer.tsx | 2 +- .../PrometheusListView/RawListItem.tsx | 2 +- .../RawListItemAttributes.tsx | 2 +- .../app/features/explore/state/main.test.ts | 3 +- .../live/centrifuge/LiveDataStream.ts | 2 +- .../logs/components/InfiniteScroll.test.tsx | 5 +- .../logs/components/InfiniteScroll.tsx | 12 +- .../logs/components/LogDetailsRow.test.tsx | 3 +- public/app/features/logs/logsModel.ts | 2 +- .../DeletePublicDashboardModal.tsx | 2 +- .../app/features/panel/state/actions.test.ts | 3 +- .../plugins/components/AppRootPage.test.tsx | 2 +- .../extensions/registry/AddedLinksRegistry.ts | 2 +- .../features/plugins/extensions/validators.ts | 19 +- .../plugins/loader/sharedDependencies.ts | 2 +- .../app/features/plugins/pluginPreloader.ts | 7 +- .../features/scopes/tests/utils/render.tsx | 2 +- .../app/features/trails/DataTrailsHistory.tsx | 5 +- .../logs/lokiRecordingRules.test.ts | 2 +- .../FilterByValueFilterEditor.tsx | 2 +- .../FilterByValueTransformerEditor.test.tsx | 2 +- .../FilterByValueTransformerEditor.tsx | 2 +- .../calculateHeatmap/heatmap.test.ts | 3 +- .../transformers/calculateHeatmap/heatmap.ts | 2 +- .../BinaryOperationOptionsEditor.tsx | 2 +- .../CalculateFieldTransformerEditor.tsx | 2 +- .../CumulativeOptionsEditor.tsx | 6 +- .../IndexOptionsEditor.tsx | 2 +- .../ReduceRowOptionsEditor.tsx | 5 +- .../UnaryOperationEditor.tsx | 6 +- .../WindowOptionsEditor.tsx | 2 +- .../editors/ConcatenateTransformerEditor.tsx | 5 +- .../ConvertFieldTypeTransformerEditor.tsx | 5 +- .../editors/EnumMappingEditor.tsx | 2 +- .../editors/FilterByNameTransformerEditor.tsx | 2 +- .../FilterByRefIdTransformerEditor.tsx | 2 +- .../editors/FormatStringTransformerEditor.tsx | 5 +- .../editors/FormatTimeTransformerEditor.tsx | 2 +- .../editors/GroupByTransformerEditor.tsx | 6 +- .../GroupToNestedTableTransformerEditor.tsx | 4 +- .../editors/HistogramTransformerEditor.tsx | 5 +- .../editors/JoinByFieldTransformerEditor.tsx | 2 +- .../LabelsToFieldsTransformerEditor.tsx | 5 +- .../editors/LimitTransformerEditor.tsx | 2 +- .../editors/MergeTransformerEditor.tsx | 2 +- .../OrganizeFieldsTransformerEditor.tsx | 3 +- .../editors/ReduceTransformerEditor.tsx | 2 +- .../editors/RenameByRegexTransformer.tsx | 2 +- .../editors/SeriesToRowsTransformerEditor.tsx | 2 +- .../editors/SortByTransformerEditor.tsx | 2 +- .../editors/TransposeTransformerEditor.tsx | 2 +- .../extractFields/extractFields.test.ts | 5 +- .../lookupGazetteer/fieldLookup.test.ts | 4 +- .../partitionByValues/partitionByValues.ts | 3 +- .../transformers/spatial/optionsHelper.tsx | 3 +- .../spatial/spatialTransformer.test.ts | 5 +- .../variables/datasource/actions.test.ts | 2 +- .../variables/datasource/reducer.test.ts | 2 +- .../state/initVariableTransaction.test.ts | 2 +- ...igrateVariablesDatasourceNameToRef.test.ts | 2 +- .../azuremonitor/__mocks__/utils.ts | 3 +- .../components/LogsQueryEditor/RawQuery.tsx | 2 +- .../CloudWatchMetricsQueryRunner.test.ts | 3 +- .../datasource/dashboard/datasource.test.ts | 2 +- .../elasticsearch/ElasticResponse.ts | 2 +- .../editor/annotation/AnnotationEditor.tsx | 2 +- .../influxdb/components/editor/constants.ts | 2 +- .../components/editor/query/QueryEditor.tsx | 2 +- .../editor/query/flux/FluxQueryEditor.tsx | 2 +- .../editor/query/fsql/FSQLEditor.tsx | 2 +- .../utils/getTemplateVariableOptions.ts | 2 +- .../utils/withTemplateVariableOptions.ts | 2 +- .../editor/query/influxql/utils/wrapper.ts | 2 +- .../influxdb/influxql_metadata_query.ts | 2 +- .../datasources/prometheus/RawQuery.tsx | 2 +- public/app/plugins/datasource/tempo/types.ts | 2 +- public/app/plugins/panel/barchart/bars.ts | 6 +- public/app/plugins/panel/barchart/utils.ts | 2 +- .../plugins/panel/bargauge/BarGaugeLegend.tsx | 3 +- .../app/plugins/panel/candlestick/fields.ts | 2 +- .../panel/canvas/components/CanvasTooltip.tsx | 4 +- .../panel/canvas/editor/connectionEditor.tsx | 2 +- .../editor/element/QuickPositioning.tsx | 2 +- .../canvas/editor/element/elementEditor.tsx | 2 +- .../canvas/editor/inline/InlineEditBody.tsx | 3 +- .../panel/canvas/editor/layer/layerEditor.tsx | 2 +- .../plugins/panel/canvas/editor/options.ts | 2 +- public/app/plugins/panel/canvas/utils.ts | 3 +- .../components/DatagridContextMenu.tsx | 2 +- .../panel/geomap/components/MarkersLegend.tsx | 9 +- .../panel/geomap/editor/layerEditor.tsx | 2 +- .../panel/geomap/layers/data/routeLayer.tsx | 6 +- .../utils/checkFeatureMatchesStyleRule.ts | 2 +- .../app/plugins/panel/geomap/utils/tooltip.ts | 2 +- .../app/plugins/panel/geomap/utils/utils.ts | 3 +- .../app/plugins/panel/graph/data_processor.ts | 2 +- .../app/plugins/panel/histogram/Histogram.tsx | 4 +- .../panel/histogram/HistogramPanel.tsx | 11 +- public/app/plugins/panel/histogram/module.tsx | 2 +- public/app/plugins/panel/histogram/utils.ts | 5 +- public/app/plugins/panel/logs/LogsPanel.tsx | 4 +- .../app/plugins/panel/nodeGraph/Node.test.tsx | 2 +- public/app/plugins/panel/stat/StatPanel.tsx | 2 +- .../app/plugins/panel/status-history/utils.ts | 3 +- public/app/plugins/panel/table/migrations.ts | 2 +- public/app/plugins/panel/timeseries/utils.ts | 6 +- public/app/plugins/panel/trend/TrendPanel.tsx | 11 +- .../plugins/panel/xychart/XYChartPanel.tsx | 5 +- .../plugins/panel/xychart/XYChartTooltip.tsx | 5 +- public/app/plugins/panel/xychart/scatter.ts | 14 +- public/app/plugins/panel/xychart/utils.ts | 2 +- public/app/routes/RoutesWrapper.tsx | 2 +- 210 files changed, 533 insertions(+), 688 deletions(-) create mode 100644 packages/grafana-data/src/internal/index.ts rename packages/grafana-data/test/{__mocks__ => helpers}/pluginMocks.ts (98%) create mode 100644 packages/grafana-data/test/index.ts diff --git a/.betterer.results b/.betterer.results index 6849eaed996..e56a82ec813 100644 --- a/.betterer.results +++ b/.betterer.results @@ -392,8 +392,9 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "7"], [0, 0, 0, "Unexpected any. Specify a different type.", "8"] ], - "packages/grafana-data/test/__mocks__/pluginMocks.ts:5381": [ - [0, 0, 0, "Unexpected any. Specify a different type.", "0"] + "packages/grafana-data/test/helpers/pluginMocks.ts:5381": [ + [0, 0, 0, "Do not use any type assertions.", "0"], + [0, 0, 0, "Unexpected any. Specify a different type.", "1"] ], "packages/grafana-e2e-selectors/src/resolver.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] @@ -970,11 +971,6 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "4"], [0, 0, 0, "Unexpected any. Specify a different type.", "5"] ], - "public/app/core/components/GraphNG/utils.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/joinDataFrames\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/nulls/nullInsertThreshold\' import is restricted from being used by a pattern. Import from the public export instead.", "1"], - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/nulls/nullToUndefThreshold\' import is restricted from being used by a pattern. Import from the public export instead.", "2"] - ], "public/app/core/components/Layers/LayerDragDropList.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], @@ -997,9 +993,6 @@ exports[`better eslint`] = { "public/app/core/components/OptionsUI/fieldColor.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] ], - "public/app/core/components/OptionsUI/registry.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/field/overrides/processors\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/core/components/OptionsUI/units.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] ], @@ -1081,14 +1074,6 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "1"], [0, 0, 0, "Unexpected any. Specify a different type.", "2"] ], - "public/app/core/components/TimelineChart/timeline.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/themes/colorManipulator\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], - "public/app/core/components/TimelineChart/utils.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/joinDataFrames\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/nulls/nullInsertThreshold\' import is restricted from being used by a pattern. Import from the public export instead.", "1"], - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/nulls/nullToValue\' import is restricted from being used by a pattern. Import from the public export instead.", "2"] - ], "public/app/core/config.ts:5381": [ [0, 0, 0, "Do not re-export imported variable (\`Settings\`)", "0"], [0, 0, 0, "Do not re-export imported variable (\`config\`)", "1"] @@ -1131,12 +1116,6 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "2"], [0, 0, 0, "Unexpected any. Specify a different type.", "3"] ], - "public/app/core/services/echo/backends/grafana-javascript-agent/GrafanaJavascriptAgentBackend.test.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/types/config\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], - "public/app/core/services/theme.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/themes/registry\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/core/specs/backend_srv.test.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], @@ -1176,9 +1155,6 @@ exports[`better eslint`] = { "public/app/core/utils/deferred.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], - "public/app/core/utils/explore.test.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/utils/url\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/core/utils/fetch.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Do not use any type assertions.", "1"], @@ -1200,10 +1176,9 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], "public/app/core/utils/richHistory.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/utils/url\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "Do not re-export imported variable (\`RichHistorySearchFilters\`)", "1"], - [0, 0, 0, "Do not re-export imported variable (\`RichHistorySettings\`)", "2"], - [0, 0, 0, "Do not re-export imported variable (\`SortOrder\`)", "3"] + [0, 0, 0, "Do not re-export imported variable (\`RichHistorySearchFilters\`)", "0"], + [0, 0, 0, "Do not re-export imported variable (\`RichHistorySettings\`)", "1"], + [0, 0, 0, "Do not re-export imported variable (\`SortOrder\`)", "2"] ], "public/app/core/utils/ticks.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], @@ -1390,9 +1365,9 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] ], "public/app/features/alerting/unified/GrafanaRuleQueryViewer.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/datetime/rangeutil\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], + [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], @@ -1405,8 +1380,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "12"], [0, 0, 0, "No untranslated strings. Wrap text with ", "13"], [0, 0, 0, "No untranslated strings. Wrap text with ", "14"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "15"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "16"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "15"] ], "public/app/features/alerting/unified/NotificationPoliciesPage.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -2052,11 +2026,10 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], "public/app/features/alerting/unified/components/rule-editor/QueryOptions.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/datetime/rangeutil\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], + [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] ], "public/app/features/alerting/unified/components/rule-editor/QueryRows.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], @@ -2426,9 +2399,6 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "22"], [0, 0, 0, "No untranslated strings. Wrap text with ", "23"] ], - "public/app/features/alerting/unified/components/rules/central-state-history/utils.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/field/fieldComparers\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/features/alerting/unified/components/rules/state-history/LogRecordViewer.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] @@ -2450,9 +2420,6 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] ], - "public/app/features/alerting/unified/components/rules/state-history/useRuleHistoryRecords.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/field/fieldComparers\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/features/alerting/unified/components/settings/AlertmanagerCard.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], @@ -2674,9 +2641,6 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "1"], [0, 0, 0, "Unexpected any. Specify a different type.", "2"] ], - "public/app/features/alerting/unified/utils/misc.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/types/config\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/features/alerting/unified/utils/receiver-form.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Do not use any type assertions.", "1"], @@ -2693,9 +2657,6 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "6"], [0, 0, 0, "Unexpected any. Specify a different type.", "7"] ], - "public/app/features/alerting/unified/utils/routeTree.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/utils/arrayUtils\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/features/alerting/unified/utils/rule-form.ts:5381": [ [0, 0, 0, "\'@grafana/runtime/src/utils/DataSourceWithBackend\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] ], @@ -2705,9 +2666,6 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "2"], [0, 0, 0, "Unexpected any. Specify a different type.", "3"] ], - "public/app/features/alerting/unified/utils/time.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/datetime/rangeutil\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/features/annotations/components/AnnotationResultMapper.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], @@ -2773,9 +2731,8 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "6"] ], "public/app/features/auth-config/AuthProvidersListPage.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/types/config\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], + [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], "public/app/features/auth-config/ProviderConfigForm.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -2830,9 +2787,6 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use export all (\`export * from ...\`)", "1"], [0, 0, 0, "Do not use export all (\`export * from ...\`)", "2"] ], - "public/app/features/canvas/element.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/panel/PanelPlugin\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/features/canvas/elements/notFound.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], @@ -3083,9 +3037,6 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], - "public/app/features/dashboard-scene/scene/DashboardLinksControls.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/text/sanitize\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/features/dashboard-scene/scene/PanelLinks.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] ], @@ -3566,10 +3517,8 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"] ], "public/app/features/dashboard/components/PanelEditor/getVisualizationOptions.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/panel/PanelPlugin\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "\'@grafana/data/src/utils/OptionsUIBuilders\' import is restricted from being used by a pattern. Import from the public export instead.", "1"], - [0, 0, 0, "Unexpected any. Specify a different type.", "2"], - [0, 0, 0, "Unexpected any. Specify a different type.", "3"] + [0, 0, 0, "Unexpected any. Specify a different type.", "0"], + [0, 0, 0, "Unexpected any. Specify a different type.", "1"] ], "public/app/features/dashboard/components/PanelEditor/utils.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], @@ -3681,20 +3630,13 @@ exports[`better eslint`] = { "public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboard.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], - "public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboardUtils.test.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/types/query\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/features/dashboard/components/ShareModal/ViewJsonModal.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] ], - "public/app/features/dashboard/components/SubMenu/DashboardLinks.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/text/sanitize\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/features/dashboard/components/SubMenu/DashboardLinksDashboard.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/text/sanitize\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "Do not use any type assertions.", "1"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], - [0, 0, 0, "Unexpected any. Specify a different type.", "3"] + [0, 0, 0, "Do not use any type assertions.", "0"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], + [0, 0, 0, "Unexpected any. Specify a different type.", "2"] ], "public/app/features/dashboard/components/SubMenu/SubMenu.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] @@ -3807,12 +3749,12 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "11"] ], "public/app/features/dashboard/state/DashboardMigrator.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/labelsToFields\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/merge\' import is restricted from being used by a pattern. Import from the public export instead.", "1"], + [0, 0, 0, "Do not use any type assertions.", "0"], + [0, 0, 0, "Do not use any type assertions.", "1"], [0, 0, 0, "Do not use any type assertions.", "2"], [0, 0, 0, "Do not use any type assertions.", "3"], - [0, 0, 0, "Do not use any type assertions.", "4"], - [0, 0, 0, "Do not use any type assertions.", "5"], + [0, 0, 0, "Unexpected any. Specify a different type.", "4"], + [0, 0, 0, "Unexpected any. Specify a different type.", "5"], [0, 0, 0, "Unexpected any. Specify a different type.", "6"], [0, 0, 0, "Unexpected any. Specify a different type.", "7"], [0, 0, 0, "Unexpected any. Specify a different type.", "8"], @@ -3834,9 +3776,7 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "24"], [0, 0, 0, "Unexpected any. Specify a different type.", "25"], [0, 0, 0, "Unexpected any. Specify a different type.", "26"], - [0, 0, 0, "Unexpected any. Specify a different type.", "27"], - [0, 0, 0, "Unexpected any. Specify a different type.", "28"], - [0, 0, 0, "Unexpected any. Specify a different type.", "29"] + [0, 0, 0, "Unexpected any. Specify a different type.", "27"] ], "public/app/features/dashboard/state/DashboardModel.repeat.test.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], @@ -3949,10 +3889,9 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] ], "public/app/features/datasources/components/CloudInfoBox.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/types/config\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] ], "public/app/features/datasources/components/DashboardsTable.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -4133,8 +4072,7 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use export all (\`export * from ...\`)", "7"] ], "public/app/features/dimensions/scale.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/field/scale\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "Do not use any type assertions.", "1"] + [0, 0, 0, "Do not use any type assertions.", "0"] ], "public/app/features/dimensions/types.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] @@ -4212,9 +4150,6 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] ], - "public/app/features/explore/Logs/Logs.test.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/organize\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/features/explore/Logs/Logs.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], @@ -4238,9 +4173,6 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], - "public/app/features/explore/Logs/LogsMetaRow.test.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/organize\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/features/explore/Logs/LogsMetaRow.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], @@ -4255,9 +4187,6 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] ], - "public/app/features/explore/Logs/LogsTable.test.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/organize\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/features/explore/Logs/LogsTableAvailableFields.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] ], @@ -4273,9 +4202,6 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] ], - "public/app/features/explore/Logs/LogsTableWrap.test.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/organize\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/features/explore/Logs/LogsTableWrap.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], @@ -4556,9 +4482,6 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], [0, 0, 0, "Unexpected any. Specify a different type.", "3"] ], - "public/app/features/explore/state/main.test.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/utils/url\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/features/explore/state/time.test.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], @@ -4748,10 +4671,9 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] ], "public/app/features/live/centrifuge/LiveDataStream.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/dataframe/StreamingDataFrame\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "\'@grafana/runtime/src/services/live\' import is restricted from being used by a pattern. Import from the public export instead.", "1"], - [0, 0, 0, "\'@grafana/runtime/src/utils/toDataQueryError\' import is restricted from being used by a pattern. Import from the public export instead.", "2"], - [0, 0, 0, "Do not use any type assertions.", "3"] + [0, 0, 0, "\'@grafana/runtime/src/services/live\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "\'@grafana/runtime/src/utils/toDataQueryError\' import is restricted from being used by a pattern. Import from the public export instead.", "1"], + [0, 0, 0, "Do not use any type assertions.", "2"] ], "public/app/features/live/centrifuge/channel.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] @@ -4773,12 +4695,8 @@ exports[`better eslint`] = { "public/app/features/live/live.ts:5381": [ [0, 0, 0, "\'@grafana/runtime/src/utils/DataSourceWithBackend\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] ], - "public/app/features/logs/components/InfiniteScroll.test.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/datetime/rangeutil\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/features/logs/components/InfiniteScroll.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/datetime/rangeutil\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], "public/app/features/logs/components/LogDetails.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -4826,9 +4744,6 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], [0, 0, 0, "No untranslated strings. Wrap text with ", "5"] ], - "public/app/features/logs/logsModel.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/valueFormats/symbolFormatters\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/features/logs/utils.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], @@ -5168,24 +5083,15 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"] ], - "public/app/features/plugins/extensions/registry/AddedLinksRegistry.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/types/pluginExtensions\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/features/plugins/extensions/usePluginComponents.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], "public/app/features/plugins/extensions/usePluginFunctions.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], - "public/app/features/plugins/extensions/validators.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/types/pluginExtensions\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/features/plugins/loader/sharedDependencies.ts:5381": [ [0, 0, 0, "* import is invalid because \'Layout,HorizontalGroup,VerticalGroup\' from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"] ], - "public/app/features/plugins/pluginPreloader.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/types/pluginExtensions\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/features/plugins/sandbox/distortion_map.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], @@ -5570,8 +5476,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], "public/app/features/trails/DataTrailsHistory.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/datetime/rangeutil\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], "public/app/features/trails/MetricScene.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -5605,21 +5510,16 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] ], "public/app/features/transformers/FilterByValueTransformer/FilterByValueFilterEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/filterByValue\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"] - ], - "public/app/features/transformers/FilterByValueTransformer/FilterByValueTransformerEditor.test.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/filterByValue\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"] ], "public/app/features/transformers/FilterByValueTransformer/FilterByValueTransformerEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/filterByValue\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] ], "public/app/features/transformers/FilterByValueTransformer/ValueMatchers/BasicMatcherEditor.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -5655,13 +5555,9 @@ exports[`better eslint`] = { "public/app/features/transformers/calculateHeatmap/editor/helper.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], - "public/app/features/transformers/calculateHeatmap/heatmap.test.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/dataframe/processDataFrame\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/features/transformers/calculateHeatmap/heatmap.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/joinDataFrames\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "Do not use any type assertions.", "1"], - [0, 0, 0, "Do not use any type assertions.", "2"] + [0, 0, 0, "Do not use any type assertions.", "0"], + [0, 0, 0, "Do not use any type assertions.", "1"] ], "public/app/features/transformers/configFromQuery/ConfigFromQueryTransformerEditor.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -5669,66 +5565,58 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"] ], "public/app/features/transformers/editors/CalculateFieldTransformerEditor/BinaryOperationOptionsEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/calculateField\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"] ], "public/app/features/transformers/editors/CalculateFieldTransformerEditor/CalculateFieldTransformerEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/calculateField\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"] ], "public/app/features/transformers/editors/CalculateFieldTransformerEditor/CumulativeOptionsEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/calculateField\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "Do not use any type assertions.", "1"], + [0, 0, 0, "Do not use any type assertions.", "0"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"] ], "public/app/features/transformers/editors/CalculateFieldTransformerEditor/IndexOptionsEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/calculateField\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"] ], "public/app/features/transformers/editors/CalculateFieldTransformerEditor/ReduceRowOptionsEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/calculateField\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "1"], - [0, 0, 0, "Do not use any type assertions.", "2"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"] + [0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"], + [0, 0, 0, "Do not use any type assertions.", "1"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"] ], "public/app/features/transformers/editors/CalculateFieldTransformerEditor/UnaryOperationEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/calculateField\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] ], "public/app/features/transformers/editors/CalculateFieldTransformerEditor/WindowOptionsEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/calculateField\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "Do not use any type assertions.", "1"], + [0, 0, 0, "Do not use any type assertions.", "0"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "6"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "7"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "6"] ], "public/app/features/transformers/editors/CalculateFieldTransformerEditor/index.ts:5381": [ [0, 0, 0, "Do not re-export imported variable (\`CalculateFieldTransformerEditor\`)", "0"], [0, 0, 0, "Do not re-export imported variable (\`calculateFieldTransformRegistryItem\`)", "1"] ], "public/app/features/transformers/editors/ConcatenateTransformerEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/concat\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"] ], "public/app/features/transformers/editors/ConvertFieldTypeTransformerEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/convertFieldType\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "Do not use any type assertions.", "1"], + [0, 0, 0, "Do not use any type assertions.", "0"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"], @@ -5743,15 +5631,13 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "13"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "14"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "15"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "16"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "17"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "16"] ], "public/app/features/transformers/editors/EnumMappingEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/convertFieldType\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "1"], - [0, 0, 0, "\'VerticalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] + [0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"], + [0, 0, 0, "\'VerticalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "1"], + [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], + [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] ], "public/app/features/transformers/editors/EnumMappingRow.tsx:5381": [ [0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"], @@ -5759,48 +5645,39 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"] ], "public/app/features/transformers/editors/FilterByNameTransformerEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/filterByName\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "\'@grafana/runtime/src/services\' import is restricted from being used by a pattern. Import from the public export instead.", "1"], + [0, 0, 0, "\'@grafana/runtime/src/services\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "6"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "7"] - ], - "public/app/features/transformers/editors/FilterByRefIdTransformerEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/filterByRefId\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "6"] ], "public/app/features/transformers/editors/FormatStringTransformerEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/formatString\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"] ], "public/app/features/transformers/editors/FormatTimeTransformerEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/formatTime\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "6"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "5"] ], "public/app/features/transformers/editors/GroupByTransformerEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/groupBy\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "Do not use any type assertions.", "1"], + [0, 0, 0, "Do not use any type assertions.", "0"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"] ], "public/app/features/transformers/editors/GroupToNestedTableTransformerEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/groupBy\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/groupToNestedTable\' import is restricted from being used by a pattern. Import from the public export instead.", "1"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "6"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"] ], "public/app/features/transformers/editors/GroupingToMatrixTransformerEditor.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -5809,73 +5686,59 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"] ], "public/app/features/transformers/editors/HistogramTransformerEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/histogram\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"] ], "public/app/features/transformers/editors/JoinByFieldTransformerEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/joinByField\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"] ], "public/app/features/transformers/editors/LabelsToFieldsTransformerEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/labelsToFields\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"] ], "public/app/features/transformers/editors/LimitTransformerEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/limit\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] ], "public/app/features/transformers/editors/MergeTransformerEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/merge\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], "public/app/features/transformers/editors/OrganizeFieldsTransformerEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/order\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/organize\' import is restricted from being used by a pattern. Import from the public export instead.", "1"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], + [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] ], "public/app/features/transformers/editors/ReduceTransformerEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/reduce\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "Do not use any type assertions.", "1"], + [0, 0, 0, "Do not use any type assertions.", "0"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "6"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"] ], "public/app/features/transformers/editors/RenameByRegexTransformer.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/renameByRegex\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"] - ], - "public/app/features/transformers/editors/SeriesToRowsTransformerEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/seriesToRows\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"] ], "public/app/features/transformers/editors/SortByTransformerEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/sortBy\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "Do not use any type assertions.", "1"], + [0, 0, 0, "Do not use any type assertions.", "0"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"] ], "public/app/features/transformers/editors/TransposeTransformerEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/transpose\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"] ], "public/app/features/transformers/extractFields/ExtractFieldsTransformerEditor.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], @@ -5902,11 +5765,6 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], [0, 0, 0, "No untranslated strings. Wrap text with ", "6"] ], - "public/app/features/transformers/extractFields/extractFields.test.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/dataframe/processDataFrame\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/sortBy\' import is restricted from being used by a pattern. Import from the public export instead.", "1"], - [0, 0, 0, "\'@grafana/data/src/utils/tests/mockTransformationsRegistry\' import is restricted from being used by a pattern. Import from the public export instead.", "2"] - ], "public/app/features/transformers/extractFields/extractFields.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"] @@ -5949,10 +5807,6 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"] ], - "public/app/features/transformers/lookupGazetteer/fieldLookup.test.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/dataframe/processDataFrame\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/ids\' import is restricted from being used by a pattern. Import from the public export instead.", "1"] - ], "public/app/features/transformers/lookupGazetteer/fieldLookup.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], @@ -5966,10 +5820,6 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "6"], [0, 0, 0, "No untranslated strings. Wrap text with ", "7"] ], - "public/app/features/transformers/partitionByValues/partitionByValues.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/filterByName\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/noop\' import is restricted from being used by a pattern. Import from the public export instead.", "1"] - ], "public/app/features/transformers/prepareTimeSeries/PrepareTimeSeriesEditor.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], @@ -6004,18 +5854,12 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"] ], "public/app/features/transformers/spatial/optionsHelper.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/panel/PanelPlugin\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "\'@grafana/data/src/utils/OptionsUIBuilders\' import is restricted from being used by a pattern. Import from the public export instead.", "1"], + [0, 0, 0, "Do not use any type assertions.", "0"], + [0, 0, 0, "Do not use any type assertions.", "1"], [0, 0, 0, "Do not use any type assertions.", "2"], - [0, 0, 0, "Do not use any type assertions.", "3"], - [0, 0, 0, "Do not use any type assertions.", "4"], - [0, 0, 0, "Unexpected any. Specify a different type.", "5"], - [0, 0, 0, "Unexpected any. Specify a different type.", "6"], - [0, 0, 0, "Unexpected any. Specify a different type.", "7"] - ], - "public/app/features/transformers/spatial/spatialTransformer.test.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/dataframe/processDataFrame\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/ids\' import is restricted from being used by a pattern. Import from the public export instead.", "1"] + [0, 0, 0, "Unexpected any. Specify a different type.", "3"], + [0, 0, 0, "Unexpected any. Specify a different type.", "4"], + [0, 0, 0, "Unexpected any. Specify a different type.", "5"] ], "public/app/features/transformers/suggestionsInput/SuggestionsInput.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], @@ -6298,9 +6142,6 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"] ], - "public/app/plugins/datasource/azuremonitor/__mocks__/utils.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/types/data\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/plugins/datasource/azuremonitor/azureMetadata/index.ts:5381": [ [0, 0, 0, "Do not use export all (\`export * from ...\`)", "0"], [0, 0, 0, "Do not use export all (\`export * from ...\`)", "1"] @@ -6471,9 +6312,6 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "1"], [0, 0, 0, "Unexpected any. Specify a different type.", "2"] ], - "public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchMetricsQueryRunner.test.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/datetime/moment_wrapper\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/plugins/datasource/cloudwatch/types.ts:5381": [ [0, 0, 0, "Do not use export all (\`export * from ...\`)", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"], @@ -6496,9 +6334,9 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "1"] ], "public/app/plugins/datasource/elasticsearch/ElasticResponse.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/convertFieldType\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Do not use any type assertions.", "1"], - [0, 0, 0, "Do not use any type assertions.", "2"], + [0, 0, 0, "Unexpected any. Specify a different type.", "2"], [0, 0, 0, "Unexpected any. Specify a different type.", "3"], [0, 0, 0, "Unexpected any. Specify a different type.", "4"], [0, 0, 0, "Unexpected any. Specify a different type.", "5"], @@ -6527,8 +6365,7 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "28"], [0, 0, 0, "Unexpected any. Specify a different type.", "29"], [0, 0, 0, "Unexpected any. Specify a different type.", "30"], - [0, 0, 0, "Unexpected any. Specify a different type.", "31"], - [0, 0, 0, "Unexpected any. Specify a different type.", "32"] + [0, 0, 0, "Unexpected any. Specify a different type.", "31"] ], "public/app/plugins/datasource/elasticsearch/LanguageProvider.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], @@ -6903,22 +6740,15 @@ exports[`better eslint`] = { [0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"] ], "public/app/plugins/panel/barchart/bars.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/themes/colorManipulator\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "Do not use any type assertions.", "1"] + [0, 0, 0, "Do not use any type assertions.", "0"] ], "public/app/plugins/panel/barchart/quadtree.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], - "public/app/plugins/panel/barchart/utils.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/field/fieldState\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/plugins/panel/candlestick/CandlestickPanel.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"] ], - "public/app/plugins/panel/candlestick/fields.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/joinDataFrames\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/plugins/panel/candlestick/types.ts:5381": [ [0, 0, 0, "Do not re-export imported variable (\`CandleStyle\`)", "0"], [0, 0, 0, "Do not re-export imported variable (\`CandlestickColors\`)", "1"], @@ -6929,28 +6759,6 @@ exports[`better eslint`] = { [0, 0, 0, "Do not re-export imported variable (\`VizDisplayMode\`)", "6"], [0, 0, 0, "Do not re-export imported variable (\`defaultCandlestickColors\`)", "7"] ], - "public/app/plugins/panel/canvas/components/CanvasTooltip.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/types/action\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], - "public/app/plugins/panel/canvas/editor/connectionEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/utils/OptionsUIBuilders\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], - "public/app/plugins/panel/canvas/editor/element/elementEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/utils/OptionsUIBuilders\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], - "public/app/plugins/panel/canvas/editor/inline/InlineEditBody.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/panel/PanelPlugin\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "\'@grafana/data/src/utils/OptionsUIBuilders\' import is restricted from being used by a pattern. Import from the public export instead.", "1"] - ], - "public/app/plugins/panel/canvas/editor/layer/layerEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/utils/OptionsUIBuilders\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], - "public/app/plugins/panel/canvas/editor/options.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/panel/PanelPlugin\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], - "public/app/plugins/panel/datagrid/components/DatagridContextMenu.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/convertFieldType\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/plugins/panel/debug/CursorView.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"] @@ -6963,10 +6771,9 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], "public/app/plugins/panel/geomap/components/MarkersLegend.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/field/scale\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Do not use any type assertions.", "1"], - [0, 0, 0, "Do not use any type assertions.", "2"], - [0, 0, 0, "Unexpected any. Specify a different type.", "3"] + [0, 0, 0, "Unexpected any. Specify a different type.", "2"] ], "public/app/plugins/panel/geomap/editor/GeomapStyleRulesEditor.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] @@ -6992,9 +6799,6 @@ exports[`better eslint`] = { "public/app/plugins/panel/geomap/editor/StyleRuleEditor.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], - "public/app/plugins/panel/geomap/editor/layerEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/utils/OptionsUIBuilders\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/plugins/panel/geomap/layers/basemaps/esri.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], @@ -7002,8 +6806,7 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "0"] ], "public/app/plugins/panel/geomap/layers/data/routeLayer.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/themes/colorManipulator\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "Do not use any type assertions.", "1"] + [0, 0, 0, "Do not use any type assertions.", "0"] ], "public/app/plugins/panel/geomap/layers/registry.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], @@ -7016,9 +6819,6 @@ exports[`better eslint`] = { "public/app/plugins/panel/geomap/types.ts:5381": [ [0, 0, 0, "Do not re-export imported variable (\`./panelcfg.gen\`)", "0"] ], - "public/app/plugins/panel/geomap/utils/checkFeatureMatchesStyleRule.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/matchers/compareValues\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/plugins/panel/geomap/utils/layers.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], @@ -7059,27 +6859,12 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "15"], [0, 0, 0, "Do not use any type assertions.", "16"] ], - "public/app/plugins/panel/histogram/Histogram.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/histogram\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], - "public/app/plugins/panel/histogram/HistogramPanel.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/histogram\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], - "public/app/plugins/panel/histogram/module.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/histogram\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], - "public/app/plugins/panel/histogram/utils.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/histogram\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/plugins/panel/live/LivePanel.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], "public/app/plugins/panel/logs/LogsPanel.test.tsx:5381": [ [0, 0, 0, "* import is invalid because \'Layout,HorizontalGroup,VerticalGroup\' from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"] ], - "public/app/plugins/panel/logs/LogsPanel.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/datetime/rangeutil\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/plugins/panel/logs/types.ts:5381": [ [0, 0, 0, "Do not re-export imported variable (\`./panelcfg.gen\`)", "0"] ], @@ -7113,9 +6898,6 @@ exports[`better eslint`] = { "public/app/plugins/panel/stat/StatMigrations.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], - "public/app/plugins/panel/stat/StatPanel.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/field/fieldOverrides\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/plugins/panel/state-timeline/migrations.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"] @@ -7124,11 +6906,10 @@ exports[`better eslint`] = { [0, 0, 0, "\'VerticalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"] ], "public/app/plugins/panel/table/migrations.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/reduce\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"], [0, 0, 0, "Unexpected any. Specify a different type.", "2"], - [0, 0, 0, "Unexpected any. Specify a different type.", "3"], - [0, 0, 0, "Unexpected any. Specify a different type.", "4"] + [0, 0, 0, "Unexpected any. Specify a different type.", "3"] ], "public/app/plugins/panel/text/textPanelMigrationHandler.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] @@ -7167,31 +6948,17 @@ exports[`better eslint`] = { [0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"] ], - "public/app/plugins/panel/timeseries/utils.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/convertFieldType\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/nulls/nullInsertThreshold\' import is restricted from being used by a pattern. Import from the public export instead.", "1"], - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/nulls/nullToValue\' import is restricted from being used by a pattern. Import from the public export instead.", "2"] - ], - "public/app/plugins/panel/trend/TrendPanel.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/transformations/transformers/joinDataFrames\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/plugins/panel/xychart/SeriesEditor.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Do not use any type assertions.", "1"], [0, 0, 0, "Do not use any type assertions.", "2"], [0, 0, 0, "Do not use any type assertions.", "3"] ], - "public/app/plugins/panel/xychart/XYChartPanel.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/themes/colorManipulator\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], - "public/app/plugins/panel/xychart/XYChartTooltip.tsx:5381": [ - [0, 0, 0, "\'@grafana/data/src/themes/colorManipulator\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] - ], "public/app/plugins/panel/xychart/migrations.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], "public/app/plugins/panel/xychart/scatter.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/themes/colorManipulator\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Do not use any type assertions.", "1"], [0, 0, 0, "Do not use any type assertions.", "2"], [0, 0, 0, "Do not use any type assertions.", "3"], @@ -7205,14 +6972,10 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "11"], [0, 0, 0, "Do not use any type assertions.", "12"], [0, 0, 0, "Do not use any type assertions.", "13"], - [0, 0, 0, "Do not use any type assertions.", "14"], + [0, 0, 0, "Unexpected any. Specify a different type.", "14"], [0, 0, 0, "Unexpected any. Specify a different type.", "15"], [0, 0, 0, "Unexpected any. Specify a different type.", "16"], - [0, 0, 0, "Unexpected any. Specify a different type.", "17"], - [0, 0, 0, "Unexpected any. Specify a different type.", "18"] - ], - "public/app/plugins/panel/xychart/utils.ts:5381": [ - [0, 0, 0, "\'@grafana/data/src/field/fieldState\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + [0, 0, 0, "Unexpected any. Specify a different type.", "17"] ], "public/app/plugins/sdk.ts:5381": [ [0, 0, 0, "Do not re-export imported variable (\`loadPluginCss\`)", "0"] diff --git a/packages/grafana-data/package.json b/packages/grafana-data/package.json index c33053087f2..aad57fcef43 100644 --- a/packages/grafana-data/package.json +++ b/packages/grafana-data/package.json @@ -15,6 +15,26 @@ }, "main": "src/index.ts", "types": "src/index.ts", + "module": "src/index.ts", + "exports": { + "./package.json": "./package.json", + ".": { + "import": "./src/index.ts", + "require": "./src/index.ts" + }, + "./internal": { + "import": "./src/internal/index.ts", + "require": "./src/internal/index.ts" + }, + "./unstable": { + "import": "./src/unstable.ts", + "require": "./src/unstable.ts" + }, + "./test": { + "import": "./test/index.ts", + "require": "./test/index.ts" + } + }, "publishConfig": { "main": "./dist/cjs/index.cjs", "module": "./dist/esm/index.mjs", diff --git a/packages/grafana-data/src/internal/index.ts b/packages/grafana-data/src/internal/index.ts new file mode 100644 index 00000000000..c0e52d01c67 --- /dev/null +++ b/packages/grafana-data/src/internal/index.ts @@ -0,0 +1,100 @@ +/** + * This file is used to share internal grafana/data code with Grafana core. + * Note that these exports are also used within Enterprise. + * + * Through the exports declared in package.json we can import this code in core Grafana and the grafana/data + * package will continue to be able to access all code when it's published to npm as it's private to the package. + * + * During the yarn pack lifecycle the exports[./internal] property is deleted from the package.json + * preventing the code from being importable by plugins or other npm packages making it truly "internal". + * + */ + +export { actionsOverrideProcessor } from '../field/overrides/processors'; +export { nullToUndefThreshold } from '../transformations/transformers/nulls/nullToUndefThreshold'; +export { applyNullInsertThreshold } from '../transformations/transformers/nulls/nullInsertThreshold'; +export { + NULL_EXPAND, + NULL_REMOVE, + NULL_RETAIN, + isLikelyAscendingVector, + maybeSortFrame, +} from '../transformations/transformers/joinDataFrames'; +export { ConcatenateFrameNameMode, type ConcatenateTransformerOptions } from '../transformations/transformers/concat'; +export { + type ConvertFieldTypeOptions, + type ConvertFieldTypeTransformerOptions, + convertFieldType, +} from '../transformations/transformers/convertFieldType'; +export { type FilterFieldsByNameTransformerOptions } from '../transformations/transformers/filterByName'; +export { type FilterFramesByRefIdTransformerOptions } from '../transformations/transformers/filterByRefId'; +export { FormatStringOutput, type FormatStringTransformerOptions } from '../transformations/transformers/formatString'; +export { organizeFieldsTransformer } from '../transformations/transformers/organize'; +export { labelsToFieldsTransformer } from '../transformations/transformers/labelsToFields'; +export { type FormatTimeTransformerOptions } from '../transformations/transformers/formatTime'; +export { + type GroupByFieldOptions, + GroupByOperationID, + type GroupByTransformerOptions, +} from '../transformations/transformers/groupBy'; +export { + type GroupToNestedTableTransformerOptions, + SHOW_NESTED_HEADERS_DEFAULT, +} from '../transformations/transformers/groupToNestedTable'; +export { + type BinaryValue, + type BinaryOptions, + CalculateFieldMode, + type CalculateFieldTransformerOptions, + getNameFromOptions, + defaultWindowOptions, + checkBinaryValueType, + type CumulativeOptions, + type ReduceOptions, + type UnaryOptions, + WindowAlignment, + type WindowOptions, + WindowSizeMode, +} from '../transformations/transformers/calculateField'; +export { type SeriesToRowsTransformerOptions } from '../transformations/transformers/seriesToRows'; +export { histogramFieldInfo, type HistogramTransformerInputs } from '../transformations/transformers/histogram'; +export { type JoinByFieldOptions, JoinMode } from '../transformations/transformers/joinByField'; +export { LabelsToFieldsMode, type LabelsToFieldsOptions } from '../transformations/transformers/labelsToFields'; +export { type LimitTransformerOptions } from '../transformations/transformers/limit'; +export { type MergeTransformerOptions } from '../transformations/transformers/merge'; +export { ReduceTransformerMode, type ReduceTransformerOptions } from '../transformations/transformers/reduce'; +export { createOrderFieldsComparer } from '../transformations/transformers/order'; +export { type RenameByRegexTransformerOptions } from '../transformations/transformers/renameByRegex'; +export { type OrganizeFieldsTransformerOptions } from '../transformations/transformers/organize'; +export { compareValues } from '../transformations/matchers/compareValues'; +export { + type SortByField, + type SortByTransformerOptions, + sortByTransformer, +} from '../transformations/transformers/sortBy'; +export { type TransposeTransformerOptions } from '../transformations/transformers/transpose'; +export { + type FilterByValueTransformerOptions, + FilterByValueMatch, + FilterByValueType, + type FilterByValueFilter, +} from '../transformations/transformers/filterByValue'; +export { getMatcherConfig } from '../transformations/transformers/filterByName'; +export { mockTransformationsRegistry } from '../utils/tests/mockTransformationsRegistry'; +export { noopTransformer } from '../transformations/transformers/noop'; +export { DataTransformerID } from '../transformations/transformers/ids'; + +export { mergeTransformer } from '../transformations/transformers/merge'; +export { getThemeById } from '../themes/registry'; +export { GrafanaEdition } from '../types/config'; +export { SIPrefix } from '../valueFormats/symbolFormatters'; + +export { type PluginAddedLinksConfigureFunc, type PluginExtensionEventHelpers } from '../types/pluginExtensions'; + +export { getStreamingFrameOptions } from '../dataframe/StreamingDataFrame'; +export { fieldIndexComparer } from '../field/fieldComparers'; +export { decoupleHideFromState } from '../field/fieldState'; +export { findNumericFieldMinMax } from '../field/fieldOverrides'; +export { type PanelOptionsSupplier } from '../panel/PanelPlugin'; +export { sanitize, sanitizeUrl } from '../text/sanitize'; +export { type NestedValueAccess, type NestedPanelOptions, isNestedPanelOptions } from '../utils/OptionsUIBuilders'; diff --git a/packages/grafana-data/src/panel/getPanelOptionsWithDefaults.test.ts b/packages/grafana-data/src/panel/getPanelOptionsWithDefaults.test.ts index 01b42612f1d..f155696053d 100644 --- a/packages/grafana-data/src/panel/getPanelOptionsWithDefaults.test.ts +++ b/packages/grafana-data/src/panel/getPanelOptionsWithDefaults.test.ts @@ -11,8 +11,7 @@ import { ThresholdsMode, } from '@grafana/data'; -import { getPanelPlugin } from '../../test/__mocks__/pluginMocks'; -import { mockStandardFieldConfigOptions } from '../../test/helpers/fieldConfig'; +import { getPanelPlugin, mockStandardFieldConfigOptions } from '../../test'; import { getPanelOptionsWithDefaults, restoreCustomOverrideRules } from './getPanelOptionsWithDefaults'; diff --git a/packages/grafana-data/test/__mocks__/pluginMocks.ts b/packages/grafana-data/test/helpers/pluginMocks.ts similarity index 98% rename from packages/grafana-data/test/__mocks__/pluginMocks.ts rename to packages/grafana-data/test/helpers/pluginMocks.ts index 226d6eb87cb..1fe23bb46f3 100644 --- a/packages/grafana-data/test/__mocks__/pluginMocks.ts +++ b/packages/grafana-data/test/helpers/pluginMocks.ts @@ -1,7 +1,7 @@ import { defaultsDeep } from 'lodash'; import { ComponentType } from 'react'; -import { PanelPluginMeta, PluginMeta, PluginType, PanelPlugin, PanelProps } from '../../src'; +import { PanelPluginMeta, PluginMeta, PluginType, PanelPlugin, PanelProps } from '../../'; export const getMockPlugins = (amount: number): PluginMeta[] => { const plugins: PluginMeta[] = []; diff --git a/packages/grafana-data/test/index.ts b/packages/grafana-data/test/index.ts new file mode 100644 index 00000000000..c6f6494b213 --- /dev/null +++ b/packages/grafana-data/test/index.ts @@ -0,0 +1,2 @@ +export { getMockPlugin, getMockPlugins, getPanelPlugin } from './helpers/pluginMocks'; +export { mockStandardFieldConfigOptions } from './helpers/fieldConfig'; diff --git a/packages/grafana-prometheus/src/querybuilder/operationUtils.ts b/packages/grafana-prometheus/src/querybuilder/operationUtils.ts index bf5bc98c0ad..36b9a3f6bd8 100644 --- a/packages/grafana-prometheus/src/querybuilder/operationUtils.ts +++ b/packages/grafana-prometheus/src/querybuilder/operationUtils.ts @@ -2,7 +2,7 @@ import { capitalize } from 'lodash'; import pluralize from 'pluralize'; -import { SelectableValue } from '@grafana/data/src'; +import { SelectableValue } from '@grafana/data'; import { LabelParamEditor } from './components/LabelParamEditor'; import { diff --git a/public/app/core/components/GraphNG/utils.ts b/public/app/core/components/GraphNG/utils.ts index b0c4368f3bb..34757b4d81a 100644 --- a/public/app/core/components/GraphNG/utils.ts +++ b/public/app/core/components/GraphNG/utils.ts @@ -1,7 +1,5 @@ -import { DataFrame, Field, FieldType, outerJoinDataFrames, TimeRange } from '@grafana/data'; -import { NULL_EXPAND, NULL_REMOVE, NULL_RETAIN } from '@grafana/data/src/transformations/transformers/joinDataFrames'; -import { applyNullInsertThreshold } from '@grafana/data/src/transformations/transformers/nulls/nullInsertThreshold'; -import { nullToUndefThreshold } from '@grafana/data/src/transformations/transformers/nulls/nullToUndefThreshold'; +import { DataFrame, Field, FieldType, outerJoinDataFrames, TimeRange, applyNullInsertThreshold } from '@grafana/data'; +import { NULL_EXPAND, NULL_REMOVE, NULL_RETAIN, nullToUndefThreshold } from '@grafana/data/internal'; import { GraphDrawStyle } from '@grafana/schema'; import { XYFieldMatchers } from './types'; diff --git a/public/app/core/components/OptionsUI/registry.tsx b/public/app/core/components/OptionsUI/registry.tsx index da20681e556..d1c51c96de8 100644 --- a/public/app/core/components/OptionsUI/registry.tsx +++ b/public/app/core/components/OptionsUI/registry.tsx @@ -29,7 +29,7 @@ import { Action, DataLinksFieldConfigSettings, } from '@grafana/data'; -import { actionsOverrideProcessor } from '@grafana/data/src/field/overrides/processors'; +import { actionsOverrideProcessor } from '@grafana/data/internal'; import { FieldConfig } from '@grafana/schema'; import { RadioButtonGroup, TimeZonePicker, Switch } from '@grafana/ui'; import { FieldNamePicker } from '@grafana/ui/internal'; diff --git a/public/app/core/components/TimelineChart/timeline.ts b/public/app/core/components/TimelineChart/timeline.ts index 68acea164f6..8fa0a8faef1 100644 --- a/public/app/core/components/TimelineChart/timeline.ts +++ b/public/app/core/components/TimelineChart/timeline.ts @@ -1,7 +1,6 @@ import uPlot, { Series } from 'uplot'; -import { GrafanaTheme2, TimeRange } from '@grafana/data'; -import { alpha } from '@grafana/data/src/themes/colorManipulator'; +import { GrafanaTheme2, TimeRange, colorManipulator } from '@grafana/data'; import { TimelineValueAlignment, VisibilityMode } from '@grafana/schema'; import { FIXED_UNIT } from '@grafana/ui'; import { distribute, SPACE_BETWEEN } from 'app/plugins/panel/barchart/distribute'; @@ -533,5 +532,5 @@ function getFillColor(fieldConfig: { fillOpacity?: number; lineWidth?: number }, } const opacityPercent = (fieldConfig.fillOpacity ?? 100) / 100; - return alpha(color, opacityPercent); + return colorManipulator.alpha(color, opacityPercent); } diff --git a/public/app/core/components/TimelineChart/utils.ts b/public/app/core/components/TimelineChart/utils.ts index bf38c4bc5c5..a9af674a839 100644 --- a/public/app/core/components/TimelineChart/utils.ts +++ b/public/app/core/components/TimelineChart/utils.ts @@ -18,10 +18,10 @@ import { outerJoinDataFrames, ValueMapping, ThresholdsConfig, + applyNullInsertThreshold, + nullToValue, } from '@grafana/data'; -import { maybeSortFrame, NULL_RETAIN } from '@grafana/data/src/transformations/transformers/joinDataFrames'; -import { applyNullInsertThreshold } from '@grafana/data/src/transformations/transformers/nulls/nullInsertThreshold'; -import { nullToValue } from '@grafana/data/src/transformations/transformers/nulls/nullToValue'; +import { maybeSortFrame, NULL_RETAIN } from '@grafana/data/internal'; import { VizLegendOptions, AxisPlacement, diff --git a/public/app/core/services/echo/backends/grafana-javascript-agent/GrafanaJavascriptAgentBackend.test.ts b/public/app/core/services/echo/backends/grafana-javascript-agent/GrafanaJavascriptAgentBackend.test.ts index 5ee5b184736..ca92345ccac 100644 --- a/public/app/core/services/echo/backends/grafana-javascript-agent/GrafanaJavascriptAgentBackend.test.ts +++ b/public/app/core/services/echo/backends/grafana-javascript-agent/GrafanaJavascriptAgentBackend.test.ts @@ -1,5 +1,5 @@ import { BuildInfo } from '@grafana/data'; -import { GrafanaEdition } from '@grafana/data/src/types/config'; +import { GrafanaEdition } from '@grafana/data/internal'; import { Faro, Instrumentation } from '@grafana/faro-core'; import * as faroWebSdkModule from '@grafana/faro-web-sdk'; import { BrowserConfig, FetchTransport } from '@grafana/faro-web-sdk'; diff --git a/public/app/core/services/theme.ts b/public/app/core/services/theme.ts index b244b95e012..30d63375f6b 100644 --- a/public/app/core/services/theme.ts +++ b/public/app/core/services/theme.ts @@ -1,4 +1,4 @@ -import { getThemeById } from '@grafana/data/src/themes/registry'; +import { getThemeById } from '@grafana/data/internal'; import { ThemeChangedEvent } from '@grafana/runtime'; import appEvents from '../app_events'; diff --git a/public/app/core/utils/explore.test.ts b/public/app/core/utils/explore.test.ts index 76da92421a9..011380fed79 100644 --- a/public/app/core/utils/explore.test.ts +++ b/public/app/core/utils/explore.test.ts @@ -1,5 +1,12 @@ -import { DataSourceApi, dateTime, ExploreUrlState, GrafanaConfig, locationUtil, LogsSortOrder } from '@grafana/data'; -import { serializeStateToUrlParam } from '@grafana/data/src/utils/url'; +import { + DataSourceApi, + dateTime, + ExploreUrlState, + GrafanaConfig, + locationUtil, + LogsSortOrder, + serializeStateToUrlParam, +} from '@grafana/data'; import { config } from '@grafana/runtime'; import { DataQuery } from '@grafana/schema'; import { RefreshPicker } from '@grafana/ui'; diff --git a/public/app/core/utils/richHistory.ts b/public/app/core/utils/richHistory.ts index b99a16f5ceb..8816613a51b 100644 --- a/public/app/core/utils/richHistory.ts +++ b/public/app/core/utils/richHistory.ts @@ -1,7 +1,13 @@ import { omit } from 'lodash'; -import { DataQuery, DataSourceApi, dateTimeFormat, ExploreUrlState, urlUtil } from '@grafana/data'; -import { serializeStateToUrlParam } from '@grafana/data/src/utils/url'; +import { + DataQuery, + DataSourceApi, + dateTimeFormat, + ExploreUrlState, + urlUtil, + serializeStateToUrlParam, +} from '@grafana/data'; import { getDataSourceSrv } from '@grafana/runtime'; import { notifyApp } from 'app/core/actions'; import { createErrorNotification, createWarningNotification } from 'app/core/copy/appNotification'; diff --git a/public/app/features/admin/UserListPublicDashboardPage/DashboardsListModalButton.tsx b/public/app/features/admin/UserListPublicDashboardPage/DashboardsListModalButton.tsx index cc0284d753d..87d3b1fe591 100644 --- a/public/app/features/admin/UserListPublicDashboardPage/DashboardsListModalButton.tsx +++ b/public/app/features/admin/UserListPublicDashboardPage/DashboardsListModalButton.tsx @@ -1,6 +1,6 @@ import { css, cx } from '@emotion/css'; -import { GrafanaTheme2 } from '@grafana/data/src'; +import { GrafanaTheme2 } from '@grafana/data'; import { selectors as e2eSelectors } from '@grafana/e2e-selectors/src'; import { config } from '@grafana/runtime'; import { Button, LoadingPlaceholder, Modal, ModalsController, useStyles2 } from '@grafana/ui'; diff --git a/public/app/features/admin/UserListPublicDashboardPage/DeleteUserModalButton.tsx b/public/app/features/admin/UserListPublicDashboardPage/DeleteUserModalButton.tsx index 1ca1f8d6656..fa33265f205 100644 --- a/public/app/features/admin/UserListPublicDashboardPage/DeleteUserModalButton.tsx +++ b/public/app/features/admin/UserListPublicDashboardPage/DeleteUserModalButton.tsx @@ -1,6 +1,6 @@ import { css } from '@emotion/css'; -import { GrafanaTheme2 } from '@grafana/data/src'; +import { GrafanaTheme2 } from '@grafana/data'; import { config } from '@grafana/runtime'; import { Button, Modal, ModalsController, useStyles2 } from '@grafana/ui'; import { Trans, t } from 'app/core/internationalization'; diff --git a/public/app/features/alerting/unified/GrafanaRuleQueryViewer.tsx b/public/app/features/alerting/unified/GrafanaRuleQueryViewer.tsx index b591ece380d..b7946517a41 100644 --- a/public/app/features/alerting/unified/GrafanaRuleQueryViewer.tsx +++ b/public/app/features/alerting/unified/GrafanaRuleQueryViewer.tsx @@ -2,8 +2,7 @@ import { css, cx } from '@emotion/css'; import { keyBy, startCase, uniqueId } from 'lodash'; import * as React from 'react'; -import { DataSourceInstanceSettings, GrafanaTheme2, PanelData, urlUtil } from '@grafana/data'; -import { secondsToHms } from '@grafana/data/src/datetime/rangeutil'; +import { DataSourceInstanceSettings, GrafanaTheme2, PanelData, rangeUtil, urlUtil } from '@grafana/data'; import { config } from '@grafana/runtime'; import { DataSourceRef } from '@grafana/schema'; import { Preview } from '@grafana/sql/src/components/visual-query-builder/Preview'; @@ -123,7 +122,7 @@ export function QueryPreview({ if (relativeTimeRange) { headerItems.push( - {secondsToHms(relativeTimeRange.from)} to now + {rangeUtil.secondsToHms(relativeTimeRange.from)} to now ); } diff --git a/public/app/features/alerting/unified/components/GrafanaAlertmanagerDeliveryWarning.tsx b/public/app/features/alerting/unified/components/GrafanaAlertmanagerDeliveryWarning.tsx index 239de85bd2d..b16c50bbb44 100644 --- a/public/app/features/alerting/unified/components/GrafanaAlertmanagerDeliveryWarning.tsx +++ b/public/app/features/alerting/unified/components/GrafanaAlertmanagerDeliveryWarning.tsx @@ -1,6 +1,6 @@ import { css } from '@emotion/css'; -import { GrafanaTheme2 } from '@grafana/data/src'; +import { GrafanaTheme2 } from '@grafana/data'; import { Alert, useStyles2 } from '@grafana/ui'; import { AlertmanagerChoice } from '../../../../plugins/datasource/alertmanager/types'; diff --git a/public/app/features/alerting/unified/components/rule-editor/CloudAlertPreview.tsx b/public/app/features/alerting/unified/components/rule-editor/CloudAlertPreview.tsx index a9d67203d14..b2fa4fa8297 100644 --- a/public/app/features/alerting/unified/components/rule-editor/CloudAlertPreview.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/CloudAlertPreview.tsx @@ -1,6 +1,6 @@ import { css } from '@emotion/css'; -import { DataFrame, GrafanaTheme2 } from '@grafana/data/src'; +import { DataFrame, GrafanaTheme2 } from '@grafana/data'; import { Icon, TagList, Tooltip, useStyles2 } from '@grafana/ui'; import { labelsToTags } from '../../utils/labels'; diff --git a/public/app/features/alerting/unified/components/rule-editor/DashboardPicker.tsx b/public/app/features/alerting/unified/components/rule-editor/DashboardPicker.tsx index 14eea33da9d..4428ba2e1a9 100644 --- a/public/app/features/alerting/unified/components/rule-editor/DashboardPicker.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/DashboardPicker.tsx @@ -5,7 +5,7 @@ import { useDebounce } from 'react-use'; import AutoSizer from 'react-virtualized-auto-sizer'; import { FixedSizeList } from 'react-window'; -import { GrafanaTheme2 } from '@grafana/data/src'; +import { GrafanaTheme2 } from '@grafana/data'; import { Alert, Button, diff --git a/public/app/features/alerting/unified/components/rule-editor/QueryOptions.tsx b/public/app/features/alerting/unified/components/rule-editor/QueryOptions.tsx index 1a046f8e2a3..215ae1d3646 100644 --- a/public/app/features/alerting/unified/components/rule-editor/QueryOptions.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/QueryOptions.tsx @@ -1,8 +1,7 @@ import { css } from '@emotion/css'; import { useState } from 'react'; -import { GrafanaTheme2, RelativeTimeRange, dateTime, getDefaultRelativeTimeRange } from '@grafana/data'; -import { relativeToTimeRange } from '@grafana/data/src/datetime/rangeutil'; +import { GrafanaTheme2, RelativeTimeRange, dateTime, getDefaultRelativeTimeRange, rangeUtil } from '@grafana/data'; import { Icon, InlineField, RelativeTimeRangePicker, Toggletip, clearButtonStyles, useStyles2 } from '@grafana/ui'; import { AlertQuery } from 'app/types/unified-alerting-dto'; @@ -27,7 +26,7 @@ export const QueryOptions = ({ const [showOptions, setShowOptions] = useState(false); - const timeRange = query.relativeTimeRange ? relativeToTimeRange(query.relativeTimeRange) : undefined; + const timeRange = query.relativeTimeRange ? rangeUtil.relativeToTimeRange(query.relativeTimeRange) : undefined; return ( <> diff --git a/public/app/features/alerting/unified/components/rule-editor/rule-types/RuleTypePicker.tsx b/public/app/features/alerting/unified/components/rule-editor/rule-types/RuleTypePicker.tsx index ab41cd3121f..17cbdcfcd6e 100644 --- a/public/app/features/alerting/unified/components/rule-editor/rule-types/RuleTypePicker.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/rule-types/RuleTypePicker.tsx @@ -1,7 +1,7 @@ import { css } from '@emotion/css'; import { isEmpty } from 'lodash'; -import { GrafanaTheme2 } from '@grafana/data/src'; +import { GrafanaTheme2 } from '@grafana/data'; import { Stack, useStyles2 } from '@grafana/ui'; import { useRulesSourcesWithRuler } from '../../../hooks/useRuleSourcesWithRuler'; diff --git a/public/app/features/alerting/unified/components/rules/AlertInstanceStateFilter.tsx b/public/app/features/alerting/unified/components/rules/AlertInstanceStateFilter.tsx index 97cf310a478..29afb21fa2c 100644 --- a/public/app/features/alerting/unified/components/rules/AlertInstanceStateFilter.tsx +++ b/public/app/features/alerting/unified/components/rules/AlertInstanceStateFilter.tsx @@ -1,7 +1,7 @@ import { css } from '@emotion/css'; import { capitalize } from 'lodash'; -import { GrafanaTheme2 } from '@grafana/data/src'; +import { GrafanaTheme2 } from '@grafana/data'; import { Label, RadioButtonGroup, Tag, useStyles2 } from '@grafana/ui'; import { GrafanaAlertState, PromAlertingRuleState } from 'app/types/unified-alerting-dto'; diff --git a/public/app/features/alerting/unified/components/rules/RuleConfigStatus.tsx b/public/app/features/alerting/unified/components/rules/RuleConfigStatus.tsx index 8b10c1388bf..ed3f96dc960 100644 --- a/public/app/features/alerting/unified/components/rules/RuleConfigStatus.tsx +++ b/public/app/features/alerting/unified/components/rules/RuleConfigStatus.tsx @@ -1,7 +1,7 @@ import { css } from '@emotion/css'; import { useMemo } from 'react'; -import { GrafanaTheme2 } from '@grafana/data/src'; +import { GrafanaTheme2 } from '@grafana/data'; import { config } from '@grafana/runtime/src'; import { Icon, Tooltip, useStyles2 } from '@grafana/ui'; diff --git a/public/app/features/alerting/unified/components/rules/central-state-history/utils.ts b/public/app/features/alerting/unified/components/rules/central-state-history/utils.ts index 21b2548dac9..d78688c1ab8 100644 --- a/public/app/features/alerting/unified/components/rules/central-state-history/utils.ts +++ b/public/app/features/alerting/unified/components/rules/central-state-history/utils.ts @@ -11,7 +11,7 @@ import { ThresholdsMode, getDisplayProcessor, } from '@grafana/data'; -import { fieldIndexComparer } from '@grafana/data/src/field/fieldComparers'; +import { fieldIndexComparer } from '@grafana/data/internal'; import { mapStateWithReasonToBaseState } from 'app/types/unified-alerting-dto'; import { labelsMatchMatchers } from '../../../utils/alertmanager'; diff --git a/public/app/features/alerting/unified/components/rules/state-history/useRuleHistoryRecords.tsx b/public/app/features/alerting/unified/components/rules/state-history/useRuleHistoryRecords.tsx index 9f18e9bea2c..613938eebb5 100644 --- a/public/app/features/alerting/unified/components/rules/state-history/useRuleHistoryRecords.tsx +++ b/public/app/features/alerting/unified/components/rules/state-history/useRuleHistoryRecords.tsx @@ -9,7 +9,7 @@ import { GrafanaTheme2, getDisplayProcessor, } from '@grafana/data'; -import { fieldIndexComparer } from '@grafana/data/src/field/fieldComparers'; +import { fieldIndexComparer } from '@grafana/data/internal'; import { MappingType, ThresholdsMode } from '@grafana/schema'; import { useTheme2 } from '@grafana/ui'; diff --git a/public/app/features/alerting/unified/home/PluginIntegrations.tsx b/public/app/features/alerting/unified/home/PluginIntegrations.tsx index f07a0738934..4a7d560da38 100644 --- a/public/app/features/alerting/unified/home/PluginIntegrations.tsx +++ b/public/app/features/alerting/unified/home/PluginIntegrations.tsx @@ -1,6 +1,6 @@ import { css } from '@emotion/css'; -import { GrafanaTheme2 } from '@grafana/data/'; +import { GrafanaTheme2 } from '@grafana/data'; import { Stack, Text, useStyles2 } from '@grafana/ui'; import { useAlertingHomePageExtensions } from '../plugins/useAlertingHomePageExtensions'; diff --git a/public/app/features/alerting/unified/styles/pagination.ts b/public/app/features/alerting/unified/styles/pagination.ts index f3d92f70662..0a16b5ce7ee 100644 --- a/public/app/features/alerting/unified/styles/pagination.ts +++ b/public/app/features/alerting/unified/styles/pagination.ts @@ -1,6 +1,6 @@ import { css } from '@emotion/css'; -import { GrafanaTheme2 } from '@grafana/data/src'; +import { GrafanaTheme2 } from '@grafana/data'; export const getPaginationStyles = (theme: GrafanaTheme2) => { return css({ diff --git a/public/app/features/alerting/unified/utils/misc.ts b/public/app/features/alerting/unified/utils/misc.ts index c136c2aa883..686194d24c6 100644 --- a/public/app/features/alerting/unified/utils/misc.ts +++ b/public/app/features/alerting/unified/utils/misc.ts @@ -1,7 +1,7 @@ import { sortBy } from 'lodash'; import { Labels, UrlQueryMap } from '@grafana/data'; -import { GrafanaEdition } from '@grafana/data/src/types/config'; +import { GrafanaEdition } from '@grafana/data/internal'; import { config, isFetchError } from '@grafana/runtime'; import { DataSourceRef } from '@grafana/schema'; import { contextSrv } from 'app/core/services/context_srv'; diff --git a/public/app/features/alerting/unified/utils/routeTree.ts b/public/app/features/alerting/unified/utils/routeTree.ts index 6aa80dcb030..ba08bfd7526 100644 --- a/public/app/features/alerting/unified/utils/routeTree.ts +++ b/public/app/features/alerting/unified/utils/routeTree.ts @@ -5,7 +5,7 @@ import { produce } from 'immer'; import { omit } from 'lodash'; -import { insertAfterImmutably, insertBeforeImmutably } from '@grafana/data/src/utils/arrayUtils'; +import { arrayUtils } from '@grafana/data'; import { ROUTES_META_SYMBOL, Route, RouteWithID } from 'app/plugins/datasource/alertmanager/types'; import { @@ -109,12 +109,12 @@ export const addRouteToReferenceRoute = ( // insert new policy before / above the referenceRoute if (position === 'above') { - parentRoute.routes = insertBeforeImmutably(parentRoute.routes ?? [], newRoute, positionInParent); + parentRoute.routes = arrayUtils.insertBeforeImmutably(parentRoute.routes ?? [], newRoute, positionInParent); } // insert new policy after / below the referenceRoute if (position === 'below') { - parentRoute.routes = insertAfterImmutably(parentRoute.routes ?? [], newRoute, positionInParent); + parentRoute.routes = arrayUtils.insertAfterImmutably(parentRoute.routes ?? [], newRoute, positionInParent); } }); }; diff --git a/public/app/features/alerting/unified/utils/time.ts b/public/app/features/alerting/unified/utils/time.ts index 14a52ab677f..7e9eeea528a 100644 --- a/public/app/features/alerting/unified/utils/time.ts +++ b/public/app/features/alerting/unified/utils/time.ts @@ -1,4 +1,4 @@ -import { describeInterval } from '@grafana/data/src/datetime/rangeutil'; +import { rangeUtil } from '@grafana/data'; import { TimeOptions } from '../types/time'; @@ -18,7 +18,7 @@ export function parseInterval(value: string): [number, string] { } export function intervalToSeconds(interval: string): number { - const { sec, count } = describeInterval(interval); + const { sec, count } = rangeUtil.describeInterval(interval); return sec * count; } diff --git a/public/app/features/annotations/components/StandardAnnotationQueryEditor.test.tsx b/public/app/features/annotations/components/StandardAnnotationQueryEditor.test.tsx index c347a069369..c4126cb6aa1 100644 --- a/public/app/features/annotations/components/StandardAnnotationQueryEditor.test.tsx +++ b/public/app/features/annotations/components/StandardAnnotationQueryEditor.test.tsx @@ -1,6 +1,6 @@ import { render } from '@testing-library/react'; -import { AnnotationQuery, DataSourceApi, DataSourceInstanceSettings } from '@grafana/data/src'; +import { AnnotationQuery, DataSourceApi, DataSourceInstanceSettings } from '@grafana/data'; import StandardAnnotationQueryEditor, { Props as EditorProps } from './StandardAnnotationQueryEditor'; diff --git a/public/app/features/auth-config/AuthProvidersListPage.tsx b/public/app/features/auth-config/AuthProvidersListPage.tsx index 717906f0f3a..9ae5786703a 100644 --- a/public/app/features/auth-config/AuthProvidersListPage.tsx +++ b/public/app/features/auth-config/AuthProvidersListPage.tsx @@ -1,7 +1,7 @@ import { JSX, useEffect, useState } from 'react'; import { connect, ConnectedProps } from 'react-redux'; -import { GrafanaEdition } from '@grafana/data/src/types/config'; +import { GrafanaEdition } from '@grafana/data/internal'; import { reportInteraction } from '@grafana/runtime'; import { Grid, TextLink, ToolbarButton } from '@grafana/ui'; import { Page } from 'app/core/components/Page/Page'; diff --git a/public/app/features/canvas/element.ts b/public/app/features/canvas/element.ts index 1d6c39dba0d..7f987fed873 100644 --- a/public/app/features/canvas/element.ts +++ b/public/app/features/canvas/element.ts @@ -1,7 +1,7 @@ import { ComponentType } from 'react'; import { DataLink, RegistryItem, Action } from '@grafana/data'; -import { PanelOptionsSupplier } from '@grafana/data/src/panel/PanelPlugin'; +import { PanelOptionsSupplier } from '@grafana/data/internal'; import { ColorDimensionConfig, ScaleDimensionConfig } from '@grafana/schema'; import { config } from 'app/core/config'; import { BackgroundConfig, Constraint, LineConfig, Placement } from 'app/plugins/panel/canvas/panelcfg.gen'; diff --git a/public/app/features/canvas/elements/button.tsx b/public/app/features/canvas/elements/button.tsx index eb926056ace..2b70fa66e3a 100644 --- a/public/app/features/canvas/elements/button.tsx +++ b/public/app/features/canvas/elements/button.tsx @@ -1,8 +1,7 @@ import { css } from '@emotion/css'; import { useState } from 'react'; -import { GrafanaTheme2 } from '@grafana/data'; -import { PluginState } from '@grafana/data/src'; +import { GrafanaTheme2, PluginState } from '@grafana/data'; import { TextDimensionMode } from '@grafana/schema'; import { Button, Spinner, useStyles2 } from '@grafana/ui'; import { DimensionContext } from 'app/features/dimensions/context'; diff --git a/public/app/features/canvas/types.ts b/public/app/features/canvas/types.ts index 1dd3f298e7a..50b926779a6 100644 --- a/public/app/features/canvas/types.ts +++ b/public/app/features/canvas/types.ts @@ -1,4 +1,4 @@ -import { LinkModel } from '@grafana/data/src'; +import { LinkModel } from '@grafana/data'; import { ColorDimensionConfig, ResourceDimensionConfig, TextDimensionConfig } from '@grafana/schema'; import { BackgroundImageSize } from 'app/plugins/panel/canvas/panelcfg.gen'; diff --git a/public/app/features/dashboard-scene/inspect/HelpWizard/HelpWizard.test.tsx b/public/app/features/dashboard-scene/inspect/HelpWizard/HelpWizard.test.tsx index 276c71f61dd..be4fbbb8692 100644 --- a/public/app/features/dashboard-scene/inspect/HelpWizard/HelpWizard.test.tsx +++ b/public/app/features/dashboard-scene/inspect/HelpWizard/HelpWizard.test.tsx @@ -2,7 +2,7 @@ import userEvent from '@testing-library/user-event'; import { render, screen } from 'test/test-utils'; import { FieldType, getDefaultTimeRange, LoadingState, toDataFrame } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getPanelPlugin } from '@grafana/data/test'; import { config } from '@grafana/runtime'; import { SceneQueryRunner, SceneTimeRange, VizPanel, VizPanelMenu } from '@grafana/scenes'; import { contextSrv } from 'app/core/services/context_srv'; diff --git a/public/app/features/dashboard-scene/inspect/InspectJsonTab.test.tsx b/public/app/features/dashboard-scene/inspect/InspectJsonTab.test.tsx index 582e0855008..b49a61cd1b8 100644 --- a/public/app/features/dashboard-scene/inspect/InspectJsonTab.test.tsx +++ b/public/app/features/dashboard-scene/inspect/InspectJsonTab.test.tsx @@ -10,7 +10,7 @@ import { standardTransformersRegistry, toDataFrame, } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getPanelPlugin } from '@grafana/data/test'; import { setPluginImportUtils, setRunRequest } from '@grafana/runtime'; import { SceneCanvasText, SceneDataTransformer, SceneQueryRunner, VizPanel } from '@grafana/scenes'; import * as libpanels from 'app/features/library-panels/state/api'; diff --git a/public/app/features/dashboard-scene/pages/DashboardScenePage.test.tsx b/public/app/features/dashboard-scene/pages/DashboardScenePage.test.tsx index 77551f16579..90dc4a7de07 100644 --- a/public/app/features/dashboard-scene/pages/DashboardScenePage.test.tsx +++ b/public/app/features/dashboard-scene/pages/DashboardScenePage.test.tsx @@ -6,7 +6,7 @@ import { TestProvider } from 'test/helpers/TestProvider'; import { getGrafanaContextMock } from 'test/mocks/getGrafanaContextMock'; import { PanelProps } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getPanelPlugin } from '@grafana/data/test'; import { selectors } from '@grafana/e2e-selectors'; import { LocationServiceProvider, diff --git a/public/app/features/dashboard-scene/pages/PublicDashboardScenePage.test.tsx b/public/app/features/dashboard-scene/pages/PublicDashboardScenePage.test.tsx index a8c109d261b..b5c05c830b8 100644 --- a/public/app/features/dashboard-scene/pages/PublicDashboardScenePage.test.tsx +++ b/public/app/features/dashboard-scene/pages/PublicDashboardScenePage.test.tsx @@ -4,7 +4,7 @@ import { of } from 'rxjs'; import { render } from 'test/test-utils'; import { getDefaultTimeRange, LoadingState, PanelData, PanelProps } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getPanelPlugin } from '@grafana/data/test'; import { selectors as e2eSelectors } from '@grafana/e2e-selectors'; import { config, getPluginLinkExtensions, setPluginImportUtils, setRunRequest } from '@grafana/runtime'; import { Dashboard } from '@grafana/schema'; diff --git a/public/app/features/dashboard-scene/panel-edit/PanelDataPane/PanelDataQueriesTab.test.tsx b/public/app/features/dashboard-scene/panel-edit/PanelDataPane/PanelDataQueriesTab.test.tsx index c0131b6847d..c88d60a527e 100644 --- a/public/app/features/dashboard-scene/panel-edit/PanelDataPane/PanelDataQueriesTab.test.tsx +++ b/public/app/features/dashboard-scene/panel-edit/PanelDataPane/PanelDataQueriesTab.test.tsx @@ -15,7 +15,7 @@ import { TimeRange, toDataFrame, } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getPanelPlugin } from '@grafana/data/test'; import { selectors } from '@grafana/e2e-selectors'; import { config, locationService, setPluginExtensionsHook } from '@grafana/runtime'; import { PANEL_EDIT_LAST_USED_DATASOURCE } from 'app/features/dashboard/utils/dashboard'; diff --git a/public/app/features/dashboard-scene/panel-edit/PanelEditor.test.ts b/public/app/features/dashboard-scene/panel-edit/PanelEditor.test.ts index fe263ee3bde..ee2bda935fd 100644 --- a/public/app/features/dashboard-scene/panel-edit/PanelEditor.test.ts +++ b/public/app/features/dashboard-scene/panel-edit/PanelEditor.test.ts @@ -1,7 +1,7 @@ import { of } from 'rxjs'; import { DataQueryRequest, DataSourceApi, LoadingState, PanelPlugin } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getPanelPlugin } from '@grafana/data/test'; import { CancelActivationHandler, CustomVariable, diff --git a/public/app/features/dashboard-scene/panel-edit/PanelOptions.test.tsx b/public/app/features/dashboard-scene/panel-edit/PanelOptions.test.tsx index 3f54a519b70..afc761b080b 100644 --- a/public/app/features/dashboard-scene/panel-edit/PanelOptions.test.tsx +++ b/public/app/features/dashboard-scene/panel-edit/PanelOptions.test.tsx @@ -3,7 +3,7 @@ import userEvent from '@testing-library/user-event'; import { render } from 'test/test-utils'; import { standardEditorsRegistry, standardFieldConfigEditorRegistry } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getPanelPlugin } from '@grafana/data/test'; import { selectors } from '@grafana/e2e-selectors'; import { VizPanel } from '@grafana/scenes'; import { getAllOptionEditors, getAllStandardFieldConfigs } from 'app/core/components/OptionsUI/registry'; diff --git a/public/app/features/dashboard-scene/scene/DashboardDatasourceBehaviour.test.tsx b/public/app/features/dashboard-scene/scene/DashboardDatasourceBehaviour.test.tsx index 59a27eacaad..55aac56789a 100644 --- a/public/app/features/dashboard-scene/scene/DashboardDatasourceBehaviour.test.tsx +++ b/public/app/features/dashboard-scene/scene/DashboardDatasourceBehaviour.test.tsx @@ -10,7 +10,7 @@ import { LoadingState, PanelData, } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getPanelPlugin } from '@grafana/data/test'; import { setPluginImportUtils } from '@grafana/runtime'; import { SceneDataTransformer, SceneFlexLayout, SceneQueryRunner, VizPanel } from '@grafana/scenes'; import { SHARED_DASHBOARD_QUERY, DASHBOARD_DATASOURCE_PLUGIN_ID } from 'app/plugins/datasource/dashboard/constants'; diff --git a/public/app/features/dashboard-scene/scene/DashboardLinksControls.tsx b/public/app/features/dashboard-scene/scene/DashboardLinksControls.tsx index 72a046fc6e5..db7fb59dad7 100644 --- a/public/app/features/dashboard-scene/scene/DashboardLinksControls.tsx +++ b/public/app/features/dashboard-scene/scene/DashboardLinksControls.tsx @@ -1,4 +1,4 @@ -import { sanitizeUrl } from '@grafana/data/src/text/sanitize'; +import { sanitizeUrl } from '@grafana/data/internal'; import { selectors } from '@grafana/e2e-selectors'; import { sceneGraph } from '@grafana/scenes'; import { DashboardLink } from '@grafana/schema'; diff --git a/public/app/features/dashboard-scene/scene/DashboardSceneRenderer.test.tsx b/public/app/features/dashboard-scene/scene/DashboardSceneRenderer.test.tsx index 3f456078a7e..74c91e3037e 100644 --- a/public/app/features/dashboard-scene/scene/DashboardSceneRenderer.test.tsx +++ b/public/app/features/dashboard-scene/scene/DashboardSceneRenderer.test.tsx @@ -1,7 +1,7 @@ import { screen } from '@testing-library/react'; import { render } from 'test/test-utils'; -import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getPanelPlugin } from '@grafana/data/test'; import { config, setPluginImportUtils } from '@grafana/runtime'; import { transformSaveModelToScene } from '../serialization/transformSaveModelToScene'; diff --git a/public/app/features/dashboard-scene/scene/LibraryPanelBehavior.test.tsx b/public/app/features/dashboard-scene/scene/LibraryPanelBehavior.test.tsx index b6eb6872566..5d95b292cb4 100644 --- a/public/app/features/dashboard-scene/scene/LibraryPanelBehavior.test.tsx +++ b/public/app/features/dashboard-scene/scene/LibraryPanelBehavior.test.tsx @@ -1,7 +1,7 @@ import { of } from 'rxjs'; import { FieldType, LoadingState, PanelData, getDefaultTimeRange, toDataFrame } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getPanelPlugin } from '@grafana/data/test'; import { setPluginImportUtils, setRunRequest } from '@grafana/runtime'; import { SceneCanvasText, sceneGraph, SceneGridLayout, VizPanel } from '@grafana/scenes'; import { LibraryPanel } from '@grafana/schema'; diff --git a/public/app/features/dashboard-scene/scene/PanelMenuBehavior.test.tsx b/public/app/features/dashboard-scene/scene/PanelMenuBehavior.test.tsx index d0aa2f56b9f..182ebac330f 100644 --- a/public/app/features/dashboard-scene/scene/PanelMenuBehavior.test.tsx +++ b/public/app/features/dashboard-scene/scene/PanelMenuBehavior.test.tsx @@ -8,7 +8,7 @@ import { toDataFrame, urlUtil, } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getPanelPlugin } from '@grafana/data/test'; import { config, getPluginLinkExtensions, locationService } from '@grafana/runtime'; import { LocalValueVariable, diff --git a/public/app/features/dashboard-scene/scene/layout-default/DashboardGridItem.test.tsx b/public/app/features/dashboard-scene/scene/layout-default/DashboardGridItem.test.tsx index ec13a7992c8..00458d505a9 100644 --- a/public/app/features/dashboard-scene/scene/layout-default/DashboardGridItem.test.tsx +++ b/public/app/features/dashboard-scene/scene/layout-default/DashboardGridItem.test.tsx @@ -1,4 +1,4 @@ -import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getPanelPlugin } from '@grafana/data/test'; import { setPluginImportUtils } from '@grafana/runtime'; import { SceneGridLayout, SceneVariableSet, TestVariable, VizPanel } from '@grafana/scenes'; import { ALL_VARIABLE_TEXT, ALL_VARIABLE_VALUE } from 'app/features/variables/constants'; diff --git a/public/app/features/dashboard-scene/scene/layout-default/RowRepeaterBehavior.test.tsx b/public/app/features/dashboard-scene/scene/layout-default/RowRepeaterBehavior.test.tsx index 843f58b5640..28effcf18b5 100644 --- a/public/app/features/dashboard-scene/scene/layout-default/RowRepeaterBehavior.test.tsx +++ b/public/app/features/dashboard-scene/scene/layout-default/RowRepeaterBehavior.test.tsx @@ -1,5 +1,5 @@ import { VariableRefresh } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getPanelPlugin } from '@grafana/data/test'; import { setPluginImportUtils } from '@grafana/runtime'; import { SceneCanvasText, diff --git a/public/app/features/dashboard-scene/scene/layout-rows/RowItemRepeaterBehavior.test.tsx b/public/app/features/dashboard-scene/scene/layout-rows/RowItemRepeaterBehavior.test.tsx index ec5b4710089..ca967ce3d06 100644 --- a/public/app/features/dashboard-scene/scene/layout-rows/RowItemRepeaterBehavior.test.tsx +++ b/public/app/features/dashboard-scene/scene/layout-rows/RowItemRepeaterBehavior.test.tsx @@ -1,5 +1,5 @@ import { VariableRefresh } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getPanelPlugin } from '@grafana/data/test'; import { setPluginImportUtils } from '@grafana/runtime'; import { SceneGridRow, diff --git a/public/app/features/dashboard-scene/serialization/angularMigration.test.ts b/public/app/features/dashboard-scene/serialization/angularMigration.test.ts index cda96b97e9c..a9f63b34cf0 100644 --- a/public/app/features/dashboard-scene/serialization/angularMigration.test.ts +++ b/public/app/features/dashboard-scene/serialization/angularMigration.test.ts @@ -1,5 +1,5 @@ import { PanelTypeChangedHandler } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getPanelPlugin } from '@grafana/data/test'; import { PanelModel } from 'app/features/dashboard/state/PanelModel'; import { getAngularPanelMigrationHandler } from './angularMigration'; diff --git a/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.test.ts b/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.test.ts index e74c3f21664..546c8e95038 100644 --- a/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.test.ts +++ b/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.test.ts @@ -1,5 +1,5 @@ import { LoadingState } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getPanelPlugin } from '@grafana/data/test'; import { config } from '@grafana/runtime'; import { AdHocFiltersVariable, diff --git a/public/app/features/dashboard-scene/serialization/transformSceneToSaveModel.test.ts b/public/app/features/dashboard-scene/serialization/transformSceneToSaveModel.test.ts index 9d6061e3c6f..f1ed038dfb5 100644 --- a/public/app/features/dashboard-scene/serialization/transformSceneToSaveModel.test.ts +++ b/public/app/features/dashboard-scene/serialization/transformSceneToSaveModel.test.ts @@ -13,7 +13,7 @@ import { toDataFrame, VariableSupportType, } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getPanelPlugin } from '@grafana/data/test'; import { getPluginLinkExtensions, setPluginImportUtils } from '@grafana/runtime'; import { MultiValueVariable, sceneGraph, SceneGridRow, VizPanel } from '@grafana/scenes'; import { Dashboard, LoadingState, Panel, RowPanel, VariableRefresh } from '@grafana/schema'; diff --git a/public/app/features/dashboard-scene/settings/VariablesEditView.test.tsx b/public/app/features/dashboard-scene/settings/VariablesEditView.test.tsx index f3d93596d03..8c5f690518e 100644 --- a/public/app/features/dashboard-scene/settings/VariablesEditView.test.tsx +++ b/public/app/features/dashboard-scene/settings/VariablesEditView.test.tsx @@ -8,7 +8,7 @@ import { getDefaultTimeRange, toDataFrame, } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getPanelPlugin } from '@grafana/data/test'; import { setPluginImportUtils, setRunRequest } from '@grafana/runtime'; import { SceneVariableSet, diff --git a/public/app/features/dashboard-scene/sharing/ShareButton/share-externally/ShareExternally.test.tsx b/public/app/features/dashboard-scene/sharing/ShareButton/share-externally/ShareExternally.test.tsx index 07fdec6b6a1..b3c7a22a257 100644 --- a/public/app/features/dashboard-scene/sharing/ShareButton/share-externally/ShareExternally.test.tsx +++ b/public/app/features/dashboard-scene/sharing/ShareButton/share-externally/ShareExternally.test.tsx @@ -2,7 +2,7 @@ import { screen, waitForElementToBeRemoved } from '@testing-library/react'; import { render } from 'test/test-utils'; import { getDefaultTimeRange, LoadingState } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getPanelPlugin } from '@grafana/data/test'; import { selectors as e2eSelectors } from '@grafana/e2e-selectors'; import { config, setPluginImportUtils } from '@grafana/runtime'; import { diff --git a/public/app/features/dashboard-scene/sharing/ShareDrawer/ShareDrawer.test.tsx b/public/app/features/dashboard-scene/sharing/ShareDrawer/ShareDrawer.test.tsx index 5e7e71ee6b3..35eaec800d1 100644 --- a/public/app/features/dashboard-scene/sharing/ShareDrawer/ShareDrawer.test.tsx +++ b/public/app/features/dashboard-scene/sharing/ShareDrawer/ShareDrawer.test.tsx @@ -1,7 +1,7 @@ import { act, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getPanelPlugin } from '@grafana/data/test'; import { selectors } from '@grafana/e2e-selectors'; import { locationService, setPluginImportUtils } from '@grafana/runtime'; import { SceneTimeRange, UrlSyncContextProvider } from '@grafana/scenes'; diff --git a/public/app/features/dashboard-scene/sharing/ShareLinkTab.test.tsx b/public/app/features/dashboard-scene/sharing/ShareLinkTab.test.tsx index cded7ef3abe..d149d075e02 100644 --- a/public/app/features/dashboard-scene/sharing/ShareLinkTab.test.tsx +++ b/public/app/features/dashboard-scene/sharing/ShareLinkTab.test.tsx @@ -3,7 +3,7 @@ import userEvent from '@testing-library/user-event'; import { advanceTo, clear } from 'jest-date-mock'; import { dateTime } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getPanelPlugin } from '@grafana/data/test'; import { selectors } from '@grafana/e2e-selectors'; import { config, locationService, setPluginImportUtils } from '@grafana/runtime'; import { SceneTimeRange, VizPanel } from '@grafana/scenes'; diff --git a/public/app/features/dashboard-scene/sharing/panel-share/SharePanelInternally.test.tsx b/public/app/features/dashboard-scene/sharing/panel-share/SharePanelInternally.test.tsx index ac5daf5eac4..d2cbfaa14f7 100644 --- a/public/app/features/dashboard-scene/sharing/panel-share/SharePanelInternally.test.tsx +++ b/public/app/features/dashboard-scene/sharing/panel-share/SharePanelInternally.test.tsx @@ -1,6 +1,6 @@ import { render, screen } from '@testing-library/react'; -import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getPanelPlugin } from '@grafana/data/test'; import { selectors as e2eSelectors } from '@grafana/e2e-selectors'; import { config, setPluginImportUtils } from '@grafana/runtime'; import { SceneTimeRange, VizPanel } from '@grafana/scenes'; diff --git a/public/app/features/dashboard/components/DashboardPrompt/DashboardPrompt.test.tsx b/public/app/features/dashboard/components/DashboardPrompt/DashboardPrompt.test.tsx index 021060699b4..8da1d2bb549 100644 --- a/public/app/features/dashboard/components/DashboardPrompt/DashboardPrompt.test.tsx +++ b/public/app/features/dashboard/components/DashboardPrompt/DashboardPrompt.test.tsx @@ -1,4 +1,4 @@ -import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getPanelPlugin } from '@grafana/data/test'; import { ContextSrv, setContextSrv } from '../../../../core/services/context_srv'; import { PanelModel } from '../../state/PanelModel'; diff --git a/public/app/features/dashboard/components/HelpWizard/HelpWizard.test.tsx b/public/app/features/dashboard/components/HelpWizard/HelpWizard.test.tsx index 8fdc82a5dd8..2eb805aa87e 100644 --- a/public/app/features/dashboard/components/HelpWizard/HelpWizard.test.tsx +++ b/public/app/features/dashboard/components/HelpWizard/HelpWizard.test.tsx @@ -1,7 +1,7 @@ import { render, screen } from '@testing-library/react'; import { FieldType, getDefaultTimeRange, LoadingState, toDataFrame } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getPanelPlugin } from '@grafana/data/test'; import { PanelModel } from '../../state/PanelModel'; diff --git a/public/app/features/dashboard/components/PanelEditor/OptionsPaneOptions.test.tsx b/public/app/features/dashboard/components/PanelEditor/OptionsPaneOptions.test.tsx index 6387aac97a8..91351c87a85 100644 --- a/public/app/features/dashboard/components/PanelEditor/OptionsPaneOptions.test.tsx +++ b/public/app/features/dashboard/components/PanelEditor/OptionsPaneOptions.test.tsx @@ -13,7 +13,7 @@ import { TimeRange, toDataFrame, } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getPanelPlugin } from '@grafana/data/test'; import { selectors } from '@grafana/e2e-selectors'; import { getAllOptionEditors, getAllStandardFieldConfigs } from 'app/core/components/OptionsUI/registry'; diff --git a/public/app/features/dashboard/components/PanelEditor/PanelHeaderCorner.tsx b/public/app/features/dashboard/components/PanelEditor/PanelHeaderCorner.tsx index 07936f463b8..7e0edec648b 100644 --- a/public/app/features/dashboard/components/PanelEditor/PanelHeaderCorner.tsx +++ b/public/app/features/dashboard/components/PanelEditor/PanelHeaderCorner.tsx @@ -1,8 +1,7 @@ import { css, cx } from '@emotion/css'; import { Component } from 'react'; -import { renderMarkdown, LinkModelSupplier, ScopedVars, IconName } from '@grafana/data'; -import { GrafanaTheme2 } from '@grafana/data/'; +import { GrafanaTheme2, renderMarkdown, LinkModelSupplier, ScopedVars, IconName } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; import { locationService, getTemplateSrv } from '@grafana/runtime'; import { Tooltip, PopoverContent, Icon, Themeable2, withTheme2, useStyles2 } from '@grafana/ui'; diff --git a/public/app/features/dashboard/components/PanelEditor/getVisualizationOptions.tsx b/public/app/features/dashboard/components/PanelEditor/getVisualizationOptions.tsx index b62d0493c2e..4b003d91c84 100644 --- a/public/app/features/dashboard/components/PanelEditor/getVisualizationOptions.tsx +++ b/public/app/features/dashboard/components/PanelEditor/getVisualizationOptions.tsx @@ -7,13 +7,9 @@ import { PanelPlugin, StandardEditorContext, VariableSuggestionsScope, -} from '@grafana/data'; -import { PanelOptionsSupplier } from '@grafana/data/src/panel/PanelPlugin'; -import { - NestedValueAccess, PanelOptionsEditorBuilder, - isNestedPanelOptions, -} from '@grafana/data/src/utils/OptionsUIBuilders'; +} from '@grafana/data'; +import { NestedValueAccess, isNestedPanelOptions, PanelOptionsSupplier } from '@grafana/data/internal'; import { VizPanel } from '@grafana/scenes'; import { Input } from '@grafana/ui'; import { LibraryVizPanelInfo } from 'app/features/dashboard-scene/panel-edit/LibraryVizPanelInfo'; diff --git a/public/app/features/dashboard/components/PanelEditor/state/actions.test.ts b/public/app/features/dashboard/components/PanelEditor/state/actions.test.ts index b661ef017b8..ab46604bb92 100644 --- a/public/app/features/dashboard/components/PanelEditor/state/actions.test.ts +++ b/public/app/features/dashboard/components/PanelEditor/state/actions.test.ts @@ -1,5 +1,5 @@ import { PanelPlugin } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getPanelPlugin } from '@grafana/data/test'; import { LibraryElementDTOMeta } from '@grafana/schema'; import { createDashboardModelFixture } from 'app/features/dashboard/state/__fixtures__/dashboardFixtures'; import { panelModelAndPluginReady, removePanel } from 'app/features/panel/state/reducers'; diff --git a/public/app/features/dashboard/components/PublicDashboardNotAvailable/PublicDashboardNotAvailable.tsx b/public/app/features/dashboard/components/PublicDashboardNotAvailable/PublicDashboardNotAvailable.tsx index 4bf24218d60..e413a750181 100644 --- a/public/app/features/dashboard/components/PublicDashboardNotAvailable/PublicDashboardNotAvailable.tsx +++ b/public/app/features/dashboard/components/PublicDashboardNotAvailable/PublicDashboardNotAvailable.tsx @@ -1,6 +1,6 @@ import { css, cx } from '@emotion/css'; -import { GrafanaTheme2 } from '@grafana/data/src'; +import { GrafanaTheme2 } from '@grafana/data'; import { selectors as e2eSelectors } from '@grafana/e2e-selectors/src'; import { useStyles2 } from '@grafana/ui'; diff --git a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ConfigPublicDashboard/ConfigPublicDashboard.tsx b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ConfigPublicDashboard/ConfigPublicDashboard.tsx index b83161aa968..5cf08218411 100644 --- a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ConfigPublicDashboard/ConfigPublicDashboard.tsx +++ b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ConfigPublicDashboard/ConfigPublicDashboard.tsx @@ -1,7 +1,7 @@ import { css } from '@emotion/css'; import { useForm } from 'react-hook-form'; -import { GrafanaTheme2, TimeRange } from '@grafana/data/src'; +import { GrafanaTheme2, TimeRange } from '@grafana/data'; import { selectors as e2eSelectors } from '@grafana/e2e-selectors/src'; import { Button, diff --git a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ConfigPublicDashboard/Configuration.tsx b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ConfigPublicDashboard/Configuration.tsx index eb9a3d8a34f..5156356f470 100644 --- a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ConfigPublicDashboard/Configuration.tsx +++ b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ConfigPublicDashboard/Configuration.tsx @@ -1,6 +1,6 @@ import { UseFormRegister } from 'react-hook-form'; -import { TimeRange } from '@grafana/data/src'; +import { TimeRange } from '@grafana/data'; import { selectors as e2eSelectors } from '@grafana/e2e-selectors/src'; import { FieldSet, Label, Switch, TimeRangeInput, Stack, VerticalGroup } from '@grafana/ui'; import { Trans, t } from 'app/core/internationalization'; diff --git a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/CreatePublicDashboard/AcknowledgeCheckboxes.tsx b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/CreatePublicDashboard/AcknowledgeCheckboxes.tsx index 574e289609a..d1913aa3b9f 100644 --- a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/CreatePublicDashboard/AcknowledgeCheckboxes.tsx +++ b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/CreatePublicDashboard/AcknowledgeCheckboxes.tsx @@ -1,7 +1,7 @@ import { css } from '@emotion/css'; import { UseFormRegister } from 'react-hook-form'; -import { GrafanaTheme2 } from '@grafana/data/src'; +import { GrafanaTheme2 } from '@grafana/data'; import { selectors as e2eSelectors } from '@grafana/e2e-selectors/src'; import { Checkbox, FieldSet, HorizontalGroup, LinkButton, useStyles2, VerticalGroup } from '@grafana/ui'; import { t, Trans } from 'app/core/internationalization'; diff --git a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ModalAlerts/UnsupportedDataSourcesAlert.tsx b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ModalAlerts/UnsupportedDataSourcesAlert.tsx index 3850c5e8b17..1df2bbeac48 100644 --- a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ModalAlerts/UnsupportedDataSourcesAlert.tsx +++ b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ModalAlerts/UnsupportedDataSourcesAlert.tsx @@ -1,7 +1,7 @@ import { css } from '@emotion/css'; import cx from 'classnames'; -import { GrafanaTheme2 } from '@grafana/data/src'; +import { GrafanaTheme2 } from '@grafana/data'; import { selectors as e2eSelectors } from '@grafana/e2e-selectors/src'; import { config } from '@grafana/runtime'; import { Alert, useStyles2 } from '@grafana/ui'; diff --git a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboard.test.tsx b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboard.test.tsx index 12d213f8501..9a0357f0626 100644 --- a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboard.test.tsx +++ b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboard.test.tsx @@ -3,7 +3,7 @@ import userEvent from '@testing-library/user-event'; import { http, HttpResponse } from 'msw'; import { setupServer } from 'msw/node'; -import { BootData, DataQuery } from '@grafana/data/src'; +import { BootData, DataQuery } from '@grafana/data'; import { selectors as e2eSelectors } from '@grafana/e2e-selectors/src'; import { reportInteraction, setEchoSrv } from '@grafana/runtime'; import { Panel } from '@grafana/schema'; diff --git a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboard.tsx b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboard.tsx index 8cbfdd8bd57..329e0d5ef08 100644 --- a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboard.tsx +++ b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboard.tsx @@ -1,6 +1,6 @@ import { css } from '@emotion/css'; -import { GrafanaTheme2 } from '@grafana/data/src'; +import { GrafanaTheme2 } from '@grafana/data'; import { Spinner, useStyles2 } from '@grafana/ui'; import { useGetPublicDashboardQuery } from 'app/features/dashboard/api/publicDashboardApi'; import { publicDashboardPersisted } from 'app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboardUtils'; diff --git a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboardUtils.test.tsx b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboardUtils.test.tsx index 7a14d0a4e45..6ca108fc542 100644 --- a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboardUtils.test.tsx +++ b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboardUtils.test.tsx @@ -1,5 +1,4 @@ -import { TypedVariableModel } from '@grafana/data'; -import { DataSourceRef, DataQuery } from '@grafana/data/src/types/query'; +import { DataSourceRef, DataQuery, TypedVariableModel } from '@grafana/data'; import { DataSourceWithBackend } from '@grafana/runtime'; import { updateConfig } from 'app/core/config'; import { mockDataSource } from 'app/features/alerting/unified/mocks'; diff --git a/public/app/features/dashboard/components/SubMenu/DashboardLinks.tsx b/public/app/features/dashboard/components/SubMenu/DashboardLinks.tsx index 1fa176900eb..65a7c39b335 100644 --- a/public/app/features/dashboard/components/SubMenu/DashboardLinks.tsx +++ b/public/app/features/dashboard/components/SubMenu/DashboardLinks.tsx @@ -1,6 +1,6 @@ import { useEffectOnce } from 'react-use'; -import { sanitizeUrl } from '@grafana/data/src/text/sanitize'; +import { sanitizeUrl } from '@grafana/data/internal'; import { selectors } from '@grafana/e2e-selectors'; import { TimeRangeUpdatedEvent } from '@grafana/runtime'; import { DashboardLink } from '@grafana/schema'; diff --git a/public/app/features/dashboard/components/SubMenu/DashboardLinksDashboard.tsx b/public/app/features/dashboard/components/SubMenu/DashboardLinksDashboard.tsx index f36232b7b2b..7beb284f28b 100644 --- a/public/app/features/dashboard/components/SubMenu/DashboardLinksDashboard.tsx +++ b/public/app/features/dashboard/components/SubMenu/DashboardLinksDashboard.tsx @@ -3,7 +3,7 @@ import { forwardRef } from 'react'; import { useAsync } from 'react-use'; import { GrafanaTheme2, ScopedVars } from '@grafana/data'; -import { sanitize, sanitizeUrl } from '@grafana/data/src/text/sanitize'; +import { sanitize, sanitizeUrl } from '@grafana/data/internal'; import { selectors } from '@grafana/e2e-selectors'; import { DashboardLink } from '@grafana/schema'; import { Dropdown, Icon, LinkButton, Button, Menu, ScrollContainer, useStyles2 } from '@grafana/ui'; diff --git a/public/app/features/dashboard/state/DashboardMigrator.test.ts b/public/app/features/dashboard/state/DashboardMigrator.test.ts index 70a80fb2da1..f0ed1f72c82 100644 --- a/public/app/features/dashboard/state/DashboardMigrator.test.ts +++ b/public/app/features/dashboard/state/DashboardMigrator.test.ts @@ -1,7 +1,7 @@ import { each, map } from 'lodash'; import { DataLinkBuiltInVars, MappingType, VariableHide } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getPanelPlugin } from '@grafana/data/test'; import { FieldConfigSource } from '@grafana/schema'; import { config } from 'app/core/config'; import { GRID_CELL_HEIGHT, GRID_CELL_VMARGIN } from 'app/core/constants'; diff --git a/public/app/features/dashboard/state/DashboardMigrator.ts b/public/app/features/dashboard/state/DashboardMigrator.ts index bab206f9792..44796c1e6f9 100644 --- a/public/app/features/dashboard/state/DashboardMigrator.ts +++ b/public/app/features/dashboard/state/DashboardMigrator.ts @@ -27,8 +27,7 @@ import { ValueMapping, VariableHide, } from '@grafana/data'; -import { labelsToFieldsTransformer } from '@grafana/data/src/transformations/transformers/labelsToFields'; -import { mergeTransformer } from '@grafana/data/src/transformations/transformers/merge'; +import { labelsToFieldsTransformer, mergeTransformer } from '@grafana/data/internal'; import { getDataSourceSrv, setDataSourceSrv } from '@grafana/runtime'; import { DataTransformerConfig } from '@grafana/schema'; import { AxisPlacement, GraphFieldConfig } from '@grafana/ui'; diff --git a/public/app/features/dashboard/state/PanelModel.test.ts b/public/app/features/dashboard/state/PanelModel.test.ts index a8a7aaae420..092ec0e0947 100644 --- a/public/app/features/dashboard/state/PanelModel.test.ts +++ b/public/app/features/dashboard/state/PanelModel.test.ts @@ -11,8 +11,7 @@ import { PanelMigrationHandler, PanelTypeChangedHandler, } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; -import { mockStandardFieldConfigOptions } from '@grafana/data/test/helpers/fieldConfig'; +import { getPanelPlugin, mockStandardFieldConfigOptions } from '@grafana/data/test'; import { setTemplateSrv } from '@grafana/runtime'; import { queryBuilder } from 'app/features/variables/shared/testing/builders'; diff --git a/public/app/features/dashboard/utils/panel.test.ts b/public/app/features/dashboard/utils/panel.test.ts index a739dcedab4..0a444a7726a 100644 --- a/public/app/features/dashboard/utils/panel.test.ts +++ b/public/app/features/dashboard/utils/panel.test.ts @@ -2,7 +2,7 @@ import { advanceTo, clear } from 'jest-date-mock'; import { ComponentClass } from 'react'; import { dateTime, DateTime, PanelProps, TimeRange } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getPanelPlugin } from '@grafana/data/test'; import { applyPanelTimeOverrides, calculateInnerPanelHeight } from 'app/features/dashboard/utils/panel'; import { PanelModel } from '../state/PanelModel'; diff --git a/public/app/features/dashboard/utils/timeRange.ts b/public/app/features/dashboard/utils/timeRange.ts index 79cf1f10244..da144cf427c 100644 --- a/public/app/features/dashboard/utils/timeRange.ts +++ b/public/app/features/dashboard/utils/timeRange.ts @@ -1,5 +1,4 @@ -import { DateTime, TimeRange } from '@grafana/data'; -import { dateMath, dateTime, isDateTime } from '@grafana/data/src'; +import { dateMath, dateTime, isDateTime, DateTime, TimeRange } from '@grafana/data'; import { TimeModel } from 'app/features/dashboard/state/TimeModel'; export const getTimeRange = ( diff --git a/public/app/features/datasources/components/CloudInfoBox.tsx b/public/app/features/datasources/components/CloudInfoBox.tsx index c34c44ce810..17e6b6d26b8 100644 --- a/public/app/features/datasources/components/CloudInfoBox.tsx +++ b/public/app/features/datasources/components/CloudInfoBox.tsx @@ -1,5 +1,5 @@ import { DataSourceSettings } from '@grafana/data'; -import { GrafanaEdition } from '@grafana/data/src/types/config'; +import { GrafanaEdition } from '@grafana/data/internal'; import { Alert } from '@grafana/ui'; import { LocalStorageValueProvider } from 'app/core/components/LocalStorageValueProvider'; import { config } from 'app/core/config'; diff --git a/public/app/features/datasources/state/buildCategories.test.ts b/public/app/features/datasources/state/buildCategories.test.ts index 5370c5a5789..297c413073d 100644 --- a/public/app/features/datasources/state/buildCategories.test.ts +++ b/public/app/features/datasources/state/buildCategories.test.ts @@ -1,5 +1,5 @@ import { DataSourcePluginMeta } from '@grafana/data'; -import { getMockPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getMockPlugin } from '@grafana/data/test'; import { buildCategories } from './buildCategories'; diff --git a/public/app/features/dimensions/context.ts b/public/app/features/dimensions/context.ts index a4693ada2a9..bd0755de986 100644 --- a/public/app/features/dimensions/context.ts +++ b/public/app/features/dimensions/context.ts @@ -1,4 +1,4 @@ -import { PanelData } from '@grafana/data/src'; +import { PanelData } from '@grafana/data'; import { ColorDimensionConfig, ResourceDimensionConfig, diff --git a/public/app/features/dimensions/scale.ts b/public/app/features/dimensions/scale.ts index 06f3be04dee..7c82df3c29d 100644 --- a/public/app/features/dimensions/scale.ts +++ b/public/app/features/dimensions/scale.ts @@ -1,5 +1,4 @@ -import { DataFrame, Field } from '@grafana/data'; -import { getMinMaxAndDelta } from '@grafana/data/src/field/scale'; +import { getMinMaxAndDelta, DataFrame, Field } from '@grafana/data'; import { ScaleDimensionConfig, ScaleDimensionMode } from '@grafana/schema'; import { DimensionSupplier, ScaleDimensionOptions } from './types'; diff --git a/public/app/features/explore/Logs/Logs.test.tsx b/public/app/features/explore/Logs/Logs.test.tsx index 958bad54ad4..85b5906eef6 100644 --- a/public/app/features/explore/Logs/Logs.test.tsx +++ b/public/app/features/explore/Logs/Logs.test.tsx @@ -16,7 +16,7 @@ import { ExploreLogsPanelState, DataQuery, } from '@grafana/data'; -import { organizeFieldsTransformer } from '@grafana/data/src/transformations/transformers/organize'; +import { organizeFieldsTransformer } from '@grafana/data/internal'; import { config } from '@grafana/runtime'; import { extractFieldsTransformer } from 'app/features/transformers/extractFields/extractFields'; import { LokiQueryDirection } from 'app/plugins/datasource/loki/dataquery.gen'; diff --git a/public/app/features/explore/Logs/LogsColumnSearch.tsx b/public/app/features/explore/Logs/LogsColumnSearch.tsx index 16e24d48954..6919e9e3fcf 100644 --- a/public/app/features/explore/Logs/LogsColumnSearch.tsx +++ b/public/app/features/explore/Logs/LogsColumnSearch.tsx @@ -1,7 +1,7 @@ import { css } from '@emotion/css'; import * as React from 'react'; -import { GrafanaTheme2 } from '@grafana/data/src'; +import { GrafanaTheme2 } from '@grafana/data'; import { Field, Input, useTheme2 } from '@grafana/ui'; function getStyles(theme: GrafanaTheme2) { diff --git a/public/app/features/explore/Logs/LogsMetaRow.test.tsx b/public/app/features/explore/Logs/LogsMetaRow.test.tsx index ce63d19b4d0..e66a3d1bd77 100644 --- a/public/app/features/explore/Logs/LogsMetaRow.test.tsx +++ b/public/app/features/explore/Logs/LogsMetaRow.test.tsx @@ -4,7 +4,7 @@ import saveAs from 'file-saver'; import { ComponentProps } from 'react'; import { FieldType, LogLevel, LogsDedupStrategy, standardTransformersRegistry, toDataFrame } from '@grafana/data'; -import { organizeFieldsTransformer } from '@grafana/data/src/transformations/transformers/organize'; +import { organizeFieldsTransformer } from '@grafana/data/internal'; import { config } from '@grafana/runtime'; import { MAX_CHARACTERS } from '../../logs/components/LogRowMessage'; diff --git a/public/app/features/explore/Logs/LogsMetaRow.tsx b/public/app/features/explore/Logs/LogsMetaRow.tsx index 9db3be0ebdd..ba07fdf71b2 100644 --- a/public/app/features/explore/Logs/LogsMetaRow.tsx +++ b/public/app/features/explore/Logs/LogsMetaRow.tsx @@ -14,8 +14,8 @@ import { DataTransformerConfig, CustomTransformOperator, Labels, + DataFrame, } from '@grafana/data'; -import { DataFrame } from '@grafana/data/'; import { config, reportInteraction } from '@grafana/runtime'; import { Button, Dropdown, Menu, ToolbarButton, Tooltip, useStyles2 } from '@grafana/ui'; diff --git a/public/app/features/explore/Logs/LogsTable.test.tsx b/public/app/features/explore/Logs/LogsTable.test.tsx index 6dff92ec2c5..a8fa211431e 100644 --- a/public/app/features/explore/Logs/LogsTable.test.tsx +++ b/public/app/features/explore/Logs/LogsTable.test.tsx @@ -2,7 +2,7 @@ import { render, screen, waitFor } from '@testing-library/react'; import { ComponentProps } from 'react'; import { DataFrame, FieldType, LogsSortOrder, standardTransformersRegistry, toUtc } from '@grafana/data'; -import { organizeFieldsTransformer } from '@grafana/data/src/transformations/transformers/organize'; +import { organizeFieldsTransformer } from '@grafana/data/internal'; import { config } from '@grafana/runtime'; import { extractFieldsTransformer } from 'app/features/transformers/extractFields/extractFields'; diff --git a/public/app/features/explore/Logs/LogsTableActiveFields.tsx b/public/app/features/explore/Logs/LogsTableActiveFields.tsx index eb833030106..c228c7aaf7b 100644 --- a/public/app/features/explore/Logs/LogsTableActiveFields.tsx +++ b/public/app/features/explore/Logs/LogsTableActiveFields.tsx @@ -1,7 +1,7 @@ import { css, cx } from '@emotion/css'; import { DragDropContext, Draggable, DraggableProvided, Droppable, DropResult } from '@hello-pangea/dnd'; -import { GrafanaTheme2 } from '@grafana/data/src'; +import { GrafanaTheme2 } from '@grafana/data'; import { useTheme2 } from '@grafana/ui'; import { LogsTableEmptyFields } from './LogsTableEmptyFields'; diff --git a/public/app/features/explore/Logs/LogsTableMultiSelect.tsx b/public/app/features/explore/Logs/LogsTableMultiSelect.tsx index 10308e761a7..19e10e72f4b 100644 --- a/public/app/features/explore/Logs/LogsTableMultiSelect.tsx +++ b/public/app/features/explore/Logs/LogsTableMultiSelect.tsx @@ -1,6 +1,6 @@ import { css } from '@emotion/css'; -import { GrafanaTheme2 } from '@grafana/data/src'; +import { GrafanaTheme2 } from '@grafana/data'; import { useTheme2 } from '@grafana/ui'; import { LogsTableActiveFields } from './LogsTableActiveFields'; diff --git a/public/app/features/explore/Logs/LogsTableWrap.test.tsx b/public/app/features/explore/Logs/LogsTableWrap.test.tsx index a862b326065..3fd2add101f 100644 --- a/public/app/features/explore/Logs/LogsTableWrap.test.tsx +++ b/public/app/features/explore/Logs/LogsTableWrap.test.tsx @@ -1,14 +1,8 @@ import { act, fireEvent, render, screen, waitFor } from '@testing-library/react'; import { ComponentProps } from 'react'; -import { - createTheme, - ExploreLogsPanelState, - LogsSortOrder, - standardTransformersRegistry, - toUtc, -} from '@grafana/data/src'; -import { organizeFieldsTransformer } from '@grafana/data/src/transformations/transformers/organize'; +import { createTheme, ExploreLogsPanelState, LogsSortOrder, standardTransformersRegistry, toUtc } from '@grafana/data'; +import { organizeFieldsTransformer } from '@grafana/data/internal'; import { config } from '@grafana/runtime'; import { extractFieldsTransformer } from '../../transformers/extractFields/extractFields'; diff --git a/public/app/features/explore/Logs/utils/testMocks.test.ts b/public/app/features/explore/Logs/utils/testMocks.test.ts index 55a19433b20..aadea96a5e7 100644 --- a/public/app/features/explore/Logs/utils/testMocks.test.ts +++ b/public/app/features/explore/Logs/utils/testMocks.test.ts @@ -1,4 +1,4 @@ -import { DataFrame, Field, FieldType } from '@grafana/data/src'; +import { DataFrame, Field, FieldType } from '@grafana/data'; import { DataFrameType } from '../../../../../../packages/grafana-data'; diff --git a/public/app/features/explore/NoData.tsx b/public/app/features/explore/NoData.tsx index 130f38750ef..38384793050 100644 --- a/public/app/features/explore/NoData.tsx +++ b/public/app/features/explore/NoData.tsx @@ -1,6 +1,6 @@ import { css } from '@emotion/css'; -import { GrafanaTheme2 } from '@grafana/data/src'; +import { GrafanaTheme2 } from '@grafana/data'; import { useStyles2, PanelContainer } from '@grafana/ui'; export const NoData = () => { diff --git a/public/app/features/explore/PrometheusListView/ItemLabels.tsx b/public/app/features/explore/PrometheusListView/ItemLabels.tsx index 4f0884ab71b..4fb465818cc 100644 --- a/public/app/features/explore/PrometheusListView/ItemLabels.tsx +++ b/public/app/features/explore/PrometheusListView/ItemLabels.tsx @@ -1,6 +1,6 @@ import { css } from '@emotion/css'; -import { Field, GrafanaTheme2 } from '@grafana/data/'; +import { Field, GrafanaTheme2 } from '@grafana/data'; import { InstantQueryRefIdIndex } from '@grafana/prometheus'; import { useStyles2 } from '@grafana/ui'; diff --git a/public/app/features/explore/PrometheusListView/ItemValues.tsx b/public/app/features/explore/PrometheusListView/ItemValues.tsx index 2cb61be35c0..ab46049a540 100644 --- a/public/app/features/explore/PrometheusListView/ItemValues.tsx +++ b/public/app/features/explore/PrometheusListView/ItemValues.tsx @@ -1,6 +1,6 @@ import { css } from '@emotion/css'; -import { GrafanaTheme2 } from '@grafana/data/'; +import { GrafanaTheme2 } from '@grafana/data'; import { useStyles2 } from '@grafana/ui'; import { rawListItemColumnWidth, rawListPaddingToHoldSpaceForCopyIcon, RawListValue } from './RawListItem'; diff --git a/public/app/features/explore/PrometheusListView/RawListContainer.test.tsx b/public/app/features/explore/PrometheusListView/RawListContainer.test.tsx index 8f3d27dbac8..896b5dd7ba8 100644 --- a/public/app/features/explore/PrometheusListView/RawListContainer.test.tsx +++ b/public/app/features/explore/PrometheusListView/RawListContainer.test.tsx @@ -1,6 +1,6 @@ import { render, screen, within } from '@testing-library/react'; -import { FieldType, FormattedValue, toDataFrame } from '@grafana/data/src'; +import { FieldType, FormattedValue, toDataFrame } from '@grafana/data'; import RawListContainer, { RawListContainerProps } from './RawListContainer'; diff --git a/public/app/features/explore/PrometheusListView/RawListContainer.tsx b/public/app/features/explore/PrometheusListView/RawListContainer.tsx index ee8dedfd5ab..eb0717b6c43 100644 --- a/public/app/features/explore/PrometheusListView/RawListContainer.tsx +++ b/public/app/features/explore/PrometheusListView/RawListContainer.tsx @@ -4,7 +4,7 @@ import { useEffect, useId, useRef, useState } from 'react'; import { useWindowSize } from 'react-use'; import { VariableSizeList as List } from 'react-window'; -import { DataFrame, Field as DataFrameField } from '@grafana/data/'; +import { DataFrame, Field as DataFrameField } from '@grafana/data'; import { reportInteraction } from '@grafana/runtime/src'; import { Field, Switch } from '@grafana/ui'; diff --git a/public/app/features/explore/PrometheusListView/RawListItem.tsx b/public/app/features/explore/PrometheusListView/RawListItem.tsx index b5a4e5b9433..a396a636a2b 100644 --- a/public/app/features/explore/PrometheusListView/RawListItem.tsx +++ b/public/app/features/explore/PrometheusListView/RawListItem.tsx @@ -1,7 +1,7 @@ import { css } from '@emotion/css'; import { useCopyToClipboard } from 'react-use'; -import { Field, GrafanaTheme2 } from '@grafana/data/'; +import { Field, GrafanaTheme2 } from '@grafana/data'; import { isValidLegacyName, utf8Support } from '@grafana/prometheus/src/utf8_support'; import { reportInteraction } from '@grafana/runtime/src'; import { IconButton, useStyles2 } from '@grafana/ui'; diff --git a/public/app/features/explore/PrometheusListView/RawListItemAttributes.tsx b/public/app/features/explore/PrometheusListView/RawListItemAttributes.tsx index bbc7962c918..8d9ecb28fe2 100644 --- a/public/app/features/explore/PrometheusListView/RawListItemAttributes.tsx +++ b/public/app/features/explore/PrometheusListView/RawListItemAttributes.tsx @@ -1,6 +1,6 @@ import { css } from '@emotion/css'; -import { GrafanaTheme2 } from '@grafana/data/'; +import { GrafanaTheme2 } from '@grafana/data'; import { useStyles2 } from '@grafana/ui'; import { RawListValue } from './RawListItem'; diff --git a/public/app/features/explore/state/main.test.ts b/public/app/features/explore/state/main.test.ts index 28fe5009234..d52a1be7211 100644 --- a/public/app/features/explore/state/main.test.ts +++ b/public/app/features/explore/state/main.test.ts @@ -1,7 +1,6 @@ import { thunkTester } from 'test/core/thunk/thunkTester'; -import { dateTime, ExploreUrlState } from '@grafana/data'; -import { serializeStateToUrlParam } from '@grafana/data/src/utils/url'; +import { dateTime, ExploreUrlState, serializeStateToUrlParam } from '@grafana/data'; import { locationService } from '@grafana/runtime'; import { PanelModel } from 'app/features/dashboard/state/PanelModel'; diff --git a/public/app/features/live/centrifuge/LiveDataStream.ts b/public/app/features/live/centrifuge/LiveDataStream.ts index a4b6eb80255..6d0787c205f 100644 --- a/public/app/features/live/centrifuge/LiveDataStream.ts +++ b/public/app/features/live/centrifuge/LiveDataStream.ts @@ -12,7 +12,7 @@ import { LoadingState, StreamingDataFrame, } from '@grafana/data'; -import { getStreamingFrameOptions } from '@grafana/data/src/dataframe/StreamingDataFrame'; +import { getStreamingFrameOptions } from '@grafana/data/internal'; import { LiveDataStreamOptions, StreamingFrameAction, StreamingFrameOptions } from '@grafana/runtime/src/services/live'; import { toDataQueryError } from '@grafana/runtime/src/utils/toDataQueryError'; diff --git a/public/app/features/logs/components/InfiniteScroll.test.tsx b/public/app/features/logs/components/InfiniteScroll.test.tsx index c6b92afaef5..dfbb093c17f 100644 --- a/public/app/features/logs/components/InfiniteScroll.test.tsx +++ b/public/app/features/logs/components/InfiniteScroll.test.tsx @@ -2,8 +2,7 @@ import { act, render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { useEffect, useRef, useState } from 'react'; -import { CoreApp, LogRowModel, dateTimeForTimeZone } from '@grafana/data'; -import { convertRawToRange } from '@grafana/data/src/datetime/rangeutil'; +import { CoreApp, LogRowModel, dateTimeForTimeZone, rangeUtil } from '@grafana/data'; import { config } from '@grafana/runtime'; import { LogsSortOrder } from '@grafana/schema'; @@ -16,7 +15,7 @@ const absoluteRange = { from: 1702578600000, to: 1702578900000, }; -const defaultRange = convertRawToRange({ +const defaultRange = rangeUtil.convertRawToRange({ from: dateTimeForTimeZone(defaultTz, absoluteRange.from), to: dateTimeForTimeZone(defaultTz, absoluteRange.to), }); diff --git a/public/app/features/logs/components/InfiniteScroll.tsx b/public/app/features/logs/components/InfiniteScroll.tsx index 36d748d2db1..df0b3109237 100644 --- a/public/app/features/logs/components/InfiniteScroll.tsx +++ b/public/app/features/logs/components/InfiniteScroll.tsx @@ -1,8 +1,8 @@ import { css } from '@emotion/css'; import { ReactNode, MutableRefObject, useCallback, useEffect, useRef, useState } from 'react'; -import { AbsoluteTimeRange, CoreApp, LogRowModel, TimeRange } from '@grafana/data'; -import { convertRawToRange, isRelativeTime, isRelativeTimeRange } from '@grafana/data/src/datetime/rangeutil'; +import { AbsoluteTimeRange, CoreApp, LogRowModel, TimeRange, rangeUtil } from '@grafana/data'; +// import { convertRawToRange, isRelativeTime, isRelativeTimeRange } from '@grafana/data/internal'; import { config, reportInteraction } from '@grafana/runtime'; import { LogsSortOrder, TimeZone } from '@grafana/schema'; import { Button, Icon } from '@grafana/ui'; @@ -140,8 +140,8 @@ export const InfiniteScroll = ({ }, [loadMoreLogs, loading, range, rows, scrollElement, sortOrder, timeZone, topScrollEnabled]); // We allow "now" to move when using relative time, so we hide the message so it doesn't flash. - const hideTopMessage = sortOrder === LogsSortOrder.Descending && isRelativeTime(range.raw.to); - const hideBottomMessage = sortOrder === LogsSortOrder.Ascending && isRelativeTime(range.raw.to); + const hideTopMessage = sortOrder === LogsSortOrder.Descending && rangeUtil.isRelativeTime(range.raw.to); + const hideBottomMessage = sortOrder === LogsSortOrder.Ascending && rangeUtil.isRelativeTime(range.raw.to); const loadOlderLogs = useCallback(() => { //If we are not on the last page, use next page's range @@ -344,5 +344,7 @@ export function canScrollBottom( // Given a TimeRange, returns a new instance if using relative time, or else the same. function updateCurrentRange(timeRange: TimeRange, timeZone: TimeZone) { - return isRelativeTimeRange(timeRange.raw) ? convertRawToRange(timeRange.raw, timeZone) : timeRange; + return rangeUtil.isRelativeTimeRange(timeRange.raw) + ? rangeUtil.convertRawToRange(timeRange.raw, timeZone) + : timeRange; } diff --git a/public/app/features/logs/components/LogDetailsRow.test.tsx b/public/app/features/logs/components/LogDetailsRow.test.tsx index 5f3229255b3..4463adde1f7 100644 --- a/public/app/features/logs/components/LogDetailsRow.test.tsx +++ b/public/app/features/logs/components/LogDetailsRow.test.tsx @@ -1,8 +1,7 @@ import { fireEvent, render, screen } from '@testing-library/react'; import { ComponentProps } from 'react'; -import { CoreApp, FieldType, LinkModel } from '@grafana/data'; -import { Field } from '@grafana/data/'; +import { Field, CoreApp, FieldType, LinkModel } from '@grafana/data'; import { LogDetailsRow } from './LogDetailsRow'; import { createLogRow } from './__mocks__/logRow'; diff --git a/public/app/features/logs/logsModel.ts b/public/app/features/logs/logsModel.ts index 60aef4364bd..a63e464c62f 100644 --- a/public/app/features/logs/logsModel.ts +++ b/public/app/features/logs/logsModel.ts @@ -39,7 +39,7 @@ import { toDataFrame, toUtc, } from '@grafana/data'; -import { SIPrefix } from '@grafana/data/src/valueFormats/symbolFormatters'; +import { SIPrefix } from '@grafana/data/internal'; import { config } from '@grafana/runtime'; import { BarAlignment, GraphDrawStyle, StackingMode } from '@grafana/schema'; import { colors } from '@grafana/ui'; diff --git a/public/app/features/manage-dashboards/components/PublicDashboardListTable/DeletePublicDashboardModal.tsx b/public/app/features/manage-dashboards/components/PublicDashboardListTable/DeletePublicDashboardModal.tsx index 8e3766ce457..dabaa6d3473 100644 --- a/public/app/features/manage-dashboards/components/PublicDashboardListTable/DeletePublicDashboardModal.tsx +++ b/public/app/features/manage-dashboards/components/PublicDashboardListTable/DeletePublicDashboardModal.tsx @@ -1,6 +1,6 @@ import { css } from '@emotion/css'; -import { GrafanaTheme2 } from '@grafana/data/src'; +import { GrafanaTheme2 } from '@grafana/data'; import { config } from '@grafana/runtime'; import { ConfirmModal, useStyles2 } from '@grafana/ui'; import { t } from 'app/core/internationalization'; diff --git a/public/app/features/panel/state/actions.test.ts b/public/app/features/panel/state/actions.test.ts index 0f6dc41284d..98c0105f848 100644 --- a/public/app/features/panel/state/actions.test.ts +++ b/public/app/features/panel/state/actions.test.ts @@ -1,6 +1,5 @@ import { standardEditorsRegistry, standardFieldConfigEditorRegistry } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; -import { mockStandardFieldConfigOptions } from '@grafana/data/test/helpers/fieldConfig'; +import { getPanelPlugin, mockStandardFieldConfigOptions } from '@grafana/data/test'; import { PanelModel } from 'app/features/dashboard/state/PanelModel'; import { panelPluginLoaded } from 'app/features/plugins/admin/state/actions'; diff --git a/public/app/features/plugins/components/AppRootPage.test.tsx b/public/app/features/plugins/components/AppRootPage.test.tsx index 594028bcebf..bef9ed62306 100644 --- a/public/app/features/plugins/components/AppRootPage.test.tsx +++ b/public/app/features/plugins/components/AppRootPage.test.tsx @@ -4,7 +4,7 @@ import { Routes, Route, Link } from 'react-router-dom-v5-compat'; import { render } from 'test/test-utils'; import { AppPlugin, PluginType, AppRootProps, NavModelItem, PluginIncludeType, OrgRole } from '@grafana/data'; -import { getMockPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getMockPlugin } from '@grafana/data/test'; import { setEchoSrv } from '@grafana/runtime'; import { GrafanaRouteWrapper } from 'app/core/navigation/GrafanaRoute'; import { contextSrv } from 'app/core/services/context_srv'; diff --git a/public/app/features/plugins/extensions/registry/AddedLinksRegistry.ts b/public/app/features/plugins/extensions/registry/AddedLinksRegistry.ts index 52a1ad9a96c..12024fd0863 100644 --- a/public/app/features/plugins/extensions/registry/AddedLinksRegistry.ts +++ b/public/app/features/plugins/extensions/registry/AddedLinksRegistry.ts @@ -1,7 +1,7 @@ import { ReplaySubject } from 'rxjs'; import { IconName, PluginExtensionAddedLinkConfig } from '@grafana/data'; -import { PluginAddedLinksConfigureFunc, PluginExtensionEventHelpers } from '@grafana/data/src/types/pluginExtensions'; +import { PluginAddedLinksConfigureFunc, PluginExtensionEventHelpers } from '@grafana/data/internal'; import * as errors from '../errors'; import { isGrafanaDevMode } from '../utils'; diff --git a/public/app/features/plugins/extensions/validators.ts b/public/app/features/plugins/extensions/validators.ts index cbdaf81e935..4106544567f 100644 --- a/public/app/features/plugins/extensions/validators.ts +++ b/public/app/features/plugins/extensions/validators.ts @@ -1,13 +1,14 @@ -import type { - PluginExtensionAddedLinkConfig, - PluginExtension, - PluginExtensionLink, - PluginContextType, - PluginExtensionAddedComponentConfig, - PluginExtensionExposedComponentConfig, - PluginExtensionAddedFunctionConfig, +import { + type PluginExtensionAddedLinkConfig, + type PluginExtension, + type PluginExtensionLink, + type PluginContextType, + type PluginExtensionAddedComponentConfig, + type PluginExtensionExposedComponentConfig, + type PluginExtensionAddedFunctionConfig, + PluginExtensionPoints, } from '@grafana/data'; -import { PluginAddedLinksConfigureFunc, PluginExtensionPoints } from '@grafana/data/src/types/pluginExtensions'; +import { PluginAddedLinksConfigureFunc } from '@grafana/data/internal'; import { config, isPluginExtensionLink } from '@grafana/runtime'; import * as errors from './errors'; diff --git a/public/app/features/plugins/loader/sharedDependencies.ts b/public/app/features/plugins/loader/sharedDependencies.ts index dc88d5a292c..0551cd8d170 100644 --- a/public/app/features/plugins/loader/sharedDependencies.ts +++ b/public/app/features/plugins/loader/sharedDependencies.ts @@ -49,7 +49,7 @@ export const sharedDependenciesMap = { '@emotion/css': () => import('@emotion/css'), '@emotion/react': () => import('@emotion/react'), '@grafana/data': grafanaData, - '@grafana/data/unstable': () => import('@grafana/data/src/unstable'), + '@grafana/data/unstable': () => import('@grafana/data/unstable'), '@grafana/runtime': grafanaRuntime, '@grafana/runtime/unstable': () => import('@grafana/runtime/src/unstable'), '@grafana/slate-react': () => import('slate-react'), diff --git a/public/app/features/plugins/pluginPreloader.ts b/public/app/features/plugins/pluginPreloader.ts index 8b7a85759be..43b58f2d08e 100644 --- a/public/app/features/plugins/pluginPreloader.ts +++ b/public/app/features/plugins/pluginPreloader.ts @@ -1,5 +1,8 @@ -import type { PluginExtensionAddedLinkConfig, PluginExtensionExposedComponentConfig } from '@grafana/data'; -import { PluginExtensionAddedComponentConfig } from '@grafana/data/src/types/pluginExtensions'; +import type { + PluginExtensionAddedLinkConfig, + PluginExtensionExposedComponentConfig, + PluginExtensionAddedComponentConfig, +} from '@grafana/data'; import type { AppPluginConfig } from '@grafana/runtime'; import { getPluginSettings } from 'app/features/plugins/pluginSettings'; diff --git a/public/app/features/scopes/tests/utils/render.tsx b/public/app/features/scopes/tests/utils/render.tsx index 3fa447d952b..391331eb5f1 100644 --- a/public/app/features/scopes/tests/utils/render.tsx +++ b/public/app/features/scopes/tests/utils/render.tsx @@ -2,7 +2,7 @@ import { cleanup, waitFor } from '@testing-library/react'; import { KBarProvider } from 'kbar'; import { render } from 'test/test-utils'; -import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getPanelPlugin } from '@grafana/data/test'; import { config, setPluginImportUtils } from '@grafana/runtime'; import { sceneGraph } from '@grafana/scenes'; import { defaultDashboard } from '@grafana/schema'; diff --git a/public/app/features/trails/DataTrailsHistory.tsx b/public/app/features/trails/DataTrailsHistory.tsx index bfd7af07344..81e20a8b29c 100644 --- a/public/app/features/trails/DataTrailsHistory.tsx +++ b/public/app/features/trails/DataTrailsHistory.tsx @@ -1,8 +1,7 @@ import { css, cx } from '@emotion/css'; import { useMemo } from 'react'; -import { getTimeZoneInfo, GrafanaTheme2, InternalTimeZones, TIME_FORMAT } from '@grafana/data'; -import { convertRawToRange } from '@grafana/data/src/datetime/rangeutil'; +import { getTimeZoneInfo, GrafanaTheme2, InternalTimeZones, TIME_FORMAT, rangeUtil } from '@grafana/data'; import { config } from '@grafana/runtime'; import { SceneComponentProps, @@ -349,7 +348,7 @@ export function parseTimeTooltip(urlValues: SceneObjectUrlValues): string { return ''; } - const range = convertRawToRange({ + const range = rangeUtil.convertRawToRange({ from: urlValues.from, to: urlValues.to, }); diff --git a/public/app/features/trails/Integrations/logs/lokiRecordingRules.test.ts b/public/app/features/trails/Integrations/logs/lokiRecordingRules.test.ts index 673cb2d5348..8d7e5418b3a 100644 --- a/public/app/features/trails/Integrations/logs/lokiRecordingRules.test.ts +++ b/public/app/features/trails/Integrations/logs/lokiRecordingRules.test.ts @@ -1,7 +1,7 @@ import { of } from 'rxjs'; import type { DataSourceInstanceSettings, DataSourceJsonData } from '@grafana/data'; -import { getMockPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getMockPlugin } from '@grafana/data/test'; import * as runtime from '@grafana/runtime'; import { MetricsLogsConnector } from './base'; diff --git a/public/app/features/transformers/FilterByValueTransformer/FilterByValueFilterEditor.tsx b/public/app/features/transformers/FilterByValueTransformer/FilterByValueFilterEditor.tsx index f896c2a5759..1b2f85c51da 100644 --- a/public/app/features/transformers/FilterByValueTransformer/FilterByValueFilterEditor.tsx +++ b/public/app/features/transformers/FilterByValueTransformer/FilterByValueFilterEditor.tsx @@ -1,7 +1,7 @@ import { useCallback } from 'react'; import { Field, SelectableValue, valueMatchers } from '@grafana/data'; -import { FilterByValueFilter } from '@grafana/data/src/transformations/transformers/filterByValue'; +import { FilterByValueFilter } from '@grafana/data/internal'; import { Button, Select, InlineField, InlineFieldRow, Box } from '@grafana/ui'; import { valueMatchersUI } from './ValueMatchers/valueMatchersUI'; diff --git a/public/app/features/transformers/FilterByValueTransformer/FilterByValueTransformerEditor.test.tsx b/public/app/features/transformers/FilterByValueTransformer/FilterByValueTransformerEditor.test.tsx index e9cf39d1497..6c064b2ad0c 100644 --- a/public/app/features/transformers/FilterByValueTransformer/FilterByValueTransformerEditor.test.tsx +++ b/public/app/features/transformers/FilterByValueTransformer/FilterByValueTransformerEditor.test.tsx @@ -1,7 +1,7 @@ import { render, fireEvent } from '@testing-library/react'; import { DataFrame, FieldType, ValueMatcherID, valueMatchers } from '@grafana/data'; -import { FilterByValueMatch, FilterByValueType } from '@grafana/data/src/transformations/transformers/filterByValue'; +import { FilterByValueMatch, FilterByValueType } from '@grafana/data/internal'; import { FilterByValueTransformerEditor } from './FilterByValueTransformerEditor'; diff --git a/public/app/features/transformers/FilterByValueTransformer/FilterByValueTransformerEditor.tsx b/public/app/features/transformers/FilterByValueTransformer/FilterByValueTransformerEditor.tsx index 683350d47b1..57b42e72d32 100644 --- a/public/app/features/transformers/FilterByValueTransformer/FilterByValueTransformerEditor.tsx +++ b/public/app/features/transformers/FilterByValueTransformer/FilterByValueTransformerEditor.tsx @@ -19,7 +19,7 @@ import { FilterByValueMatch, FilterByValueTransformerOptions, FilterByValueType, -} from '@grafana/data/src/transformations/transformers/filterByValue'; +} from '@grafana/data/internal'; import { Button, RadioButtonGroup, InlineField, Box } from '@grafana/ui'; import { getTransformationContent } from '../docs/getTransformationContent'; diff --git a/public/app/features/transformers/calculateHeatmap/heatmap.test.ts b/public/app/features/transformers/calculateHeatmap/heatmap.test.ts index 0087b9fe22f..256cd576ebe 100644 --- a/public/app/features/transformers/calculateHeatmap/heatmap.test.ts +++ b/public/app/features/transformers/calculateHeatmap/heatmap.test.ts @@ -1,5 +1,4 @@ -import { FieldType } from '@grafana/data'; -import { toDataFrame } from '@grafana/data/src/dataframe/processDataFrame'; +import { FieldType, toDataFrame } from '@grafana/data'; import { HeatmapCalculationOptions } from '@grafana/schema'; import { rowsToCellsHeatmap, calculateHeatmapFromData } from './heatmap'; diff --git a/public/app/features/transformers/calculateHeatmap/heatmap.ts b/public/app/features/transformers/calculateHeatmap/heatmap.ts index 6a7a29ce69c..ed37d76651e 100644 --- a/public/app/features/transformers/calculateHeatmap/heatmap.ts +++ b/public/app/features/transformers/calculateHeatmap/heatmap.ts @@ -15,7 +15,7 @@ import { TransformationApplicabilityLevels, TimeRange, } from '@grafana/data'; -import { isLikelyAscendingVector } from '@grafana/data/src/transformations/transformers/joinDataFrames'; +import { isLikelyAscendingVector } from '@grafana/data/internal'; import { ScaleDistribution, HeatmapCellLayout, diff --git a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/BinaryOperationOptionsEditor.tsx b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/BinaryOperationOptionsEditor.tsx index 0dd7cc033cb..e0439cf7126 100644 --- a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/BinaryOperationOptionsEditor.tsx +++ b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/BinaryOperationOptionsEditor.tsx @@ -5,7 +5,7 @@ import { CalculateFieldMode, CalculateFieldTransformerOptions, checkBinaryValueType, -} from '@grafana/data/src/transformations/transformers/calculateField'; +} from '@grafana/data/internal'; import { getFieldTypeIconName, InlineField, InlineFieldRow, Select } from '@grafana/ui'; import { LABEL_WIDTH } from './constants'; diff --git a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/CalculateFieldTransformerEditor.tsx b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/CalculateFieldTransformerEditor.tsx index bc39a4e2c62..bd0e589dd88 100644 --- a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/CalculateFieldTransformerEditor.tsx +++ b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/CalculateFieldTransformerEditor.tsx @@ -21,7 +21,7 @@ import { CalculateFieldTransformerOptions, getNameFromOptions, defaultWindowOptions, -} from '@grafana/data/src/transformations/transformers/calculateField'; +} from '@grafana/data/internal'; import { getTemplateSrv, config as cfg } from '@grafana/runtime'; import { InlineField, InlineSwitch, Input, Select } from '@grafana/ui'; diff --git a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/CumulativeOptionsEditor.tsx b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/CumulativeOptionsEditor.tsx index 1194514bcf4..5d8eb17ea1d 100644 --- a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/CumulativeOptionsEditor.tsx +++ b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/CumulativeOptionsEditor.tsx @@ -1,9 +1,5 @@ import { ReducerID, SelectableValue } from '@grafana/data'; -import { - CalculateFieldMode, - CalculateFieldTransformerOptions, - CumulativeOptions, -} from '@grafana/data/src/transformations/transformers/calculateField'; +import { CalculateFieldMode, CalculateFieldTransformerOptions, CumulativeOptions } from '@grafana/data/internal'; import { InlineField, Select, StatsPicker } from '@grafana/ui'; import { LABEL_WIDTH } from './constants'; diff --git a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/IndexOptionsEditor.tsx b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/IndexOptionsEditor.tsx index c660ac21317..e812dfafb0e 100644 --- a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/IndexOptionsEditor.tsx +++ b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/IndexOptionsEditor.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; -import { CalculateFieldTransformerOptions } from '@grafana/data/src/transformations/transformers/calculateField'; +import { CalculateFieldTransformerOptions } from '@grafana/data/internal'; import { InlineField, InlineSwitch } from '@grafana/ui'; import { LABEL_WIDTH } from './constants'; diff --git a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/ReduceRowOptionsEditor.tsx b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/ReduceRowOptionsEditor.tsx index c48870fc36b..e3e50a475ef 100644 --- a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/ReduceRowOptionsEditor.tsx +++ b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/ReduceRowOptionsEditor.tsx @@ -1,8 +1,5 @@ import { ReducerID } from '@grafana/data'; -import { - CalculateFieldTransformerOptions, - ReduceOptions, -} from '@grafana/data/src/transformations/transformers/calculateField'; +import { CalculateFieldTransformerOptions, ReduceOptions } from '@grafana/data/internal'; import { FilterPill, HorizontalGroup, InlineField, StatsPicker } from '@grafana/ui'; import { LABEL_WIDTH } from './constants'; diff --git a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/UnaryOperationEditor.tsx b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/UnaryOperationEditor.tsx index 3b38248b705..4c57fca1b9b 100644 --- a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/UnaryOperationEditor.tsx +++ b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/UnaryOperationEditor.tsx @@ -1,9 +1,5 @@ import { unaryOperators, SelectableValue, UnaryOperationID } from '@grafana/data'; -import { - UnaryOptions, - CalculateFieldMode, - CalculateFieldTransformerOptions, -} from '@grafana/data/src/transformations/transformers/calculateField'; +import { UnaryOptions, CalculateFieldMode, CalculateFieldTransformerOptions } from '@grafana/data/internal'; import { InlineField, InlineFieldRow, InlineLabel, Select } from '@grafana/ui'; import { LABEL_WIDTH } from './constants'; diff --git a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/WindowOptionsEditor.tsx b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/WindowOptionsEditor.tsx index b025c705c12..34fee4b264d 100644 --- a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/WindowOptionsEditor.tsx +++ b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/WindowOptionsEditor.tsx @@ -5,7 +5,7 @@ import { CalculateFieldTransformerOptions, WindowOptions, WindowSizeMode, -} from '@grafana/data/src/transformations/transformers/calculateField'; +} from '@grafana/data/internal'; import { InlineField, RadioButtonGroup, Select, StatsPicker } from '@grafana/ui'; import { NumberInput } from 'app/core/components/OptionsUI/NumberInput'; diff --git a/public/app/features/transformers/editors/ConcatenateTransformerEditor.tsx b/public/app/features/transformers/editors/ConcatenateTransformerEditor.tsx index 8c548fb2f38..91a0b251d74 100644 --- a/public/app/features/transformers/editors/ConcatenateTransformerEditor.tsx +++ b/public/app/features/transformers/editors/ConcatenateTransformerEditor.tsx @@ -8,10 +8,7 @@ import { TransformerUIProps, TransformerCategory, } from '@grafana/data'; -import { - ConcatenateFrameNameMode, - ConcatenateTransformerOptions, -} from '@grafana/data/src/transformations/transformers/concat'; +import { ConcatenateFrameNameMode, ConcatenateTransformerOptions } from '@grafana/data/internal'; import { InlineField, Input, Select } from '@grafana/ui'; import { getTransformationContent } from '../docs/getTransformationContent'; diff --git a/public/app/features/transformers/editors/ConvertFieldTypeTransformerEditor.tsx b/public/app/features/transformers/editors/ConvertFieldTypeTransformerEditor.tsx index c7d0f4f2f39..e331388cb3e 100644 --- a/public/app/features/transformers/editors/ConvertFieldTypeTransformerEditor.tsx +++ b/public/app/features/transformers/editors/ConvertFieldTypeTransformerEditor.tsx @@ -12,10 +12,7 @@ import { TransformerCategory, getTimeZones, } from '@grafana/data'; -import { - ConvertFieldTypeOptions, - ConvertFieldTypeTransformerOptions, -} from '@grafana/data/src/transformations/transformers/convertFieldType'; +import { ConvertFieldTypeOptions, ConvertFieldTypeTransformerOptions } from '@grafana/data/internal'; import { Button, InlineField, InlineFieldRow, Input, Select } from '@grafana/ui'; import { allFieldTypeIconOptions, FieldNamePicker } from '@grafana/ui/internal'; import { findField } from 'app/features/dimensions'; diff --git a/public/app/features/transformers/editors/EnumMappingEditor.tsx b/public/app/features/transformers/editors/EnumMappingEditor.tsx index 09f1822302c..ed1947a7181 100644 --- a/public/app/features/transformers/editors/EnumMappingEditor.tsx +++ b/public/app/features/transformers/editors/EnumMappingEditor.tsx @@ -4,7 +4,7 @@ import { isEqual } from 'lodash'; import { useEffect, useState } from 'react'; import { DataFrame, EnumFieldConfig, GrafanaTheme2 } from '@grafana/data'; -import { ConvertFieldTypeTransformerOptions } from '@grafana/data/src/transformations/transformers/convertFieldType'; +import { ConvertFieldTypeTransformerOptions } from '@grafana/data/internal'; import { Button, HorizontalGroup, InlineFieldRow, useStyles2, VerticalGroup } from '@grafana/ui'; import EnumMappingRow from './EnumMappingRow'; diff --git a/public/app/features/transformers/editors/FilterByNameTransformerEditor.tsx b/public/app/features/transformers/editors/FilterByNameTransformerEditor.tsx index 8ac19f37e7f..f8035a86f0b 100644 --- a/public/app/features/transformers/editors/FilterByNameTransformerEditor.tsx +++ b/public/app/features/transformers/editors/FilterByNameTransformerEditor.tsx @@ -11,7 +11,7 @@ import { TransformerCategory, SelectableValue, } from '@grafana/data'; -import { FilterFieldsByNameTransformerOptions } from '@grafana/data/src/transformations/transformers/filterByName'; +import { FilterFieldsByNameTransformerOptions } from '@grafana/data/internal'; import { getTemplateSrv } from '@grafana/runtime/src/services'; import { Input, FilterPill, InlineFieldRow, InlineField, InlineSwitch, Select } from '@grafana/ui'; diff --git a/public/app/features/transformers/editors/FilterByRefIdTransformerEditor.tsx b/public/app/features/transformers/editors/FilterByRefIdTransformerEditor.tsx index f67a7cb2b95..05b9e196b83 100644 --- a/public/app/features/transformers/editors/FilterByRefIdTransformerEditor.tsx +++ b/public/app/features/transformers/editors/FilterByRefIdTransformerEditor.tsx @@ -6,7 +6,7 @@ import { TransformerCategory, FrameMatcherID, } from '@grafana/data'; -import { FilterFramesByRefIdTransformerOptions } from '@grafana/data/src/transformations/transformers/filterByRefId'; +import { FilterFramesByRefIdTransformerOptions } from '@grafana/data/internal'; import { FrameMultiSelectionEditor } from 'app/plugins/panel/geomap/editor/FrameSelectionEditor'; import { getTransformationContent } from '../docs/getTransformationContent'; diff --git a/public/app/features/transformers/editors/FormatStringTransformerEditor.tsx b/public/app/features/transformers/editors/FormatStringTransformerEditor.tsx index e208d67976e..cf14f69a044 100644 --- a/public/app/features/transformers/editors/FormatStringTransformerEditor.tsx +++ b/public/app/features/transformers/editors/FormatStringTransformerEditor.tsx @@ -12,10 +12,7 @@ import { FieldNamePickerConfigSettings, TransformerCategory, } from '@grafana/data'; -import { - FormatStringOutput, - FormatStringTransformerOptions, -} from '@grafana/data/src/transformations/transformers/formatString'; +import { FormatStringOutput, FormatStringTransformerOptions } from '@grafana/data/internal'; import { Select, InlineFieldRow, InlineField } from '@grafana/ui'; import { FieldNamePicker } from '@grafana/ui/internal'; import { NumberInput } from 'app/core/components/OptionsUI/NumberInput'; diff --git a/public/app/features/transformers/editors/FormatTimeTransformerEditor.tsx b/public/app/features/transformers/editors/FormatTimeTransformerEditor.tsx index 4c2a646d93f..3f30a79d1a5 100644 --- a/public/app/features/transformers/editors/FormatTimeTransformerEditor.tsx +++ b/public/app/features/transformers/editors/FormatTimeTransformerEditor.tsx @@ -9,7 +9,7 @@ import { getFieldDisplayName, PluginState, } from '@grafana/data'; -import { FormatTimeTransformerOptions } from '@grafana/data/src/transformations/transformers/formatTime'; +import { FormatTimeTransformerOptions } from '@grafana/data/internal'; import { Select, InlineFieldRow, InlineField, Input } from '@grafana/ui'; import { getTransformationContent } from '../docs/getTransformationContent'; diff --git a/public/app/features/transformers/editors/GroupByTransformerEditor.tsx b/public/app/features/transformers/editors/GroupByTransformerEditor.tsx index ca4386f541f..5dc4636bf59 100644 --- a/public/app/features/transformers/editors/GroupByTransformerEditor.tsx +++ b/public/app/features/transformers/editors/GroupByTransformerEditor.tsx @@ -11,11 +11,7 @@ import { TransformerCategory, GrafanaTheme2, } from '@grafana/data'; -import { - GroupByFieldOptions, - GroupByOperationID, - GroupByTransformerOptions, -} from '@grafana/data/src/transformations/transformers/groupBy'; +import { GroupByFieldOptions, GroupByOperationID, GroupByTransformerOptions } from '@grafana/data/internal'; import { useTheme2, Select, StatsPicker, InlineField, Stack, Alert } from '@grafana/ui'; import { getTransformationContent } from '../docs/getTransformationContent'; diff --git a/public/app/features/transformers/editors/GroupToNestedTableTransformerEditor.tsx b/public/app/features/transformers/editors/GroupToNestedTableTransformerEditor.tsx index 17170be06cc..9b874bf5c64 100644 --- a/public/app/features/transformers/editors/GroupToNestedTableTransformerEditor.tsx +++ b/public/app/features/transformers/editors/GroupToNestedTableTransformerEditor.tsx @@ -16,11 +16,9 @@ import { GroupByFieldOptions, GroupByOperationID, GroupByTransformerOptions, -} from '@grafana/data/src/transformations/transformers/groupBy'; -import { GroupToNestedTableTransformerOptions, SHOW_NESTED_HEADERS_DEFAULT, -} from '@grafana/data/src/transformations/transformers/groupToNestedTable'; +} from '@grafana/data/internal'; import { useTheme2, Select, StatsPicker, InlineField, Field, Switch, Alert, Stack } from '@grafana/ui'; import { useAllFieldNamesFromDataFrames } from '../utils'; diff --git a/public/app/features/transformers/editors/HistogramTransformerEditor.tsx b/public/app/features/transformers/editors/HistogramTransformerEditor.tsx index a257f02b0af..e9fa82aec13 100644 --- a/public/app/features/transformers/editors/HistogramTransformerEditor.tsx +++ b/public/app/features/transformers/editors/HistogramTransformerEditor.tsx @@ -7,10 +7,7 @@ import { TransformerUIProps, TransformerCategory, } from '@grafana/data'; -import { - histogramFieldInfo, - HistogramTransformerInputs, -} from '@grafana/data/src/transformations/transformers/histogram'; +import { histogramFieldInfo, HistogramTransformerInputs } from '@grafana/data/internal'; import { InlineField, InlineFieldRow, InlineSwitch } from '@grafana/ui'; import { getTransformationContent } from '../docs/getTransformationContent'; diff --git a/public/app/features/transformers/editors/JoinByFieldTransformerEditor.tsx b/public/app/features/transformers/editors/JoinByFieldTransformerEditor.tsx index cccf062d843..a28c8548780 100644 --- a/public/app/features/transformers/editors/JoinByFieldTransformerEditor.tsx +++ b/public/app/features/transformers/editors/JoinByFieldTransformerEditor.tsx @@ -8,7 +8,7 @@ import { TransformerUIProps, TransformerCategory, } from '@grafana/data'; -import { JoinByFieldOptions, JoinMode } from '@grafana/data/src/transformations/transformers/joinByField'; +import { JoinByFieldOptions, JoinMode } from '@grafana/data/internal'; import { getTemplateSrv } from '@grafana/runtime'; import { Select, InlineFieldRow, InlineField } from '@grafana/ui'; import { useFieldDisplayNames, useSelectOptions } from '@grafana/ui/internal'; diff --git a/public/app/features/transformers/editors/LabelsToFieldsTransformerEditor.tsx b/public/app/features/transformers/editors/LabelsToFieldsTransformerEditor.tsx index e41017a51a2..263aff71a36 100644 --- a/public/app/features/transformers/editors/LabelsToFieldsTransformerEditor.tsx +++ b/public/app/features/transformers/editors/LabelsToFieldsTransformerEditor.tsx @@ -8,10 +8,7 @@ import { TransformerUIProps, TransformerCategory, } from '@grafana/data'; -import { - LabelsToFieldsMode, - LabelsToFieldsOptions, -} from '@grafana/data/src/transformations/transformers/labelsToFields'; +import { LabelsToFieldsMode, LabelsToFieldsOptions } from '@grafana/data/internal'; import { InlineField, InlineFieldRow, RadioButtonGroup, Select, FilterPill, Stack } from '@grafana/ui'; import { getTransformationContent } from '../docs/getTransformationContent'; diff --git a/public/app/features/transformers/editors/LimitTransformerEditor.tsx b/public/app/features/transformers/editors/LimitTransformerEditor.tsx index c55cb9bbfd3..fd10293e2ce 100644 --- a/public/app/features/transformers/editors/LimitTransformerEditor.tsx +++ b/public/app/features/transformers/editors/LimitTransformerEditor.tsx @@ -7,7 +7,7 @@ import { TransformerUIProps, TransformerCategory, } from '@grafana/data'; -import { LimitTransformerOptions } from '@grafana/data/src/transformations/transformers/limit'; +import { LimitTransformerOptions } from '@grafana/data/internal'; import { InlineFieldRow } from '@grafana/ui'; import { getTransformationContent } from '../docs/getTransformationContent'; diff --git a/public/app/features/transformers/editors/MergeTransformerEditor.tsx b/public/app/features/transformers/editors/MergeTransformerEditor.tsx index cd55fbd5543..c81f59bcf9b 100644 --- a/public/app/features/transformers/editors/MergeTransformerEditor.tsx +++ b/public/app/features/transformers/editors/MergeTransformerEditor.tsx @@ -5,7 +5,7 @@ import { TransformerUIProps, TransformerCategory, } from '@grafana/data'; -import { MergeTransformerOptions } from '@grafana/data/src/transformations/transformers/merge'; +import { MergeTransformerOptions } from '@grafana/data/internal'; import { FieldValidationMessage } from '@grafana/ui'; import { getTransformationContent } from '../docs/getTransformationContent'; diff --git a/public/app/features/transformers/editors/OrganizeFieldsTransformerEditor.tsx b/public/app/features/transformers/editors/OrganizeFieldsTransformerEditor.tsx index ef640a79dad..b253066abbf 100644 --- a/public/app/features/transformers/editors/OrganizeFieldsTransformerEditor.tsx +++ b/public/app/features/transformers/editors/OrganizeFieldsTransformerEditor.tsx @@ -10,8 +10,7 @@ import { TransformerUIProps, TransformerCategory, } from '@grafana/data'; -import { createOrderFieldsComparer } from '@grafana/data/src/transformations/transformers/order'; -import { OrganizeFieldsTransformerOptions } from '@grafana/data/src/transformations/transformers/organize'; +import { createOrderFieldsComparer, OrganizeFieldsTransformerOptions } from '@grafana/data/internal'; import { Input, IconButton, diff --git a/public/app/features/transformers/editors/ReduceTransformerEditor.tsx b/public/app/features/transformers/editors/ReduceTransformerEditor.tsx index fc8e10c6b7e..3131e85be1d 100644 --- a/public/app/features/transformers/editors/ReduceTransformerEditor.tsx +++ b/public/app/features/transformers/editors/ReduceTransformerEditor.tsx @@ -9,7 +9,7 @@ import { TransformerUIProps, TransformerCategory, } from '@grafana/data'; -import { ReduceTransformerMode, ReduceTransformerOptions } from '@grafana/data/src/transformations/transformers/reduce'; +import { ReduceTransformerMode, ReduceTransformerOptions } from '@grafana/data/internal'; import { selectors } from '@grafana/e2e-selectors'; import { InlineField, Select, StatsPicker, InlineSwitch } from '@grafana/ui'; diff --git a/public/app/features/transformers/editors/RenameByRegexTransformer.tsx b/public/app/features/transformers/editors/RenameByRegexTransformer.tsx index d192c4a9ee0..4530ad8b84a 100644 --- a/public/app/features/transformers/editors/RenameByRegexTransformer.tsx +++ b/public/app/features/transformers/editors/RenameByRegexTransformer.tsx @@ -8,7 +8,7 @@ import { stringToJsRegex, TransformerCategory, } from '@grafana/data'; -import { RenameByRegexTransformerOptions } from '@grafana/data/src/transformations/transformers/renameByRegex'; +import { RenameByRegexTransformerOptions } from '@grafana/data/internal'; import { InlineField, Input } from '@grafana/ui'; import { getTransformationContent } from '../docs/getTransformationContent'; diff --git a/public/app/features/transformers/editors/SeriesToRowsTransformerEditor.tsx b/public/app/features/transformers/editors/SeriesToRowsTransformerEditor.tsx index 606d0cdb417..8b3b66e64ed 100644 --- a/public/app/features/transformers/editors/SeriesToRowsTransformerEditor.tsx +++ b/public/app/features/transformers/editors/SeriesToRowsTransformerEditor.tsx @@ -5,7 +5,7 @@ import { TransformerUIProps, TransformerCategory, } from '@grafana/data'; -import { SeriesToRowsTransformerOptions } from '@grafana/data/src/transformations/transformers/seriesToRows'; +import { SeriesToRowsTransformerOptions } from '@grafana/data/internal'; import { getTransformationContent } from '../docs/getTransformationContent'; diff --git a/public/app/features/transformers/editors/SortByTransformerEditor.tsx b/public/app/features/transformers/editors/SortByTransformerEditor.tsx index 3faa19ebf8f..4247e1c4f66 100644 --- a/public/app/features/transformers/editors/SortByTransformerEditor.tsx +++ b/public/app/features/transformers/editors/SortByTransformerEditor.tsx @@ -7,7 +7,7 @@ import { TransformerUIProps, TransformerCategory, } from '@grafana/data'; -import { SortByField, SortByTransformerOptions } from '@grafana/data/src/transformations/transformers/sortBy'; +import { SortByField, SortByTransformerOptions } from '@grafana/data/internal'; import { getTemplateSrv } from '@grafana/runtime'; import { InlineField, InlineSwitch, InlineFieldRow, Select } from '@grafana/ui'; diff --git a/public/app/features/transformers/editors/TransposeTransformerEditor.tsx b/public/app/features/transformers/editors/TransposeTransformerEditor.tsx index 4190d385e48..9ba613fe78c 100644 --- a/public/app/features/transformers/editors/TransposeTransformerEditor.tsx +++ b/public/app/features/transformers/editors/TransposeTransformerEditor.tsx @@ -5,7 +5,7 @@ import { TransformerUIProps, TransformerCategory, } from '@grafana/data'; -import { TransposeTransformerOptions } from '@grafana/data/src/transformations/transformers/transpose'; +import { TransposeTransformerOptions } from '@grafana/data/internal'; import { InlineField, InlineFieldRow, Input } from '@grafana/ui'; export const TransposeTransfomerEditor = ({ options, onChange }: TransformerUIProps) => { diff --git a/public/app/features/transformers/extractFields/extractFields.test.ts b/public/app/features/transformers/extractFields/extractFields.test.ts index a6617aecea9..863b89163ca 100644 --- a/public/app/features/transformers/extractFields/extractFields.test.ts +++ b/public/app/features/transformers/extractFields/extractFields.test.ts @@ -5,10 +5,9 @@ import { Field, FieldType, transformDataFrame, + toDataFrame, } from '@grafana/data'; -import { toDataFrame } from '@grafana/data/src/dataframe/processDataFrame'; -import { SortByTransformerOptions, sortByTransformer } from '@grafana/data/src/transformations/transformers/sortBy'; -import { mockTransformationsRegistry } from '@grafana/data/src/utils/tests/mockTransformationsRegistry'; +import { mockTransformationsRegistry, SortByTransformerOptions, sortByTransformer } from '@grafana/data/internal'; import { extractFieldsTransformer } from './extractFields'; import { ExtractFieldsOptions, FieldExtractorID } from './types'; diff --git a/public/app/features/transformers/lookupGazetteer/fieldLookup.test.ts b/public/app/features/transformers/lookupGazetteer/fieldLookup.test.ts index 7f0072dd4d7..bc0ef8c8b82 100644 --- a/public/app/features/transformers/lookupGazetteer/fieldLookup.test.ts +++ b/public/app/features/transformers/lookupGazetteer/fieldLookup.test.ts @@ -1,6 +1,4 @@ -import { FieldMatcherID, fieldMatchers, FieldType } from '@grafana/data'; -import { toDataFrame } from '@grafana/data/src/dataframe/processDataFrame'; -import { DataTransformerID } from '@grafana/data/src/transformations/transformers/ids'; +import { DataTransformerID, toDataFrame, FieldMatcherID, fieldMatchers, FieldType } from '@grafana/data'; import { frameAsGazetter } from 'app/features/geo/gazetteer/gazetteer'; import { addFieldsFromGazetteer } from './fieldLookup'; diff --git a/public/app/features/transformers/partitionByValues/partitionByValues.ts b/public/app/features/transformers/partitionByValues/partitionByValues.ts index 80c349fe762..4ab8d360cbe 100644 --- a/public/app/features/transformers/partitionByValues/partitionByValues.ts +++ b/public/app/features/transformers/partitionByValues/partitionByValues.ts @@ -8,8 +8,7 @@ import { DataTransformContext, FieldMatcher, } from '@grafana/data'; -import { getMatcherConfig } from '@grafana/data/src/transformations/transformers/filterByName'; -import { noopTransformer } from '@grafana/data/src/transformations/transformers/noop'; +import { getMatcherConfig, noopTransformer } from '@grafana/data/internal'; import { partition } from './partition'; diff --git a/public/app/features/transformers/spatial/optionsHelper.tsx b/public/app/features/transformers/spatial/optionsHelper.tsx index 49f77cf7927..e493dfc7d0c 100644 --- a/public/app/features/transformers/spatial/optionsHelper.tsx +++ b/public/app/features/transformers/spatial/optionsHelper.tsx @@ -1,8 +1,7 @@ import { set, get as lodashGet } from 'lodash'; import { StandardEditorContext, TransformerUIProps, PanelOptionsEditorBuilder } from '@grafana/data'; -import { PanelOptionsSupplier } from '@grafana/data/src/panel/PanelPlugin'; -import { NestedValueAccess } from '@grafana/data/src/utils/OptionsUIBuilders'; +import { NestedValueAccess, PanelOptionsSupplier } from '@grafana/data/internal'; import { OptionsPaneCategoryDescriptor } from 'app/features/dashboard/components/PanelEditor/OptionsPaneCategoryDescriptor'; import { fillOptionsPaneItems } from 'app/features/dashboard/components/PanelEditor/getVisualizationOptions'; import { setOptionImmutably } from 'app/features/dashboard/components/PanelEditor/utils'; diff --git a/public/app/features/transformers/spatial/spatialTransformer.test.ts b/public/app/features/transformers/spatial/spatialTransformer.test.ts index b36315fefe5..196a6b3680d 100644 --- a/public/app/features/transformers/spatial/spatialTransformer.test.ts +++ b/public/app/features/transformers/spatial/spatialTransformer.test.ts @@ -1,6 +1,5 @@ -import { FieldMatcherID, fieldMatchers, FieldType } from '@grafana/data'; -import { toDataFrame } from '@grafana/data/src/dataframe/processDataFrame'; -import { DataTransformerID } from '@grafana/data/src/transformations/transformers/ids'; +import { toDataFrame, FieldMatcherID, fieldMatchers, FieldType } from '@grafana/data'; +import { DataTransformerID } from '@grafana/data/internal'; import { frameAsGazetter } from 'app/features/geo/gazetteer/gazetteer'; describe('spatial transformer', () => { diff --git a/public/app/features/variables/datasource/actions.test.ts b/public/app/features/variables/datasource/actions.test.ts index 4d3a5ca8e94..2a0b42b30ff 100644 --- a/public/app/features/variables/datasource/actions.test.ts +++ b/public/app/features/variables/datasource/actions.test.ts @@ -1,5 +1,5 @@ import { DataSourceInstanceSettings } from '@grafana/data'; -import { getMockPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getMockPlugin } from '@grafana/data/test'; import { reduxTester } from '../../../../test/core/redux/reduxTester'; import { variableAdapters } from '../adapters'; diff --git a/public/app/features/variables/datasource/reducer.test.ts b/public/app/features/variables/datasource/reducer.test.ts index 2acb6e96346..6a3abaa27cb 100644 --- a/public/app/features/variables/datasource/reducer.test.ts +++ b/public/app/features/variables/datasource/reducer.test.ts @@ -1,7 +1,7 @@ import { cloneDeep } from 'lodash'; import { DataSourceInstanceSettings, DataSourceVariableModel } from '@grafana/data'; -import { getMockPlugins } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getMockPlugins } from '@grafana/data/test'; import { reducerTester } from '../../../../test/core/redux/reducerTester'; import { getDataSourceInstanceSetting } from '../shared/testing/helpers'; diff --git a/public/app/features/variables/state/initVariableTransaction.test.ts b/public/app/features/variables/state/initVariableTransaction.test.ts index ba9939b8442..0e9c0070023 100644 --- a/public/app/features/variables/state/initVariableTransaction.test.ts +++ b/public/app/features/variables/state/initVariableTransaction.test.ts @@ -1,4 +1,4 @@ -import { DataSourceRef, LoadingState } from '@grafana/data/src'; +import { DataSourceRef, LoadingState } from '@grafana/data'; import { setDataSourceSrv } from '@grafana/runtime/src'; import { DashboardModel } from 'app/features/dashboard/state/DashboardModel'; diff --git a/public/app/features/variables/state/migrateVariablesDatasourceNameToRef.test.ts b/public/app/features/variables/state/migrateVariablesDatasourceNameToRef.test.ts index aea1a31a10b..7673e9bf8d5 100644 --- a/public/app/features/variables/state/migrateVariablesDatasourceNameToRef.test.ts +++ b/public/app/features/variables/state/migrateVariablesDatasourceNameToRef.test.ts @@ -1,4 +1,4 @@ -import { DataSourceRef } from '@grafana/data/src'; +import { DataSourceRef } from '@grafana/data'; import { adHocBuilder, queryBuilder } from '../shared/testing/builders'; import { toVariablePayload } from '../utils'; diff --git a/public/app/plugins/datasource/azuremonitor/__mocks__/utils.ts b/public/app/plugins/datasource/azuremonitor/__mocks__/utils.ts index 921573b797e..3e0204fdd6e 100644 --- a/public/app/plugins/datasource/azuremonitor/__mocks__/utils.ts +++ b/public/app/plugins/datasource/azuremonitor/__mocks__/utils.ts @@ -1,5 +1,4 @@ -import { VariableType, VariableWithOptions } from '@grafana/data'; -import { LoadingState } from '@grafana/data/src/types/data'; +import { LoadingState, VariableType, VariableWithOptions } from '@grafana/data'; interface TemplateableValue { variableName: string; diff --git a/public/app/plugins/datasource/azuremonitor/components/LogsQueryEditor/RawQuery.tsx b/public/app/plugins/datasource/azuremonitor/components/LogsQueryEditor/RawQuery.tsx index 742b12b9d50..bbf7c27cc5c 100644 --- a/public/app/plugins/datasource/azuremonitor/components/LogsQueryEditor/RawQuery.tsx +++ b/public/app/plugins/datasource/azuremonitor/components/LogsQueryEditor/RawQuery.tsx @@ -1,7 +1,7 @@ import { css, cx } from '@emotion/css'; import Prism, { Grammar } from 'prismjs'; -import { GrafanaTheme2 } from '@grafana/data/src'; +import { GrafanaTheme2 } from '@grafana/data'; import { useTheme2 } from '@grafana/ui'; export interface Props { diff --git a/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchMetricsQueryRunner.test.ts b/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchMetricsQueryRunner.test.ts index 637328f022a..7654c6228cd 100644 --- a/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchMetricsQueryRunner.test.ts +++ b/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchMetricsQueryRunner.test.ts @@ -1,7 +1,6 @@ import { of } from 'rxjs'; -import { CustomVariableModel, getFrameDisplayName, VariableHide } from '@grafana/data'; -import { dateTime } from '@grafana/data/src/datetime/moment_wrapper'; +import { dateTime, CustomVariableModel, getFrameDisplayName, VariableHide } from '@grafana/data'; import { toDataQueryResponse } from '@grafana/runtime'; import { diff --git a/public/app/plugins/datasource/dashboard/datasource.test.ts b/public/app/plugins/datasource/dashboard/datasource.test.ts index 114bb966941..a543c5037d4 100644 --- a/public/app/plugins/datasource/dashboard/datasource.test.ts +++ b/public/app/plugins/datasource/dashboard/datasource.test.ts @@ -8,7 +8,7 @@ import { LoadingState, standardTransformersRegistry, } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { getPanelPlugin } from '@grafana/data/test'; import { setPluginImportUtils } from '@grafana/runtime'; import { SafeSerializableSceneObject, diff --git a/public/app/plugins/datasource/elasticsearch/ElasticResponse.ts b/public/app/plugins/datasource/elasticsearch/ElasticResponse.ts index 5b46beee758..103a571b8a6 100644 --- a/public/app/plugins/datasource/elasticsearch/ElasticResponse.ts +++ b/public/app/plugins/datasource/elasticsearch/ElasticResponse.ts @@ -8,7 +8,7 @@ import { MutableDataFrame, PreferredVisualisationType, } from '@grafana/data'; -import { convertFieldType } from '@grafana/data/src/transformations/transformers/convertFieldType'; +import { convertFieldType } from '@grafana/data/internal'; import TableModel from 'app/core/TableModel'; import { isMetricAggregationWithField } from './components/QueryEditor/MetricAggregationsEditor/aggregations'; diff --git a/public/app/plugins/datasource/influxdb/components/editor/annotation/AnnotationEditor.tsx b/public/app/plugins/datasource/influxdb/components/editor/annotation/AnnotationEditor.tsx index a0feea2669b..71418a7904e 100644 --- a/public/app/plugins/datasource/influxdb/components/editor/annotation/AnnotationEditor.tsx +++ b/public/app/plugins/datasource/influxdb/components/editor/annotation/AnnotationEditor.tsx @@ -1,6 +1,6 @@ import { useState } from 'react'; -import { QueryEditorProps } from '@grafana/data/src'; +import { QueryEditorProps } from '@grafana/data'; import { InlineFormLabel, Input, Stack } from '@grafana/ui'; import InfluxDatasource from '../../../datasource'; diff --git a/public/app/plugins/datasource/influxdb/components/editor/constants.ts b/public/app/plugins/datasource/influxdb/components/editor/constants.ts index e234d7652ea..f9f0c4850a5 100644 --- a/public/app/plugins/datasource/influxdb/components/editor/constants.ts +++ b/public/app/plugins/datasource/influxdb/components/editor/constants.ts @@ -1,4 +1,4 @@ -import { SelectableValue } from '@grafana/data/src'; +import { SelectableValue } from '@grafana/data'; import { ResultFormat } from '../../types'; diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/QueryEditor.tsx b/public/app/plugins/datasource/influxdb/components/editor/query/QueryEditor.tsx index acb8d949f4c..079bb5ba02e 100644 --- a/public/app/plugins/datasource/influxdb/components/editor/query/QueryEditor.tsx +++ b/public/app/plugins/datasource/influxdb/components/editor/query/QueryEditor.tsx @@ -1,6 +1,6 @@ import { css } from '@emotion/css'; -import { QueryEditorProps } from '@grafana/data/src'; +import { QueryEditorProps } from '@grafana/data'; import InfluxDatasource from '../../../datasource'; import { buildRawQuery } from '../../../queryUtils'; diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/flux/FluxQueryEditor.tsx b/public/app/plugins/datasource/influxdb/components/editor/query/flux/FluxQueryEditor.tsx index b5b594f3445..daedc65855e 100644 --- a/public/app/plugins/datasource/influxdb/components/editor/query/flux/FluxQueryEditor.tsx +++ b/public/app/plugins/datasource/influxdb/components/editor/query/flux/FluxQueryEditor.tsx @@ -1,7 +1,7 @@ import { css, cx } from '@emotion/css'; import { PureComponent } from 'react'; -import { GrafanaTheme2, SelectableValue } from '@grafana/data/src'; +import { GrafanaTheme2, SelectableValue } from '@grafana/data'; import { getTemplateSrv } from '@grafana/runtime/src'; import { CodeEditor, diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/fsql/FSQLEditor.tsx b/public/app/plugins/datasource/influxdb/components/editor/query/fsql/FSQLEditor.tsx index 4858da88623..e25e951c25d 100644 --- a/public/app/plugins/datasource/influxdb/components/editor/query/fsql/FSQLEditor.tsx +++ b/public/app/plugins/datasource/influxdb/components/editor/query/fsql/FSQLEditor.tsx @@ -1,7 +1,7 @@ import { css, cx } from '@emotion/css'; import { PureComponent } from 'react'; -import { GrafanaTheme2 } from '@grafana/data/src'; +import { GrafanaTheme2 } from '@grafana/data'; import { SQLQuery, SqlQueryEditorLazy, applyQueryDefaults } from '@grafana/sql'; import { InlineFormLabel, LinkButton, Themeable2, withTheme2 } from '@grafana/ui'; diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/getTemplateVariableOptions.ts b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/getTemplateVariableOptions.ts index 51db862e4d9..b3e9860798e 100644 --- a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/getTemplateVariableOptions.ts +++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/getTemplateVariableOptions.ts @@ -1,4 +1,4 @@ -import { TypedVariableModel } from '@grafana/data/src'; +import { TypedVariableModel } from '@grafana/data'; import { getTemplateSrv } from '@grafana/runtime/src'; export function getTemplateVariableOptions(wrapper: (v: TypedVariableModel) => string) { diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/withTemplateVariableOptions.ts b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/withTemplateVariableOptions.ts index 89bd1372bcd..c346946dbfc 100644 --- a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/withTemplateVariableOptions.ts +++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/withTemplateVariableOptions.ts @@ -1,5 +1,5 @@ // helper function to make it easy to call this from the widget-render-code -import { TypedVariableModel } from '@grafana/data/src'; +import { TypedVariableModel } from '@grafana/data'; import { getTemplateVariableOptions } from './getTemplateVariableOptions'; diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/wrapper.ts b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/wrapper.ts index 769a9a435a4..745ada1dd39 100644 --- a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/wrapper.ts +++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/wrapper.ts @@ -1,4 +1,4 @@ -import { TypedVariableModel } from '@grafana/data/src'; +import { TypedVariableModel } from '@grafana/data'; export function wrapRegex(v: TypedVariableModel): string { return `/^$${v.name}$/`; diff --git a/public/app/plugins/datasource/influxdb/influxql_metadata_query.ts b/public/app/plugins/datasource/influxdb/influxql_metadata_query.ts index b343f668018..314b70c2d15 100644 --- a/public/app/plugins/datasource/influxdb/influxql_metadata_query.ts +++ b/public/app/plugins/datasource/influxdb/influxql_metadata_query.ts @@ -1,4 +1,4 @@ -import { ScopedVars } from '@grafana/data/src'; +import { ScopedVars } from '@grafana/data'; import config from 'app/core/config'; import InfluxDatasource from './datasource'; diff --git a/public/app/plugins/datasource/tempo/_importedDependencies/datasources/prometheus/RawQuery.tsx b/public/app/plugins/datasource/tempo/_importedDependencies/datasources/prometheus/RawQuery.tsx index 742b12b9d50..bbf7c27cc5c 100644 --- a/public/app/plugins/datasource/tempo/_importedDependencies/datasources/prometheus/RawQuery.tsx +++ b/public/app/plugins/datasource/tempo/_importedDependencies/datasources/prometheus/RawQuery.tsx @@ -1,7 +1,7 @@ import { css, cx } from '@emotion/css'; import Prism, { Grammar } from 'prismjs'; -import { GrafanaTheme2 } from '@grafana/data/src'; +import { GrafanaTheme2 } from '@grafana/data'; import { useTheme2 } from '@grafana/ui'; export interface Props { diff --git a/public/app/plugins/datasource/tempo/types.ts b/public/app/plugins/datasource/tempo/types.ts index de6c050fb6c..02dbe712969 100644 --- a/public/app/plugins/datasource/tempo/types.ts +++ b/public/app/plugins/datasource/tempo/types.ts @@ -1,4 +1,4 @@ -import { DataSourceJsonData } from '@grafana/data/src'; +import { DataSourceJsonData } from '@grafana/data'; import { NodeGraphOptions, TraceToLogsOptions } from '@grafana/o11y-ds-frontend'; import { TempoQuery as TempoBase, TempoQueryType, TraceqlFilter } from './dataquery.gen'; diff --git a/public/app/plugins/panel/barchart/bars.ts b/public/app/plugins/panel/barchart/bars.ts index 7d3e318eea3..40a3c62f73d 100644 --- a/public/app/plugins/panel/barchart/bars.ts +++ b/public/app/plugins/panel/barchart/bars.ts @@ -1,7 +1,6 @@ import uPlot, { Axis, AlignedData, Scale } from 'uplot'; -import { DataFrame, dateTimeFormat, GrafanaTheme2, systemDateFormats, TimeZone } from '@grafana/data'; -import { alpha } from '@grafana/data/src/themes/colorManipulator'; +import { colorManipulator, DataFrame, dateTimeFormat, GrafanaTheme2, systemDateFormats, TimeZone } from '@grafana/data'; import { StackingMode, VisibilityMode, @@ -545,7 +544,8 @@ export function getConfig(opts: BarsOptions, theme: GrafanaTheme2) { }); barsColors.push({ - fill: fillOpacity < 1 ? colors.map((c) => (c != null ? alpha(c, fillOpacity) : null)) : colors, + fill: + fillOpacity < 1 ? colors.map((c) => (c != null ? colorManipulator.alpha(c, fillOpacity) : null)) : colors, stroke: colors, }); } diff --git a/public/app/plugins/panel/barchart/utils.ts b/public/app/plugins/panel/barchart/utils.ts index 9b25e678f1f..ebd8ac300af 100644 --- a/public/app/plugins/panel/barchart/utils.ts +++ b/public/app/plugins/panel/barchart/utils.ts @@ -13,7 +13,7 @@ import { getFieldSeriesColor, outerJoinDataFrames, } from '@grafana/data'; -import { decoupleHideFromState } from '@grafana/data/src/field/fieldState'; +import { decoupleHideFromState } from '@grafana/data/internal'; import { AxisColorMode, AxisPlacement, diff --git a/public/app/plugins/panel/bargauge/BarGaugeLegend.tsx b/public/app/plugins/panel/bargauge/BarGaugeLegend.tsx index 0ddecee36f6..5364552267a 100644 --- a/public/app/plugins/panel/bargauge/BarGaugeLegend.tsx +++ b/public/app/plugins/panel/bargauge/BarGaugeLegend.tsx @@ -1,7 +1,6 @@ import { memo } from 'react'; -import { cacheFieldDisplayNames, DataFrame, FieldType, getFieldSeriesColor } from '@grafana/data'; -import { Field } from '@grafana/data/'; +import { Field, cacheFieldDisplayNames, DataFrame, FieldType, getFieldSeriesColor } from '@grafana/data'; import { AxisPlacement, VizLegendOptions } from '@grafana/schema'; import { useTheme2, VizLayout, VizLayoutLegendProps, VizLegend, VizLegendItem } from '@grafana/ui'; import { getDisplayValuesForCalcs } from '@grafana/ui/internal'; diff --git a/public/app/plugins/panel/candlestick/fields.ts b/public/app/plugins/panel/candlestick/fields.ts index c370b953a72..5019dfe06d0 100644 --- a/public/app/plugins/panel/candlestick/fields.ts +++ b/public/app/plugins/panel/candlestick/fields.ts @@ -7,7 +7,7 @@ import { outerJoinDataFrames, TimeRange, } from '@grafana/data'; -import { maybeSortFrame } from '@grafana/data/src/transformations/transformers/joinDataFrames'; +import { maybeSortFrame } from '@grafana/data/internal'; import { findField } from 'app/features/dimensions'; import { prepareGraphableFields } from '../timeseries/utils'; diff --git a/public/app/plugins/panel/canvas/components/CanvasTooltip.tsx b/public/app/plugins/panel/canvas/components/CanvasTooltip.tsx index aa756baa9c8..ceb17a8ce7d 100644 --- a/public/app/plugins/panel/canvas/components/CanvasTooltip.tsx +++ b/public/app/plugins/panel/canvas/components/CanvasTooltip.tsx @@ -12,8 +12,8 @@ import { getFieldDisplayName, ScopedVars, ValueLinkConfig, -} from '@grafana/data/src'; -import { ActionModel } from '@grafana/data/src/types/action'; + ActionModel, +} from '@grafana/data'; import { Portal, useStyles2, VizTooltipContainer } from '@grafana/ui'; import { VizTooltipContent, diff --git a/public/app/plugins/panel/canvas/editor/connectionEditor.tsx b/public/app/plugins/panel/canvas/editor/connectionEditor.tsx index 96e8a21b331..869bcec4adb 100644 --- a/public/app/plugins/panel/canvas/editor/connectionEditor.tsx +++ b/public/app/plugins/panel/canvas/editor/connectionEditor.tsx @@ -1,6 +1,6 @@ import { get as lodashGet } from 'lodash'; -import { NestedPanelOptions, NestedValueAccess } from '@grafana/data/src/utils/OptionsUIBuilders'; +import { NestedPanelOptions, NestedValueAccess } from '@grafana/data/internal'; import { Scene } from 'app/features/canvas/runtime/scene'; import { setOptionImmutably } from 'app/features/dashboard/components/PanelEditor/utils'; diff --git a/public/app/plugins/panel/canvas/editor/element/QuickPositioning.tsx b/public/app/plugins/panel/canvas/editor/element/QuickPositioning.tsx index acfe2f3b755..c63a14aabc6 100644 --- a/public/app/plugins/panel/canvas/editor/element/QuickPositioning.tsx +++ b/public/app/plugins/panel/canvas/editor/element/QuickPositioning.tsx @@ -1,6 +1,6 @@ import { css } from '@emotion/css'; -import { GrafanaTheme2 } from '@grafana/data/src'; +import { GrafanaTheme2 } from '@grafana/data'; import { IconButton, useStyles2 } from '@grafana/ui'; import { ElementState } from 'app/features/canvas/runtime/element'; import { QuickPlacement } from 'app/features/canvas/types'; diff --git a/public/app/plugins/panel/canvas/editor/element/elementEditor.tsx b/public/app/plugins/panel/canvas/editor/element/elementEditor.tsx index bdad1130a50..4e0164319ea 100644 --- a/public/app/plugins/panel/canvas/editor/element/elementEditor.tsx +++ b/public/app/plugins/panel/canvas/editor/element/elementEditor.tsx @@ -1,6 +1,6 @@ import { get as lodashGet } from 'lodash'; -import { NestedPanelOptions, NestedValueAccess } from '@grafana/data/src/utils/OptionsUIBuilders'; +import { NestedPanelOptions, NestedValueAccess } from '@grafana/data/internal'; import { CanvasElementOptions } from 'app/features/canvas/element'; import { canvasElementRegistry, diff --git a/public/app/plugins/panel/canvas/editor/inline/InlineEditBody.tsx b/public/app/plugins/panel/canvas/editor/inline/InlineEditBody.tsx index 5b13b982eb8..8c6a2764035 100644 --- a/public/app/plugins/panel/canvas/editor/inline/InlineEditBody.tsx +++ b/public/app/plugins/panel/canvas/editor/inline/InlineEditBody.tsx @@ -4,8 +4,7 @@ import { useMemo, useState } from 'react'; import { useObservable } from 'react-use'; import { DataFrame, GrafanaTheme2, PanelOptionsEditorBuilder, StandardEditorContext } from '@grafana/data'; -import { PanelOptionsSupplier } from '@grafana/data/src/panel/PanelPlugin'; -import { NestedValueAccess } from '@grafana/data/src/utils/OptionsUIBuilders'; +import { NestedValueAccess, PanelOptionsSupplier } from '@grafana/data/internal'; import { useStyles2 } from '@grafana/ui'; import { AddLayerButton } from 'app/core/components/Layers/AddLayerButton'; import { FrameState } from 'app/features/canvas/runtime/frame'; diff --git a/public/app/plugins/panel/canvas/editor/layer/layerEditor.tsx b/public/app/plugins/panel/canvas/editor/layer/layerEditor.tsx index 59c9b40fd46..69a0e9aa29e 100644 --- a/public/app/plugins/panel/canvas/editor/layer/layerEditor.tsx +++ b/public/app/plugins/panel/canvas/editor/layer/layerEditor.tsx @@ -1,6 +1,6 @@ import { get as lodashGet } from 'lodash'; -import { NestedPanelOptions, NestedValueAccess } from '@grafana/data/src/utils/OptionsUIBuilders'; +import { NestedPanelOptions, NestedValueAccess } from '@grafana/data/internal'; import { ElementState } from 'app/features/canvas/runtime/element'; import { FrameState } from 'app/features/canvas/runtime/frame'; import { Scene } from 'app/features/canvas/runtime/scene'; diff --git a/public/app/plugins/panel/canvas/editor/options.ts b/public/app/plugins/panel/canvas/editor/options.ts index 221ab5f7979..48640dfddb0 100644 --- a/public/app/plugins/panel/canvas/editor/options.ts +++ b/public/app/plugins/panel/canvas/editor/options.ts @@ -1,7 +1,7 @@ import { capitalize } from 'lodash'; import { FieldType } from '@grafana/data'; -import { PanelOptionsSupplier } from '@grafana/data/src/panel/PanelPlugin'; +import { PanelOptionsSupplier } from '@grafana/data/internal'; import { ConnectionDirection } from 'app/features/canvas/element'; import { SVGElements } from 'app/features/canvas/runtime/element'; import { ColorDimensionEditor, ResourceDimensionEditor, ScaleDimensionEditor } from 'app/features/dimensions/editors'; diff --git a/public/app/plugins/panel/canvas/utils.ts b/public/app/plugins/panel/canvas/utils.ts index bf5fb30b15f..386466d3378 100644 --- a/public/app/plugins/panel/canvas/utils.ts +++ b/public/app/plugins/panel/canvas/utils.ts @@ -1,7 +1,6 @@ import { isNumber, isString } from 'lodash'; -import { AppEvents, getFieldDisplayName, PluginState, SelectableValue } from '@grafana/data'; -import { DataFrame, Field } from '@grafana/data/'; +import { DataFrame, Field, AppEvents, getFieldDisplayName, PluginState, SelectableValue } from '@grafana/data'; import appEvents from 'app/core/app_events'; import { hasAlphaPanels, config } from 'app/core/config'; import { diff --git a/public/app/plugins/panel/datagrid/components/DatagridContextMenu.tsx b/public/app/plugins/panel/datagrid/components/DatagridContextMenu.tsx index f9629ce7053..1e06330c88d 100644 --- a/public/app/plugins/panel/datagrid/components/DatagridContextMenu.tsx +++ b/public/app/plugins/panel/datagrid/components/DatagridContextMenu.tsx @@ -3,7 +3,7 @@ import { capitalize } from 'lodash'; import * as React from 'react'; import { DataFrame, FieldType } from '@grafana/data'; -import { convertFieldType } from '@grafana/data/src/transformations/transformers/convertFieldType'; +import { convertFieldType } from '@grafana/data/internal'; import { reportInteraction } from '@grafana/runtime'; import { ContextMenu, MenuGroup, MenuItem } from '@grafana/ui'; import { MenuDivider } from '@grafana/ui/internal'; diff --git a/public/app/plugins/panel/geomap/components/MarkersLegend.tsx b/public/app/plugins/panel/geomap/components/MarkersLegend.tsx index 2d6cdabfc5d..34eda649940 100644 --- a/public/app/plugins/panel/geomap/components/MarkersLegend.tsx +++ b/public/app/plugins/panel/geomap/components/MarkersLegend.tsx @@ -4,8 +4,13 @@ import { useMemo } from 'react'; import { useObservable } from 'react-use'; import { of } from 'rxjs'; -import { DataFrame, formattedValueToString, getFieldColorModeForField, GrafanaTheme2 } from '@grafana/data'; -import { getMinMaxAndDelta } from '@grafana/data/src/field/scale'; +import { + getMinMaxAndDelta, + DataFrame, + formattedValueToString, + getFieldColorModeForField, + GrafanaTheme2, +} from '@grafana/data'; import { useStyles2, VizLegendItem } from '@grafana/ui'; import { ColorScale } from 'app/core/components/ColorScale/ColorScale'; import { SanitizedSVG } from 'app/core/components/SVG/SanitizedSVG'; diff --git a/public/app/plugins/panel/geomap/editor/layerEditor.tsx b/public/app/plugins/panel/geomap/editor/layerEditor.tsx index e0676fab740..064e6189cf7 100644 --- a/public/app/plugins/panel/geomap/editor/layerEditor.tsx +++ b/public/app/plugins/panel/geomap/editor/layerEditor.tsx @@ -1,7 +1,7 @@ import { get as lodashGet, isEqual } from 'lodash'; import { FrameGeometrySourceMode, getFrameMatchers, MapLayerOptions } from '@grafana/data'; -import { NestedPanelOptions, NestedValueAccess } from '@grafana/data/src/utils/OptionsUIBuilders'; +import { NestedPanelOptions, NestedValueAccess } from '@grafana/data/internal'; import { setOptionImmutably } from 'app/features/dashboard/components/PanelEditor/utils'; import { addLocationFields } from 'app/features/geo/editor/locationEditor'; diff --git a/public/app/plugins/panel/geomap/layers/data/routeLayer.tsx b/public/app/plugins/panel/geomap/layers/data/routeLayer.tsx index 43e9500ad0c..366b687c5aa 100644 --- a/public/app/plugins/panel/geomap/layers/data/routeLayer.tsx +++ b/public/app/plugins/panel/geomap/layers/data/routeLayer.tsx @@ -20,8 +20,8 @@ import { DataHoverClearEvent, DataFrame, FieldType, + colorManipulator } from '@grafana/data'; -import { alpha } from '@grafana/data/src/themes/colorManipulator'; import { MapLayerOptions, FrameGeometrySourceMode } from '@grafana/schema'; import { FrameVectorSource } from 'app/features/geo/utils/frameVectorSource'; import { getGeometryField, getLocationMatchers } from 'app/features/geo/utils/location'; @@ -207,10 +207,10 @@ export const routeLayer: MapLayerRegistryItem = { image: new Circle({ radius: crosshairRadius, stroke: new Stroke({ - color: alpha(crosshairColor, 1), + color: colorManipulator.alpha(crosshairColor, 1), width: 1, }), - fill: new Fill({ color: alpha(crosshairColor, 0.4) }), + fill: new Fill({ color: colorManipulator.alpha(crosshairColor, 0.4) }), }), }); const lineStyle = new Style({ diff --git a/public/app/plugins/panel/geomap/utils/checkFeatureMatchesStyleRule.ts b/public/app/plugins/panel/geomap/utils/checkFeatureMatchesStyleRule.ts index 569bbdf7c7b..cc0558c4e44 100644 --- a/public/app/plugins/panel/geomap/utils/checkFeatureMatchesStyleRule.ts +++ b/public/app/plugins/panel/geomap/utils/checkFeatureMatchesStyleRule.ts @@ -1,6 +1,6 @@ import { FeatureLike } from 'ol/Feature'; -import { compareValues } from '@grafana/data/src/transformations/matchers/compareValues'; +import { compareValues } from '@grafana/data/internal'; import { FeatureRuleConfig } from '../types'; diff --git a/public/app/plugins/panel/geomap/utils/tooltip.ts b/public/app/plugins/panel/geomap/utils/tooltip.ts index 74fc3d6a8ba..547ef6e498b 100644 --- a/public/app/plugins/panel/geomap/utils/tooltip.ts +++ b/public/app/plugins/panel/geomap/utils/tooltip.ts @@ -2,7 +2,7 @@ import { debounce } from 'lodash'; import { MapBrowserEvent } from 'ol'; import { toLonLat } from 'ol/proj'; -import { DataFrame, DataHoverClearEvent } from '@grafana/data/src'; +import { DataFrame, DataHoverClearEvent } from '@grafana/data'; import { GeomapPanel } from '../GeomapPanel'; import { GeomapHoverPayload, GeomapLayerHover } from '../event'; diff --git a/public/app/plugins/panel/geomap/utils/utils.ts b/public/app/plugins/panel/geomap/utils/utils.ts index 6587dda7ee2..44bb31c0876 100644 --- a/public/app/plugins/panel/geomap/utils/utils.ts +++ b/public/app/plugins/panel/geomap/utils/utils.ts @@ -1,8 +1,7 @@ import { Map as OpenLayersMap } from 'ol'; import { defaults as interactionDefaults } from 'ol/interaction'; -import { SelectableValue } from '@grafana/data'; -import { DataFrame, GrafanaTheme2 } from '@grafana/data/src'; +import { DataFrame, GrafanaTheme2, SelectableValue } from '@grafana/data'; import { getColorDimension, getScalarDimension, getScaledDimension, getTextDimension } from 'app/features/dimensions'; import { getGrafanaDatasource } from 'app/plugins/datasource/grafana/datasource'; diff --git a/public/app/plugins/panel/graph/data_processor.ts b/public/app/plugins/panel/graph/data_processor.ts index 21afccf65d3..0b97dd6efbd 100644 --- a/public/app/plugins/panel/graph/data_processor.ts +++ b/public/app/plugins/panel/graph/data_processor.ts @@ -1,7 +1,7 @@ import { find } from 'lodash'; import { DataFrame, dateTime, Field, FieldType, getFieldDisplayName, getTimeField, TimeRange } from '@grafana/data'; -import { applyNullInsertThreshold } from '@grafana/data/src/transformations/transformers/nulls/nullInsertThreshold'; +import { applyNullInsertThreshold } from '@grafana/data/internal'; import { colors } from '@grafana/ui'; import config from 'app/core/config'; import TimeSeries from 'app/core/time_series2'; diff --git a/public/app/plugins/panel/histogram/Histogram.tsx b/public/app/plugins/panel/histogram/Histogram.tsx index 024d3105a51..3225018263a 100644 --- a/public/app/plugins/panel/histogram/Histogram.tsx +++ b/public/app/plugins/panel/histogram/Histogram.tsx @@ -9,11 +9,9 @@ import { getFieldSeriesColor, GrafanaTheme2, roundDecimals, -} from '@grafana/data'; -import { histogramBucketSizes, histogramFrameBucketMaxFieldName, -} from '@grafana/data/src/transformations/transformers/histogram'; +} from '@grafana/data'; import { VizLegendOptions, ScaleDistribution, AxisPlacement, ScaleDirection, ScaleOrientation } from '@grafana/schema'; import { Themeable2, diff --git a/public/app/plugins/panel/histogram/HistogramPanel.tsx b/public/app/plugins/panel/histogram/HistogramPanel.tsx index 082b0be63c4..6ec723bd766 100644 --- a/public/app/plugins/panel/histogram/HistogramPanel.tsx +++ b/public/app/plugins/panel/histogram/HistogramPanel.tsx @@ -1,7 +1,14 @@ import { useMemo } from 'react'; -import { DataFrameType, PanelProps, buildHistogram, cacheFieldDisplayNames, getHistogramFields } from '@grafana/data'; -import { histogramFieldsToFrame, joinHistograms } from '@grafana/data/src/transformations/transformers/histogram'; +import { + histogramFieldsToFrame, + joinHistograms, + DataFrameType, + PanelProps, + buildHistogram, + cacheFieldDisplayNames, + getHistogramFields, +} from '@grafana/data'; import { TooltipDisplayMode, TooltipPlugin2, useTheme2 } from '@grafana/ui'; import { TooltipHoverMode } from '@grafana/ui/internal'; diff --git a/public/app/plugins/panel/histogram/module.tsx b/public/app/plugins/panel/histogram/module.tsx index cf95bbc463d..2584b008737 100644 --- a/public/app/plugins/panel/histogram/module.tsx +++ b/public/app/plugins/panel/histogram/module.tsx @@ -4,8 +4,8 @@ import { FieldType, identityOverrideProcessor, PanelPlugin, + histogramFieldInfo, } from '@grafana/data'; -import { histogramFieldInfo } from '@grafana/data/src/transformations/transformers/histogram'; import { commonOptionsBuilder, graphFieldOptions } from '@grafana/ui'; import { StackingEditor } from '@grafana/ui/internal'; diff --git a/public/app/plugins/panel/histogram/utils.ts b/public/app/plugins/panel/histogram/utils.ts index 51d041050bf..25e1f33c4bd 100644 --- a/public/app/plugins/panel/histogram/utils.ts +++ b/public/app/plugins/panel/histogram/utils.ts @@ -1,8 +1,9 @@ -import { DataFrame, FieldType } from '@grafana/data'; import { isHistogramFrameBucketMinFieldName, isHistogramFrameBucketMaxFieldName, -} from '@grafana/data/src/transformations/transformers/histogram'; + DataFrame, + FieldType, +} from '@grafana/data'; export function originalDataHasHistogram(frames?: DataFrame[]): boolean { if (frames?.length !== 1) { diff --git a/public/app/plugins/panel/logs/LogsPanel.tsx b/public/app/plugins/panel/logs/LogsPanel.tsx index a335e830aca..be0b279952a 100644 --- a/public/app/plugins/panel/logs/LogsPanel.tsx +++ b/public/app/plugins/panel/logs/LogsPanel.tsx @@ -29,8 +29,8 @@ import { urlUtil, LogSortOrderChangeEvent, LoadingState, + rangeUtil, } from '@grafana/data'; -import { convertRawToRange } from '@grafana/data/src/datetime/rangeutil'; import { config, getAppEvents } from '@grafana/runtime'; import { ScrollContainer, usePanelContext, useStyles2 } from '@grafana/ui'; import { getFieldLinksForExplore } from 'app/features/explore/utils/links'; @@ -574,7 +574,7 @@ export async function requestMoreLogs( return []; } - const range: TimeRange = convertRawToRange({ + const range: TimeRange = rangeUtil.convertRawToRange({ from: dateTimeForTimeZone(timeZone, timeRange.from), to: dateTimeForTimeZone(timeZone, timeRange.to), }); diff --git a/public/app/plugins/panel/nodeGraph/Node.test.tsx b/public/app/plugins/panel/nodeGraph/Node.test.tsx index a73f0b8334e..2c9bf841394 100644 --- a/public/app/plugins/panel/nodeGraph/Node.test.tsx +++ b/public/app/plugins/panel/nodeGraph/Node.test.tsx @@ -1,6 +1,6 @@ import { render, screen } from '@testing-library/react'; -import { FieldType } from '@grafana/data/src'; +import { FieldType } from '@grafana/data'; import { Node } from './Node'; diff --git a/public/app/plugins/panel/stat/StatPanel.tsx b/public/app/plugins/panel/stat/StatPanel.tsx index 2411ab49943..6d1c35cc63a 100644 --- a/public/app/plugins/panel/stat/StatPanel.tsx +++ b/public/app/plugins/panel/stat/StatPanel.tsx @@ -10,7 +10,7 @@ import { NumericRange, PanelProps, } from '@grafana/data'; -import { findNumericFieldMinMax } from '@grafana/data/src/field/fieldOverrides'; +import { findNumericFieldMinMax } from '@grafana/data/internal'; import { BigValueTextMode, BigValueGraphMode } from '@grafana/schema'; import { BigValue, DataLinksContextMenu, VizRepeater, VizRepeaterRenderValueProps } from '@grafana/ui'; import { DataLinksContextMenuApi } from '@grafana/ui/internal'; diff --git a/public/app/plugins/panel/status-history/utils.ts b/public/app/plugins/panel/status-history/utils.ts index cd683b7129c..d077a54a959 100644 --- a/public/app/plugins/panel/status-history/utils.ts +++ b/public/app/plugins/panel/status-history/utils.ts @@ -1,5 +1,4 @@ -import { ActionModel, Field, InterpolateFunction, LinkModel } from '@grafana/data'; -import { DataFrame } from '@grafana/data/'; +import { DataFrame, ActionModel, Field, InterpolateFunction, LinkModel } from '@grafana/data'; import { getActions } from 'app/features/actions/utils'; export const getDataLinks = (field: Field, rowIdx: number) => { diff --git a/public/app/plugins/panel/table/migrations.ts b/public/app/plugins/panel/table/migrations.ts index 734376e18be..aa4c635682c 100644 --- a/public/app/plugins/panel/table/migrations.ts +++ b/public/app/plugins/panel/table/migrations.ts @@ -10,7 +10,7 @@ import { DataFrame, FieldType, } from '@grafana/data'; -import { ReduceTransformerOptions } from '@grafana/data/src/transformations/transformers/reduce'; +import { ReduceTransformerOptions } from '@grafana/data/internal'; import { Options } from './panelcfg.gen'; diff --git a/public/app/plugins/panel/timeseries/utils.ts b/public/app/plugins/panel/timeseries/utils.ts index 02fc7ea3b34..8b974ac38fa 100644 --- a/public/app/plugins/panel/timeseries/utils.ts +++ b/public/app/plugins/panel/timeseries/utils.ts @@ -7,10 +7,10 @@ import { isBooleanUnit, TimeRange, cacheFieldDisplayNames, + applyNullInsertThreshold, + nullToValue, } from '@grafana/data'; -import { convertFieldType } from '@grafana/data/src/transformations/transformers/convertFieldType'; -import { applyNullInsertThreshold } from '@grafana/data/src/transformations/transformers/nulls/nullInsertThreshold'; -import { nullToValue } from '@grafana/data/src/transformations/transformers/nulls/nullToValue'; +import { convertFieldType } from '@grafana/data/internal'; import { GraphFieldConfig, LineInterpolation, TooltipDisplayMode, VizTooltipOptions } from '@grafana/schema'; import { buildScaleKey } from '@grafana/ui/internal'; diff --git a/public/app/plugins/panel/trend/TrendPanel.tsx b/public/app/plugins/panel/trend/TrendPanel.tsx index f043c113b1f..ff54529bbe4 100644 --- a/public/app/plugins/panel/trend/TrendPanel.tsx +++ b/public/app/plugins/panel/trend/TrendPanel.tsx @@ -1,7 +1,14 @@ import { useMemo } from 'react'; -import { DataFrame, FieldMatcherID, fieldMatchers, FieldType, PanelProps, TimeRange } from '@grafana/data'; -import { isLikelyAscendingVector } from '@grafana/data/src/transformations/transformers/joinDataFrames'; +import { + isLikelyAscendingVector, + DataFrame, + FieldMatcherID, + fieldMatchers, + FieldType, + PanelProps, + TimeRange, +} from '@grafana/data'; import { config, PanelDataErrorView } from '@grafana/runtime'; import { KeyboardPlugin, TooltipDisplayMode, usePanelContext, TooltipPlugin2 } from '@grafana/ui'; import { TooltipHoverMode } from '@grafana/ui/internal'; diff --git a/public/app/plugins/panel/xychart/XYChartPanel.tsx b/public/app/plugins/panel/xychart/XYChartPanel.tsx index 31d4784a7aa..e3e667730c2 100644 --- a/public/app/plugins/panel/xychart/XYChartPanel.tsx +++ b/public/app/plugins/panel/xychart/XYChartPanel.tsx @@ -1,8 +1,7 @@ import { css } from '@emotion/css'; import { useMemo } from 'react'; -import { FALLBACK_COLOR, PanelProps } from '@grafana/data'; -import { alpha } from '@grafana/data/src/themes/colorManipulator'; +import { colorManipulator, FALLBACK_COLOR, PanelProps } from '@grafana/data'; import { config } from '@grafana/runtime'; import { TooltipDisplayMode, @@ -72,7 +71,7 @@ export const XYChartPanel2 = (props: Props2) => { items.push({ yAxis: 1, // TODO: pull from y field label: s.name.value, - color: alpha(s.color.fixed ?? FALLBACK_COLOR, 1), + color: colorManipulator.alpha(s.color.fixed ?? FALLBACK_COLOR, 1), getItemKey: () => `${idx}-${s.name.value}`, fieldName: yField.state?.displayName ?? yField.name, disabled: yField.state?.hideFrom?.viz ?? false, diff --git a/public/app/plugins/panel/xychart/XYChartTooltip.tsx b/public/app/plugins/panel/xychart/XYChartTooltip.tsx index f9b0d588d31..f72a67b7b5e 100644 --- a/public/app/plugins/panel/xychart/XYChartTooltip.tsx +++ b/public/app/plugins/panel/xychart/XYChartTooltip.tsx @@ -1,7 +1,6 @@ import { ReactNode } from 'react'; -import { DataFrame, InterpolateFunction, LinkModel } from '@grafana/data'; -import { alpha } from '@grafana/data/src/themes/colorManipulator'; +import { colorManipulator, DataFrame, InterpolateFunction, LinkModel } from '@grafana/data'; import { VizTooltipContent, VizTooltipFooter, @@ -67,7 +66,7 @@ export const XYChartTooltip = ({ const headerItem: VizTooltipItem = { label, value: '', - color: alpha(seriesColor ?? '#fff', 0.5), + color: colorManipulator.alpha(seriesColor ?? '#fff', 0.5), colorIndicator: ColorIndicator.marker_md, }; diff --git a/public/app/plugins/panel/xychart/scatter.ts b/public/app/plugins/panel/xychart/scatter.ts index b2d9156ffbb..d7bb53a3838 100644 --- a/public/app/plugins/panel/xychart/scatter.ts +++ b/public/app/plugins/panel/xychart/scatter.ts @@ -11,8 +11,8 @@ import { MappingType, SpecialValueMatch, ThresholdsMode, + colorManipulator, } from '@grafana/data'; -import { alpha } from '@grafana/data/src/themes/colorManipulator'; import { AxisPlacement, FieldColorModeId, ScaleDirection, ScaleOrientation, VisibilityMode } from '@grafana/schema'; import { UPlotConfigBuilder } from '@grafana/ui'; import { FacetedData, FacetSeries } from '@grafana/ui/internal'; @@ -86,8 +86,8 @@ export const prepConfig = (xySeries: XYSeries[], theme: GrafanaTheme2) => { let pointAlpha = scatterInfo.fillOpacity / 100; - u.ctx.fillStyle = alpha((series.fill as any)(), pointAlpha); - u.ctx.strokeStyle = alpha((series.stroke as any)(), 1); + u.ctx.fillStyle = colorManipulator.alpha((series.fill as any)(), pointAlpha); + u.ctx.strokeStyle = colorManipulator.alpha((series.stroke as any)(), 1); u.ctx.lineWidth = strokeWidth; let deg360 = 2 * Math.PI; @@ -138,8 +138,8 @@ export const prepConfig = (xySeries: XYSeries[], theme: GrafanaTheme2) => { if (pointColors[i] !== curColorIdx) { curColorIdx = pointColors[i]; let c = curColorIdx === -1 ? FALLBACK_COLOR : pointPalette[curColorIdx]; - u.ctx.fillStyle = paletteHasAlpha ? c : alpha(c as string, pointAlpha); - u.ctx.strokeStyle = alpha(c as string, 1); + u.ctx.fillStyle = paletteHasAlpha ? c : colorManipulator.alpha(c as string, pointAlpha); + u.ctx.strokeStyle = colorManipulator.alpha(c as string, 1); } } @@ -421,8 +421,8 @@ export const prepConfig = (xySeries: XYSeries[], theme: GrafanaTheme2) => { pathBuilder: drawBubbles, // drawBubbles({disp: {size: {values: () => }}}) theme, scaleKey: '', // facets' scales used (above) - lineColor: alpha(lineColor ?? '#ffff', 1), - fillColor: alpha(pointColor ?? '#ffff', 0.5), + lineColor: colorManipulator.alpha(lineColor ?? '#ffff', 1), + fillColor: colorManipulator.alpha(pointColor ?? '#ffff', 0.5), show: !field.state?.hideFrom?.viz, }); }); diff --git a/public/app/plugins/panel/xychart/utils.ts b/public/app/plugins/panel/xychart/utils.ts index 47884a7540b..4425666fe0b 100644 --- a/public/app/plugins/panel/xychart/utils.ts +++ b/public/app/plugins/panel/xychart/utils.ts @@ -12,7 +12,7 @@ import { FieldMatcherID, FieldConfigSource, } from '@grafana/data'; -import { decoupleHideFromState } from '@grafana/data/src/field/fieldState'; +import { decoupleHideFromState } from '@grafana/data/internal'; import { config } from '@grafana/runtime'; import { VisibilityMode } from '@grafana/schema'; diff --git a/public/app/routes/RoutesWrapper.tsx b/public/app/routes/RoutesWrapper.tsx index 7e4701f040e..ee0318cb7a7 100644 --- a/public/app/routes/RoutesWrapper.tsx +++ b/public/app/routes/RoutesWrapper.tsx @@ -4,7 +4,7 @@ import { ComponentType, ReactNode } from 'react'; import { Router } from 'react-router-dom'; import { CompatRouter } from 'react-router-dom-v5-compat'; -import { GrafanaTheme2 } from '@grafana/data/'; +import { GrafanaTheme2 } from '@grafana/data'; import { config, locationService, From cacdf00067cd3ada5d03d4917ebbca61b9cd1ac9 Mon Sep 17 00:00:00 2001 From: Pepe Cano <825430+ppcano@users.noreply.github.com> Date: Mon, 17 Mar 2025 11:28:29 +0100 Subject: [PATCH 088/117] alerting(ui): add external links to read more about labels and annotations (#102187) * alerting(ui): add external link to read about labels * alerting(ui): add external link to read about annotations * fix i18n settings * fix i18n * fix i18n error with `make 18n-extract` --- .../rule-editor/AnnotationsStep.tsx | 27 ++++++++++++++++--- .../rule-editor/labels/LabelsField.tsx | 2 ++ .../rule-editor/labels/LabelsFieldInForm.tsx | 2 ++ public/locales/en-US/grafana.json | 5 ++++ 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/public/app/features/alerting/unified/components/rule-editor/AnnotationsStep.tsx b/public/app/features/alerting/unified/components/rule-editor/AnnotationsStep.tsx index aabe2aed1bd..7148c0e17e7 100644 --- a/public/app/features/alerting/unified/components/rule-editor/AnnotationsStep.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/AnnotationsStep.tsx @@ -98,9 +98,30 @@ const AnnotationsStep = () => { Add more context to your alert notifications. +

+ {t( + 'alerting.rule-form.annotations.description1', + 'Annotations add additional information to alerts, helping alert responders identify and address potential issues.' + )} +

+

+ {t( + 'alerting.rule-form.annotations.description2', + 'For example, add a Summary annotation to tell you which value caused the alert to fire or which server it happened on.' + )} +

+ {t( + 'alerting.rule-form.annotations.description3', + 'Annotations can contain a combination of text and template code, which is used to include data from queries.' + )} + + } title="Annotations" />
diff --git a/public/app/features/alerting/unified/components/rule-editor/labels/LabelsField.tsx b/public/app/features/alerting/unified/components/rule-editor/labels/LabelsField.tsx index b3d3dd81927..f3919ed0b09 100644 --- a/public/app/features/alerting/unified/components/rule-editor/labels/LabelsField.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/labels/LabelsField.tsx @@ -404,6 +404,8 @@ function LabelsField() { {getLabelText(type)} Date: Mon, 17 Mar 2025 11:36:38 +0100 Subject: [PATCH 089/117] feat(unified-storage): prune history table based on limits (#101970) --- .../src/types/featureToggles.gen.ts | 1 + pkg/services/featuremgmt/registry.go | 8 ++ pkg/services/featuremgmt/toggles_gen.csv | 1 + pkg/services/featuremgmt/toggles_gen.go | 4 + pkg/services/featuremgmt/toggles_gen.json | 14 +++ pkg/storage/unified/client.go | 2 +- pkg/storage/unified/sql/backend.go | 113 +++++++++++++++++- .../sql/data/resource_history_prune.sql | 22 ++++ pkg/storage/unified/sql/queries.go | 27 +++++ pkg/storage/unified/sql/queries_test.go | 15 +++ pkg/storage/unified/sql/server.go | 15 ++- pkg/storage/unified/sql/service.go | 2 +- .../mysql--resource_history_prune-simple.sql | 22 ++++ ...ostgres--resource_history_prune-simple.sql | 22 ++++ .../sqlite--resource_history_prune-simple.sql | 22 ++++ 15 files changed, 282 insertions(+), 8 deletions(-) create mode 100644 pkg/storage/unified/sql/data/resource_history_prune.sql create mode 100755 pkg/storage/unified/sql/testdata/mysql--resource_history_prune-simple.sql create mode 100755 pkg/storage/unified/sql/testdata/postgres--resource_history_prune-simple.sql create mode 100755 pkg/storage/unified/sql/testdata/sqlite--resource_history_prune-simple.sql diff --git a/packages/grafana-data/src/types/featureToggles.gen.ts b/packages/grafana-data/src/types/featureToggles.gen.ts index 033b7c30e05..2658b66d145 100644 --- a/packages/grafana-data/src/types/featureToggles.gen.ts +++ b/packages/grafana-data/src/types/featureToggles.gen.ts @@ -259,4 +259,5 @@ export interface FeatureToggles { extraLanguages?: boolean; noBackdropBlur?: boolean; alertingMigrationUI?: boolean; + unifiedStorageHistoryPruner?: boolean; } diff --git a/pkg/services/featuremgmt/registry.go b/pkg/services/featuremgmt/registry.go index c6abe10a09a..eb027590f7c 100644 --- a/pkg/services/featuremgmt/registry.go +++ b/pkg/services/featuremgmt/registry.go @@ -1820,6 +1820,14 @@ var ( HideFromAdminPage: true, HideFromDocs: true, }, + { + Name: "unifiedStorageHistoryPruner", + Description: "Enables the unified storage history pruner", + Stage: FeatureStageExperimental, + Owner: grafanaSearchAndStorageSquad, + HideFromAdminPage: true, + HideFromDocs: true, + }, } ) diff --git a/pkg/services/featuremgmt/toggles_gen.csv b/pkg/services/featuremgmt/toggles_gen.csv index f2c41c26500..8bdbad38ba8 100644 --- a/pkg/services/featuremgmt/toggles_gen.csv +++ b/pkg/services/featuremgmt/toggles_gen.csv @@ -240,3 +240,4 @@ inviteUserExperimental,experimental,@grafana/sharing-squad,false,false,true extraLanguages,experimental,@grafana/grafana-frontend-platform,false,false,true noBackdropBlur,experimental,@grafana/grafana-frontend-platform,false,false,true alertingMigrationUI,experimental,@grafana/alerting-squad,false,false,true +unifiedStorageHistoryPruner,experimental,@grafana/search-and-storage,false,false,false diff --git a/pkg/services/featuremgmt/toggles_gen.go b/pkg/services/featuremgmt/toggles_gen.go index 3fcc06d9d94..1f4dee5e21d 100644 --- a/pkg/services/featuremgmt/toggles_gen.go +++ b/pkg/services/featuremgmt/toggles_gen.go @@ -970,4 +970,8 @@ const ( // FlagAlertingMigrationUI // Enables the alerting migration UI, to migrate datasource-managed rules to Grafana-managed rules FlagAlertingMigrationUI = "alertingMigrationUI" + + // FlagUnifiedStorageHistoryPruner + // Enables the unified storage history pruner + FlagUnifiedStorageHistoryPruner = "unifiedStorageHistoryPruner" ) diff --git a/pkg/services/featuremgmt/toggles_gen.json b/pkg/services/featuremgmt/toggles_gen.json index ce2d9c3dcfa..7caf31a6d24 100644 --- a/pkg/services/featuremgmt/toggles_gen.json +++ b/pkg/services/featuremgmt/toggles_gen.json @@ -4195,6 +4195,20 @@ "codeowner": "@grafana/search-and-storage" } }, + { + "metadata": { + "name": "unifiedStorageHistoryPruner", + "resourceVersion": "1742163088045", + "creationTimestamp": "2025-03-16T22:11:28Z" + }, + "spec": { + "description": "Enables the unified storage history pruner", + "stage": "experimental", + "codeowner": "@grafana/search-and-storage", + "hideFromAdminPage": true, + "hideFromDocs": true + } + }, { "metadata": { "name": "unifiedStorageSearch", diff --git a/pkg/storage/unified/client.go b/pkg/storage/unified/client.go index 3eebaffeac8..c16fbc92ad3 100644 --- a/pkg/storage/unified/client.go +++ b/pkg/storage/unified/client.go @@ -136,7 +136,7 @@ func newClient(opts options.StorageOptions, if err != nil { return nil, err } - server, err := sql.NewResourceServer(db, cfg, tracer, reg, authzc, searchOptions, storageMetrics, indexMetrics) + server, err := sql.NewResourceServer(db, cfg, tracer, reg, authzc, searchOptions, storageMetrics, indexMetrics, features) if err != nil { return nil, err } diff --git a/pkg/storage/unified/sql/backend.go b/pkg/storage/unified/sql/backend.go index 9220633ad7b..53cf85ef9f5 100644 --- a/pkg/storage/unified/sql/backend.go +++ b/pkg/storage/unified/sql/backend.go @@ -10,6 +10,7 @@ import ( "time" "github.com/google/uuid" + "github.com/prometheus/client_golang/prometheus" "go.opentelemetry.io/otel/trace" "go.opentelemetry.io/otel/trace/noop" "google.golang.org/protobuf/proto" @@ -20,6 +21,7 @@ import ( "github.com/grafana/grafana/pkg/storage/unified/sql/db" "github.com/grafana/grafana/pkg/storage/unified/sql/dbutil" "github.com/grafana/grafana/pkg/storage/unified/sql/sqltemplate" + "github.com/grafana/grafana/pkg/util/debouncer" ) const tracePrefix = "sql.resource." @@ -35,11 +37,16 @@ type Backend interface { type BackendOptions struct { DBProvider db.DBProvider Tracer trace.Tracer + Reg prometheus.Registerer PollingInterval time.Duration WatchBufferSize int IsHA bool storageMetrics *resource.StorageMetrics + // If true, the backend will prune history on write events. + // Will be removed once fully rolled out. + withPruner bool + // testing SimulatedNetworkLatency time.Duration // slows down the create transactions by a fixed amount } @@ -65,15 +72,39 @@ func NewBackend(opts BackendOptions) (Backend, error) { cancel: cancel, log: log.New("sql-resource-server"), tracer: opts.Tracer, + reg: opts.Reg, dbProvider: opts.DBProvider, pollingInterval: opts.PollingInterval, watchBufferSize: opts.WatchBufferSize, storageMetrics: opts.storageMetrics, bulkLock: &bulkLock{running: make(map[string]bool)}, simulatedNetworkLatency: opts.SimulatedNetworkLatency, + withPruner: opts.withPruner, }, nil } +// pruningKey is a comparable key for pruning history. +type pruningKey struct { + namespace string + group string + resource string +} + +// Small abstraction to allow for different pruner implementations. +// This can be removed once the debouncer is deployed. +type pruner interface { + Add(key pruningKey) error + Start(ctx context.Context) +} + +type noopPruner struct{} + +func (p *noopPruner) Add(key pruningKey) error { + return nil +} + +func (p *noopPruner) Start(ctx context.Context) {} + type backend struct { //general isHA bool @@ -87,6 +118,7 @@ type backend struct { // o11y log log.Logger tracer trace.Tracer + reg prometheus.Registerer storageMetrics *resource.StorageMetrics // database @@ -106,6 +138,9 @@ type backend struct { // testing simulatedNetworkLatency time.Duration + + historyPruner pruner + withPruner bool } func (b *backend) Init(ctx context.Context) error { @@ -116,13 +151,18 @@ func (b *backend) Init(ctx context.Context) error { } func (b *backend) initLocked(ctx context.Context) error { - db, err := b.dbProvider.Init(ctx) + dbConn, err := b.dbProvider.Init(ctx) if err != nil { return fmt.Errorf("initialize resource DB: %w", err) } - b.db = db - driverName := db.DriverName() + if err := dbConn.PingContext(ctx); err != nil { + return fmt.Errorf("ping resource DB: %w", err) + } + + b.db = dbConn + + driverName := dbConn.DriverName() b.dialect = sqltemplate.DialectForDriver(driverName) if b.dialect == nil { return fmt.Errorf("no dialect for driver %q", driverName) @@ -146,7 +186,68 @@ func (b *backend) initLocked(ctx context.Context) error { } b.notifier = notifier - return b.db.PingContext(ctx) + if err := b.initPruner(ctx); err != nil { + return fmt.Errorf("failed to create pruner: %w", err) + } + + return nil +} + +func (b *backend) initPruner(ctx context.Context) error { + if !b.withPruner { + b.log.Debug("using noop history pruner") + b.historyPruner = &noopPruner{} + return nil + } + b.log.Debug("using debounced history pruner") + // Initialize history pruner. + pruner, err := debouncer.NewGroup(debouncer.DebouncerOpts[pruningKey]{ + Name: "history_pruner", + BufferSize: 1000, + MinWait: time.Second * 30, + MaxWait: time.Minute * 5, + ProcessHandler: func(ctx context.Context, key pruningKey) error { + return b.db.WithTx(ctx, ReadCommitted, func(ctx context.Context, tx db.Tx) error { + res, err := dbutil.Exec(ctx, tx, sqlResourceHistoryPrune, &sqlPruneHistoryRequest{ + SQLTemplate: sqltemplate.New(b.dialect), + HistoryLimit: 100, + Key: &resource.ResourceKey{ + Namespace: key.namespace, + Group: key.group, + Resource: key.resource, + }, + }) + if err != nil { + return fmt.Errorf("failed to prune history: %w", err) + } + rows, err := res.RowsAffected() + if err != nil { + return fmt.Errorf("failed to get rows affected: %w", err) + } + b.log.Debug("pruned history successfully", + "namespace", key.namespace, + "group", key.group, + "resource", key.resource, + "rows", rows) + return nil + }) + }, + ErrorHandler: func(key pruningKey, err error) { + b.log.Error("failed to prune history", + "namespace", key.namespace, + "group", key.group, + "resource", key.resource, + "error", err) + }, + Reg: b.reg, + }) + if err != nil { + return err + } + + b.historyPruner = pruner + b.historyPruner.Start(ctx) + return nil } func (b *backend) IsHealthy(ctx context.Context, r *resource.HealthCheckRequest) (*resource.HealthCheckResponse, error) { @@ -246,6 +347,7 @@ func (b *backend) create(ctx context.Context, event resource.WriteEvent) (int64, }); err != nil { return guid, fmt.Errorf("insert into resource history: %w", err) } + _ = b.historyPruner.Add(pruningKey{namespace: event.Key.Namespace, group: event.Key.Group, resource: event.Key.Resource}) if b.simulatedNetworkLatency > 0 { time.Sleep(b.simulatedNetworkLatency) } @@ -299,6 +401,7 @@ func (b *backend) update(ctx context.Context, event resource.WriteEvent) (int64, }); err != nil { return guid, fmt.Errorf("insert into resource history: %w", err) } + _ = b.historyPruner.Add(pruningKey{namespace: event.Key.Namespace, group: event.Key.Group, resource: event.Key.Resource}) return guid, nil }) @@ -346,6 +449,7 @@ func (b *backend) delete(ctx context.Context, event resource.WriteEvent) (int64, }); err != nil { return guid, fmt.Errorf("insert into resource history: %w", err) } + _ = b.historyPruner.Add(pruningKey{namespace: event.Key.Namespace, group: event.Key.Group, resource: event.Key.Resource}) return guid, nil }) @@ -394,6 +498,7 @@ func (b *backend) restore(ctx context.Context, event resource.WriteEvent) (int64 }); err != nil { return guid, fmt.Errorf("insert into resource history: %w", err) } + _ = b.historyPruner.Add(pruningKey{namespace: event.Key.Namespace, group: event.Key.Group, resource: event.Key.Resource}) // 3. Update all resource history entries with the new UID // Note: we do not update any history entries that have a deletion timestamp included. This will become diff --git a/pkg/storage/unified/sql/data/resource_history_prune.sql b/pkg/storage/unified/sql/data/resource_history_prune.sql new file mode 100644 index 00000000000..e636e9dc73c --- /dev/null +++ b/pkg/storage/unified/sql/data/resource_history_prune.sql @@ -0,0 +1,22 @@ +DELETE FROM {{ .Ident "resource_history" }} +WHERE {{ .Ident "guid" }} IN ( + SELECT {{ .Ident "guid" }} + FROM ( + SELECT + {{ .Ident "guid" }}, + ROW_NUMBER() OVER ( + PARTITION BY + {{ .Ident "namespace" }}, + {{ .Ident "group" }}, + {{ .Ident "resource" }}, + {{ .Ident "name" }} + ORDER BY {{ .Ident "resource_version" }} DESC + ) AS {{ .Ident "rn" }} + FROM {{ .Ident "resource_history" }} + WHERE + {{ .Ident "namespace" }} = {{ .Arg .Key.Namespace }} + AND {{ .Ident "group" }} = {{ .Arg .Key.Group }} + AND {{ .Ident "resource" }} = {{ .Arg .Key.Resource }} + ) AS {{ .Ident "ranked" }} + WHERE {{ .Ident "rn" }} > {{ .Arg .HistoryLimit }} +); diff --git a/pkg/storage/unified/sql/queries.go b/pkg/storage/unified/sql/queries.go index 3902ee8ecc3..3ea34472024 100644 --- a/pkg/storage/unified/sql/queries.go +++ b/pkg/storage/unified/sql/queries.go @@ -44,6 +44,7 @@ var ( sqlResourceHistoryPoll = mustTemplate("resource_history_poll.sql") sqlResourceHistoryGet = mustTemplate("resource_history_get.sql") sqlResourceHistoryDelete = mustTemplate("resource_history_delete.sql") + sqlResourceHistoryPrune = mustTemplate("resource_history_prune.sql") sqlResourceInsertFromHistory = mustTemplate("resource_insert_from_history.sql") // sqlResourceLabelsInsert = mustTemplate("resource_labels_insert.sql") @@ -252,6 +253,32 @@ func (r sqlGetHistoryRequest) Validate() error { return nil // TODO } +// prune resource history +type sqlPruneHistoryRequest struct { + sqltemplate.SQLTemplate + Key *resource.ResourceKey + HistoryLimit int64 +} + +func (r *sqlPruneHistoryRequest) Validate() error { + if r.HistoryLimit <= 0 { + return fmt.Errorf("history limit must be greater than zero") + } + if r.Key == nil { + return fmt.Errorf("missing key") + } + if r.Key.Namespace == "" { + return fmt.Errorf("missing namespace") + } + if r.Key.Group == "" { + return fmt.Errorf("missing group") + } + if r.Key.Resource == "" { + return fmt.Errorf("missing resource") + } + return nil +} + // update resource history type sqlResourceHistoryUpdateRequest struct { diff --git a/pkg/storage/unified/sql/queries_test.go b/pkg/storage/unified/sql/queries_test.go index c8662ad310a..4dfb7e13327 100644 --- a/pkg/storage/unified/sql/queries_test.go +++ b/pkg/storage/unified/sql/queries_test.go @@ -255,6 +255,21 @@ func TestUnifiedStorageQueries(t *testing.T) { }, }, + sqlResourceHistoryPrune: { + { + Name: "simple", + Data: &sqlPruneHistoryRequest{ + SQLTemplate: mocks.NewTestingSQLTemplate(), + Key: &resource.ResourceKey{ + Namespace: "nn", + Group: "gg", + Resource: "rr", + }, + HistoryLimit: 100, + }, + }, + }, + sqlResourceVersionGet: { { Name: "single path", diff --git a/pkg/storage/unified/sql/server.go b/pkg/storage/unified/sql/server.go index 330e265d9f7..0a6664187cc 100644 --- a/pkg/storage/unified/sql/server.go +++ b/pkg/storage/unified/sql/server.go @@ -10,6 +10,7 @@ import ( infraDB "github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/infra/tracing" + "github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/services/sqlstore/migrator" "github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/storage/unified/resource" @@ -18,7 +19,9 @@ import ( // Creates a new ResourceServer func NewResourceServer(db infraDB.DB, cfg *setting.Cfg, - tracer tracing.Tracer, reg prometheus.Registerer, ac types.AccessClient, searchOptions resource.SearchOptions, storageMetrics *resource.StorageMetrics, indexMetrics *resource.BleveIndexMetrics) (resource.ResourceServer, error) { + tracer tracing.Tracer, reg prometheus.Registerer, ac types.AccessClient, + searchOptions resource.SearchOptions, storageMetrics *resource.StorageMetrics, + indexMetrics *resource.BleveIndexMetrics, features featuremgmt.FeatureToggles) (resource.ResourceServer, error) { apiserverCfg := cfg.SectionWithEnvOverrides("grafana-apiserver") opts := resource.ResourceServerOptions{ Tracer: tracer, @@ -46,8 +49,16 @@ func NewResourceServer(db infraDB.DB, cfg *setting.Cfg, } isHA := isHighAvailabilityEnabled(cfg.SectionWithEnvOverrides("database")) + withPruner := features.IsEnabledGlobally(featuremgmt.FlagUnifiedStorageHistoryPruner) - store, err := NewBackend(BackendOptions{DBProvider: eDB, Tracer: tracer, IsHA: isHA, storageMetrics: storageMetrics}) + store, err := NewBackend(BackendOptions{ + DBProvider: eDB, + Tracer: tracer, + Reg: reg, + IsHA: isHA, + withPruner: withPruner, + storageMetrics: storageMetrics, + }) if err != nil { return nil, err } diff --git a/pkg/storage/unified/sql/service.go b/pkg/storage/unified/sql/service.go index 6b4e3dc2a87..8148111e017 100644 --- a/pkg/storage/unified/sql/service.go +++ b/pkg/storage/unified/sql/service.go @@ -118,7 +118,7 @@ func (s *service) start(ctx context.Context) error { return err } - server, err := NewResourceServer(s.db, s.cfg, s.tracing, s.reg, authzClient, searchOptions, s.storageMetrics, s.indexMetrics) + server, err := NewResourceServer(s.db, s.cfg, s.tracing, s.reg, authzClient, searchOptions, s.storageMetrics, s.indexMetrics, s.features) if err != nil { return err } diff --git a/pkg/storage/unified/sql/testdata/mysql--resource_history_prune-simple.sql b/pkg/storage/unified/sql/testdata/mysql--resource_history_prune-simple.sql new file mode 100755 index 00000000000..fa50d446b4e --- /dev/null +++ b/pkg/storage/unified/sql/testdata/mysql--resource_history_prune-simple.sql @@ -0,0 +1,22 @@ +DELETE FROM `resource_history` +WHERE `guid` IN ( + SELECT `guid` + FROM ( + SELECT + `guid`, + ROW_NUMBER() OVER ( + PARTITION BY + `namespace`, + `group`, + `resource`, + `name` + ORDER BY `resource_version` DESC + ) AS `rn` + FROM `resource_history` + WHERE + `namespace` = 'nn' + AND `group` = 'gg' + AND `resource` = 'rr' + ) AS `ranked` + WHERE `rn` > 100 +); diff --git a/pkg/storage/unified/sql/testdata/postgres--resource_history_prune-simple.sql b/pkg/storage/unified/sql/testdata/postgres--resource_history_prune-simple.sql new file mode 100755 index 00000000000..9994708de39 --- /dev/null +++ b/pkg/storage/unified/sql/testdata/postgres--resource_history_prune-simple.sql @@ -0,0 +1,22 @@ +DELETE FROM "resource_history" +WHERE "guid" IN ( + SELECT "guid" + FROM ( + SELECT + "guid", + ROW_NUMBER() OVER ( + PARTITION BY + "namespace", + "group", + "resource", + "name" + ORDER BY "resource_version" DESC + ) AS "rn" + FROM "resource_history" + WHERE + "namespace" = 'nn' + AND "group" = 'gg' + AND "resource" = 'rr' + ) AS "ranked" + WHERE "rn" > 100 +); diff --git a/pkg/storage/unified/sql/testdata/sqlite--resource_history_prune-simple.sql b/pkg/storage/unified/sql/testdata/sqlite--resource_history_prune-simple.sql new file mode 100755 index 00000000000..9994708de39 --- /dev/null +++ b/pkg/storage/unified/sql/testdata/sqlite--resource_history_prune-simple.sql @@ -0,0 +1,22 @@ +DELETE FROM "resource_history" +WHERE "guid" IN ( + SELECT "guid" + FROM ( + SELECT + "guid", + ROW_NUMBER() OVER ( + PARTITION BY + "namespace", + "group", + "resource", + "name" + ORDER BY "resource_version" DESC + ) AS "rn" + FROM "resource_history" + WHERE + "namespace" = 'nn' + AND "group" = 'gg' + AND "resource" = 'rr' + ) AS "ranked" + WHERE "rn" > 100 +); From c46565f65218c9f39c66c829fc71366e897463f8 Mon Sep 17 00:00:00 2001 From: Ryan McKinley Date: Mon, 17 Mar 2025 14:29:18 +0300 Subject: [PATCH 090/117] K8s/Dashboard: DeepCopy should deep copy (#102258) --- .../dashboard/v0alpha1/dashboard_object_gen.go | 2 +- .../dashboard/v1alpha1/dashboard_object_gen.go | 2 +- .../dashboard/v2alpha1/dashboard_object_gen.go | 2 +- .../pkg/migration/conversion/conversion_test.go | 17 +++++++++++++++++ 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_object_gen.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_object_gen.go index ab406988c90..5e5643192a6 100644 --- a/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_object_gen.go +++ b/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_object_gen.go @@ -219,7 +219,7 @@ func (o *Dashboard) Copy() resource.Object { } func (o *Dashboard) DeepCopyObject() runtime.Object { - return o.Copy() + return o.DeepCopy() } // Interface compliance compile-time check diff --git a/apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_object_gen.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_object_gen.go index cdf11cabbd0..8d45c64fc1a 100644 --- a/apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_object_gen.go +++ b/apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_object_gen.go @@ -219,7 +219,7 @@ func (o *Dashboard) Copy() resource.Object { } func (o *Dashboard) DeepCopyObject() runtime.Object { - return o.Copy() + return o.DeepCopy() } // Interface compliance compile-time check diff --git a/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_object_gen.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_object_gen.go index 504dc5a25f1..5b59fbd93aa 100644 --- a/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_object_gen.go +++ b/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_object_gen.go @@ -219,7 +219,7 @@ func (o *Dashboard) Copy() resource.Object { } func (o *Dashboard) DeepCopyObject() runtime.Object { - return o.Copy() + return o.DeepCopy() } // Interface compliance compile-time check diff --git a/apps/dashboard/pkg/migration/conversion/conversion_test.go b/apps/dashboard/pkg/migration/conversion/conversion_test.go index 23cbd9fc2ba..c77afd78e1f 100644 --- a/apps/dashboard/pkg/migration/conversion/conversion_test.go +++ b/apps/dashboard/pkg/migration/conversion/conversion_test.go @@ -45,3 +45,20 @@ func TestConversionMatrixExist(t *testing.T) { }) } } + +func TestDeepCopyValid(t *testing.T) { + dash1 := &v0alpha1.Dashboard{} + meta1, err := utils.MetaAccessor(dash1) + require.NoError(t, err) + meta1.SetFolder("f1") + require.Equal(t, "f1", dash1.Annotations[utils.AnnoKeyFolder]) + + dash1Copy := dash1.DeepCopyObject() + metaCopy, err := utils.MetaAccessor(dash1Copy) + require.NoError(t, err) + require.Equal(t, "f1", metaCopy.GetFolder()) + + // Changing a property on the copy should not effect the original + metaCopy.SetFolder("XYZ") + require.Equal(t, "f1", meta1.GetFolder()) // 💣💣💣 +} From 5cd85471315b7a0455f133a3b72bb064d738c4ea Mon Sep 17 00:00:00 2001 From: Jack Westbrook Date: Mon, 17 Mar 2025 13:26:59 +0100 Subject: [PATCH 091/117] Revert "Grafana Data: Use package.json exports for internal code (#102286) Revert "Grafana Data: Use package.json exports for internal code (#102036)" This reverts commit 91116de790c6c59248abd262721c40f169be6661. --- .betterer.results | 469 +++++++++++++----- packages/grafana-data/package.json | 20 - packages/grafana-data/src/internal/index.ts | 100 ---- .../panel/getPanelOptionsWithDefaults.test.ts | 3 +- .../{helpers => __mocks__}/pluginMocks.ts | 2 +- packages/grafana-data/test/index.ts | 2 - .../src/querybuilder/operationUtils.ts | 2 +- public/app/core/components/GraphNG/utils.ts | 6 +- .../core/components/OptionsUI/registry.tsx | 2 +- .../core/components/TimelineChart/timeline.ts | 5 +- .../core/components/TimelineChart/utils.ts | 6 +- .../GrafanaJavascriptAgentBackend.test.ts | 2 +- public/app/core/services/theme.ts | 2 +- public/app/core/utils/explore.test.ts | 11 +- public/app/core/utils/richHistory.ts | 10 +- .../DashboardsListModalButton.tsx | 2 +- .../DeleteUserModalButton.tsx | 2 +- .../unified/GrafanaRuleQueryViewer.tsx | 5 +- .../GrafanaAlertmanagerDeliveryWarning.tsx | 2 +- .../rule-editor/CloudAlertPreview.tsx | 2 +- .../rule-editor/DashboardPicker.tsx | 2 +- .../components/rule-editor/QueryOptions.tsx | 5 +- .../rule-editor/rule-types/RuleTypePicker.tsx | 2 +- .../rules/AlertInstanceStateFilter.tsx | 2 +- .../components/rules/RuleConfigStatus.tsx | 2 +- .../rules/central-state-history/utils.ts | 2 +- .../state-history/useRuleHistoryRecords.tsx | 2 +- .../unified/home/PluginIntegrations.tsx | 2 +- .../alerting/unified/styles/pagination.ts | 2 +- .../features/alerting/unified/utils/misc.ts | 2 +- .../alerting/unified/utils/routeTree.ts | 6 +- .../features/alerting/unified/utils/time.ts | 4 +- .../StandardAnnotationQueryEditor.test.tsx | 2 +- .../auth-config/AuthProvidersListPage.tsx | 2 +- public/app/features/canvas/element.ts | 2 +- .../app/features/canvas/elements/button.tsx | 3 +- public/app/features/canvas/types.ts | 2 +- .../inspect/HelpWizard/HelpWizard.test.tsx | 2 +- .../inspect/InspectJsonTab.test.tsx | 2 +- .../pages/DashboardScenePage.test.tsx | 2 +- .../pages/PublicDashboardScenePage.test.tsx | 2 +- .../PanelDataQueriesTab.test.tsx | 2 +- .../panel-edit/PanelEditor.test.ts | 2 +- .../panel-edit/PanelOptions.test.tsx | 2 +- .../DashboardDatasourceBehaviour.test.tsx | 2 +- .../scene/DashboardLinksControls.tsx | 2 +- .../scene/DashboardSceneRenderer.test.tsx | 2 +- .../scene/LibraryPanelBehavior.test.tsx | 2 +- .../scene/PanelMenuBehavior.test.tsx | 2 +- .../layout-default/DashboardGridItem.test.tsx | 2 +- .../RowRepeaterBehavior.test.tsx | 2 +- .../RowItemRepeaterBehavior.test.tsx | 2 +- .../serialization/angularMigration.test.ts | 2 +- .../transformSaveModelToScene.test.ts | 2 +- .../transformSceneToSaveModel.test.ts | 2 +- .../settings/VariablesEditView.test.tsx | 2 +- .../share-externally/ShareExternally.test.tsx | 2 +- .../sharing/ShareDrawer/ShareDrawer.test.tsx | 2 +- .../sharing/ShareLinkTab.test.tsx | 2 +- .../panel-share/SharePanelInternally.test.tsx | 2 +- .../DashboardPrompt/DashboardPrompt.test.tsx | 2 +- .../components/HelpWizard/HelpWizard.test.tsx | 2 +- .../PanelEditor/OptionsPaneOptions.test.tsx | 2 +- .../PanelEditor/PanelHeaderCorner.tsx | 3 +- .../PanelEditor/getVisualizationOptions.tsx | 8 +- .../PanelEditor/state/actions.test.ts | 2 +- .../PublicDashboardNotAvailable.tsx | 2 +- .../ConfigPublicDashboard.tsx | 2 +- .../ConfigPublicDashboard/Configuration.tsx | 2 +- .../AcknowledgeCheckboxes.tsx | 2 +- .../UnsupportedDataSourcesAlert.tsx | 2 +- .../SharePublicDashboard.test.tsx | 2 +- .../SharePublicDashboard.tsx | 2 +- .../SharePublicDashboardUtils.test.tsx | 3 +- .../components/SubMenu/DashboardLinks.tsx | 2 +- .../SubMenu/DashboardLinksDashboard.tsx | 2 +- .../dashboard/state/DashboardMigrator.test.ts | 2 +- .../dashboard/state/DashboardMigrator.ts | 3 +- .../dashboard/state/PanelModel.test.ts | 3 +- .../features/dashboard/utils/panel.test.ts | 2 +- .../app/features/dashboard/utils/timeRange.ts | 3 +- .../datasources/components/CloudInfoBox.tsx | 2 +- .../datasources/state/buildCategories.test.ts | 2 +- public/app/features/dimensions/context.ts | 2 +- public/app/features/dimensions/scale.ts | 3 +- .../app/features/explore/Logs/Logs.test.tsx | 2 +- .../explore/Logs/LogsColumnSearch.tsx | 2 +- .../explore/Logs/LogsMetaRow.test.tsx | 2 +- .../app/features/explore/Logs/LogsMetaRow.tsx | 2 +- .../features/explore/Logs/LogsTable.test.tsx | 2 +- .../explore/Logs/LogsTableActiveFields.tsx | 2 +- .../explore/Logs/LogsTableMultiSelect.tsx | 2 +- .../explore/Logs/LogsTableWrap.test.tsx | 10 +- .../explore/Logs/utils/testMocks.test.ts | 2 +- public/app/features/explore/NoData.tsx | 2 +- .../explore/PrometheusListView/ItemLabels.tsx | 2 +- .../explore/PrometheusListView/ItemValues.tsx | 2 +- .../RawListContainer.test.tsx | 2 +- .../PrometheusListView/RawListContainer.tsx | 2 +- .../PrometheusListView/RawListItem.tsx | 2 +- .../RawListItemAttributes.tsx | 2 +- .../app/features/explore/state/main.test.ts | 3 +- .../live/centrifuge/LiveDataStream.ts | 2 +- .../logs/components/InfiniteScroll.test.tsx | 5 +- .../logs/components/InfiniteScroll.tsx | 12 +- .../logs/components/LogDetailsRow.test.tsx | 3 +- public/app/features/logs/logsModel.ts | 2 +- .../DeletePublicDashboardModal.tsx | 2 +- .../app/features/panel/state/actions.test.ts | 3 +- .../plugins/components/AppRootPage.test.tsx | 2 +- .../extensions/registry/AddedLinksRegistry.ts | 2 +- .../features/plugins/extensions/validators.ts | 19 +- .../plugins/loader/sharedDependencies.ts | 2 +- .../app/features/plugins/pluginPreloader.ts | 7 +- .../features/scopes/tests/utils/render.tsx | 2 +- .../app/features/trails/DataTrailsHistory.tsx | 5 +- .../logs/lokiRecordingRules.test.ts | 2 +- .../FilterByValueFilterEditor.tsx | 2 +- .../FilterByValueTransformerEditor.test.tsx | 2 +- .../FilterByValueTransformerEditor.tsx | 2 +- .../calculateHeatmap/heatmap.test.ts | 3 +- .../transformers/calculateHeatmap/heatmap.ts | 2 +- .../BinaryOperationOptionsEditor.tsx | 2 +- .../CalculateFieldTransformerEditor.tsx | 2 +- .../CumulativeOptionsEditor.tsx | 6 +- .../IndexOptionsEditor.tsx | 2 +- .../ReduceRowOptionsEditor.tsx | 5 +- .../UnaryOperationEditor.tsx | 6 +- .../WindowOptionsEditor.tsx | 2 +- .../editors/ConcatenateTransformerEditor.tsx | 5 +- .../ConvertFieldTypeTransformerEditor.tsx | 5 +- .../editors/EnumMappingEditor.tsx | 2 +- .../editors/FilterByNameTransformerEditor.tsx | 2 +- .../FilterByRefIdTransformerEditor.tsx | 2 +- .../editors/FormatStringTransformerEditor.tsx | 5 +- .../editors/FormatTimeTransformerEditor.tsx | 2 +- .../editors/GroupByTransformerEditor.tsx | 6 +- .../GroupToNestedTableTransformerEditor.tsx | 4 +- .../editors/HistogramTransformerEditor.tsx | 5 +- .../editors/JoinByFieldTransformerEditor.tsx | 2 +- .../LabelsToFieldsTransformerEditor.tsx | 5 +- .../editors/LimitTransformerEditor.tsx | 2 +- .../editors/MergeTransformerEditor.tsx | 2 +- .../OrganizeFieldsTransformerEditor.tsx | 3 +- .../editors/ReduceTransformerEditor.tsx | 2 +- .../editors/RenameByRegexTransformer.tsx | 2 +- .../editors/SeriesToRowsTransformerEditor.tsx | 2 +- .../editors/SortByTransformerEditor.tsx | 2 +- .../editors/TransposeTransformerEditor.tsx | 2 +- .../extractFields/extractFields.test.ts | 5 +- .../lookupGazetteer/fieldLookup.test.ts | 4 +- .../partitionByValues/partitionByValues.ts | 3 +- .../transformers/spatial/optionsHelper.tsx | 3 +- .../spatial/spatialTransformer.test.ts | 5 +- .../variables/datasource/actions.test.ts | 2 +- .../variables/datasource/reducer.test.ts | 2 +- .../state/initVariableTransaction.test.ts | 2 +- ...igrateVariablesDatasourceNameToRef.test.ts | 2 +- .../azuremonitor/__mocks__/utils.ts | 3 +- .../components/LogsQueryEditor/RawQuery.tsx | 2 +- .../CloudWatchMetricsQueryRunner.test.ts | 3 +- .../datasource/dashboard/datasource.test.ts | 2 +- .../elasticsearch/ElasticResponse.ts | 2 +- .../editor/annotation/AnnotationEditor.tsx | 2 +- .../influxdb/components/editor/constants.ts | 2 +- .../components/editor/query/QueryEditor.tsx | 2 +- .../editor/query/flux/FluxQueryEditor.tsx | 2 +- .../editor/query/fsql/FSQLEditor.tsx | 2 +- .../utils/getTemplateVariableOptions.ts | 2 +- .../utils/withTemplateVariableOptions.ts | 2 +- .../editor/query/influxql/utils/wrapper.ts | 2 +- .../influxdb/influxql_metadata_query.ts | 2 +- .../datasources/prometheus/RawQuery.tsx | 2 +- public/app/plugins/datasource/tempo/types.ts | 2 +- public/app/plugins/panel/barchart/bars.ts | 6 +- public/app/plugins/panel/barchart/utils.ts | 2 +- .../plugins/panel/bargauge/BarGaugeLegend.tsx | 3 +- .../app/plugins/panel/candlestick/fields.ts | 2 +- .../panel/canvas/components/CanvasTooltip.tsx | 4 +- .../panel/canvas/editor/connectionEditor.tsx | 2 +- .../editor/element/QuickPositioning.tsx | 2 +- .../canvas/editor/element/elementEditor.tsx | 2 +- .../canvas/editor/inline/InlineEditBody.tsx | 3 +- .../panel/canvas/editor/layer/layerEditor.tsx | 2 +- .../plugins/panel/canvas/editor/options.ts | 2 +- public/app/plugins/panel/canvas/utils.ts | 3 +- .../components/DatagridContextMenu.tsx | 2 +- .../panel/geomap/components/MarkersLegend.tsx | 9 +- .../panel/geomap/editor/layerEditor.tsx | 2 +- .../panel/geomap/layers/data/routeLayer.tsx | 6 +- .../utils/checkFeatureMatchesStyleRule.ts | 2 +- .../app/plugins/panel/geomap/utils/tooltip.ts | 2 +- .../app/plugins/panel/geomap/utils/utils.ts | 3 +- .../app/plugins/panel/graph/data_processor.ts | 2 +- .../app/plugins/panel/histogram/Histogram.tsx | 4 +- .../panel/histogram/HistogramPanel.tsx | 11 +- public/app/plugins/panel/histogram/module.tsx | 2 +- public/app/plugins/panel/histogram/utils.ts | 5 +- public/app/plugins/panel/logs/LogsPanel.tsx | 4 +- .../app/plugins/panel/nodeGraph/Node.test.tsx | 2 +- public/app/plugins/panel/stat/StatPanel.tsx | 2 +- .../app/plugins/panel/status-history/utils.ts | 3 +- public/app/plugins/panel/table/migrations.ts | 2 +- public/app/plugins/panel/timeseries/utils.ts | 6 +- public/app/plugins/panel/trend/TrendPanel.tsx | 11 +- .../plugins/panel/xychart/XYChartPanel.tsx | 5 +- .../plugins/panel/xychart/XYChartTooltip.tsx | 5 +- public/app/plugins/panel/xychart/scatter.ts | 14 +- public/app/plugins/panel/xychart/utils.ts | 2 +- public/app/routes/RoutesWrapper.tsx | 2 +- 210 files changed, 688 insertions(+), 533 deletions(-) delete mode 100644 packages/grafana-data/src/internal/index.ts rename packages/grafana-data/test/{helpers => __mocks__}/pluginMocks.ts (98%) delete mode 100644 packages/grafana-data/test/index.ts diff --git a/.betterer.results b/.betterer.results index e56a82ec813..6849eaed996 100644 --- a/.betterer.results +++ b/.betterer.results @@ -392,9 +392,8 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "7"], [0, 0, 0, "Unexpected any. Specify a different type.", "8"] ], - "packages/grafana-data/test/helpers/pluginMocks.ts:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"], - [0, 0, 0, "Unexpected any. Specify a different type.", "1"] + "packages/grafana-data/test/__mocks__/pluginMocks.ts:5381": [ + [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], "packages/grafana-e2e-selectors/src/resolver.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] @@ -971,6 +970,11 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "4"], [0, 0, 0, "Unexpected any. Specify a different type.", "5"] ], + "public/app/core/components/GraphNG/utils.ts:5381": [ + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/joinDataFrames\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/nulls/nullInsertThreshold\' import is restricted from being used by a pattern. Import from the public export instead.", "1"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/nulls/nullToUndefThreshold\' import is restricted from being used by a pattern. Import from the public export instead.", "2"] + ], "public/app/core/components/Layers/LayerDragDropList.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], @@ -993,6 +997,9 @@ exports[`better eslint`] = { "public/app/core/components/OptionsUI/fieldColor.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] ], + "public/app/core/components/OptionsUI/registry.tsx:5381": [ + [0, 0, 0, "\'@grafana/data/src/field/overrides/processors\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/core/components/OptionsUI/units.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] ], @@ -1074,6 +1081,14 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "1"], [0, 0, 0, "Unexpected any. Specify a different type.", "2"] ], + "public/app/core/components/TimelineChart/timeline.ts:5381": [ + [0, 0, 0, "\'@grafana/data/src/themes/colorManipulator\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], + "public/app/core/components/TimelineChart/utils.ts:5381": [ + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/joinDataFrames\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/nulls/nullInsertThreshold\' import is restricted from being used by a pattern. Import from the public export instead.", "1"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/nulls/nullToValue\' import is restricted from being used by a pattern. Import from the public export instead.", "2"] + ], "public/app/core/config.ts:5381": [ [0, 0, 0, "Do not re-export imported variable (\`Settings\`)", "0"], [0, 0, 0, "Do not re-export imported variable (\`config\`)", "1"] @@ -1116,6 +1131,12 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "2"], [0, 0, 0, "Unexpected any. Specify a different type.", "3"] ], + "public/app/core/services/echo/backends/grafana-javascript-agent/GrafanaJavascriptAgentBackend.test.ts:5381": [ + [0, 0, 0, "\'@grafana/data/src/types/config\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], + "public/app/core/services/theme.ts:5381": [ + [0, 0, 0, "\'@grafana/data/src/themes/registry\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/core/specs/backend_srv.test.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], @@ -1155,6 +1176,9 @@ exports[`better eslint`] = { "public/app/core/utils/deferred.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], + "public/app/core/utils/explore.test.ts:5381": [ + [0, 0, 0, "\'@grafana/data/src/utils/url\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/core/utils/fetch.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Do not use any type assertions.", "1"], @@ -1176,9 +1200,10 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], "public/app/core/utils/richHistory.ts:5381": [ - [0, 0, 0, "Do not re-export imported variable (\`RichHistorySearchFilters\`)", "0"], - [0, 0, 0, "Do not re-export imported variable (\`RichHistorySettings\`)", "1"], - [0, 0, 0, "Do not re-export imported variable (\`SortOrder\`)", "2"] + [0, 0, 0, "\'@grafana/data/src/utils/url\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "Do not re-export imported variable (\`RichHistorySearchFilters\`)", "1"], + [0, 0, 0, "Do not re-export imported variable (\`RichHistorySettings\`)", "2"], + [0, 0, 0, "Do not re-export imported variable (\`SortOrder\`)", "3"] ], "public/app/core/utils/ticks.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], @@ -1365,9 +1390,9 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] ], "public/app/features/alerting/unified/GrafanaRuleQueryViewer.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], + [0, 0, 0, "\'@grafana/data/src/datetime/rangeutil\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], @@ -1380,7 +1405,8 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "12"], [0, 0, 0, "No untranslated strings. Wrap text with ", "13"], [0, 0, 0, "No untranslated strings. Wrap text with ", "14"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "15"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "15"], + [0, 0, 0, "No untranslated strings. Wrap text with ", "16"] ], "public/app/features/alerting/unified/NotificationPoliciesPage.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -2026,10 +2052,11 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], "public/app/features/alerting/unified/components/rule-editor/QueryOptions.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], + [0, 0, 0, "\'@grafana/data/src/datetime/rangeutil\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], + [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] ], "public/app/features/alerting/unified/components/rule-editor/QueryRows.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], @@ -2399,6 +2426,9 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "22"], [0, 0, 0, "No untranslated strings. Wrap text with ", "23"] ], + "public/app/features/alerting/unified/components/rules/central-state-history/utils.ts:5381": [ + [0, 0, 0, "\'@grafana/data/src/field/fieldComparers\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/features/alerting/unified/components/rules/state-history/LogRecordViewer.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] @@ -2420,6 +2450,9 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] ], + "public/app/features/alerting/unified/components/rules/state-history/useRuleHistoryRecords.tsx:5381": [ + [0, 0, 0, "\'@grafana/data/src/field/fieldComparers\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/features/alerting/unified/components/settings/AlertmanagerCard.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], @@ -2641,6 +2674,9 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "1"], [0, 0, 0, "Unexpected any. Specify a different type.", "2"] ], + "public/app/features/alerting/unified/utils/misc.ts:5381": [ + [0, 0, 0, "\'@grafana/data/src/types/config\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/features/alerting/unified/utils/receiver-form.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Do not use any type assertions.", "1"], @@ -2657,6 +2693,9 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "6"], [0, 0, 0, "Unexpected any. Specify a different type.", "7"] ], + "public/app/features/alerting/unified/utils/routeTree.ts:5381": [ + [0, 0, 0, "\'@grafana/data/src/utils/arrayUtils\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/features/alerting/unified/utils/rule-form.ts:5381": [ [0, 0, 0, "\'@grafana/runtime/src/utils/DataSourceWithBackend\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] ], @@ -2666,6 +2705,9 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "2"], [0, 0, 0, "Unexpected any. Specify a different type.", "3"] ], + "public/app/features/alerting/unified/utils/time.ts:5381": [ + [0, 0, 0, "\'@grafana/data/src/datetime/rangeutil\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/features/annotations/components/AnnotationResultMapper.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], @@ -2731,8 +2773,9 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "6"] ], "public/app/features/auth-config/AuthProvidersListPage.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] + [0, 0, 0, "\'@grafana/data/src/types/config\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], + [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] ], "public/app/features/auth-config/ProviderConfigForm.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -2787,6 +2830,9 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use export all (\`export * from ...\`)", "1"], [0, 0, 0, "Do not use export all (\`export * from ...\`)", "2"] ], + "public/app/features/canvas/element.ts:5381": [ + [0, 0, 0, "\'@grafana/data/src/panel/PanelPlugin\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/features/canvas/elements/notFound.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], @@ -3037,6 +3083,9 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], + "public/app/features/dashboard-scene/scene/DashboardLinksControls.tsx:5381": [ + [0, 0, 0, "\'@grafana/data/src/text/sanitize\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/features/dashboard-scene/scene/PanelLinks.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] ], @@ -3517,8 +3566,10 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"] ], "public/app/features/dashboard/components/PanelEditor/getVisualizationOptions.tsx:5381": [ - [0, 0, 0, "Unexpected any. Specify a different type.", "0"], - [0, 0, 0, "Unexpected any. Specify a different type.", "1"] + [0, 0, 0, "\'@grafana/data/src/panel/PanelPlugin\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "\'@grafana/data/src/utils/OptionsUIBuilders\' import is restricted from being used by a pattern. Import from the public export instead.", "1"], + [0, 0, 0, "Unexpected any. Specify a different type.", "2"], + [0, 0, 0, "Unexpected any. Specify a different type.", "3"] ], "public/app/features/dashboard/components/PanelEditor/utils.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], @@ -3630,13 +3681,20 @@ exports[`better eslint`] = { "public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboard.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], + "public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboardUtils.test.tsx:5381": [ + [0, 0, 0, "\'@grafana/data/src/types/query\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/features/dashboard/components/ShareModal/ViewJsonModal.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] ], + "public/app/features/dashboard/components/SubMenu/DashboardLinks.tsx:5381": [ + [0, 0, 0, "\'@grafana/data/src/text/sanitize\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/features/dashboard/components/SubMenu/DashboardLinksDashboard.tsx:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "Unexpected any. Specify a different type.", "2"] + [0, 0, 0, "\'@grafana/data/src/text/sanitize\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "Do not use any type assertions.", "1"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], + [0, 0, 0, "Unexpected any. Specify a different type.", "3"] ], "public/app/features/dashboard/components/SubMenu/SubMenu.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] @@ -3749,12 +3807,12 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "11"] ], "public/app/features/dashboard/state/DashboardMigrator.ts:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"], - [0, 0, 0, "Do not use any type assertions.", "1"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/labelsToFields\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/merge\' import is restricted from being used by a pattern. Import from the public export instead.", "1"], [0, 0, 0, "Do not use any type assertions.", "2"], [0, 0, 0, "Do not use any type assertions.", "3"], - [0, 0, 0, "Unexpected any. Specify a different type.", "4"], - [0, 0, 0, "Unexpected any. Specify a different type.", "5"], + [0, 0, 0, "Do not use any type assertions.", "4"], + [0, 0, 0, "Do not use any type assertions.", "5"], [0, 0, 0, "Unexpected any. Specify a different type.", "6"], [0, 0, 0, "Unexpected any. Specify a different type.", "7"], [0, 0, 0, "Unexpected any. Specify a different type.", "8"], @@ -3776,7 +3834,9 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "24"], [0, 0, 0, "Unexpected any. Specify a different type.", "25"], [0, 0, 0, "Unexpected any. Specify a different type.", "26"], - [0, 0, 0, "Unexpected any. Specify a different type.", "27"] + [0, 0, 0, "Unexpected any. Specify a different type.", "27"], + [0, 0, 0, "Unexpected any. Specify a different type.", "28"], + [0, 0, 0, "Unexpected any. Specify a different type.", "29"] ], "public/app/features/dashboard/state/DashboardModel.repeat.test.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], @@ -3889,9 +3949,10 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] ], "public/app/features/datasources/components/CloudInfoBox.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], + [0, 0, 0, "\'@grafana/data/src/types/config\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], + [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] ], "public/app/features/datasources/components/DashboardsTable.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -4072,7 +4133,8 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use export all (\`export * from ...\`)", "7"] ], "public/app/features/dimensions/scale.ts:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"] + [0, 0, 0, "\'@grafana/data/src/field/scale\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "Do not use any type assertions.", "1"] ], "public/app/features/dimensions/types.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] @@ -4150,6 +4212,9 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] ], + "public/app/features/explore/Logs/Logs.test.tsx:5381": [ + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/organize\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/features/explore/Logs/Logs.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], @@ -4173,6 +4238,9 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], + "public/app/features/explore/Logs/LogsMetaRow.test.tsx:5381": [ + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/organize\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/features/explore/Logs/LogsMetaRow.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], @@ -4187,6 +4255,9 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] ], + "public/app/features/explore/Logs/LogsTable.test.tsx:5381": [ + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/organize\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/features/explore/Logs/LogsTableAvailableFields.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] ], @@ -4202,6 +4273,9 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] ], + "public/app/features/explore/Logs/LogsTableWrap.test.tsx:5381": [ + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/organize\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/features/explore/Logs/LogsTableWrap.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], @@ -4482,6 +4556,9 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], [0, 0, 0, "Unexpected any. Specify a different type.", "3"] ], + "public/app/features/explore/state/main.test.ts:5381": [ + [0, 0, 0, "\'@grafana/data/src/utils/url\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/features/explore/state/time.test.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], @@ -4671,9 +4748,10 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] ], "public/app/features/live/centrifuge/LiveDataStream.ts:5381": [ - [0, 0, 0, "\'@grafana/runtime/src/services/live\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "\'@grafana/runtime/src/utils/toDataQueryError\' import is restricted from being used by a pattern. Import from the public export instead.", "1"], - [0, 0, 0, "Do not use any type assertions.", "2"] + [0, 0, 0, "\'@grafana/data/src/dataframe/StreamingDataFrame\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "\'@grafana/runtime/src/services/live\' import is restricted from being used by a pattern. Import from the public export instead.", "1"], + [0, 0, 0, "\'@grafana/runtime/src/utils/toDataQueryError\' import is restricted from being used by a pattern. Import from the public export instead.", "2"], + [0, 0, 0, "Do not use any type assertions.", "3"] ], "public/app/features/live/centrifuge/channel.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] @@ -4695,8 +4773,12 @@ exports[`better eslint`] = { "public/app/features/live/live.ts:5381": [ [0, 0, 0, "\'@grafana/runtime/src/utils/DataSourceWithBackend\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] ], + "public/app/features/logs/components/InfiniteScroll.test.tsx:5381": [ + [0, 0, 0, "\'@grafana/data/src/datetime/rangeutil\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/features/logs/components/InfiniteScroll.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] + [0, 0, 0, "\'@grafana/data/src/datetime/rangeutil\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], "public/app/features/logs/components/LogDetails.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -4744,6 +4826,9 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], [0, 0, 0, "No untranslated strings. Wrap text with ", "5"] ], + "public/app/features/logs/logsModel.ts:5381": [ + [0, 0, 0, "\'@grafana/data/src/valueFormats/symbolFormatters\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/features/logs/utils.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], @@ -5083,15 +5168,24 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"] ], + "public/app/features/plugins/extensions/registry/AddedLinksRegistry.ts:5381": [ + [0, 0, 0, "\'@grafana/data/src/types/pluginExtensions\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/features/plugins/extensions/usePluginComponents.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], "public/app/features/plugins/extensions/usePluginFunctions.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], + "public/app/features/plugins/extensions/validators.ts:5381": [ + [0, 0, 0, "\'@grafana/data/src/types/pluginExtensions\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/features/plugins/loader/sharedDependencies.ts:5381": [ [0, 0, 0, "* import is invalid because \'Layout,HorizontalGroup,VerticalGroup\' from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"] ], + "public/app/features/plugins/pluginPreloader.ts:5381": [ + [0, 0, 0, "\'@grafana/data/src/types/pluginExtensions\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/features/plugins/sandbox/distortion_map.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], @@ -5476,7 +5570,8 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] ], "public/app/features/trails/DataTrailsHistory.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] + [0, 0, 0, "\'@grafana/data/src/datetime/rangeutil\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], "public/app/features/trails/MetricScene.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -5510,16 +5605,21 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] ], "public/app/features/transformers/FilterByValueTransformer/FilterByValueFilterEditor.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/filterByValue\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"] + ], + "public/app/features/transformers/FilterByValueTransformer/FilterByValueTransformerEditor.test.tsx:5381": [ + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/filterByValue\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] ], "public/app/features/transformers/FilterByValueTransformer/FilterByValueTransformerEditor.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/filterByValue\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], + [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] ], "public/app/features/transformers/FilterByValueTransformer/ValueMatchers/BasicMatcherEditor.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -5555,9 +5655,13 @@ exports[`better eslint`] = { "public/app/features/transformers/calculateHeatmap/editor/helper.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], + "public/app/features/transformers/calculateHeatmap/heatmap.test.ts:5381": [ + [0, 0, 0, "\'@grafana/data/src/dataframe/processDataFrame\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/features/transformers/calculateHeatmap/heatmap.ts:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"], - [0, 0, 0, "Do not use any type assertions.", "1"] + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/joinDataFrames\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "Do not use any type assertions.", "1"], + [0, 0, 0, "Do not use any type assertions.", "2"] ], "public/app/features/transformers/configFromQuery/ConfigFromQueryTransformerEditor.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -5565,58 +5669,66 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"] ], "public/app/features/transformers/editors/CalculateFieldTransformerEditor/BinaryOperationOptionsEditor.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/calculateField\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"] ], "public/app/features/transformers/editors/CalculateFieldTransformerEditor/CalculateFieldTransformerEditor.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/calculateField\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"] ], "public/app/features/transformers/editors/CalculateFieldTransformerEditor/CumulativeOptionsEditor.tsx:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/calculateField\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "Do not use any type assertions.", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"] ], "public/app/features/transformers/editors/CalculateFieldTransformerEditor/IndexOptionsEditor.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"] + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/calculateField\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"] ], "public/app/features/transformers/editors/CalculateFieldTransformerEditor/ReduceRowOptionsEditor.tsx:5381": [ - [0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"], - [0, 0, 0, "Do not use any type assertions.", "1"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"] + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/calculateField\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "1"], + [0, 0, 0, "Do not use any type assertions.", "2"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"] ], "public/app/features/transformers/editors/CalculateFieldTransformerEditor/UnaryOperationEditor.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/calculateField\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], + [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] ], "public/app/features/transformers/editors/CalculateFieldTransformerEditor/WindowOptionsEditor.tsx:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/calculateField\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "Do not use any type assertions.", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "6"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "6"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "7"] ], "public/app/features/transformers/editors/CalculateFieldTransformerEditor/index.ts:5381": [ [0, 0, 0, "Do not re-export imported variable (\`CalculateFieldTransformerEditor\`)", "0"], [0, 0, 0, "Do not re-export imported variable (\`calculateFieldTransformRegistryItem\`)", "1"] ], "public/app/features/transformers/editors/ConcatenateTransformerEditor.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/concat\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"] ], "public/app/features/transformers/editors/ConvertFieldTypeTransformerEditor.tsx:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/convertFieldType\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "Do not use any type assertions.", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"], @@ -5631,13 +5743,15 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "13"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "14"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "15"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "16"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "16"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "17"] ], "public/app/features/transformers/editors/EnumMappingEditor.tsx:5381": [ - [0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"], - [0, 0, 0, "\'VerticalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/convertFieldType\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "1"], + [0, 0, 0, "\'VerticalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "2"], + [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], + [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] ], "public/app/features/transformers/editors/EnumMappingRow.tsx:5381": [ [0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"], @@ -5645,39 +5759,48 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"] ], "public/app/features/transformers/editors/FilterByNameTransformerEditor.tsx:5381": [ - [0, 0, 0, "\'@grafana/runtime/src/services\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/filterByName\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "\'@grafana/runtime/src/services\' import is restricted from being used by a pattern. Import from the public export instead.", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "6"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "6"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "7"] + ], + "public/app/features/transformers/editors/FilterByRefIdTransformerEditor.tsx:5381": [ + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/filterByRefId\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] ], "public/app/features/transformers/editors/FormatStringTransformerEditor.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/formatString\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"] ], "public/app/features/transformers/editors/FormatTimeTransformerEditor.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/formatTime\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"], + [0, 0, 0, "No untranslated strings. Wrap text with ", "6"] ], "public/app/features/transformers/editors/GroupByTransformerEditor.tsx:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/groupBy\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "Do not use any type assertions.", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"] ], "public/app/features/transformers/editors/GroupToNestedTableTransformerEditor.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/groupBy\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/groupToNestedTable\' import is restricted from being used by a pattern. Import from the public export instead.", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "6"] ], "public/app/features/transformers/editors/GroupingToMatrixTransformerEditor.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], @@ -5686,59 +5809,73 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"] ], "public/app/features/transformers/editors/HistogramTransformerEditor.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/histogram\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"] ], "public/app/features/transformers/editors/JoinByFieldTransformerEditor.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/joinByField\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"] ], "public/app/features/transformers/editors/LabelsToFieldsTransformerEditor.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/labelsToFields\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"] ], "public/app/features/transformers/editors/LimitTransformerEditor.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/limit\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"] ], "public/app/features/transformers/editors/MergeTransformerEditor.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/merge\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], "public/app/features/transformers/editors/OrganizeFieldsTransformerEditor.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/order\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/organize\' import is restricted from being used by a pattern. Import from the public export instead.", "1"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], + [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] ], "public/app/features/transformers/editors/ReduceTransformerEditor.tsx:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/reduce\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "Do not use any type assertions.", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "6"] ], "public/app/features/transformers/editors/RenameByRegexTransformer.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/renameByRegex\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"] + ], + "public/app/features/transformers/editors/SeriesToRowsTransformerEditor.tsx:5381": [ + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/seriesToRows\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] ], "public/app/features/transformers/editors/SortByTransformerEditor.tsx:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/sortBy\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "Do not use any type assertions.", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"] ], "public/app/features/transformers/editors/TransposeTransformerEditor.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/transpose\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"] + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"], + [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"] ], "public/app/features/transformers/extractFields/ExtractFieldsTransformerEditor.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], @@ -5765,6 +5902,11 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], [0, 0, 0, "No untranslated strings. Wrap text with ", "6"] ], + "public/app/features/transformers/extractFields/extractFields.test.ts:5381": [ + [0, 0, 0, "\'@grafana/data/src/dataframe/processDataFrame\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/sortBy\' import is restricted from being used by a pattern. Import from the public export instead.", "1"], + [0, 0, 0, "\'@grafana/data/src/utils/tests/mockTransformationsRegistry\' import is restricted from being used by a pattern. Import from the public export instead.", "2"] + ], "public/app/features/transformers/extractFields/extractFields.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"] @@ -5807,6 +5949,10 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"] ], + "public/app/features/transformers/lookupGazetteer/fieldLookup.test.ts:5381": [ + [0, 0, 0, "\'@grafana/data/src/dataframe/processDataFrame\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/ids\' import is restricted from being used by a pattern. Import from the public export instead.", "1"] + ], "public/app/features/transformers/lookupGazetteer/fieldLookup.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], @@ -5820,6 +5966,10 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "6"], [0, 0, 0, "No untranslated strings. Wrap text with ", "7"] ], + "public/app/features/transformers/partitionByValues/partitionByValues.ts:5381": [ + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/filterByName\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/noop\' import is restricted from being used by a pattern. Import from the public export instead.", "1"] + ], "public/app/features/transformers/prepareTimeSeries/PrepareTimeSeriesEditor.tsx:5381": [ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], @@ -5854,12 +6004,18 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"] ], "public/app/features/transformers/spatial/optionsHelper.tsx:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"], - [0, 0, 0, "Do not use any type assertions.", "1"], + [0, 0, 0, "\'@grafana/data/src/panel/PanelPlugin\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "\'@grafana/data/src/utils/OptionsUIBuilders\' import is restricted from being used by a pattern. Import from the public export instead.", "1"], [0, 0, 0, "Do not use any type assertions.", "2"], - [0, 0, 0, "Unexpected any. Specify a different type.", "3"], - [0, 0, 0, "Unexpected any. Specify a different type.", "4"], - [0, 0, 0, "Unexpected any. Specify a different type.", "5"] + [0, 0, 0, "Do not use any type assertions.", "3"], + [0, 0, 0, "Do not use any type assertions.", "4"], + [0, 0, 0, "Unexpected any. Specify a different type.", "5"], + [0, 0, 0, "Unexpected any. Specify a different type.", "6"], + [0, 0, 0, "Unexpected any. Specify a different type.", "7"] + ], + "public/app/features/transformers/spatial/spatialTransformer.test.ts:5381": [ + [0, 0, 0, "\'@grafana/data/src/dataframe/processDataFrame\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/ids\' import is restricted from being used by a pattern. Import from the public export instead.", "1"] ], "public/app/features/transformers/suggestionsInput/SuggestionsInput.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], @@ -6142,6 +6298,9 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"] ], + "public/app/plugins/datasource/azuremonitor/__mocks__/utils.ts:5381": [ + [0, 0, 0, "\'@grafana/data/src/types/data\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/plugins/datasource/azuremonitor/azureMetadata/index.ts:5381": [ [0, 0, 0, "Do not use export all (\`export * from ...\`)", "0"], [0, 0, 0, "Do not use export all (\`export * from ...\`)", "1"] @@ -6312,6 +6471,9 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "1"], [0, 0, 0, "Unexpected any. Specify a different type.", "2"] ], + "public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchMetricsQueryRunner.test.ts:5381": [ + [0, 0, 0, "\'@grafana/data/src/datetime/moment_wrapper\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/plugins/datasource/cloudwatch/types.ts:5381": [ [0, 0, 0, "Do not use export all (\`export * from ...\`)", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"], @@ -6334,9 +6496,9 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "1"] ], "public/app/plugins/datasource/elasticsearch/ElasticResponse.ts:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/convertFieldType\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], [0, 0, 0, "Do not use any type assertions.", "1"], - [0, 0, 0, "Unexpected any. Specify a different type.", "2"], + [0, 0, 0, "Do not use any type assertions.", "2"], [0, 0, 0, "Unexpected any. Specify a different type.", "3"], [0, 0, 0, "Unexpected any. Specify a different type.", "4"], [0, 0, 0, "Unexpected any. Specify a different type.", "5"], @@ -6365,7 +6527,8 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "28"], [0, 0, 0, "Unexpected any. Specify a different type.", "29"], [0, 0, 0, "Unexpected any. Specify a different type.", "30"], - [0, 0, 0, "Unexpected any. Specify a different type.", "31"] + [0, 0, 0, "Unexpected any. Specify a different type.", "31"], + [0, 0, 0, "Unexpected any. Specify a different type.", "32"] ], "public/app/plugins/datasource/elasticsearch/LanguageProvider.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], @@ -6740,15 +6903,22 @@ exports[`better eslint`] = { [0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"] ], "public/app/plugins/panel/barchart/bars.ts:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"] + [0, 0, 0, "\'@grafana/data/src/themes/colorManipulator\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "Do not use any type assertions.", "1"] ], "public/app/plugins/panel/barchart/quadtree.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], + "public/app/plugins/panel/barchart/utils.ts:5381": [ + [0, 0, 0, "\'@grafana/data/src/field/fieldState\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/plugins/panel/candlestick/CandlestickPanel.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"] ], + "public/app/plugins/panel/candlestick/fields.ts:5381": [ + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/joinDataFrames\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/plugins/panel/candlestick/types.ts:5381": [ [0, 0, 0, "Do not re-export imported variable (\`CandleStyle\`)", "0"], [0, 0, 0, "Do not re-export imported variable (\`CandlestickColors\`)", "1"], @@ -6759,6 +6929,28 @@ exports[`better eslint`] = { [0, 0, 0, "Do not re-export imported variable (\`VizDisplayMode\`)", "6"], [0, 0, 0, "Do not re-export imported variable (\`defaultCandlestickColors\`)", "7"] ], + "public/app/plugins/panel/canvas/components/CanvasTooltip.tsx:5381": [ + [0, 0, 0, "\'@grafana/data/src/types/action\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], + "public/app/plugins/panel/canvas/editor/connectionEditor.tsx:5381": [ + [0, 0, 0, "\'@grafana/data/src/utils/OptionsUIBuilders\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], + "public/app/plugins/panel/canvas/editor/element/elementEditor.tsx:5381": [ + [0, 0, 0, "\'@grafana/data/src/utils/OptionsUIBuilders\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], + "public/app/plugins/panel/canvas/editor/inline/InlineEditBody.tsx:5381": [ + [0, 0, 0, "\'@grafana/data/src/panel/PanelPlugin\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "\'@grafana/data/src/utils/OptionsUIBuilders\' import is restricted from being used by a pattern. Import from the public export instead.", "1"] + ], + "public/app/plugins/panel/canvas/editor/layer/layerEditor.tsx:5381": [ + [0, 0, 0, "\'@grafana/data/src/utils/OptionsUIBuilders\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], + "public/app/plugins/panel/canvas/editor/options.ts:5381": [ + [0, 0, 0, "\'@grafana/data/src/panel/PanelPlugin\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], + "public/app/plugins/panel/datagrid/components/DatagridContextMenu.tsx:5381": [ + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/convertFieldType\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/plugins/panel/debug/CursorView.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"] @@ -6771,9 +6963,10 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], "public/app/plugins/panel/geomap/components/MarkersLegend.tsx:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"], + [0, 0, 0, "\'@grafana/data/src/field/scale\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], [0, 0, 0, "Do not use any type assertions.", "1"], - [0, 0, 0, "Unexpected any. Specify a different type.", "2"] + [0, 0, 0, "Do not use any type assertions.", "2"], + [0, 0, 0, "Unexpected any. Specify a different type.", "3"] ], "public/app/plugins/panel/geomap/editor/GeomapStyleRulesEditor.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] @@ -6799,6 +6992,9 @@ exports[`better eslint`] = { "public/app/plugins/panel/geomap/editor/StyleRuleEditor.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], + "public/app/plugins/panel/geomap/editor/layerEditor.tsx:5381": [ + [0, 0, 0, "\'@grafana/data/src/utils/OptionsUIBuilders\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/plugins/panel/geomap/layers/basemaps/esri.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], @@ -6806,7 +7002,8 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "0"] ], "public/app/plugins/panel/geomap/layers/data/routeLayer.tsx:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"] + [0, 0, 0, "\'@grafana/data/src/themes/colorManipulator\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "Do not use any type assertions.", "1"] ], "public/app/plugins/panel/geomap/layers/registry.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], @@ -6819,6 +7016,9 @@ exports[`better eslint`] = { "public/app/plugins/panel/geomap/types.ts:5381": [ [0, 0, 0, "Do not re-export imported variable (\`./panelcfg.gen\`)", "0"] ], + "public/app/plugins/panel/geomap/utils/checkFeatureMatchesStyleRule.ts:5381": [ + [0, 0, 0, "\'@grafana/data/src/transformations/matchers/compareValues\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/plugins/panel/geomap/utils/layers.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], @@ -6859,12 +7059,27 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "15"], [0, 0, 0, "Do not use any type assertions.", "16"] ], + "public/app/plugins/panel/histogram/Histogram.tsx:5381": [ + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/histogram\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], + "public/app/plugins/panel/histogram/HistogramPanel.tsx:5381": [ + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/histogram\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], + "public/app/plugins/panel/histogram/module.tsx:5381": [ + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/histogram\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], + "public/app/plugins/panel/histogram/utils.ts:5381": [ + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/histogram\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/plugins/panel/live/LivePanel.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], "public/app/plugins/panel/logs/LogsPanel.test.tsx:5381": [ [0, 0, 0, "* import is invalid because \'Layout,HorizontalGroup,VerticalGroup\' from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"] ], + "public/app/plugins/panel/logs/LogsPanel.tsx:5381": [ + [0, 0, 0, "\'@grafana/data/src/datetime/rangeutil\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/plugins/panel/logs/types.ts:5381": [ [0, 0, 0, "Do not re-export imported variable (\`./panelcfg.gen\`)", "0"] ], @@ -6898,6 +7113,9 @@ exports[`better eslint`] = { "public/app/plugins/panel/stat/StatMigrations.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], + "public/app/plugins/panel/stat/StatPanel.tsx:5381": [ + [0, 0, 0, "\'@grafana/data/src/field/fieldOverrides\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/plugins/panel/state-timeline/migrations.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"] @@ -6906,10 +7124,11 @@ exports[`better eslint`] = { [0, 0, 0, "\'VerticalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"] ], "public/app/plugins/panel/table/migrations.ts:5381": [ - [0, 0, 0, "Unexpected any. Specify a different type.", "0"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/reduce\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"], [0, 0, 0, "Unexpected any. Specify a different type.", "2"], - [0, 0, 0, "Unexpected any. Specify a different type.", "3"] + [0, 0, 0, "Unexpected any. Specify a different type.", "3"], + [0, 0, 0, "Unexpected any. Specify a different type.", "4"] ], "public/app/plugins/panel/text/textPanelMigrationHandler.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] @@ -6948,17 +7167,31 @@ exports[`better eslint`] = { [0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"] ], + "public/app/plugins/panel/timeseries/utils.ts:5381": [ + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/convertFieldType\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/nulls/nullInsertThreshold\' import is restricted from being used by a pattern. Import from the public export instead.", "1"], + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/nulls/nullToValue\' import is restricted from being used by a pattern. Import from the public export instead.", "2"] + ], + "public/app/plugins/panel/trend/TrendPanel.tsx:5381": [ + [0, 0, 0, "\'@grafana/data/src/transformations/transformers/joinDataFrames\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/plugins/panel/xychart/SeriesEditor.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Do not use any type assertions.", "1"], [0, 0, 0, "Do not use any type assertions.", "2"], [0, 0, 0, "Do not use any type assertions.", "3"] ], + "public/app/plugins/panel/xychart/XYChartPanel.tsx:5381": [ + [0, 0, 0, "\'@grafana/data/src/themes/colorManipulator\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], + "public/app/plugins/panel/xychart/XYChartTooltip.tsx:5381": [ + [0, 0, 0, "\'@grafana/data/src/themes/colorManipulator\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] + ], "public/app/plugins/panel/xychart/migrations.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], "public/app/plugins/panel/xychart/scatter.ts:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"], + [0, 0, 0, "\'@grafana/data/src/themes/colorManipulator\' import is restricted from being used by a pattern. Import from the public export instead.", "0"], [0, 0, 0, "Do not use any type assertions.", "1"], [0, 0, 0, "Do not use any type assertions.", "2"], [0, 0, 0, "Do not use any type assertions.", "3"], @@ -6972,10 +7205,14 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "11"], [0, 0, 0, "Do not use any type assertions.", "12"], [0, 0, 0, "Do not use any type assertions.", "13"], - [0, 0, 0, "Unexpected any. Specify a different type.", "14"], + [0, 0, 0, "Do not use any type assertions.", "14"], [0, 0, 0, "Unexpected any. Specify a different type.", "15"], [0, 0, 0, "Unexpected any. Specify a different type.", "16"], - [0, 0, 0, "Unexpected any. Specify a different type.", "17"] + [0, 0, 0, "Unexpected any. Specify a different type.", "17"], + [0, 0, 0, "Unexpected any. Specify a different type.", "18"] + ], + "public/app/plugins/panel/xychart/utils.ts:5381": [ + [0, 0, 0, "\'@grafana/data/src/field/fieldState\' import is restricted from being used by a pattern. Import from the public export instead.", "0"] ], "public/app/plugins/sdk.ts:5381": [ [0, 0, 0, "Do not re-export imported variable (\`loadPluginCss\`)", "0"] diff --git a/packages/grafana-data/package.json b/packages/grafana-data/package.json index aad57fcef43..c33053087f2 100644 --- a/packages/grafana-data/package.json +++ b/packages/grafana-data/package.json @@ -15,26 +15,6 @@ }, "main": "src/index.ts", "types": "src/index.ts", - "module": "src/index.ts", - "exports": { - "./package.json": "./package.json", - ".": { - "import": "./src/index.ts", - "require": "./src/index.ts" - }, - "./internal": { - "import": "./src/internal/index.ts", - "require": "./src/internal/index.ts" - }, - "./unstable": { - "import": "./src/unstable.ts", - "require": "./src/unstable.ts" - }, - "./test": { - "import": "./test/index.ts", - "require": "./test/index.ts" - } - }, "publishConfig": { "main": "./dist/cjs/index.cjs", "module": "./dist/esm/index.mjs", diff --git a/packages/grafana-data/src/internal/index.ts b/packages/grafana-data/src/internal/index.ts deleted file mode 100644 index c0e52d01c67..00000000000 --- a/packages/grafana-data/src/internal/index.ts +++ /dev/null @@ -1,100 +0,0 @@ -/** - * This file is used to share internal grafana/data code with Grafana core. - * Note that these exports are also used within Enterprise. - * - * Through the exports declared in package.json we can import this code in core Grafana and the grafana/data - * package will continue to be able to access all code when it's published to npm as it's private to the package. - * - * During the yarn pack lifecycle the exports[./internal] property is deleted from the package.json - * preventing the code from being importable by plugins or other npm packages making it truly "internal". - * - */ - -export { actionsOverrideProcessor } from '../field/overrides/processors'; -export { nullToUndefThreshold } from '../transformations/transformers/nulls/nullToUndefThreshold'; -export { applyNullInsertThreshold } from '../transformations/transformers/nulls/nullInsertThreshold'; -export { - NULL_EXPAND, - NULL_REMOVE, - NULL_RETAIN, - isLikelyAscendingVector, - maybeSortFrame, -} from '../transformations/transformers/joinDataFrames'; -export { ConcatenateFrameNameMode, type ConcatenateTransformerOptions } from '../transformations/transformers/concat'; -export { - type ConvertFieldTypeOptions, - type ConvertFieldTypeTransformerOptions, - convertFieldType, -} from '../transformations/transformers/convertFieldType'; -export { type FilterFieldsByNameTransformerOptions } from '../transformations/transformers/filterByName'; -export { type FilterFramesByRefIdTransformerOptions } from '../transformations/transformers/filterByRefId'; -export { FormatStringOutput, type FormatStringTransformerOptions } from '../transformations/transformers/formatString'; -export { organizeFieldsTransformer } from '../transformations/transformers/organize'; -export { labelsToFieldsTransformer } from '../transformations/transformers/labelsToFields'; -export { type FormatTimeTransformerOptions } from '../transformations/transformers/formatTime'; -export { - type GroupByFieldOptions, - GroupByOperationID, - type GroupByTransformerOptions, -} from '../transformations/transformers/groupBy'; -export { - type GroupToNestedTableTransformerOptions, - SHOW_NESTED_HEADERS_DEFAULT, -} from '../transformations/transformers/groupToNestedTable'; -export { - type BinaryValue, - type BinaryOptions, - CalculateFieldMode, - type CalculateFieldTransformerOptions, - getNameFromOptions, - defaultWindowOptions, - checkBinaryValueType, - type CumulativeOptions, - type ReduceOptions, - type UnaryOptions, - WindowAlignment, - type WindowOptions, - WindowSizeMode, -} from '../transformations/transformers/calculateField'; -export { type SeriesToRowsTransformerOptions } from '../transformations/transformers/seriesToRows'; -export { histogramFieldInfo, type HistogramTransformerInputs } from '../transformations/transformers/histogram'; -export { type JoinByFieldOptions, JoinMode } from '../transformations/transformers/joinByField'; -export { LabelsToFieldsMode, type LabelsToFieldsOptions } from '../transformations/transformers/labelsToFields'; -export { type LimitTransformerOptions } from '../transformations/transformers/limit'; -export { type MergeTransformerOptions } from '../transformations/transformers/merge'; -export { ReduceTransformerMode, type ReduceTransformerOptions } from '../transformations/transformers/reduce'; -export { createOrderFieldsComparer } from '../transformations/transformers/order'; -export { type RenameByRegexTransformerOptions } from '../transformations/transformers/renameByRegex'; -export { type OrganizeFieldsTransformerOptions } from '../transformations/transformers/organize'; -export { compareValues } from '../transformations/matchers/compareValues'; -export { - type SortByField, - type SortByTransformerOptions, - sortByTransformer, -} from '../transformations/transformers/sortBy'; -export { type TransposeTransformerOptions } from '../transformations/transformers/transpose'; -export { - type FilterByValueTransformerOptions, - FilterByValueMatch, - FilterByValueType, - type FilterByValueFilter, -} from '../transformations/transformers/filterByValue'; -export { getMatcherConfig } from '../transformations/transformers/filterByName'; -export { mockTransformationsRegistry } from '../utils/tests/mockTransformationsRegistry'; -export { noopTransformer } from '../transformations/transformers/noop'; -export { DataTransformerID } from '../transformations/transformers/ids'; - -export { mergeTransformer } from '../transformations/transformers/merge'; -export { getThemeById } from '../themes/registry'; -export { GrafanaEdition } from '../types/config'; -export { SIPrefix } from '../valueFormats/symbolFormatters'; - -export { type PluginAddedLinksConfigureFunc, type PluginExtensionEventHelpers } from '../types/pluginExtensions'; - -export { getStreamingFrameOptions } from '../dataframe/StreamingDataFrame'; -export { fieldIndexComparer } from '../field/fieldComparers'; -export { decoupleHideFromState } from '../field/fieldState'; -export { findNumericFieldMinMax } from '../field/fieldOverrides'; -export { type PanelOptionsSupplier } from '../panel/PanelPlugin'; -export { sanitize, sanitizeUrl } from '../text/sanitize'; -export { type NestedValueAccess, type NestedPanelOptions, isNestedPanelOptions } from '../utils/OptionsUIBuilders'; diff --git a/packages/grafana-data/src/panel/getPanelOptionsWithDefaults.test.ts b/packages/grafana-data/src/panel/getPanelOptionsWithDefaults.test.ts index f155696053d..01b42612f1d 100644 --- a/packages/grafana-data/src/panel/getPanelOptionsWithDefaults.test.ts +++ b/packages/grafana-data/src/panel/getPanelOptionsWithDefaults.test.ts @@ -11,7 +11,8 @@ import { ThresholdsMode, } from '@grafana/data'; -import { getPanelPlugin, mockStandardFieldConfigOptions } from '../../test'; +import { getPanelPlugin } from '../../test/__mocks__/pluginMocks'; +import { mockStandardFieldConfigOptions } from '../../test/helpers/fieldConfig'; import { getPanelOptionsWithDefaults, restoreCustomOverrideRules } from './getPanelOptionsWithDefaults'; diff --git a/packages/grafana-data/test/helpers/pluginMocks.ts b/packages/grafana-data/test/__mocks__/pluginMocks.ts similarity index 98% rename from packages/grafana-data/test/helpers/pluginMocks.ts rename to packages/grafana-data/test/__mocks__/pluginMocks.ts index 1fe23bb46f3..226d6eb87cb 100644 --- a/packages/grafana-data/test/helpers/pluginMocks.ts +++ b/packages/grafana-data/test/__mocks__/pluginMocks.ts @@ -1,7 +1,7 @@ import { defaultsDeep } from 'lodash'; import { ComponentType } from 'react'; -import { PanelPluginMeta, PluginMeta, PluginType, PanelPlugin, PanelProps } from '../../'; +import { PanelPluginMeta, PluginMeta, PluginType, PanelPlugin, PanelProps } from '../../src'; export const getMockPlugins = (amount: number): PluginMeta[] => { const plugins: PluginMeta[] = []; diff --git a/packages/grafana-data/test/index.ts b/packages/grafana-data/test/index.ts deleted file mode 100644 index c6f6494b213..00000000000 --- a/packages/grafana-data/test/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { getMockPlugin, getMockPlugins, getPanelPlugin } from './helpers/pluginMocks'; -export { mockStandardFieldConfigOptions } from './helpers/fieldConfig'; diff --git a/packages/grafana-prometheus/src/querybuilder/operationUtils.ts b/packages/grafana-prometheus/src/querybuilder/operationUtils.ts index 36b9a3f6bd8..bf5bc98c0ad 100644 --- a/packages/grafana-prometheus/src/querybuilder/operationUtils.ts +++ b/packages/grafana-prometheus/src/querybuilder/operationUtils.ts @@ -2,7 +2,7 @@ import { capitalize } from 'lodash'; import pluralize from 'pluralize'; -import { SelectableValue } from '@grafana/data'; +import { SelectableValue } from '@grafana/data/src'; import { LabelParamEditor } from './components/LabelParamEditor'; import { diff --git a/public/app/core/components/GraphNG/utils.ts b/public/app/core/components/GraphNG/utils.ts index 34757b4d81a..b0c4368f3bb 100644 --- a/public/app/core/components/GraphNG/utils.ts +++ b/public/app/core/components/GraphNG/utils.ts @@ -1,5 +1,7 @@ -import { DataFrame, Field, FieldType, outerJoinDataFrames, TimeRange, applyNullInsertThreshold } from '@grafana/data'; -import { NULL_EXPAND, NULL_REMOVE, NULL_RETAIN, nullToUndefThreshold } from '@grafana/data/internal'; +import { DataFrame, Field, FieldType, outerJoinDataFrames, TimeRange } from '@grafana/data'; +import { NULL_EXPAND, NULL_REMOVE, NULL_RETAIN } from '@grafana/data/src/transformations/transformers/joinDataFrames'; +import { applyNullInsertThreshold } from '@grafana/data/src/transformations/transformers/nulls/nullInsertThreshold'; +import { nullToUndefThreshold } from '@grafana/data/src/transformations/transformers/nulls/nullToUndefThreshold'; import { GraphDrawStyle } from '@grafana/schema'; import { XYFieldMatchers } from './types'; diff --git a/public/app/core/components/OptionsUI/registry.tsx b/public/app/core/components/OptionsUI/registry.tsx index d1c51c96de8..da20681e556 100644 --- a/public/app/core/components/OptionsUI/registry.tsx +++ b/public/app/core/components/OptionsUI/registry.tsx @@ -29,7 +29,7 @@ import { Action, DataLinksFieldConfigSettings, } from '@grafana/data'; -import { actionsOverrideProcessor } from '@grafana/data/internal'; +import { actionsOverrideProcessor } from '@grafana/data/src/field/overrides/processors'; import { FieldConfig } from '@grafana/schema'; import { RadioButtonGroup, TimeZonePicker, Switch } from '@grafana/ui'; import { FieldNamePicker } from '@grafana/ui/internal'; diff --git a/public/app/core/components/TimelineChart/timeline.ts b/public/app/core/components/TimelineChart/timeline.ts index 8fa0a8faef1..68acea164f6 100644 --- a/public/app/core/components/TimelineChart/timeline.ts +++ b/public/app/core/components/TimelineChart/timeline.ts @@ -1,6 +1,7 @@ import uPlot, { Series } from 'uplot'; -import { GrafanaTheme2, TimeRange, colorManipulator } from '@grafana/data'; +import { GrafanaTheme2, TimeRange } from '@grafana/data'; +import { alpha } from '@grafana/data/src/themes/colorManipulator'; import { TimelineValueAlignment, VisibilityMode } from '@grafana/schema'; import { FIXED_UNIT } from '@grafana/ui'; import { distribute, SPACE_BETWEEN } from 'app/plugins/panel/barchart/distribute'; @@ -532,5 +533,5 @@ function getFillColor(fieldConfig: { fillOpacity?: number; lineWidth?: number }, } const opacityPercent = (fieldConfig.fillOpacity ?? 100) / 100; - return colorManipulator.alpha(color, opacityPercent); + return alpha(color, opacityPercent); } diff --git a/public/app/core/components/TimelineChart/utils.ts b/public/app/core/components/TimelineChart/utils.ts index a9af674a839..bf38c4bc5c5 100644 --- a/public/app/core/components/TimelineChart/utils.ts +++ b/public/app/core/components/TimelineChart/utils.ts @@ -18,10 +18,10 @@ import { outerJoinDataFrames, ValueMapping, ThresholdsConfig, - applyNullInsertThreshold, - nullToValue, } from '@grafana/data'; -import { maybeSortFrame, NULL_RETAIN } from '@grafana/data/internal'; +import { maybeSortFrame, NULL_RETAIN } from '@grafana/data/src/transformations/transformers/joinDataFrames'; +import { applyNullInsertThreshold } from '@grafana/data/src/transformations/transformers/nulls/nullInsertThreshold'; +import { nullToValue } from '@grafana/data/src/transformations/transformers/nulls/nullToValue'; import { VizLegendOptions, AxisPlacement, diff --git a/public/app/core/services/echo/backends/grafana-javascript-agent/GrafanaJavascriptAgentBackend.test.ts b/public/app/core/services/echo/backends/grafana-javascript-agent/GrafanaJavascriptAgentBackend.test.ts index ca92345ccac..5ee5b184736 100644 --- a/public/app/core/services/echo/backends/grafana-javascript-agent/GrafanaJavascriptAgentBackend.test.ts +++ b/public/app/core/services/echo/backends/grafana-javascript-agent/GrafanaJavascriptAgentBackend.test.ts @@ -1,5 +1,5 @@ import { BuildInfo } from '@grafana/data'; -import { GrafanaEdition } from '@grafana/data/internal'; +import { GrafanaEdition } from '@grafana/data/src/types/config'; import { Faro, Instrumentation } from '@grafana/faro-core'; import * as faroWebSdkModule from '@grafana/faro-web-sdk'; import { BrowserConfig, FetchTransport } from '@grafana/faro-web-sdk'; diff --git a/public/app/core/services/theme.ts b/public/app/core/services/theme.ts index 30d63375f6b..b244b95e012 100644 --- a/public/app/core/services/theme.ts +++ b/public/app/core/services/theme.ts @@ -1,4 +1,4 @@ -import { getThemeById } from '@grafana/data/internal'; +import { getThemeById } from '@grafana/data/src/themes/registry'; import { ThemeChangedEvent } from '@grafana/runtime'; import appEvents from '../app_events'; diff --git a/public/app/core/utils/explore.test.ts b/public/app/core/utils/explore.test.ts index 011380fed79..76da92421a9 100644 --- a/public/app/core/utils/explore.test.ts +++ b/public/app/core/utils/explore.test.ts @@ -1,12 +1,5 @@ -import { - DataSourceApi, - dateTime, - ExploreUrlState, - GrafanaConfig, - locationUtil, - LogsSortOrder, - serializeStateToUrlParam, -} from '@grafana/data'; +import { DataSourceApi, dateTime, ExploreUrlState, GrafanaConfig, locationUtil, LogsSortOrder } from '@grafana/data'; +import { serializeStateToUrlParam } from '@grafana/data/src/utils/url'; import { config } from '@grafana/runtime'; import { DataQuery } from '@grafana/schema'; import { RefreshPicker } from '@grafana/ui'; diff --git a/public/app/core/utils/richHistory.ts b/public/app/core/utils/richHistory.ts index 8816613a51b..b99a16f5ceb 100644 --- a/public/app/core/utils/richHistory.ts +++ b/public/app/core/utils/richHistory.ts @@ -1,13 +1,7 @@ import { omit } from 'lodash'; -import { - DataQuery, - DataSourceApi, - dateTimeFormat, - ExploreUrlState, - urlUtil, - serializeStateToUrlParam, -} from '@grafana/data'; +import { DataQuery, DataSourceApi, dateTimeFormat, ExploreUrlState, urlUtil } from '@grafana/data'; +import { serializeStateToUrlParam } from '@grafana/data/src/utils/url'; import { getDataSourceSrv } from '@grafana/runtime'; import { notifyApp } from 'app/core/actions'; import { createErrorNotification, createWarningNotification } from 'app/core/copy/appNotification'; diff --git a/public/app/features/admin/UserListPublicDashboardPage/DashboardsListModalButton.tsx b/public/app/features/admin/UserListPublicDashboardPage/DashboardsListModalButton.tsx index 87d3b1fe591..cc0284d753d 100644 --- a/public/app/features/admin/UserListPublicDashboardPage/DashboardsListModalButton.tsx +++ b/public/app/features/admin/UserListPublicDashboardPage/DashboardsListModalButton.tsx @@ -1,6 +1,6 @@ import { css, cx } from '@emotion/css'; -import { GrafanaTheme2 } from '@grafana/data'; +import { GrafanaTheme2 } from '@grafana/data/src'; import { selectors as e2eSelectors } from '@grafana/e2e-selectors/src'; import { config } from '@grafana/runtime'; import { Button, LoadingPlaceholder, Modal, ModalsController, useStyles2 } from '@grafana/ui'; diff --git a/public/app/features/admin/UserListPublicDashboardPage/DeleteUserModalButton.tsx b/public/app/features/admin/UserListPublicDashboardPage/DeleteUserModalButton.tsx index fa33265f205..1ca1f8d6656 100644 --- a/public/app/features/admin/UserListPublicDashboardPage/DeleteUserModalButton.tsx +++ b/public/app/features/admin/UserListPublicDashboardPage/DeleteUserModalButton.tsx @@ -1,6 +1,6 @@ import { css } from '@emotion/css'; -import { GrafanaTheme2 } from '@grafana/data'; +import { GrafanaTheme2 } from '@grafana/data/src'; import { config } from '@grafana/runtime'; import { Button, Modal, ModalsController, useStyles2 } from '@grafana/ui'; import { Trans, t } from 'app/core/internationalization'; diff --git a/public/app/features/alerting/unified/GrafanaRuleQueryViewer.tsx b/public/app/features/alerting/unified/GrafanaRuleQueryViewer.tsx index b7946517a41..b591ece380d 100644 --- a/public/app/features/alerting/unified/GrafanaRuleQueryViewer.tsx +++ b/public/app/features/alerting/unified/GrafanaRuleQueryViewer.tsx @@ -2,7 +2,8 @@ import { css, cx } from '@emotion/css'; import { keyBy, startCase, uniqueId } from 'lodash'; import * as React from 'react'; -import { DataSourceInstanceSettings, GrafanaTheme2, PanelData, rangeUtil, urlUtil } from '@grafana/data'; +import { DataSourceInstanceSettings, GrafanaTheme2, PanelData, urlUtil } from '@grafana/data'; +import { secondsToHms } from '@grafana/data/src/datetime/rangeutil'; import { config } from '@grafana/runtime'; import { DataSourceRef } from '@grafana/schema'; import { Preview } from '@grafana/sql/src/components/visual-query-builder/Preview'; @@ -122,7 +123,7 @@ export function QueryPreview({ if (relativeTimeRange) { headerItems.push( - {rangeUtil.secondsToHms(relativeTimeRange.from)} to now + {secondsToHms(relativeTimeRange.from)} to now ); } diff --git a/public/app/features/alerting/unified/components/GrafanaAlertmanagerDeliveryWarning.tsx b/public/app/features/alerting/unified/components/GrafanaAlertmanagerDeliveryWarning.tsx index b16c50bbb44..239de85bd2d 100644 --- a/public/app/features/alerting/unified/components/GrafanaAlertmanagerDeliveryWarning.tsx +++ b/public/app/features/alerting/unified/components/GrafanaAlertmanagerDeliveryWarning.tsx @@ -1,6 +1,6 @@ import { css } from '@emotion/css'; -import { GrafanaTheme2 } from '@grafana/data'; +import { GrafanaTheme2 } from '@grafana/data/src'; import { Alert, useStyles2 } from '@grafana/ui'; import { AlertmanagerChoice } from '../../../../plugins/datasource/alertmanager/types'; diff --git a/public/app/features/alerting/unified/components/rule-editor/CloudAlertPreview.tsx b/public/app/features/alerting/unified/components/rule-editor/CloudAlertPreview.tsx index b2fa4fa8297..a9d67203d14 100644 --- a/public/app/features/alerting/unified/components/rule-editor/CloudAlertPreview.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/CloudAlertPreview.tsx @@ -1,6 +1,6 @@ import { css } from '@emotion/css'; -import { DataFrame, GrafanaTheme2 } from '@grafana/data'; +import { DataFrame, GrafanaTheme2 } from '@grafana/data/src'; import { Icon, TagList, Tooltip, useStyles2 } from '@grafana/ui'; import { labelsToTags } from '../../utils/labels'; diff --git a/public/app/features/alerting/unified/components/rule-editor/DashboardPicker.tsx b/public/app/features/alerting/unified/components/rule-editor/DashboardPicker.tsx index 4428ba2e1a9..14eea33da9d 100644 --- a/public/app/features/alerting/unified/components/rule-editor/DashboardPicker.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/DashboardPicker.tsx @@ -5,7 +5,7 @@ import { useDebounce } from 'react-use'; import AutoSizer from 'react-virtualized-auto-sizer'; import { FixedSizeList } from 'react-window'; -import { GrafanaTheme2 } from '@grafana/data'; +import { GrafanaTheme2 } from '@grafana/data/src'; import { Alert, Button, diff --git a/public/app/features/alerting/unified/components/rule-editor/QueryOptions.tsx b/public/app/features/alerting/unified/components/rule-editor/QueryOptions.tsx index 215ae1d3646..1a046f8e2a3 100644 --- a/public/app/features/alerting/unified/components/rule-editor/QueryOptions.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/QueryOptions.tsx @@ -1,7 +1,8 @@ import { css } from '@emotion/css'; import { useState } from 'react'; -import { GrafanaTheme2, RelativeTimeRange, dateTime, getDefaultRelativeTimeRange, rangeUtil } from '@grafana/data'; +import { GrafanaTheme2, RelativeTimeRange, dateTime, getDefaultRelativeTimeRange } from '@grafana/data'; +import { relativeToTimeRange } from '@grafana/data/src/datetime/rangeutil'; import { Icon, InlineField, RelativeTimeRangePicker, Toggletip, clearButtonStyles, useStyles2 } from '@grafana/ui'; import { AlertQuery } from 'app/types/unified-alerting-dto'; @@ -26,7 +27,7 @@ export const QueryOptions = ({ const [showOptions, setShowOptions] = useState(false); - const timeRange = query.relativeTimeRange ? rangeUtil.relativeToTimeRange(query.relativeTimeRange) : undefined; + const timeRange = query.relativeTimeRange ? relativeToTimeRange(query.relativeTimeRange) : undefined; return ( <> diff --git a/public/app/features/alerting/unified/components/rule-editor/rule-types/RuleTypePicker.tsx b/public/app/features/alerting/unified/components/rule-editor/rule-types/RuleTypePicker.tsx index 17cbdcfcd6e..ab41cd3121f 100644 --- a/public/app/features/alerting/unified/components/rule-editor/rule-types/RuleTypePicker.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/rule-types/RuleTypePicker.tsx @@ -1,7 +1,7 @@ import { css } from '@emotion/css'; import { isEmpty } from 'lodash'; -import { GrafanaTheme2 } from '@grafana/data'; +import { GrafanaTheme2 } from '@grafana/data/src'; import { Stack, useStyles2 } from '@grafana/ui'; import { useRulesSourcesWithRuler } from '../../../hooks/useRuleSourcesWithRuler'; diff --git a/public/app/features/alerting/unified/components/rules/AlertInstanceStateFilter.tsx b/public/app/features/alerting/unified/components/rules/AlertInstanceStateFilter.tsx index 29afb21fa2c..97cf310a478 100644 --- a/public/app/features/alerting/unified/components/rules/AlertInstanceStateFilter.tsx +++ b/public/app/features/alerting/unified/components/rules/AlertInstanceStateFilter.tsx @@ -1,7 +1,7 @@ import { css } from '@emotion/css'; import { capitalize } from 'lodash'; -import { GrafanaTheme2 } from '@grafana/data'; +import { GrafanaTheme2 } from '@grafana/data/src'; import { Label, RadioButtonGroup, Tag, useStyles2 } from '@grafana/ui'; import { GrafanaAlertState, PromAlertingRuleState } from 'app/types/unified-alerting-dto'; diff --git a/public/app/features/alerting/unified/components/rules/RuleConfigStatus.tsx b/public/app/features/alerting/unified/components/rules/RuleConfigStatus.tsx index ed3f96dc960..8b10c1388bf 100644 --- a/public/app/features/alerting/unified/components/rules/RuleConfigStatus.tsx +++ b/public/app/features/alerting/unified/components/rules/RuleConfigStatus.tsx @@ -1,7 +1,7 @@ import { css } from '@emotion/css'; import { useMemo } from 'react'; -import { GrafanaTheme2 } from '@grafana/data'; +import { GrafanaTheme2 } from '@grafana/data/src'; import { config } from '@grafana/runtime/src'; import { Icon, Tooltip, useStyles2 } from '@grafana/ui'; diff --git a/public/app/features/alerting/unified/components/rules/central-state-history/utils.ts b/public/app/features/alerting/unified/components/rules/central-state-history/utils.ts index d78688c1ab8..21b2548dac9 100644 --- a/public/app/features/alerting/unified/components/rules/central-state-history/utils.ts +++ b/public/app/features/alerting/unified/components/rules/central-state-history/utils.ts @@ -11,7 +11,7 @@ import { ThresholdsMode, getDisplayProcessor, } from '@grafana/data'; -import { fieldIndexComparer } from '@grafana/data/internal'; +import { fieldIndexComparer } from '@grafana/data/src/field/fieldComparers'; import { mapStateWithReasonToBaseState } from 'app/types/unified-alerting-dto'; import { labelsMatchMatchers } from '../../../utils/alertmanager'; diff --git a/public/app/features/alerting/unified/components/rules/state-history/useRuleHistoryRecords.tsx b/public/app/features/alerting/unified/components/rules/state-history/useRuleHistoryRecords.tsx index 613938eebb5..9f18e9bea2c 100644 --- a/public/app/features/alerting/unified/components/rules/state-history/useRuleHistoryRecords.tsx +++ b/public/app/features/alerting/unified/components/rules/state-history/useRuleHistoryRecords.tsx @@ -9,7 +9,7 @@ import { GrafanaTheme2, getDisplayProcessor, } from '@grafana/data'; -import { fieldIndexComparer } from '@grafana/data/internal'; +import { fieldIndexComparer } from '@grafana/data/src/field/fieldComparers'; import { MappingType, ThresholdsMode } from '@grafana/schema'; import { useTheme2 } from '@grafana/ui'; diff --git a/public/app/features/alerting/unified/home/PluginIntegrations.tsx b/public/app/features/alerting/unified/home/PluginIntegrations.tsx index 4a7d560da38..f07a0738934 100644 --- a/public/app/features/alerting/unified/home/PluginIntegrations.tsx +++ b/public/app/features/alerting/unified/home/PluginIntegrations.tsx @@ -1,6 +1,6 @@ import { css } from '@emotion/css'; -import { GrafanaTheme2 } from '@grafana/data'; +import { GrafanaTheme2 } from '@grafana/data/'; import { Stack, Text, useStyles2 } from '@grafana/ui'; import { useAlertingHomePageExtensions } from '../plugins/useAlertingHomePageExtensions'; diff --git a/public/app/features/alerting/unified/styles/pagination.ts b/public/app/features/alerting/unified/styles/pagination.ts index 0a16b5ce7ee..f3d92f70662 100644 --- a/public/app/features/alerting/unified/styles/pagination.ts +++ b/public/app/features/alerting/unified/styles/pagination.ts @@ -1,6 +1,6 @@ import { css } from '@emotion/css'; -import { GrafanaTheme2 } from '@grafana/data'; +import { GrafanaTheme2 } from '@grafana/data/src'; export const getPaginationStyles = (theme: GrafanaTheme2) => { return css({ diff --git a/public/app/features/alerting/unified/utils/misc.ts b/public/app/features/alerting/unified/utils/misc.ts index 686194d24c6..c136c2aa883 100644 --- a/public/app/features/alerting/unified/utils/misc.ts +++ b/public/app/features/alerting/unified/utils/misc.ts @@ -1,7 +1,7 @@ import { sortBy } from 'lodash'; import { Labels, UrlQueryMap } from '@grafana/data'; -import { GrafanaEdition } from '@grafana/data/internal'; +import { GrafanaEdition } from '@grafana/data/src/types/config'; import { config, isFetchError } from '@grafana/runtime'; import { DataSourceRef } from '@grafana/schema'; import { contextSrv } from 'app/core/services/context_srv'; diff --git a/public/app/features/alerting/unified/utils/routeTree.ts b/public/app/features/alerting/unified/utils/routeTree.ts index ba08bfd7526..6aa80dcb030 100644 --- a/public/app/features/alerting/unified/utils/routeTree.ts +++ b/public/app/features/alerting/unified/utils/routeTree.ts @@ -5,7 +5,7 @@ import { produce } from 'immer'; import { omit } from 'lodash'; -import { arrayUtils } from '@grafana/data'; +import { insertAfterImmutably, insertBeforeImmutably } from '@grafana/data/src/utils/arrayUtils'; import { ROUTES_META_SYMBOL, Route, RouteWithID } from 'app/plugins/datasource/alertmanager/types'; import { @@ -109,12 +109,12 @@ export const addRouteToReferenceRoute = ( // insert new policy before / above the referenceRoute if (position === 'above') { - parentRoute.routes = arrayUtils.insertBeforeImmutably(parentRoute.routes ?? [], newRoute, positionInParent); + parentRoute.routes = insertBeforeImmutably(parentRoute.routes ?? [], newRoute, positionInParent); } // insert new policy after / below the referenceRoute if (position === 'below') { - parentRoute.routes = arrayUtils.insertAfterImmutably(parentRoute.routes ?? [], newRoute, positionInParent); + parentRoute.routes = insertAfterImmutably(parentRoute.routes ?? [], newRoute, positionInParent); } }); }; diff --git a/public/app/features/alerting/unified/utils/time.ts b/public/app/features/alerting/unified/utils/time.ts index 7e9eeea528a..14a52ab677f 100644 --- a/public/app/features/alerting/unified/utils/time.ts +++ b/public/app/features/alerting/unified/utils/time.ts @@ -1,4 +1,4 @@ -import { rangeUtil } from '@grafana/data'; +import { describeInterval } from '@grafana/data/src/datetime/rangeutil'; import { TimeOptions } from '../types/time'; @@ -18,7 +18,7 @@ export function parseInterval(value: string): [number, string] { } export function intervalToSeconds(interval: string): number { - const { sec, count } = rangeUtil.describeInterval(interval); + const { sec, count } = describeInterval(interval); return sec * count; } diff --git a/public/app/features/annotations/components/StandardAnnotationQueryEditor.test.tsx b/public/app/features/annotations/components/StandardAnnotationQueryEditor.test.tsx index c4126cb6aa1..c347a069369 100644 --- a/public/app/features/annotations/components/StandardAnnotationQueryEditor.test.tsx +++ b/public/app/features/annotations/components/StandardAnnotationQueryEditor.test.tsx @@ -1,6 +1,6 @@ import { render } from '@testing-library/react'; -import { AnnotationQuery, DataSourceApi, DataSourceInstanceSettings } from '@grafana/data'; +import { AnnotationQuery, DataSourceApi, DataSourceInstanceSettings } from '@grafana/data/src'; import StandardAnnotationQueryEditor, { Props as EditorProps } from './StandardAnnotationQueryEditor'; diff --git a/public/app/features/auth-config/AuthProvidersListPage.tsx b/public/app/features/auth-config/AuthProvidersListPage.tsx index 9ae5786703a..717906f0f3a 100644 --- a/public/app/features/auth-config/AuthProvidersListPage.tsx +++ b/public/app/features/auth-config/AuthProvidersListPage.tsx @@ -1,7 +1,7 @@ import { JSX, useEffect, useState } from 'react'; import { connect, ConnectedProps } from 'react-redux'; -import { GrafanaEdition } from '@grafana/data/internal'; +import { GrafanaEdition } from '@grafana/data/src/types/config'; import { reportInteraction } from '@grafana/runtime'; import { Grid, TextLink, ToolbarButton } from '@grafana/ui'; import { Page } from 'app/core/components/Page/Page'; diff --git a/public/app/features/canvas/element.ts b/public/app/features/canvas/element.ts index 7f987fed873..1d6c39dba0d 100644 --- a/public/app/features/canvas/element.ts +++ b/public/app/features/canvas/element.ts @@ -1,7 +1,7 @@ import { ComponentType } from 'react'; import { DataLink, RegistryItem, Action } from '@grafana/data'; -import { PanelOptionsSupplier } from '@grafana/data/internal'; +import { PanelOptionsSupplier } from '@grafana/data/src/panel/PanelPlugin'; import { ColorDimensionConfig, ScaleDimensionConfig } from '@grafana/schema'; import { config } from 'app/core/config'; import { BackgroundConfig, Constraint, LineConfig, Placement } from 'app/plugins/panel/canvas/panelcfg.gen'; diff --git a/public/app/features/canvas/elements/button.tsx b/public/app/features/canvas/elements/button.tsx index 2b70fa66e3a..eb926056ace 100644 --- a/public/app/features/canvas/elements/button.tsx +++ b/public/app/features/canvas/elements/button.tsx @@ -1,7 +1,8 @@ import { css } from '@emotion/css'; import { useState } from 'react'; -import { GrafanaTheme2, PluginState } from '@grafana/data'; +import { GrafanaTheme2 } from '@grafana/data'; +import { PluginState } from '@grafana/data/src'; import { TextDimensionMode } from '@grafana/schema'; import { Button, Spinner, useStyles2 } from '@grafana/ui'; import { DimensionContext } from 'app/features/dimensions/context'; diff --git a/public/app/features/canvas/types.ts b/public/app/features/canvas/types.ts index 50b926779a6..1dd3f298e7a 100644 --- a/public/app/features/canvas/types.ts +++ b/public/app/features/canvas/types.ts @@ -1,4 +1,4 @@ -import { LinkModel } from '@grafana/data'; +import { LinkModel } from '@grafana/data/src'; import { ColorDimensionConfig, ResourceDimensionConfig, TextDimensionConfig } from '@grafana/schema'; import { BackgroundImageSize } from 'app/plugins/panel/canvas/panelcfg.gen'; diff --git a/public/app/features/dashboard-scene/inspect/HelpWizard/HelpWizard.test.tsx b/public/app/features/dashboard-scene/inspect/HelpWizard/HelpWizard.test.tsx index be4fbbb8692..276c71f61dd 100644 --- a/public/app/features/dashboard-scene/inspect/HelpWizard/HelpWizard.test.tsx +++ b/public/app/features/dashboard-scene/inspect/HelpWizard/HelpWizard.test.tsx @@ -2,7 +2,7 @@ import userEvent from '@testing-library/user-event'; import { render, screen } from 'test/test-utils'; import { FieldType, getDefaultTimeRange, LoadingState, toDataFrame } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test'; +import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { config } from '@grafana/runtime'; import { SceneQueryRunner, SceneTimeRange, VizPanel, VizPanelMenu } from '@grafana/scenes'; import { contextSrv } from 'app/core/services/context_srv'; diff --git a/public/app/features/dashboard-scene/inspect/InspectJsonTab.test.tsx b/public/app/features/dashboard-scene/inspect/InspectJsonTab.test.tsx index b49a61cd1b8..582e0855008 100644 --- a/public/app/features/dashboard-scene/inspect/InspectJsonTab.test.tsx +++ b/public/app/features/dashboard-scene/inspect/InspectJsonTab.test.tsx @@ -10,7 +10,7 @@ import { standardTransformersRegistry, toDataFrame, } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test'; +import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { setPluginImportUtils, setRunRequest } from '@grafana/runtime'; import { SceneCanvasText, SceneDataTransformer, SceneQueryRunner, VizPanel } from '@grafana/scenes'; import * as libpanels from 'app/features/library-panels/state/api'; diff --git a/public/app/features/dashboard-scene/pages/DashboardScenePage.test.tsx b/public/app/features/dashboard-scene/pages/DashboardScenePage.test.tsx index 90dc4a7de07..77551f16579 100644 --- a/public/app/features/dashboard-scene/pages/DashboardScenePage.test.tsx +++ b/public/app/features/dashboard-scene/pages/DashboardScenePage.test.tsx @@ -6,7 +6,7 @@ import { TestProvider } from 'test/helpers/TestProvider'; import { getGrafanaContextMock } from 'test/mocks/getGrafanaContextMock'; import { PanelProps } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test'; +import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { selectors } from '@grafana/e2e-selectors'; import { LocationServiceProvider, diff --git a/public/app/features/dashboard-scene/pages/PublicDashboardScenePage.test.tsx b/public/app/features/dashboard-scene/pages/PublicDashboardScenePage.test.tsx index b5c05c830b8..a8c109d261b 100644 --- a/public/app/features/dashboard-scene/pages/PublicDashboardScenePage.test.tsx +++ b/public/app/features/dashboard-scene/pages/PublicDashboardScenePage.test.tsx @@ -4,7 +4,7 @@ import { of } from 'rxjs'; import { render } from 'test/test-utils'; import { getDefaultTimeRange, LoadingState, PanelData, PanelProps } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test'; +import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { selectors as e2eSelectors } from '@grafana/e2e-selectors'; import { config, getPluginLinkExtensions, setPluginImportUtils, setRunRequest } from '@grafana/runtime'; import { Dashboard } from '@grafana/schema'; diff --git a/public/app/features/dashboard-scene/panel-edit/PanelDataPane/PanelDataQueriesTab.test.tsx b/public/app/features/dashboard-scene/panel-edit/PanelDataPane/PanelDataQueriesTab.test.tsx index c88d60a527e..c0131b6847d 100644 --- a/public/app/features/dashboard-scene/panel-edit/PanelDataPane/PanelDataQueriesTab.test.tsx +++ b/public/app/features/dashboard-scene/panel-edit/PanelDataPane/PanelDataQueriesTab.test.tsx @@ -15,7 +15,7 @@ import { TimeRange, toDataFrame, } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test'; +import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { selectors } from '@grafana/e2e-selectors'; import { config, locationService, setPluginExtensionsHook } from '@grafana/runtime'; import { PANEL_EDIT_LAST_USED_DATASOURCE } from 'app/features/dashboard/utils/dashboard'; diff --git a/public/app/features/dashboard-scene/panel-edit/PanelEditor.test.ts b/public/app/features/dashboard-scene/panel-edit/PanelEditor.test.ts index ee2bda935fd..fe263ee3bde 100644 --- a/public/app/features/dashboard-scene/panel-edit/PanelEditor.test.ts +++ b/public/app/features/dashboard-scene/panel-edit/PanelEditor.test.ts @@ -1,7 +1,7 @@ import { of } from 'rxjs'; import { DataQueryRequest, DataSourceApi, LoadingState, PanelPlugin } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test'; +import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { CancelActivationHandler, CustomVariable, diff --git a/public/app/features/dashboard-scene/panel-edit/PanelOptions.test.tsx b/public/app/features/dashboard-scene/panel-edit/PanelOptions.test.tsx index afc761b080b..3f54a519b70 100644 --- a/public/app/features/dashboard-scene/panel-edit/PanelOptions.test.tsx +++ b/public/app/features/dashboard-scene/panel-edit/PanelOptions.test.tsx @@ -3,7 +3,7 @@ import userEvent from '@testing-library/user-event'; import { render } from 'test/test-utils'; import { standardEditorsRegistry, standardFieldConfigEditorRegistry } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test'; +import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { selectors } from '@grafana/e2e-selectors'; import { VizPanel } from '@grafana/scenes'; import { getAllOptionEditors, getAllStandardFieldConfigs } from 'app/core/components/OptionsUI/registry'; diff --git a/public/app/features/dashboard-scene/scene/DashboardDatasourceBehaviour.test.tsx b/public/app/features/dashboard-scene/scene/DashboardDatasourceBehaviour.test.tsx index 55aac56789a..59a27eacaad 100644 --- a/public/app/features/dashboard-scene/scene/DashboardDatasourceBehaviour.test.tsx +++ b/public/app/features/dashboard-scene/scene/DashboardDatasourceBehaviour.test.tsx @@ -10,7 +10,7 @@ import { LoadingState, PanelData, } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test'; +import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { setPluginImportUtils } from '@grafana/runtime'; import { SceneDataTransformer, SceneFlexLayout, SceneQueryRunner, VizPanel } from '@grafana/scenes'; import { SHARED_DASHBOARD_QUERY, DASHBOARD_DATASOURCE_PLUGIN_ID } from 'app/plugins/datasource/dashboard/constants'; diff --git a/public/app/features/dashboard-scene/scene/DashboardLinksControls.tsx b/public/app/features/dashboard-scene/scene/DashboardLinksControls.tsx index db7fb59dad7..72a046fc6e5 100644 --- a/public/app/features/dashboard-scene/scene/DashboardLinksControls.tsx +++ b/public/app/features/dashboard-scene/scene/DashboardLinksControls.tsx @@ -1,4 +1,4 @@ -import { sanitizeUrl } from '@grafana/data/internal'; +import { sanitizeUrl } from '@grafana/data/src/text/sanitize'; import { selectors } from '@grafana/e2e-selectors'; import { sceneGraph } from '@grafana/scenes'; import { DashboardLink } from '@grafana/schema'; diff --git a/public/app/features/dashboard-scene/scene/DashboardSceneRenderer.test.tsx b/public/app/features/dashboard-scene/scene/DashboardSceneRenderer.test.tsx index 74c91e3037e..3f456078a7e 100644 --- a/public/app/features/dashboard-scene/scene/DashboardSceneRenderer.test.tsx +++ b/public/app/features/dashboard-scene/scene/DashboardSceneRenderer.test.tsx @@ -1,7 +1,7 @@ import { screen } from '@testing-library/react'; import { render } from 'test/test-utils'; -import { getPanelPlugin } from '@grafana/data/test'; +import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { config, setPluginImportUtils } from '@grafana/runtime'; import { transformSaveModelToScene } from '../serialization/transformSaveModelToScene'; diff --git a/public/app/features/dashboard-scene/scene/LibraryPanelBehavior.test.tsx b/public/app/features/dashboard-scene/scene/LibraryPanelBehavior.test.tsx index 5d95b292cb4..b6eb6872566 100644 --- a/public/app/features/dashboard-scene/scene/LibraryPanelBehavior.test.tsx +++ b/public/app/features/dashboard-scene/scene/LibraryPanelBehavior.test.tsx @@ -1,7 +1,7 @@ import { of } from 'rxjs'; import { FieldType, LoadingState, PanelData, getDefaultTimeRange, toDataFrame } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test'; +import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { setPluginImportUtils, setRunRequest } from '@grafana/runtime'; import { SceneCanvasText, sceneGraph, SceneGridLayout, VizPanel } from '@grafana/scenes'; import { LibraryPanel } from '@grafana/schema'; diff --git a/public/app/features/dashboard-scene/scene/PanelMenuBehavior.test.tsx b/public/app/features/dashboard-scene/scene/PanelMenuBehavior.test.tsx index 182ebac330f..d0aa2f56b9f 100644 --- a/public/app/features/dashboard-scene/scene/PanelMenuBehavior.test.tsx +++ b/public/app/features/dashboard-scene/scene/PanelMenuBehavior.test.tsx @@ -8,7 +8,7 @@ import { toDataFrame, urlUtil, } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test'; +import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { config, getPluginLinkExtensions, locationService } from '@grafana/runtime'; import { LocalValueVariable, diff --git a/public/app/features/dashboard-scene/scene/layout-default/DashboardGridItem.test.tsx b/public/app/features/dashboard-scene/scene/layout-default/DashboardGridItem.test.tsx index 00458d505a9..ec13a7992c8 100644 --- a/public/app/features/dashboard-scene/scene/layout-default/DashboardGridItem.test.tsx +++ b/public/app/features/dashboard-scene/scene/layout-default/DashboardGridItem.test.tsx @@ -1,4 +1,4 @@ -import { getPanelPlugin } from '@grafana/data/test'; +import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { setPluginImportUtils } from '@grafana/runtime'; import { SceneGridLayout, SceneVariableSet, TestVariable, VizPanel } from '@grafana/scenes'; import { ALL_VARIABLE_TEXT, ALL_VARIABLE_VALUE } from 'app/features/variables/constants'; diff --git a/public/app/features/dashboard-scene/scene/layout-default/RowRepeaterBehavior.test.tsx b/public/app/features/dashboard-scene/scene/layout-default/RowRepeaterBehavior.test.tsx index 28effcf18b5..843f58b5640 100644 --- a/public/app/features/dashboard-scene/scene/layout-default/RowRepeaterBehavior.test.tsx +++ b/public/app/features/dashboard-scene/scene/layout-default/RowRepeaterBehavior.test.tsx @@ -1,5 +1,5 @@ import { VariableRefresh } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test'; +import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { setPluginImportUtils } from '@grafana/runtime'; import { SceneCanvasText, diff --git a/public/app/features/dashboard-scene/scene/layout-rows/RowItemRepeaterBehavior.test.tsx b/public/app/features/dashboard-scene/scene/layout-rows/RowItemRepeaterBehavior.test.tsx index ca967ce3d06..ec5b4710089 100644 --- a/public/app/features/dashboard-scene/scene/layout-rows/RowItemRepeaterBehavior.test.tsx +++ b/public/app/features/dashboard-scene/scene/layout-rows/RowItemRepeaterBehavior.test.tsx @@ -1,5 +1,5 @@ import { VariableRefresh } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test'; +import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { setPluginImportUtils } from '@grafana/runtime'; import { SceneGridRow, diff --git a/public/app/features/dashboard-scene/serialization/angularMigration.test.ts b/public/app/features/dashboard-scene/serialization/angularMigration.test.ts index a9f63b34cf0..cda96b97e9c 100644 --- a/public/app/features/dashboard-scene/serialization/angularMigration.test.ts +++ b/public/app/features/dashboard-scene/serialization/angularMigration.test.ts @@ -1,5 +1,5 @@ import { PanelTypeChangedHandler } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test'; +import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { PanelModel } from 'app/features/dashboard/state/PanelModel'; import { getAngularPanelMigrationHandler } from './angularMigration'; diff --git a/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.test.ts b/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.test.ts index 546c8e95038..e74c3f21664 100644 --- a/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.test.ts +++ b/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.test.ts @@ -1,5 +1,5 @@ import { LoadingState } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test'; +import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { config } from '@grafana/runtime'; import { AdHocFiltersVariable, diff --git a/public/app/features/dashboard-scene/serialization/transformSceneToSaveModel.test.ts b/public/app/features/dashboard-scene/serialization/transformSceneToSaveModel.test.ts index f1ed038dfb5..9d6061e3c6f 100644 --- a/public/app/features/dashboard-scene/serialization/transformSceneToSaveModel.test.ts +++ b/public/app/features/dashboard-scene/serialization/transformSceneToSaveModel.test.ts @@ -13,7 +13,7 @@ import { toDataFrame, VariableSupportType, } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test'; +import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { getPluginLinkExtensions, setPluginImportUtils } from '@grafana/runtime'; import { MultiValueVariable, sceneGraph, SceneGridRow, VizPanel } from '@grafana/scenes'; import { Dashboard, LoadingState, Panel, RowPanel, VariableRefresh } from '@grafana/schema'; diff --git a/public/app/features/dashboard-scene/settings/VariablesEditView.test.tsx b/public/app/features/dashboard-scene/settings/VariablesEditView.test.tsx index 8c5f690518e..f3d93596d03 100644 --- a/public/app/features/dashboard-scene/settings/VariablesEditView.test.tsx +++ b/public/app/features/dashboard-scene/settings/VariablesEditView.test.tsx @@ -8,7 +8,7 @@ import { getDefaultTimeRange, toDataFrame, } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test'; +import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { setPluginImportUtils, setRunRequest } from '@grafana/runtime'; import { SceneVariableSet, diff --git a/public/app/features/dashboard-scene/sharing/ShareButton/share-externally/ShareExternally.test.tsx b/public/app/features/dashboard-scene/sharing/ShareButton/share-externally/ShareExternally.test.tsx index b3c7a22a257..07fdec6b6a1 100644 --- a/public/app/features/dashboard-scene/sharing/ShareButton/share-externally/ShareExternally.test.tsx +++ b/public/app/features/dashboard-scene/sharing/ShareButton/share-externally/ShareExternally.test.tsx @@ -2,7 +2,7 @@ import { screen, waitForElementToBeRemoved } from '@testing-library/react'; import { render } from 'test/test-utils'; import { getDefaultTimeRange, LoadingState } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test'; +import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { selectors as e2eSelectors } from '@grafana/e2e-selectors'; import { config, setPluginImportUtils } from '@grafana/runtime'; import { diff --git a/public/app/features/dashboard-scene/sharing/ShareDrawer/ShareDrawer.test.tsx b/public/app/features/dashboard-scene/sharing/ShareDrawer/ShareDrawer.test.tsx index 35eaec800d1..5e7e71ee6b3 100644 --- a/public/app/features/dashboard-scene/sharing/ShareDrawer/ShareDrawer.test.tsx +++ b/public/app/features/dashboard-scene/sharing/ShareDrawer/ShareDrawer.test.tsx @@ -1,7 +1,7 @@ import { act, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { getPanelPlugin } from '@grafana/data/test'; +import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { selectors } from '@grafana/e2e-selectors'; import { locationService, setPluginImportUtils } from '@grafana/runtime'; import { SceneTimeRange, UrlSyncContextProvider } from '@grafana/scenes'; diff --git a/public/app/features/dashboard-scene/sharing/ShareLinkTab.test.tsx b/public/app/features/dashboard-scene/sharing/ShareLinkTab.test.tsx index d149d075e02..cded7ef3abe 100644 --- a/public/app/features/dashboard-scene/sharing/ShareLinkTab.test.tsx +++ b/public/app/features/dashboard-scene/sharing/ShareLinkTab.test.tsx @@ -3,7 +3,7 @@ import userEvent from '@testing-library/user-event'; import { advanceTo, clear } from 'jest-date-mock'; import { dateTime } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test'; +import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { selectors } from '@grafana/e2e-selectors'; import { config, locationService, setPluginImportUtils } from '@grafana/runtime'; import { SceneTimeRange, VizPanel } from '@grafana/scenes'; diff --git a/public/app/features/dashboard-scene/sharing/panel-share/SharePanelInternally.test.tsx b/public/app/features/dashboard-scene/sharing/panel-share/SharePanelInternally.test.tsx index d2cbfaa14f7..ac5daf5eac4 100644 --- a/public/app/features/dashboard-scene/sharing/panel-share/SharePanelInternally.test.tsx +++ b/public/app/features/dashboard-scene/sharing/panel-share/SharePanelInternally.test.tsx @@ -1,6 +1,6 @@ import { render, screen } from '@testing-library/react'; -import { getPanelPlugin } from '@grafana/data/test'; +import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { selectors as e2eSelectors } from '@grafana/e2e-selectors'; import { config, setPluginImportUtils } from '@grafana/runtime'; import { SceneTimeRange, VizPanel } from '@grafana/scenes'; diff --git a/public/app/features/dashboard/components/DashboardPrompt/DashboardPrompt.test.tsx b/public/app/features/dashboard/components/DashboardPrompt/DashboardPrompt.test.tsx index 8da1d2bb549..021060699b4 100644 --- a/public/app/features/dashboard/components/DashboardPrompt/DashboardPrompt.test.tsx +++ b/public/app/features/dashboard/components/DashboardPrompt/DashboardPrompt.test.tsx @@ -1,4 +1,4 @@ -import { getPanelPlugin } from '@grafana/data/test'; +import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { ContextSrv, setContextSrv } from '../../../../core/services/context_srv'; import { PanelModel } from '../../state/PanelModel'; diff --git a/public/app/features/dashboard/components/HelpWizard/HelpWizard.test.tsx b/public/app/features/dashboard/components/HelpWizard/HelpWizard.test.tsx index 2eb805aa87e..8fdc82a5dd8 100644 --- a/public/app/features/dashboard/components/HelpWizard/HelpWizard.test.tsx +++ b/public/app/features/dashboard/components/HelpWizard/HelpWizard.test.tsx @@ -1,7 +1,7 @@ import { render, screen } from '@testing-library/react'; import { FieldType, getDefaultTimeRange, LoadingState, toDataFrame } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test'; +import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { PanelModel } from '../../state/PanelModel'; diff --git a/public/app/features/dashboard/components/PanelEditor/OptionsPaneOptions.test.tsx b/public/app/features/dashboard/components/PanelEditor/OptionsPaneOptions.test.tsx index 91351c87a85..6387aac97a8 100644 --- a/public/app/features/dashboard/components/PanelEditor/OptionsPaneOptions.test.tsx +++ b/public/app/features/dashboard/components/PanelEditor/OptionsPaneOptions.test.tsx @@ -13,7 +13,7 @@ import { TimeRange, toDataFrame, } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test'; +import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { selectors } from '@grafana/e2e-selectors'; import { getAllOptionEditors, getAllStandardFieldConfigs } from 'app/core/components/OptionsUI/registry'; diff --git a/public/app/features/dashboard/components/PanelEditor/PanelHeaderCorner.tsx b/public/app/features/dashboard/components/PanelEditor/PanelHeaderCorner.tsx index 7e0edec648b..07936f463b8 100644 --- a/public/app/features/dashboard/components/PanelEditor/PanelHeaderCorner.tsx +++ b/public/app/features/dashboard/components/PanelEditor/PanelHeaderCorner.tsx @@ -1,7 +1,8 @@ import { css, cx } from '@emotion/css'; import { Component } from 'react'; -import { GrafanaTheme2, renderMarkdown, LinkModelSupplier, ScopedVars, IconName } from '@grafana/data'; +import { renderMarkdown, LinkModelSupplier, ScopedVars, IconName } from '@grafana/data'; +import { GrafanaTheme2 } from '@grafana/data/'; import { selectors } from '@grafana/e2e-selectors'; import { locationService, getTemplateSrv } from '@grafana/runtime'; import { Tooltip, PopoverContent, Icon, Themeable2, withTheme2, useStyles2 } from '@grafana/ui'; diff --git a/public/app/features/dashboard/components/PanelEditor/getVisualizationOptions.tsx b/public/app/features/dashboard/components/PanelEditor/getVisualizationOptions.tsx index 4b003d91c84..b62d0493c2e 100644 --- a/public/app/features/dashboard/components/PanelEditor/getVisualizationOptions.tsx +++ b/public/app/features/dashboard/components/PanelEditor/getVisualizationOptions.tsx @@ -7,9 +7,13 @@ import { PanelPlugin, StandardEditorContext, VariableSuggestionsScope, - PanelOptionsEditorBuilder, } from '@grafana/data'; -import { NestedValueAccess, isNestedPanelOptions, PanelOptionsSupplier } from '@grafana/data/internal'; +import { PanelOptionsSupplier } from '@grafana/data/src/panel/PanelPlugin'; +import { + NestedValueAccess, + PanelOptionsEditorBuilder, + isNestedPanelOptions, +} from '@grafana/data/src/utils/OptionsUIBuilders'; import { VizPanel } from '@grafana/scenes'; import { Input } from '@grafana/ui'; import { LibraryVizPanelInfo } from 'app/features/dashboard-scene/panel-edit/LibraryVizPanelInfo'; diff --git a/public/app/features/dashboard/components/PanelEditor/state/actions.test.ts b/public/app/features/dashboard/components/PanelEditor/state/actions.test.ts index ab46604bb92..b661ef017b8 100644 --- a/public/app/features/dashboard/components/PanelEditor/state/actions.test.ts +++ b/public/app/features/dashboard/components/PanelEditor/state/actions.test.ts @@ -1,5 +1,5 @@ import { PanelPlugin } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test'; +import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { LibraryElementDTOMeta } from '@grafana/schema'; import { createDashboardModelFixture } from 'app/features/dashboard/state/__fixtures__/dashboardFixtures'; import { panelModelAndPluginReady, removePanel } from 'app/features/panel/state/reducers'; diff --git a/public/app/features/dashboard/components/PublicDashboardNotAvailable/PublicDashboardNotAvailable.tsx b/public/app/features/dashboard/components/PublicDashboardNotAvailable/PublicDashboardNotAvailable.tsx index e413a750181..4bf24218d60 100644 --- a/public/app/features/dashboard/components/PublicDashboardNotAvailable/PublicDashboardNotAvailable.tsx +++ b/public/app/features/dashboard/components/PublicDashboardNotAvailable/PublicDashboardNotAvailable.tsx @@ -1,6 +1,6 @@ import { css, cx } from '@emotion/css'; -import { GrafanaTheme2 } from '@grafana/data'; +import { GrafanaTheme2 } from '@grafana/data/src'; import { selectors as e2eSelectors } from '@grafana/e2e-selectors/src'; import { useStyles2 } from '@grafana/ui'; diff --git a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ConfigPublicDashboard/ConfigPublicDashboard.tsx b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ConfigPublicDashboard/ConfigPublicDashboard.tsx index 5cf08218411..b83161aa968 100644 --- a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ConfigPublicDashboard/ConfigPublicDashboard.tsx +++ b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ConfigPublicDashboard/ConfigPublicDashboard.tsx @@ -1,7 +1,7 @@ import { css } from '@emotion/css'; import { useForm } from 'react-hook-form'; -import { GrafanaTheme2, TimeRange } from '@grafana/data'; +import { GrafanaTheme2, TimeRange } from '@grafana/data/src'; import { selectors as e2eSelectors } from '@grafana/e2e-selectors/src'; import { Button, diff --git a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ConfigPublicDashboard/Configuration.tsx b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ConfigPublicDashboard/Configuration.tsx index 5156356f470..eb9a3d8a34f 100644 --- a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ConfigPublicDashboard/Configuration.tsx +++ b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ConfigPublicDashboard/Configuration.tsx @@ -1,6 +1,6 @@ import { UseFormRegister } from 'react-hook-form'; -import { TimeRange } from '@grafana/data'; +import { TimeRange } from '@grafana/data/src'; import { selectors as e2eSelectors } from '@grafana/e2e-selectors/src'; import { FieldSet, Label, Switch, TimeRangeInput, Stack, VerticalGroup } from '@grafana/ui'; import { Trans, t } from 'app/core/internationalization'; diff --git a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/CreatePublicDashboard/AcknowledgeCheckboxes.tsx b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/CreatePublicDashboard/AcknowledgeCheckboxes.tsx index d1913aa3b9f..574e289609a 100644 --- a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/CreatePublicDashboard/AcknowledgeCheckboxes.tsx +++ b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/CreatePublicDashboard/AcknowledgeCheckboxes.tsx @@ -1,7 +1,7 @@ import { css } from '@emotion/css'; import { UseFormRegister } from 'react-hook-form'; -import { GrafanaTheme2 } from '@grafana/data'; +import { GrafanaTheme2 } from '@grafana/data/src'; import { selectors as e2eSelectors } from '@grafana/e2e-selectors/src'; import { Checkbox, FieldSet, HorizontalGroup, LinkButton, useStyles2, VerticalGroup } from '@grafana/ui'; import { t, Trans } from 'app/core/internationalization'; diff --git a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ModalAlerts/UnsupportedDataSourcesAlert.tsx b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ModalAlerts/UnsupportedDataSourcesAlert.tsx index 1df2bbeac48..3850c5e8b17 100644 --- a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ModalAlerts/UnsupportedDataSourcesAlert.tsx +++ b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ModalAlerts/UnsupportedDataSourcesAlert.tsx @@ -1,7 +1,7 @@ import { css } from '@emotion/css'; import cx from 'classnames'; -import { GrafanaTheme2 } from '@grafana/data'; +import { GrafanaTheme2 } from '@grafana/data/src'; import { selectors as e2eSelectors } from '@grafana/e2e-selectors/src'; import { config } from '@grafana/runtime'; import { Alert, useStyles2 } from '@grafana/ui'; diff --git a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboard.test.tsx b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboard.test.tsx index 9a0357f0626..12d213f8501 100644 --- a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboard.test.tsx +++ b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboard.test.tsx @@ -3,7 +3,7 @@ import userEvent from '@testing-library/user-event'; import { http, HttpResponse } from 'msw'; import { setupServer } from 'msw/node'; -import { BootData, DataQuery } from '@grafana/data'; +import { BootData, DataQuery } from '@grafana/data/src'; import { selectors as e2eSelectors } from '@grafana/e2e-selectors/src'; import { reportInteraction, setEchoSrv } from '@grafana/runtime'; import { Panel } from '@grafana/schema'; diff --git a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboard.tsx b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboard.tsx index 329e0d5ef08..8cbfdd8bd57 100644 --- a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboard.tsx +++ b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboard.tsx @@ -1,6 +1,6 @@ import { css } from '@emotion/css'; -import { GrafanaTheme2 } from '@grafana/data'; +import { GrafanaTheme2 } from '@grafana/data/src'; import { Spinner, useStyles2 } from '@grafana/ui'; import { useGetPublicDashboardQuery } from 'app/features/dashboard/api/publicDashboardApi'; import { publicDashboardPersisted } from 'app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboardUtils'; diff --git a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboardUtils.test.tsx b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboardUtils.test.tsx index 6ca108fc542..7a14d0a4e45 100644 --- a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboardUtils.test.tsx +++ b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboardUtils.test.tsx @@ -1,4 +1,5 @@ -import { DataSourceRef, DataQuery, TypedVariableModel } from '@grafana/data'; +import { TypedVariableModel } from '@grafana/data'; +import { DataSourceRef, DataQuery } from '@grafana/data/src/types/query'; import { DataSourceWithBackend } from '@grafana/runtime'; import { updateConfig } from 'app/core/config'; import { mockDataSource } from 'app/features/alerting/unified/mocks'; diff --git a/public/app/features/dashboard/components/SubMenu/DashboardLinks.tsx b/public/app/features/dashboard/components/SubMenu/DashboardLinks.tsx index 65a7c39b335..1fa176900eb 100644 --- a/public/app/features/dashboard/components/SubMenu/DashboardLinks.tsx +++ b/public/app/features/dashboard/components/SubMenu/DashboardLinks.tsx @@ -1,6 +1,6 @@ import { useEffectOnce } from 'react-use'; -import { sanitizeUrl } from '@grafana/data/internal'; +import { sanitizeUrl } from '@grafana/data/src/text/sanitize'; import { selectors } from '@grafana/e2e-selectors'; import { TimeRangeUpdatedEvent } from '@grafana/runtime'; import { DashboardLink } from '@grafana/schema'; diff --git a/public/app/features/dashboard/components/SubMenu/DashboardLinksDashboard.tsx b/public/app/features/dashboard/components/SubMenu/DashboardLinksDashboard.tsx index 7beb284f28b..f36232b7b2b 100644 --- a/public/app/features/dashboard/components/SubMenu/DashboardLinksDashboard.tsx +++ b/public/app/features/dashboard/components/SubMenu/DashboardLinksDashboard.tsx @@ -3,7 +3,7 @@ import { forwardRef } from 'react'; import { useAsync } from 'react-use'; import { GrafanaTheme2, ScopedVars } from '@grafana/data'; -import { sanitize, sanitizeUrl } from '@grafana/data/internal'; +import { sanitize, sanitizeUrl } from '@grafana/data/src/text/sanitize'; import { selectors } from '@grafana/e2e-selectors'; import { DashboardLink } from '@grafana/schema'; import { Dropdown, Icon, LinkButton, Button, Menu, ScrollContainer, useStyles2 } from '@grafana/ui'; diff --git a/public/app/features/dashboard/state/DashboardMigrator.test.ts b/public/app/features/dashboard/state/DashboardMigrator.test.ts index f0ed1f72c82..70a80fb2da1 100644 --- a/public/app/features/dashboard/state/DashboardMigrator.test.ts +++ b/public/app/features/dashboard/state/DashboardMigrator.test.ts @@ -1,7 +1,7 @@ import { each, map } from 'lodash'; import { DataLinkBuiltInVars, MappingType, VariableHide } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test'; +import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { FieldConfigSource } from '@grafana/schema'; import { config } from 'app/core/config'; import { GRID_CELL_HEIGHT, GRID_CELL_VMARGIN } from 'app/core/constants'; diff --git a/public/app/features/dashboard/state/DashboardMigrator.ts b/public/app/features/dashboard/state/DashboardMigrator.ts index 44796c1e6f9..bab206f9792 100644 --- a/public/app/features/dashboard/state/DashboardMigrator.ts +++ b/public/app/features/dashboard/state/DashboardMigrator.ts @@ -27,7 +27,8 @@ import { ValueMapping, VariableHide, } from '@grafana/data'; -import { labelsToFieldsTransformer, mergeTransformer } from '@grafana/data/internal'; +import { labelsToFieldsTransformer } from '@grafana/data/src/transformations/transformers/labelsToFields'; +import { mergeTransformer } from '@grafana/data/src/transformations/transformers/merge'; import { getDataSourceSrv, setDataSourceSrv } from '@grafana/runtime'; import { DataTransformerConfig } from '@grafana/schema'; import { AxisPlacement, GraphFieldConfig } from '@grafana/ui'; diff --git a/public/app/features/dashboard/state/PanelModel.test.ts b/public/app/features/dashboard/state/PanelModel.test.ts index 092ec0e0947..a8a7aaae420 100644 --- a/public/app/features/dashboard/state/PanelModel.test.ts +++ b/public/app/features/dashboard/state/PanelModel.test.ts @@ -11,7 +11,8 @@ import { PanelMigrationHandler, PanelTypeChangedHandler, } from '@grafana/data'; -import { getPanelPlugin, mockStandardFieldConfigOptions } from '@grafana/data/test'; +import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { mockStandardFieldConfigOptions } from '@grafana/data/test/helpers/fieldConfig'; import { setTemplateSrv } from '@grafana/runtime'; import { queryBuilder } from 'app/features/variables/shared/testing/builders'; diff --git a/public/app/features/dashboard/utils/panel.test.ts b/public/app/features/dashboard/utils/panel.test.ts index 0a444a7726a..a739dcedab4 100644 --- a/public/app/features/dashboard/utils/panel.test.ts +++ b/public/app/features/dashboard/utils/panel.test.ts @@ -2,7 +2,7 @@ import { advanceTo, clear } from 'jest-date-mock'; import { ComponentClass } from 'react'; import { dateTime, DateTime, PanelProps, TimeRange } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test'; +import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { applyPanelTimeOverrides, calculateInnerPanelHeight } from 'app/features/dashboard/utils/panel'; import { PanelModel } from '../state/PanelModel'; diff --git a/public/app/features/dashboard/utils/timeRange.ts b/public/app/features/dashboard/utils/timeRange.ts index da144cf427c..79cf1f10244 100644 --- a/public/app/features/dashboard/utils/timeRange.ts +++ b/public/app/features/dashboard/utils/timeRange.ts @@ -1,4 +1,5 @@ -import { dateMath, dateTime, isDateTime, DateTime, TimeRange } from '@grafana/data'; +import { DateTime, TimeRange } from '@grafana/data'; +import { dateMath, dateTime, isDateTime } from '@grafana/data/src'; import { TimeModel } from 'app/features/dashboard/state/TimeModel'; export const getTimeRange = ( diff --git a/public/app/features/datasources/components/CloudInfoBox.tsx b/public/app/features/datasources/components/CloudInfoBox.tsx index 17e6b6d26b8..c34c44ce810 100644 --- a/public/app/features/datasources/components/CloudInfoBox.tsx +++ b/public/app/features/datasources/components/CloudInfoBox.tsx @@ -1,5 +1,5 @@ import { DataSourceSettings } from '@grafana/data'; -import { GrafanaEdition } from '@grafana/data/internal'; +import { GrafanaEdition } from '@grafana/data/src/types/config'; import { Alert } from '@grafana/ui'; import { LocalStorageValueProvider } from 'app/core/components/LocalStorageValueProvider'; import { config } from 'app/core/config'; diff --git a/public/app/features/datasources/state/buildCategories.test.ts b/public/app/features/datasources/state/buildCategories.test.ts index 297c413073d..5370c5a5789 100644 --- a/public/app/features/datasources/state/buildCategories.test.ts +++ b/public/app/features/datasources/state/buildCategories.test.ts @@ -1,5 +1,5 @@ import { DataSourcePluginMeta } from '@grafana/data'; -import { getMockPlugin } from '@grafana/data/test'; +import { getMockPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { buildCategories } from './buildCategories'; diff --git a/public/app/features/dimensions/context.ts b/public/app/features/dimensions/context.ts index bd0755de986..a4693ada2a9 100644 --- a/public/app/features/dimensions/context.ts +++ b/public/app/features/dimensions/context.ts @@ -1,4 +1,4 @@ -import { PanelData } from '@grafana/data'; +import { PanelData } from '@grafana/data/src'; import { ColorDimensionConfig, ResourceDimensionConfig, diff --git a/public/app/features/dimensions/scale.ts b/public/app/features/dimensions/scale.ts index 7c82df3c29d..06f3be04dee 100644 --- a/public/app/features/dimensions/scale.ts +++ b/public/app/features/dimensions/scale.ts @@ -1,4 +1,5 @@ -import { getMinMaxAndDelta, DataFrame, Field } from '@grafana/data'; +import { DataFrame, Field } from '@grafana/data'; +import { getMinMaxAndDelta } from '@grafana/data/src/field/scale'; import { ScaleDimensionConfig, ScaleDimensionMode } from '@grafana/schema'; import { DimensionSupplier, ScaleDimensionOptions } from './types'; diff --git a/public/app/features/explore/Logs/Logs.test.tsx b/public/app/features/explore/Logs/Logs.test.tsx index 85b5906eef6..958bad54ad4 100644 --- a/public/app/features/explore/Logs/Logs.test.tsx +++ b/public/app/features/explore/Logs/Logs.test.tsx @@ -16,7 +16,7 @@ import { ExploreLogsPanelState, DataQuery, } from '@grafana/data'; -import { organizeFieldsTransformer } from '@grafana/data/internal'; +import { organizeFieldsTransformer } from '@grafana/data/src/transformations/transformers/organize'; import { config } from '@grafana/runtime'; import { extractFieldsTransformer } from 'app/features/transformers/extractFields/extractFields'; import { LokiQueryDirection } from 'app/plugins/datasource/loki/dataquery.gen'; diff --git a/public/app/features/explore/Logs/LogsColumnSearch.tsx b/public/app/features/explore/Logs/LogsColumnSearch.tsx index 6919e9e3fcf..16e24d48954 100644 --- a/public/app/features/explore/Logs/LogsColumnSearch.tsx +++ b/public/app/features/explore/Logs/LogsColumnSearch.tsx @@ -1,7 +1,7 @@ import { css } from '@emotion/css'; import * as React from 'react'; -import { GrafanaTheme2 } from '@grafana/data'; +import { GrafanaTheme2 } from '@grafana/data/src'; import { Field, Input, useTheme2 } from '@grafana/ui'; function getStyles(theme: GrafanaTheme2) { diff --git a/public/app/features/explore/Logs/LogsMetaRow.test.tsx b/public/app/features/explore/Logs/LogsMetaRow.test.tsx index e66a3d1bd77..ce63d19b4d0 100644 --- a/public/app/features/explore/Logs/LogsMetaRow.test.tsx +++ b/public/app/features/explore/Logs/LogsMetaRow.test.tsx @@ -4,7 +4,7 @@ import saveAs from 'file-saver'; import { ComponentProps } from 'react'; import { FieldType, LogLevel, LogsDedupStrategy, standardTransformersRegistry, toDataFrame } from '@grafana/data'; -import { organizeFieldsTransformer } from '@grafana/data/internal'; +import { organizeFieldsTransformer } from '@grafana/data/src/transformations/transformers/organize'; import { config } from '@grafana/runtime'; import { MAX_CHARACTERS } from '../../logs/components/LogRowMessage'; diff --git a/public/app/features/explore/Logs/LogsMetaRow.tsx b/public/app/features/explore/Logs/LogsMetaRow.tsx index ba07fdf71b2..9db3be0ebdd 100644 --- a/public/app/features/explore/Logs/LogsMetaRow.tsx +++ b/public/app/features/explore/Logs/LogsMetaRow.tsx @@ -14,8 +14,8 @@ import { DataTransformerConfig, CustomTransformOperator, Labels, - DataFrame, } from '@grafana/data'; +import { DataFrame } from '@grafana/data/'; import { config, reportInteraction } from '@grafana/runtime'; import { Button, Dropdown, Menu, ToolbarButton, Tooltip, useStyles2 } from '@grafana/ui'; diff --git a/public/app/features/explore/Logs/LogsTable.test.tsx b/public/app/features/explore/Logs/LogsTable.test.tsx index a8fa211431e..6dff92ec2c5 100644 --- a/public/app/features/explore/Logs/LogsTable.test.tsx +++ b/public/app/features/explore/Logs/LogsTable.test.tsx @@ -2,7 +2,7 @@ import { render, screen, waitFor } from '@testing-library/react'; import { ComponentProps } from 'react'; import { DataFrame, FieldType, LogsSortOrder, standardTransformersRegistry, toUtc } from '@grafana/data'; -import { organizeFieldsTransformer } from '@grafana/data/internal'; +import { organizeFieldsTransformer } from '@grafana/data/src/transformations/transformers/organize'; import { config } from '@grafana/runtime'; import { extractFieldsTransformer } from 'app/features/transformers/extractFields/extractFields'; diff --git a/public/app/features/explore/Logs/LogsTableActiveFields.tsx b/public/app/features/explore/Logs/LogsTableActiveFields.tsx index c228c7aaf7b..eb833030106 100644 --- a/public/app/features/explore/Logs/LogsTableActiveFields.tsx +++ b/public/app/features/explore/Logs/LogsTableActiveFields.tsx @@ -1,7 +1,7 @@ import { css, cx } from '@emotion/css'; import { DragDropContext, Draggable, DraggableProvided, Droppable, DropResult } from '@hello-pangea/dnd'; -import { GrafanaTheme2 } from '@grafana/data'; +import { GrafanaTheme2 } from '@grafana/data/src'; import { useTheme2 } from '@grafana/ui'; import { LogsTableEmptyFields } from './LogsTableEmptyFields'; diff --git a/public/app/features/explore/Logs/LogsTableMultiSelect.tsx b/public/app/features/explore/Logs/LogsTableMultiSelect.tsx index 19e10e72f4b..10308e761a7 100644 --- a/public/app/features/explore/Logs/LogsTableMultiSelect.tsx +++ b/public/app/features/explore/Logs/LogsTableMultiSelect.tsx @@ -1,6 +1,6 @@ import { css } from '@emotion/css'; -import { GrafanaTheme2 } from '@grafana/data'; +import { GrafanaTheme2 } from '@grafana/data/src'; import { useTheme2 } from '@grafana/ui'; import { LogsTableActiveFields } from './LogsTableActiveFields'; diff --git a/public/app/features/explore/Logs/LogsTableWrap.test.tsx b/public/app/features/explore/Logs/LogsTableWrap.test.tsx index 3fd2add101f..a862b326065 100644 --- a/public/app/features/explore/Logs/LogsTableWrap.test.tsx +++ b/public/app/features/explore/Logs/LogsTableWrap.test.tsx @@ -1,8 +1,14 @@ import { act, fireEvent, render, screen, waitFor } from '@testing-library/react'; import { ComponentProps } from 'react'; -import { createTheme, ExploreLogsPanelState, LogsSortOrder, standardTransformersRegistry, toUtc } from '@grafana/data'; -import { organizeFieldsTransformer } from '@grafana/data/internal'; +import { + createTheme, + ExploreLogsPanelState, + LogsSortOrder, + standardTransformersRegistry, + toUtc, +} from '@grafana/data/src'; +import { organizeFieldsTransformer } from '@grafana/data/src/transformations/transformers/organize'; import { config } from '@grafana/runtime'; import { extractFieldsTransformer } from '../../transformers/extractFields/extractFields'; diff --git a/public/app/features/explore/Logs/utils/testMocks.test.ts b/public/app/features/explore/Logs/utils/testMocks.test.ts index aadea96a5e7..55a19433b20 100644 --- a/public/app/features/explore/Logs/utils/testMocks.test.ts +++ b/public/app/features/explore/Logs/utils/testMocks.test.ts @@ -1,4 +1,4 @@ -import { DataFrame, Field, FieldType } from '@grafana/data'; +import { DataFrame, Field, FieldType } from '@grafana/data/src'; import { DataFrameType } from '../../../../../../packages/grafana-data'; diff --git a/public/app/features/explore/NoData.tsx b/public/app/features/explore/NoData.tsx index 38384793050..130f38750ef 100644 --- a/public/app/features/explore/NoData.tsx +++ b/public/app/features/explore/NoData.tsx @@ -1,6 +1,6 @@ import { css } from '@emotion/css'; -import { GrafanaTheme2 } from '@grafana/data'; +import { GrafanaTheme2 } from '@grafana/data/src'; import { useStyles2, PanelContainer } from '@grafana/ui'; export const NoData = () => { diff --git a/public/app/features/explore/PrometheusListView/ItemLabels.tsx b/public/app/features/explore/PrometheusListView/ItemLabels.tsx index 4fb465818cc..4f0884ab71b 100644 --- a/public/app/features/explore/PrometheusListView/ItemLabels.tsx +++ b/public/app/features/explore/PrometheusListView/ItemLabels.tsx @@ -1,6 +1,6 @@ import { css } from '@emotion/css'; -import { Field, GrafanaTheme2 } from '@grafana/data'; +import { Field, GrafanaTheme2 } from '@grafana/data/'; import { InstantQueryRefIdIndex } from '@grafana/prometheus'; import { useStyles2 } from '@grafana/ui'; diff --git a/public/app/features/explore/PrometheusListView/ItemValues.tsx b/public/app/features/explore/PrometheusListView/ItemValues.tsx index ab46049a540..2cb61be35c0 100644 --- a/public/app/features/explore/PrometheusListView/ItemValues.tsx +++ b/public/app/features/explore/PrometheusListView/ItemValues.tsx @@ -1,6 +1,6 @@ import { css } from '@emotion/css'; -import { GrafanaTheme2 } from '@grafana/data'; +import { GrafanaTheme2 } from '@grafana/data/'; import { useStyles2 } from '@grafana/ui'; import { rawListItemColumnWidth, rawListPaddingToHoldSpaceForCopyIcon, RawListValue } from './RawListItem'; diff --git a/public/app/features/explore/PrometheusListView/RawListContainer.test.tsx b/public/app/features/explore/PrometheusListView/RawListContainer.test.tsx index 896b5dd7ba8..8f3d27dbac8 100644 --- a/public/app/features/explore/PrometheusListView/RawListContainer.test.tsx +++ b/public/app/features/explore/PrometheusListView/RawListContainer.test.tsx @@ -1,6 +1,6 @@ import { render, screen, within } from '@testing-library/react'; -import { FieldType, FormattedValue, toDataFrame } from '@grafana/data'; +import { FieldType, FormattedValue, toDataFrame } from '@grafana/data/src'; import RawListContainer, { RawListContainerProps } from './RawListContainer'; diff --git a/public/app/features/explore/PrometheusListView/RawListContainer.tsx b/public/app/features/explore/PrometheusListView/RawListContainer.tsx index eb0717b6c43..ee8dedfd5ab 100644 --- a/public/app/features/explore/PrometheusListView/RawListContainer.tsx +++ b/public/app/features/explore/PrometheusListView/RawListContainer.tsx @@ -4,7 +4,7 @@ import { useEffect, useId, useRef, useState } from 'react'; import { useWindowSize } from 'react-use'; import { VariableSizeList as List } from 'react-window'; -import { DataFrame, Field as DataFrameField } from '@grafana/data'; +import { DataFrame, Field as DataFrameField } from '@grafana/data/'; import { reportInteraction } from '@grafana/runtime/src'; import { Field, Switch } from '@grafana/ui'; diff --git a/public/app/features/explore/PrometheusListView/RawListItem.tsx b/public/app/features/explore/PrometheusListView/RawListItem.tsx index a396a636a2b..b5a4e5b9433 100644 --- a/public/app/features/explore/PrometheusListView/RawListItem.tsx +++ b/public/app/features/explore/PrometheusListView/RawListItem.tsx @@ -1,7 +1,7 @@ import { css } from '@emotion/css'; import { useCopyToClipboard } from 'react-use'; -import { Field, GrafanaTheme2 } from '@grafana/data'; +import { Field, GrafanaTheme2 } from '@grafana/data/'; import { isValidLegacyName, utf8Support } from '@grafana/prometheus/src/utf8_support'; import { reportInteraction } from '@grafana/runtime/src'; import { IconButton, useStyles2 } from '@grafana/ui'; diff --git a/public/app/features/explore/PrometheusListView/RawListItemAttributes.tsx b/public/app/features/explore/PrometheusListView/RawListItemAttributes.tsx index 8d9ecb28fe2..bbc7962c918 100644 --- a/public/app/features/explore/PrometheusListView/RawListItemAttributes.tsx +++ b/public/app/features/explore/PrometheusListView/RawListItemAttributes.tsx @@ -1,6 +1,6 @@ import { css } from '@emotion/css'; -import { GrafanaTheme2 } from '@grafana/data'; +import { GrafanaTheme2 } from '@grafana/data/'; import { useStyles2 } from '@grafana/ui'; import { RawListValue } from './RawListItem'; diff --git a/public/app/features/explore/state/main.test.ts b/public/app/features/explore/state/main.test.ts index d52a1be7211..28fe5009234 100644 --- a/public/app/features/explore/state/main.test.ts +++ b/public/app/features/explore/state/main.test.ts @@ -1,6 +1,7 @@ import { thunkTester } from 'test/core/thunk/thunkTester'; -import { dateTime, ExploreUrlState, serializeStateToUrlParam } from '@grafana/data'; +import { dateTime, ExploreUrlState } from '@grafana/data'; +import { serializeStateToUrlParam } from '@grafana/data/src/utils/url'; import { locationService } from '@grafana/runtime'; import { PanelModel } from 'app/features/dashboard/state/PanelModel'; diff --git a/public/app/features/live/centrifuge/LiveDataStream.ts b/public/app/features/live/centrifuge/LiveDataStream.ts index 6d0787c205f..a4b6eb80255 100644 --- a/public/app/features/live/centrifuge/LiveDataStream.ts +++ b/public/app/features/live/centrifuge/LiveDataStream.ts @@ -12,7 +12,7 @@ import { LoadingState, StreamingDataFrame, } from '@grafana/data'; -import { getStreamingFrameOptions } from '@grafana/data/internal'; +import { getStreamingFrameOptions } from '@grafana/data/src/dataframe/StreamingDataFrame'; import { LiveDataStreamOptions, StreamingFrameAction, StreamingFrameOptions } from '@grafana/runtime/src/services/live'; import { toDataQueryError } from '@grafana/runtime/src/utils/toDataQueryError'; diff --git a/public/app/features/logs/components/InfiniteScroll.test.tsx b/public/app/features/logs/components/InfiniteScroll.test.tsx index dfbb093c17f..c6b92afaef5 100644 --- a/public/app/features/logs/components/InfiniteScroll.test.tsx +++ b/public/app/features/logs/components/InfiniteScroll.test.tsx @@ -2,7 +2,8 @@ import { act, render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { useEffect, useRef, useState } from 'react'; -import { CoreApp, LogRowModel, dateTimeForTimeZone, rangeUtil } from '@grafana/data'; +import { CoreApp, LogRowModel, dateTimeForTimeZone } from '@grafana/data'; +import { convertRawToRange } from '@grafana/data/src/datetime/rangeutil'; import { config } from '@grafana/runtime'; import { LogsSortOrder } from '@grafana/schema'; @@ -15,7 +16,7 @@ const absoluteRange = { from: 1702578600000, to: 1702578900000, }; -const defaultRange = rangeUtil.convertRawToRange({ +const defaultRange = convertRawToRange({ from: dateTimeForTimeZone(defaultTz, absoluteRange.from), to: dateTimeForTimeZone(defaultTz, absoluteRange.to), }); diff --git a/public/app/features/logs/components/InfiniteScroll.tsx b/public/app/features/logs/components/InfiniteScroll.tsx index df0b3109237..36d748d2db1 100644 --- a/public/app/features/logs/components/InfiniteScroll.tsx +++ b/public/app/features/logs/components/InfiniteScroll.tsx @@ -1,8 +1,8 @@ import { css } from '@emotion/css'; import { ReactNode, MutableRefObject, useCallback, useEffect, useRef, useState } from 'react'; -import { AbsoluteTimeRange, CoreApp, LogRowModel, TimeRange, rangeUtil } from '@grafana/data'; -// import { convertRawToRange, isRelativeTime, isRelativeTimeRange } from '@grafana/data/internal'; +import { AbsoluteTimeRange, CoreApp, LogRowModel, TimeRange } from '@grafana/data'; +import { convertRawToRange, isRelativeTime, isRelativeTimeRange } from '@grafana/data/src/datetime/rangeutil'; import { config, reportInteraction } from '@grafana/runtime'; import { LogsSortOrder, TimeZone } from '@grafana/schema'; import { Button, Icon } from '@grafana/ui'; @@ -140,8 +140,8 @@ export const InfiniteScroll = ({ }, [loadMoreLogs, loading, range, rows, scrollElement, sortOrder, timeZone, topScrollEnabled]); // We allow "now" to move when using relative time, so we hide the message so it doesn't flash. - const hideTopMessage = sortOrder === LogsSortOrder.Descending && rangeUtil.isRelativeTime(range.raw.to); - const hideBottomMessage = sortOrder === LogsSortOrder.Ascending && rangeUtil.isRelativeTime(range.raw.to); + const hideTopMessage = sortOrder === LogsSortOrder.Descending && isRelativeTime(range.raw.to); + const hideBottomMessage = sortOrder === LogsSortOrder.Ascending && isRelativeTime(range.raw.to); const loadOlderLogs = useCallback(() => { //If we are not on the last page, use next page's range @@ -344,7 +344,5 @@ export function canScrollBottom( // Given a TimeRange, returns a new instance if using relative time, or else the same. function updateCurrentRange(timeRange: TimeRange, timeZone: TimeZone) { - return rangeUtil.isRelativeTimeRange(timeRange.raw) - ? rangeUtil.convertRawToRange(timeRange.raw, timeZone) - : timeRange; + return isRelativeTimeRange(timeRange.raw) ? convertRawToRange(timeRange.raw, timeZone) : timeRange; } diff --git a/public/app/features/logs/components/LogDetailsRow.test.tsx b/public/app/features/logs/components/LogDetailsRow.test.tsx index 4463adde1f7..5f3229255b3 100644 --- a/public/app/features/logs/components/LogDetailsRow.test.tsx +++ b/public/app/features/logs/components/LogDetailsRow.test.tsx @@ -1,7 +1,8 @@ import { fireEvent, render, screen } from '@testing-library/react'; import { ComponentProps } from 'react'; -import { Field, CoreApp, FieldType, LinkModel } from '@grafana/data'; +import { CoreApp, FieldType, LinkModel } from '@grafana/data'; +import { Field } from '@grafana/data/'; import { LogDetailsRow } from './LogDetailsRow'; import { createLogRow } from './__mocks__/logRow'; diff --git a/public/app/features/logs/logsModel.ts b/public/app/features/logs/logsModel.ts index a63e464c62f..60aef4364bd 100644 --- a/public/app/features/logs/logsModel.ts +++ b/public/app/features/logs/logsModel.ts @@ -39,7 +39,7 @@ import { toDataFrame, toUtc, } from '@grafana/data'; -import { SIPrefix } from '@grafana/data/internal'; +import { SIPrefix } from '@grafana/data/src/valueFormats/symbolFormatters'; import { config } from '@grafana/runtime'; import { BarAlignment, GraphDrawStyle, StackingMode } from '@grafana/schema'; import { colors } from '@grafana/ui'; diff --git a/public/app/features/manage-dashboards/components/PublicDashboardListTable/DeletePublicDashboardModal.tsx b/public/app/features/manage-dashboards/components/PublicDashboardListTable/DeletePublicDashboardModal.tsx index dabaa6d3473..8e3766ce457 100644 --- a/public/app/features/manage-dashboards/components/PublicDashboardListTable/DeletePublicDashboardModal.tsx +++ b/public/app/features/manage-dashboards/components/PublicDashboardListTable/DeletePublicDashboardModal.tsx @@ -1,6 +1,6 @@ import { css } from '@emotion/css'; -import { GrafanaTheme2 } from '@grafana/data'; +import { GrafanaTheme2 } from '@grafana/data/src'; import { config } from '@grafana/runtime'; import { ConfirmModal, useStyles2 } from '@grafana/ui'; import { t } from 'app/core/internationalization'; diff --git a/public/app/features/panel/state/actions.test.ts b/public/app/features/panel/state/actions.test.ts index 98c0105f848..0f6dc41284d 100644 --- a/public/app/features/panel/state/actions.test.ts +++ b/public/app/features/panel/state/actions.test.ts @@ -1,5 +1,6 @@ import { standardEditorsRegistry, standardFieldConfigEditorRegistry } from '@grafana/data'; -import { getPanelPlugin, mockStandardFieldConfigOptions } from '@grafana/data/test'; +import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; +import { mockStandardFieldConfigOptions } from '@grafana/data/test/helpers/fieldConfig'; import { PanelModel } from 'app/features/dashboard/state/PanelModel'; import { panelPluginLoaded } from 'app/features/plugins/admin/state/actions'; diff --git a/public/app/features/plugins/components/AppRootPage.test.tsx b/public/app/features/plugins/components/AppRootPage.test.tsx index bef9ed62306..594028bcebf 100644 --- a/public/app/features/plugins/components/AppRootPage.test.tsx +++ b/public/app/features/plugins/components/AppRootPage.test.tsx @@ -4,7 +4,7 @@ import { Routes, Route, Link } from 'react-router-dom-v5-compat'; import { render } from 'test/test-utils'; import { AppPlugin, PluginType, AppRootProps, NavModelItem, PluginIncludeType, OrgRole } from '@grafana/data'; -import { getMockPlugin } from '@grafana/data/test'; +import { getMockPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { setEchoSrv } from '@grafana/runtime'; import { GrafanaRouteWrapper } from 'app/core/navigation/GrafanaRoute'; import { contextSrv } from 'app/core/services/context_srv'; diff --git a/public/app/features/plugins/extensions/registry/AddedLinksRegistry.ts b/public/app/features/plugins/extensions/registry/AddedLinksRegistry.ts index 12024fd0863..52a1ad9a96c 100644 --- a/public/app/features/plugins/extensions/registry/AddedLinksRegistry.ts +++ b/public/app/features/plugins/extensions/registry/AddedLinksRegistry.ts @@ -1,7 +1,7 @@ import { ReplaySubject } from 'rxjs'; import { IconName, PluginExtensionAddedLinkConfig } from '@grafana/data'; -import { PluginAddedLinksConfigureFunc, PluginExtensionEventHelpers } from '@grafana/data/internal'; +import { PluginAddedLinksConfigureFunc, PluginExtensionEventHelpers } from '@grafana/data/src/types/pluginExtensions'; import * as errors from '../errors'; import { isGrafanaDevMode } from '../utils'; diff --git a/public/app/features/plugins/extensions/validators.ts b/public/app/features/plugins/extensions/validators.ts index 4106544567f..cbdaf81e935 100644 --- a/public/app/features/plugins/extensions/validators.ts +++ b/public/app/features/plugins/extensions/validators.ts @@ -1,14 +1,13 @@ -import { - type PluginExtensionAddedLinkConfig, - type PluginExtension, - type PluginExtensionLink, - type PluginContextType, - type PluginExtensionAddedComponentConfig, - type PluginExtensionExposedComponentConfig, - type PluginExtensionAddedFunctionConfig, - PluginExtensionPoints, +import type { + PluginExtensionAddedLinkConfig, + PluginExtension, + PluginExtensionLink, + PluginContextType, + PluginExtensionAddedComponentConfig, + PluginExtensionExposedComponentConfig, + PluginExtensionAddedFunctionConfig, } from '@grafana/data'; -import { PluginAddedLinksConfigureFunc } from '@grafana/data/internal'; +import { PluginAddedLinksConfigureFunc, PluginExtensionPoints } from '@grafana/data/src/types/pluginExtensions'; import { config, isPluginExtensionLink } from '@grafana/runtime'; import * as errors from './errors'; diff --git a/public/app/features/plugins/loader/sharedDependencies.ts b/public/app/features/plugins/loader/sharedDependencies.ts index 0551cd8d170..dc88d5a292c 100644 --- a/public/app/features/plugins/loader/sharedDependencies.ts +++ b/public/app/features/plugins/loader/sharedDependencies.ts @@ -49,7 +49,7 @@ export const sharedDependenciesMap = { '@emotion/css': () => import('@emotion/css'), '@emotion/react': () => import('@emotion/react'), '@grafana/data': grafanaData, - '@grafana/data/unstable': () => import('@grafana/data/unstable'), + '@grafana/data/unstable': () => import('@grafana/data/src/unstable'), '@grafana/runtime': grafanaRuntime, '@grafana/runtime/unstable': () => import('@grafana/runtime/src/unstable'), '@grafana/slate-react': () => import('slate-react'), diff --git a/public/app/features/plugins/pluginPreloader.ts b/public/app/features/plugins/pluginPreloader.ts index 43b58f2d08e..8b7a85759be 100644 --- a/public/app/features/plugins/pluginPreloader.ts +++ b/public/app/features/plugins/pluginPreloader.ts @@ -1,8 +1,5 @@ -import type { - PluginExtensionAddedLinkConfig, - PluginExtensionExposedComponentConfig, - PluginExtensionAddedComponentConfig, -} from '@grafana/data'; +import type { PluginExtensionAddedLinkConfig, PluginExtensionExposedComponentConfig } from '@grafana/data'; +import { PluginExtensionAddedComponentConfig } from '@grafana/data/src/types/pluginExtensions'; import type { AppPluginConfig } from '@grafana/runtime'; import { getPluginSettings } from 'app/features/plugins/pluginSettings'; diff --git a/public/app/features/scopes/tests/utils/render.tsx b/public/app/features/scopes/tests/utils/render.tsx index 391331eb5f1..3fa447d952b 100644 --- a/public/app/features/scopes/tests/utils/render.tsx +++ b/public/app/features/scopes/tests/utils/render.tsx @@ -2,7 +2,7 @@ import { cleanup, waitFor } from '@testing-library/react'; import { KBarProvider } from 'kbar'; import { render } from 'test/test-utils'; -import { getPanelPlugin } from '@grafana/data/test'; +import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { config, setPluginImportUtils } from '@grafana/runtime'; import { sceneGraph } from '@grafana/scenes'; import { defaultDashboard } from '@grafana/schema'; diff --git a/public/app/features/trails/DataTrailsHistory.tsx b/public/app/features/trails/DataTrailsHistory.tsx index 81e20a8b29c..bfd7af07344 100644 --- a/public/app/features/trails/DataTrailsHistory.tsx +++ b/public/app/features/trails/DataTrailsHistory.tsx @@ -1,7 +1,8 @@ import { css, cx } from '@emotion/css'; import { useMemo } from 'react'; -import { getTimeZoneInfo, GrafanaTheme2, InternalTimeZones, TIME_FORMAT, rangeUtil } from '@grafana/data'; +import { getTimeZoneInfo, GrafanaTheme2, InternalTimeZones, TIME_FORMAT } from '@grafana/data'; +import { convertRawToRange } from '@grafana/data/src/datetime/rangeutil'; import { config } from '@grafana/runtime'; import { SceneComponentProps, @@ -348,7 +349,7 @@ export function parseTimeTooltip(urlValues: SceneObjectUrlValues): string { return ''; } - const range = rangeUtil.convertRawToRange({ + const range = convertRawToRange({ from: urlValues.from, to: urlValues.to, }); diff --git a/public/app/features/trails/Integrations/logs/lokiRecordingRules.test.ts b/public/app/features/trails/Integrations/logs/lokiRecordingRules.test.ts index 8d7e5418b3a..673cb2d5348 100644 --- a/public/app/features/trails/Integrations/logs/lokiRecordingRules.test.ts +++ b/public/app/features/trails/Integrations/logs/lokiRecordingRules.test.ts @@ -1,7 +1,7 @@ import { of } from 'rxjs'; import type { DataSourceInstanceSettings, DataSourceJsonData } from '@grafana/data'; -import { getMockPlugin } from '@grafana/data/test'; +import { getMockPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import * as runtime from '@grafana/runtime'; import { MetricsLogsConnector } from './base'; diff --git a/public/app/features/transformers/FilterByValueTransformer/FilterByValueFilterEditor.tsx b/public/app/features/transformers/FilterByValueTransformer/FilterByValueFilterEditor.tsx index 1b2f85c51da..f896c2a5759 100644 --- a/public/app/features/transformers/FilterByValueTransformer/FilterByValueFilterEditor.tsx +++ b/public/app/features/transformers/FilterByValueTransformer/FilterByValueFilterEditor.tsx @@ -1,7 +1,7 @@ import { useCallback } from 'react'; import { Field, SelectableValue, valueMatchers } from '@grafana/data'; -import { FilterByValueFilter } from '@grafana/data/internal'; +import { FilterByValueFilter } from '@grafana/data/src/transformations/transformers/filterByValue'; import { Button, Select, InlineField, InlineFieldRow, Box } from '@grafana/ui'; import { valueMatchersUI } from './ValueMatchers/valueMatchersUI'; diff --git a/public/app/features/transformers/FilterByValueTransformer/FilterByValueTransformerEditor.test.tsx b/public/app/features/transformers/FilterByValueTransformer/FilterByValueTransformerEditor.test.tsx index 6c064b2ad0c..e9cf39d1497 100644 --- a/public/app/features/transformers/FilterByValueTransformer/FilterByValueTransformerEditor.test.tsx +++ b/public/app/features/transformers/FilterByValueTransformer/FilterByValueTransformerEditor.test.tsx @@ -1,7 +1,7 @@ import { render, fireEvent } from '@testing-library/react'; import { DataFrame, FieldType, ValueMatcherID, valueMatchers } from '@grafana/data'; -import { FilterByValueMatch, FilterByValueType } from '@grafana/data/internal'; +import { FilterByValueMatch, FilterByValueType } from '@grafana/data/src/transformations/transformers/filterByValue'; import { FilterByValueTransformerEditor } from './FilterByValueTransformerEditor'; diff --git a/public/app/features/transformers/FilterByValueTransformer/FilterByValueTransformerEditor.tsx b/public/app/features/transformers/FilterByValueTransformer/FilterByValueTransformerEditor.tsx index 57b42e72d32..683350d47b1 100644 --- a/public/app/features/transformers/FilterByValueTransformer/FilterByValueTransformerEditor.tsx +++ b/public/app/features/transformers/FilterByValueTransformer/FilterByValueTransformerEditor.tsx @@ -19,7 +19,7 @@ import { FilterByValueMatch, FilterByValueTransformerOptions, FilterByValueType, -} from '@grafana/data/internal'; +} from '@grafana/data/src/transformations/transformers/filterByValue'; import { Button, RadioButtonGroup, InlineField, Box } from '@grafana/ui'; import { getTransformationContent } from '../docs/getTransformationContent'; diff --git a/public/app/features/transformers/calculateHeatmap/heatmap.test.ts b/public/app/features/transformers/calculateHeatmap/heatmap.test.ts index 256cd576ebe..0087b9fe22f 100644 --- a/public/app/features/transformers/calculateHeatmap/heatmap.test.ts +++ b/public/app/features/transformers/calculateHeatmap/heatmap.test.ts @@ -1,4 +1,5 @@ -import { FieldType, toDataFrame } from '@grafana/data'; +import { FieldType } from '@grafana/data'; +import { toDataFrame } from '@grafana/data/src/dataframe/processDataFrame'; import { HeatmapCalculationOptions } from '@grafana/schema'; import { rowsToCellsHeatmap, calculateHeatmapFromData } from './heatmap'; diff --git a/public/app/features/transformers/calculateHeatmap/heatmap.ts b/public/app/features/transformers/calculateHeatmap/heatmap.ts index ed37d76651e..6a7a29ce69c 100644 --- a/public/app/features/transformers/calculateHeatmap/heatmap.ts +++ b/public/app/features/transformers/calculateHeatmap/heatmap.ts @@ -15,7 +15,7 @@ import { TransformationApplicabilityLevels, TimeRange, } from '@grafana/data'; -import { isLikelyAscendingVector } from '@grafana/data/internal'; +import { isLikelyAscendingVector } from '@grafana/data/src/transformations/transformers/joinDataFrames'; import { ScaleDistribution, HeatmapCellLayout, diff --git a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/BinaryOperationOptionsEditor.tsx b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/BinaryOperationOptionsEditor.tsx index e0439cf7126..0dd7cc033cb 100644 --- a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/BinaryOperationOptionsEditor.tsx +++ b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/BinaryOperationOptionsEditor.tsx @@ -5,7 +5,7 @@ import { CalculateFieldMode, CalculateFieldTransformerOptions, checkBinaryValueType, -} from '@grafana/data/internal'; +} from '@grafana/data/src/transformations/transformers/calculateField'; import { getFieldTypeIconName, InlineField, InlineFieldRow, Select } from '@grafana/ui'; import { LABEL_WIDTH } from './constants'; diff --git a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/CalculateFieldTransformerEditor.tsx b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/CalculateFieldTransformerEditor.tsx index bd0e589dd88..bc39a4e2c62 100644 --- a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/CalculateFieldTransformerEditor.tsx +++ b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/CalculateFieldTransformerEditor.tsx @@ -21,7 +21,7 @@ import { CalculateFieldTransformerOptions, getNameFromOptions, defaultWindowOptions, -} from '@grafana/data/internal'; +} from '@grafana/data/src/transformations/transformers/calculateField'; import { getTemplateSrv, config as cfg } from '@grafana/runtime'; import { InlineField, InlineSwitch, Input, Select } from '@grafana/ui'; diff --git a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/CumulativeOptionsEditor.tsx b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/CumulativeOptionsEditor.tsx index 5d8eb17ea1d..1194514bcf4 100644 --- a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/CumulativeOptionsEditor.tsx +++ b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/CumulativeOptionsEditor.tsx @@ -1,5 +1,9 @@ import { ReducerID, SelectableValue } from '@grafana/data'; -import { CalculateFieldMode, CalculateFieldTransformerOptions, CumulativeOptions } from '@grafana/data/internal'; +import { + CalculateFieldMode, + CalculateFieldTransformerOptions, + CumulativeOptions, +} from '@grafana/data/src/transformations/transformers/calculateField'; import { InlineField, Select, StatsPicker } from '@grafana/ui'; import { LABEL_WIDTH } from './constants'; diff --git a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/IndexOptionsEditor.tsx b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/IndexOptionsEditor.tsx index e812dfafb0e..c660ac21317 100644 --- a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/IndexOptionsEditor.tsx +++ b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/IndexOptionsEditor.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; -import { CalculateFieldTransformerOptions } from '@grafana/data/internal'; +import { CalculateFieldTransformerOptions } from '@grafana/data/src/transformations/transformers/calculateField'; import { InlineField, InlineSwitch } from '@grafana/ui'; import { LABEL_WIDTH } from './constants'; diff --git a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/ReduceRowOptionsEditor.tsx b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/ReduceRowOptionsEditor.tsx index e3e50a475ef..c48870fc36b 100644 --- a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/ReduceRowOptionsEditor.tsx +++ b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/ReduceRowOptionsEditor.tsx @@ -1,5 +1,8 @@ import { ReducerID } from '@grafana/data'; -import { CalculateFieldTransformerOptions, ReduceOptions } from '@grafana/data/internal'; +import { + CalculateFieldTransformerOptions, + ReduceOptions, +} from '@grafana/data/src/transformations/transformers/calculateField'; import { FilterPill, HorizontalGroup, InlineField, StatsPicker } from '@grafana/ui'; import { LABEL_WIDTH } from './constants'; diff --git a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/UnaryOperationEditor.tsx b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/UnaryOperationEditor.tsx index 4c57fca1b9b..3b38248b705 100644 --- a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/UnaryOperationEditor.tsx +++ b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/UnaryOperationEditor.tsx @@ -1,5 +1,9 @@ import { unaryOperators, SelectableValue, UnaryOperationID } from '@grafana/data'; -import { UnaryOptions, CalculateFieldMode, CalculateFieldTransformerOptions } from '@grafana/data/internal'; +import { + UnaryOptions, + CalculateFieldMode, + CalculateFieldTransformerOptions, +} from '@grafana/data/src/transformations/transformers/calculateField'; import { InlineField, InlineFieldRow, InlineLabel, Select } from '@grafana/ui'; import { LABEL_WIDTH } from './constants'; diff --git a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/WindowOptionsEditor.tsx b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/WindowOptionsEditor.tsx index 34fee4b264d..b025c705c12 100644 --- a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/WindowOptionsEditor.tsx +++ b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/WindowOptionsEditor.tsx @@ -5,7 +5,7 @@ import { CalculateFieldTransformerOptions, WindowOptions, WindowSizeMode, -} from '@grafana/data/internal'; +} from '@grafana/data/src/transformations/transformers/calculateField'; import { InlineField, RadioButtonGroup, Select, StatsPicker } from '@grafana/ui'; import { NumberInput } from 'app/core/components/OptionsUI/NumberInput'; diff --git a/public/app/features/transformers/editors/ConcatenateTransformerEditor.tsx b/public/app/features/transformers/editors/ConcatenateTransformerEditor.tsx index 91a0b251d74..8c548fb2f38 100644 --- a/public/app/features/transformers/editors/ConcatenateTransformerEditor.tsx +++ b/public/app/features/transformers/editors/ConcatenateTransformerEditor.tsx @@ -8,7 +8,10 @@ import { TransformerUIProps, TransformerCategory, } from '@grafana/data'; -import { ConcatenateFrameNameMode, ConcatenateTransformerOptions } from '@grafana/data/internal'; +import { + ConcatenateFrameNameMode, + ConcatenateTransformerOptions, +} from '@grafana/data/src/transformations/transformers/concat'; import { InlineField, Input, Select } from '@grafana/ui'; import { getTransformationContent } from '../docs/getTransformationContent'; diff --git a/public/app/features/transformers/editors/ConvertFieldTypeTransformerEditor.tsx b/public/app/features/transformers/editors/ConvertFieldTypeTransformerEditor.tsx index e331388cb3e..c7d0f4f2f39 100644 --- a/public/app/features/transformers/editors/ConvertFieldTypeTransformerEditor.tsx +++ b/public/app/features/transformers/editors/ConvertFieldTypeTransformerEditor.tsx @@ -12,7 +12,10 @@ import { TransformerCategory, getTimeZones, } from '@grafana/data'; -import { ConvertFieldTypeOptions, ConvertFieldTypeTransformerOptions } from '@grafana/data/internal'; +import { + ConvertFieldTypeOptions, + ConvertFieldTypeTransformerOptions, +} from '@grafana/data/src/transformations/transformers/convertFieldType'; import { Button, InlineField, InlineFieldRow, Input, Select } from '@grafana/ui'; import { allFieldTypeIconOptions, FieldNamePicker } from '@grafana/ui/internal'; import { findField } from 'app/features/dimensions'; diff --git a/public/app/features/transformers/editors/EnumMappingEditor.tsx b/public/app/features/transformers/editors/EnumMappingEditor.tsx index ed1947a7181..09f1822302c 100644 --- a/public/app/features/transformers/editors/EnumMappingEditor.tsx +++ b/public/app/features/transformers/editors/EnumMappingEditor.tsx @@ -4,7 +4,7 @@ import { isEqual } from 'lodash'; import { useEffect, useState } from 'react'; import { DataFrame, EnumFieldConfig, GrafanaTheme2 } from '@grafana/data'; -import { ConvertFieldTypeTransformerOptions } from '@grafana/data/internal'; +import { ConvertFieldTypeTransformerOptions } from '@grafana/data/src/transformations/transformers/convertFieldType'; import { Button, HorizontalGroup, InlineFieldRow, useStyles2, VerticalGroup } from '@grafana/ui'; import EnumMappingRow from './EnumMappingRow'; diff --git a/public/app/features/transformers/editors/FilterByNameTransformerEditor.tsx b/public/app/features/transformers/editors/FilterByNameTransformerEditor.tsx index f8035a86f0b..8ac19f37e7f 100644 --- a/public/app/features/transformers/editors/FilterByNameTransformerEditor.tsx +++ b/public/app/features/transformers/editors/FilterByNameTransformerEditor.tsx @@ -11,7 +11,7 @@ import { TransformerCategory, SelectableValue, } from '@grafana/data'; -import { FilterFieldsByNameTransformerOptions } from '@grafana/data/internal'; +import { FilterFieldsByNameTransformerOptions } from '@grafana/data/src/transformations/transformers/filterByName'; import { getTemplateSrv } from '@grafana/runtime/src/services'; import { Input, FilterPill, InlineFieldRow, InlineField, InlineSwitch, Select } from '@grafana/ui'; diff --git a/public/app/features/transformers/editors/FilterByRefIdTransformerEditor.tsx b/public/app/features/transformers/editors/FilterByRefIdTransformerEditor.tsx index 05b9e196b83..f67a7cb2b95 100644 --- a/public/app/features/transformers/editors/FilterByRefIdTransformerEditor.tsx +++ b/public/app/features/transformers/editors/FilterByRefIdTransformerEditor.tsx @@ -6,7 +6,7 @@ import { TransformerCategory, FrameMatcherID, } from '@grafana/data'; -import { FilterFramesByRefIdTransformerOptions } from '@grafana/data/internal'; +import { FilterFramesByRefIdTransformerOptions } from '@grafana/data/src/transformations/transformers/filterByRefId'; import { FrameMultiSelectionEditor } from 'app/plugins/panel/geomap/editor/FrameSelectionEditor'; import { getTransformationContent } from '../docs/getTransformationContent'; diff --git a/public/app/features/transformers/editors/FormatStringTransformerEditor.tsx b/public/app/features/transformers/editors/FormatStringTransformerEditor.tsx index cf14f69a044..e208d67976e 100644 --- a/public/app/features/transformers/editors/FormatStringTransformerEditor.tsx +++ b/public/app/features/transformers/editors/FormatStringTransformerEditor.tsx @@ -12,7 +12,10 @@ import { FieldNamePickerConfigSettings, TransformerCategory, } from '@grafana/data'; -import { FormatStringOutput, FormatStringTransformerOptions } from '@grafana/data/internal'; +import { + FormatStringOutput, + FormatStringTransformerOptions, +} from '@grafana/data/src/transformations/transformers/formatString'; import { Select, InlineFieldRow, InlineField } from '@grafana/ui'; import { FieldNamePicker } from '@grafana/ui/internal'; import { NumberInput } from 'app/core/components/OptionsUI/NumberInput'; diff --git a/public/app/features/transformers/editors/FormatTimeTransformerEditor.tsx b/public/app/features/transformers/editors/FormatTimeTransformerEditor.tsx index 3f30a79d1a5..4c2a646d93f 100644 --- a/public/app/features/transformers/editors/FormatTimeTransformerEditor.tsx +++ b/public/app/features/transformers/editors/FormatTimeTransformerEditor.tsx @@ -9,7 +9,7 @@ import { getFieldDisplayName, PluginState, } from '@grafana/data'; -import { FormatTimeTransformerOptions } from '@grafana/data/internal'; +import { FormatTimeTransformerOptions } from '@grafana/data/src/transformations/transformers/formatTime'; import { Select, InlineFieldRow, InlineField, Input } from '@grafana/ui'; import { getTransformationContent } from '../docs/getTransformationContent'; diff --git a/public/app/features/transformers/editors/GroupByTransformerEditor.tsx b/public/app/features/transformers/editors/GroupByTransformerEditor.tsx index 5dc4636bf59..ca4386f541f 100644 --- a/public/app/features/transformers/editors/GroupByTransformerEditor.tsx +++ b/public/app/features/transformers/editors/GroupByTransformerEditor.tsx @@ -11,7 +11,11 @@ import { TransformerCategory, GrafanaTheme2, } from '@grafana/data'; -import { GroupByFieldOptions, GroupByOperationID, GroupByTransformerOptions } from '@grafana/data/internal'; +import { + GroupByFieldOptions, + GroupByOperationID, + GroupByTransformerOptions, +} from '@grafana/data/src/transformations/transformers/groupBy'; import { useTheme2, Select, StatsPicker, InlineField, Stack, Alert } from '@grafana/ui'; import { getTransformationContent } from '../docs/getTransformationContent'; diff --git a/public/app/features/transformers/editors/GroupToNestedTableTransformerEditor.tsx b/public/app/features/transformers/editors/GroupToNestedTableTransformerEditor.tsx index 9b874bf5c64..17170be06cc 100644 --- a/public/app/features/transformers/editors/GroupToNestedTableTransformerEditor.tsx +++ b/public/app/features/transformers/editors/GroupToNestedTableTransformerEditor.tsx @@ -16,9 +16,11 @@ import { GroupByFieldOptions, GroupByOperationID, GroupByTransformerOptions, +} from '@grafana/data/src/transformations/transformers/groupBy'; +import { GroupToNestedTableTransformerOptions, SHOW_NESTED_HEADERS_DEFAULT, -} from '@grafana/data/internal'; +} from '@grafana/data/src/transformations/transformers/groupToNestedTable'; import { useTheme2, Select, StatsPicker, InlineField, Field, Switch, Alert, Stack } from '@grafana/ui'; import { useAllFieldNamesFromDataFrames } from '../utils'; diff --git a/public/app/features/transformers/editors/HistogramTransformerEditor.tsx b/public/app/features/transformers/editors/HistogramTransformerEditor.tsx index e9fa82aec13..a257f02b0af 100644 --- a/public/app/features/transformers/editors/HistogramTransformerEditor.tsx +++ b/public/app/features/transformers/editors/HistogramTransformerEditor.tsx @@ -7,7 +7,10 @@ import { TransformerUIProps, TransformerCategory, } from '@grafana/data'; -import { histogramFieldInfo, HistogramTransformerInputs } from '@grafana/data/internal'; +import { + histogramFieldInfo, + HistogramTransformerInputs, +} from '@grafana/data/src/transformations/transformers/histogram'; import { InlineField, InlineFieldRow, InlineSwitch } from '@grafana/ui'; import { getTransformationContent } from '../docs/getTransformationContent'; diff --git a/public/app/features/transformers/editors/JoinByFieldTransformerEditor.tsx b/public/app/features/transformers/editors/JoinByFieldTransformerEditor.tsx index a28c8548780..cccf062d843 100644 --- a/public/app/features/transformers/editors/JoinByFieldTransformerEditor.tsx +++ b/public/app/features/transformers/editors/JoinByFieldTransformerEditor.tsx @@ -8,7 +8,7 @@ import { TransformerUIProps, TransformerCategory, } from '@grafana/data'; -import { JoinByFieldOptions, JoinMode } from '@grafana/data/internal'; +import { JoinByFieldOptions, JoinMode } from '@grafana/data/src/transformations/transformers/joinByField'; import { getTemplateSrv } from '@grafana/runtime'; import { Select, InlineFieldRow, InlineField } from '@grafana/ui'; import { useFieldDisplayNames, useSelectOptions } from '@grafana/ui/internal'; diff --git a/public/app/features/transformers/editors/LabelsToFieldsTransformerEditor.tsx b/public/app/features/transformers/editors/LabelsToFieldsTransformerEditor.tsx index 263aff71a36..e41017a51a2 100644 --- a/public/app/features/transformers/editors/LabelsToFieldsTransformerEditor.tsx +++ b/public/app/features/transformers/editors/LabelsToFieldsTransformerEditor.tsx @@ -8,7 +8,10 @@ import { TransformerUIProps, TransformerCategory, } from '@grafana/data'; -import { LabelsToFieldsMode, LabelsToFieldsOptions } from '@grafana/data/internal'; +import { + LabelsToFieldsMode, + LabelsToFieldsOptions, +} from '@grafana/data/src/transformations/transformers/labelsToFields'; import { InlineField, InlineFieldRow, RadioButtonGroup, Select, FilterPill, Stack } from '@grafana/ui'; import { getTransformationContent } from '../docs/getTransformationContent'; diff --git a/public/app/features/transformers/editors/LimitTransformerEditor.tsx b/public/app/features/transformers/editors/LimitTransformerEditor.tsx index fd10293e2ce..c55cb9bbfd3 100644 --- a/public/app/features/transformers/editors/LimitTransformerEditor.tsx +++ b/public/app/features/transformers/editors/LimitTransformerEditor.tsx @@ -7,7 +7,7 @@ import { TransformerUIProps, TransformerCategory, } from '@grafana/data'; -import { LimitTransformerOptions } from '@grafana/data/internal'; +import { LimitTransformerOptions } from '@grafana/data/src/transformations/transformers/limit'; import { InlineFieldRow } from '@grafana/ui'; import { getTransformationContent } from '../docs/getTransformationContent'; diff --git a/public/app/features/transformers/editors/MergeTransformerEditor.tsx b/public/app/features/transformers/editors/MergeTransformerEditor.tsx index c81f59bcf9b..cd55fbd5543 100644 --- a/public/app/features/transformers/editors/MergeTransformerEditor.tsx +++ b/public/app/features/transformers/editors/MergeTransformerEditor.tsx @@ -5,7 +5,7 @@ import { TransformerUIProps, TransformerCategory, } from '@grafana/data'; -import { MergeTransformerOptions } from '@grafana/data/internal'; +import { MergeTransformerOptions } from '@grafana/data/src/transformations/transformers/merge'; import { FieldValidationMessage } from '@grafana/ui'; import { getTransformationContent } from '../docs/getTransformationContent'; diff --git a/public/app/features/transformers/editors/OrganizeFieldsTransformerEditor.tsx b/public/app/features/transformers/editors/OrganizeFieldsTransformerEditor.tsx index b253066abbf..ef640a79dad 100644 --- a/public/app/features/transformers/editors/OrganizeFieldsTransformerEditor.tsx +++ b/public/app/features/transformers/editors/OrganizeFieldsTransformerEditor.tsx @@ -10,7 +10,8 @@ import { TransformerUIProps, TransformerCategory, } from '@grafana/data'; -import { createOrderFieldsComparer, OrganizeFieldsTransformerOptions } from '@grafana/data/internal'; +import { createOrderFieldsComparer } from '@grafana/data/src/transformations/transformers/order'; +import { OrganizeFieldsTransformerOptions } from '@grafana/data/src/transformations/transformers/organize'; import { Input, IconButton, diff --git a/public/app/features/transformers/editors/ReduceTransformerEditor.tsx b/public/app/features/transformers/editors/ReduceTransformerEditor.tsx index 3131e85be1d..fc8e10c6b7e 100644 --- a/public/app/features/transformers/editors/ReduceTransformerEditor.tsx +++ b/public/app/features/transformers/editors/ReduceTransformerEditor.tsx @@ -9,7 +9,7 @@ import { TransformerUIProps, TransformerCategory, } from '@grafana/data'; -import { ReduceTransformerMode, ReduceTransformerOptions } from '@grafana/data/internal'; +import { ReduceTransformerMode, ReduceTransformerOptions } from '@grafana/data/src/transformations/transformers/reduce'; import { selectors } from '@grafana/e2e-selectors'; import { InlineField, Select, StatsPicker, InlineSwitch } from '@grafana/ui'; diff --git a/public/app/features/transformers/editors/RenameByRegexTransformer.tsx b/public/app/features/transformers/editors/RenameByRegexTransformer.tsx index 4530ad8b84a..d192c4a9ee0 100644 --- a/public/app/features/transformers/editors/RenameByRegexTransformer.tsx +++ b/public/app/features/transformers/editors/RenameByRegexTransformer.tsx @@ -8,7 +8,7 @@ import { stringToJsRegex, TransformerCategory, } from '@grafana/data'; -import { RenameByRegexTransformerOptions } from '@grafana/data/internal'; +import { RenameByRegexTransformerOptions } from '@grafana/data/src/transformations/transformers/renameByRegex'; import { InlineField, Input } from '@grafana/ui'; import { getTransformationContent } from '../docs/getTransformationContent'; diff --git a/public/app/features/transformers/editors/SeriesToRowsTransformerEditor.tsx b/public/app/features/transformers/editors/SeriesToRowsTransformerEditor.tsx index 8b3b66e64ed..606d0cdb417 100644 --- a/public/app/features/transformers/editors/SeriesToRowsTransformerEditor.tsx +++ b/public/app/features/transformers/editors/SeriesToRowsTransformerEditor.tsx @@ -5,7 +5,7 @@ import { TransformerUIProps, TransformerCategory, } from '@grafana/data'; -import { SeriesToRowsTransformerOptions } from '@grafana/data/internal'; +import { SeriesToRowsTransformerOptions } from '@grafana/data/src/transformations/transformers/seriesToRows'; import { getTransformationContent } from '../docs/getTransformationContent'; diff --git a/public/app/features/transformers/editors/SortByTransformerEditor.tsx b/public/app/features/transformers/editors/SortByTransformerEditor.tsx index 4247e1c4f66..3faa19ebf8f 100644 --- a/public/app/features/transformers/editors/SortByTransformerEditor.tsx +++ b/public/app/features/transformers/editors/SortByTransformerEditor.tsx @@ -7,7 +7,7 @@ import { TransformerUIProps, TransformerCategory, } from '@grafana/data'; -import { SortByField, SortByTransformerOptions } from '@grafana/data/internal'; +import { SortByField, SortByTransformerOptions } from '@grafana/data/src/transformations/transformers/sortBy'; import { getTemplateSrv } from '@grafana/runtime'; import { InlineField, InlineSwitch, InlineFieldRow, Select } from '@grafana/ui'; diff --git a/public/app/features/transformers/editors/TransposeTransformerEditor.tsx b/public/app/features/transformers/editors/TransposeTransformerEditor.tsx index 9ba613fe78c..4190d385e48 100644 --- a/public/app/features/transformers/editors/TransposeTransformerEditor.tsx +++ b/public/app/features/transformers/editors/TransposeTransformerEditor.tsx @@ -5,7 +5,7 @@ import { TransformerUIProps, TransformerCategory, } from '@grafana/data'; -import { TransposeTransformerOptions } from '@grafana/data/internal'; +import { TransposeTransformerOptions } from '@grafana/data/src/transformations/transformers/transpose'; import { InlineField, InlineFieldRow, Input } from '@grafana/ui'; export const TransposeTransfomerEditor = ({ options, onChange }: TransformerUIProps) => { diff --git a/public/app/features/transformers/extractFields/extractFields.test.ts b/public/app/features/transformers/extractFields/extractFields.test.ts index 863b89163ca..a6617aecea9 100644 --- a/public/app/features/transformers/extractFields/extractFields.test.ts +++ b/public/app/features/transformers/extractFields/extractFields.test.ts @@ -5,9 +5,10 @@ import { Field, FieldType, transformDataFrame, - toDataFrame, } from '@grafana/data'; -import { mockTransformationsRegistry, SortByTransformerOptions, sortByTransformer } from '@grafana/data/internal'; +import { toDataFrame } from '@grafana/data/src/dataframe/processDataFrame'; +import { SortByTransformerOptions, sortByTransformer } from '@grafana/data/src/transformations/transformers/sortBy'; +import { mockTransformationsRegistry } from '@grafana/data/src/utils/tests/mockTransformationsRegistry'; import { extractFieldsTransformer } from './extractFields'; import { ExtractFieldsOptions, FieldExtractorID } from './types'; diff --git a/public/app/features/transformers/lookupGazetteer/fieldLookup.test.ts b/public/app/features/transformers/lookupGazetteer/fieldLookup.test.ts index bc0ef8c8b82..7f0072dd4d7 100644 --- a/public/app/features/transformers/lookupGazetteer/fieldLookup.test.ts +++ b/public/app/features/transformers/lookupGazetteer/fieldLookup.test.ts @@ -1,4 +1,6 @@ -import { DataTransformerID, toDataFrame, FieldMatcherID, fieldMatchers, FieldType } from '@grafana/data'; +import { FieldMatcherID, fieldMatchers, FieldType } from '@grafana/data'; +import { toDataFrame } from '@grafana/data/src/dataframe/processDataFrame'; +import { DataTransformerID } from '@grafana/data/src/transformations/transformers/ids'; import { frameAsGazetter } from 'app/features/geo/gazetteer/gazetteer'; import { addFieldsFromGazetteer } from './fieldLookup'; diff --git a/public/app/features/transformers/partitionByValues/partitionByValues.ts b/public/app/features/transformers/partitionByValues/partitionByValues.ts index 4ab8d360cbe..80c349fe762 100644 --- a/public/app/features/transformers/partitionByValues/partitionByValues.ts +++ b/public/app/features/transformers/partitionByValues/partitionByValues.ts @@ -8,7 +8,8 @@ import { DataTransformContext, FieldMatcher, } from '@grafana/data'; -import { getMatcherConfig, noopTransformer } from '@grafana/data/internal'; +import { getMatcherConfig } from '@grafana/data/src/transformations/transformers/filterByName'; +import { noopTransformer } from '@grafana/data/src/transformations/transformers/noop'; import { partition } from './partition'; diff --git a/public/app/features/transformers/spatial/optionsHelper.tsx b/public/app/features/transformers/spatial/optionsHelper.tsx index e493dfc7d0c..49f77cf7927 100644 --- a/public/app/features/transformers/spatial/optionsHelper.tsx +++ b/public/app/features/transformers/spatial/optionsHelper.tsx @@ -1,7 +1,8 @@ import { set, get as lodashGet } from 'lodash'; import { StandardEditorContext, TransformerUIProps, PanelOptionsEditorBuilder } from '@grafana/data'; -import { NestedValueAccess, PanelOptionsSupplier } from '@grafana/data/internal'; +import { PanelOptionsSupplier } from '@grafana/data/src/panel/PanelPlugin'; +import { NestedValueAccess } from '@grafana/data/src/utils/OptionsUIBuilders'; import { OptionsPaneCategoryDescriptor } from 'app/features/dashboard/components/PanelEditor/OptionsPaneCategoryDescriptor'; import { fillOptionsPaneItems } from 'app/features/dashboard/components/PanelEditor/getVisualizationOptions'; import { setOptionImmutably } from 'app/features/dashboard/components/PanelEditor/utils'; diff --git a/public/app/features/transformers/spatial/spatialTransformer.test.ts b/public/app/features/transformers/spatial/spatialTransformer.test.ts index 196a6b3680d..b36315fefe5 100644 --- a/public/app/features/transformers/spatial/spatialTransformer.test.ts +++ b/public/app/features/transformers/spatial/spatialTransformer.test.ts @@ -1,5 +1,6 @@ -import { toDataFrame, FieldMatcherID, fieldMatchers, FieldType } from '@grafana/data'; -import { DataTransformerID } from '@grafana/data/internal'; +import { FieldMatcherID, fieldMatchers, FieldType } from '@grafana/data'; +import { toDataFrame } from '@grafana/data/src/dataframe/processDataFrame'; +import { DataTransformerID } from '@grafana/data/src/transformations/transformers/ids'; import { frameAsGazetter } from 'app/features/geo/gazetteer/gazetteer'; describe('spatial transformer', () => { diff --git a/public/app/features/variables/datasource/actions.test.ts b/public/app/features/variables/datasource/actions.test.ts index 2a0b42b30ff..4d3a5ca8e94 100644 --- a/public/app/features/variables/datasource/actions.test.ts +++ b/public/app/features/variables/datasource/actions.test.ts @@ -1,5 +1,5 @@ import { DataSourceInstanceSettings } from '@grafana/data'; -import { getMockPlugin } from '@grafana/data/test'; +import { getMockPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { reduxTester } from '../../../../test/core/redux/reduxTester'; import { variableAdapters } from '../adapters'; diff --git a/public/app/features/variables/datasource/reducer.test.ts b/public/app/features/variables/datasource/reducer.test.ts index 6a3abaa27cb..2acb6e96346 100644 --- a/public/app/features/variables/datasource/reducer.test.ts +++ b/public/app/features/variables/datasource/reducer.test.ts @@ -1,7 +1,7 @@ import { cloneDeep } from 'lodash'; import { DataSourceInstanceSettings, DataSourceVariableModel } from '@grafana/data'; -import { getMockPlugins } from '@grafana/data/test'; +import { getMockPlugins } from '@grafana/data/test/__mocks__/pluginMocks'; import { reducerTester } from '../../../../test/core/redux/reducerTester'; import { getDataSourceInstanceSetting } from '../shared/testing/helpers'; diff --git a/public/app/features/variables/state/initVariableTransaction.test.ts b/public/app/features/variables/state/initVariableTransaction.test.ts index 0e9c0070023..ba9939b8442 100644 --- a/public/app/features/variables/state/initVariableTransaction.test.ts +++ b/public/app/features/variables/state/initVariableTransaction.test.ts @@ -1,4 +1,4 @@ -import { DataSourceRef, LoadingState } from '@grafana/data'; +import { DataSourceRef, LoadingState } from '@grafana/data/src'; import { setDataSourceSrv } from '@grafana/runtime/src'; import { DashboardModel } from 'app/features/dashboard/state/DashboardModel'; diff --git a/public/app/features/variables/state/migrateVariablesDatasourceNameToRef.test.ts b/public/app/features/variables/state/migrateVariablesDatasourceNameToRef.test.ts index 7673e9bf8d5..aea1a31a10b 100644 --- a/public/app/features/variables/state/migrateVariablesDatasourceNameToRef.test.ts +++ b/public/app/features/variables/state/migrateVariablesDatasourceNameToRef.test.ts @@ -1,4 +1,4 @@ -import { DataSourceRef } from '@grafana/data'; +import { DataSourceRef } from '@grafana/data/src'; import { adHocBuilder, queryBuilder } from '../shared/testing/builders'; import { toVariablePayload } from '../utils'; diff --git a/public/app/plugins/datasource/azuremonitor/__mocks__/utils.ts b/public/app/plugins/datasource/azuremonitor/__mocks__/utils.ts index 3e0204fdd6e..921573b797e 100644 --- a/public/app/plugins/datasource/azuremonitor/__mocks__/utils.ts +++ b/public/app/plugins/datasource/azuremonitor/__mocks__/utils.ts @@ -1,4 +1,5 @@ -import { LoadingState, VariableType, VariableWithOptions } from '@grafana/data'; +import { VariableType, VariableWithOptions } from '@grafana/data'; +import { LoadingState } from '@grafana/data/src/types/data'; interface TemplateableValue { variableName: string; diff --git a/public/app/plugins/datasource/azuremonitor/components/LogsQueryEditor/RawQuery.tsx b/public/app/plugins/datasource/azuremonitor/components/LogsQueryEditor/RawQuery.tsx index bbf7c27cc5c..742b12b9d50 100644 --- a/public/app/plugins/datasource/azuremonitor/components/LogsQueryEditor/RawQuery.tsx +++ b/public/app/plugins/datasource/azuremonitor/components/LogsQueryEditor/RawQuery.tsx @@ -1,7 +1,7 @@ import { css, cx } from '@emotion/css'; import Prism, { Grammar } from 'prismjs'; -import { GrafanaTheme2 } from '@grafana/data'; +import { GrafanaTheme2 } from '@grafana/data/src'; import { useTheme2 } from '@grafana/ui'; export interface Props { diff --git a/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchMetricsQueryRunner.test.ts b/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchMetricsQueryRunner.test.ts index 7654c6228cd..637328f022a 100644 --- a/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchMetricsQueryRunner.test.ts +++ b/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchMetricsQueryRunner.test.ts @@ -1,6 +1,7 @@ import { of } from 'rxjs'; -import { dateTime, CustomVariableModel, getFrameDisplayName, VariableHide } from '@grafana/data'; +import { CustomVariableModel, getFrameDisplayName, VariableHide } from '@grafana/data'; +import { dateTime } from '@grafana/data/src/datetime/moment_wrapper'; import { toDataQueryResponse } from '@grafana/runtime'; import { diff --git a/public/app/plugins/datasource/dashboard/datasource.test.ts b/public/app/plugins/datasource/dashboard/datasource.test.ts index a543c5037d4..114bb966941 100644 --- a/public/app/plugins/datasource/dashboard/datasource.test.ts +++ b/public/app/plugins/datasource/dashboard/datasource.test.ts @@ -8,7 +8,7 @@ import { LoadingState, standardTransformersRegistry, } from '@grafana/data'; -import { getPanelPlugin } from '@grafana/data/test'; +import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { setPluginImportUtils } from '@grafana/runtime'; import { SafeSerializableSceneObject, diff --git a/public/app/plugins/datasource/elasticsearch/ElasticResponse.ts b/public/app/plugins/datasource/elasticsearch/ElasticResponse.ts index 103a571b8a6..5b46beee758 100644 --- a/public/app/plugins/datasource/elasticsearch/ElasticResponse.ts +++ b/public/app/plugins/datasource/elasticsearch/ElasticResponse.ts @@ -8,7 +8,7 @@ import { MutableDataFrame, PreferredVisualisationType, } from '@grafana/data'; -import { convertFieldType } from '@grafana/data/internal'; +import { convertFieldType } from '@grafana/data/src/transformations/transformers/convertFieldType'; import TableModel from 'app/core/TableModel'; import { isMetricAggregationWithField } from './components/QueryEditor/MetricAggregationsEditor/aggregations'; diff --git a/public/app/plugins/datasource/influxdb/components/editor/annotation/AnnotationEditor.tsx b/public/app/plugins/datasource/influxdb/components/editor/annotation/AnnotationEditor.tsx index 71418a7904e..a0feea2669b 100644 --- a/public/app/plugins/datasource/influxdb/components/editor/annotation/AnnotationEditor.tsx +++ b/public/app/plugins/datasource/influxdb/components/editor/annotation/AnnotationEditor.tsx @@ -1,6 +1,6 @@ import { useState } from 'react'; -import { QueryEditorProps } from '@grafana/data'; +import { QueryEditorProps } from '@grafana/data/src'; import { InlineFormLabel, Input, Stack } from '@grafana/ui'; import InfluxDatasource from '../../../datasource'; diff --git a/public/app/plugins/datasource/influxdb/components/editor/constants.ts b/public/app/plugins/datasource/influxdb/components/editor/constants.ts index f9f0c4850a5..e234d7652ea 100644 --- a/public/app/plugins/datasource/influxdb/components/editor/constants.ts +++ b/public/app/plugins/datasource/influxdb/components/editor/constants.ts @@ -1,4 +1,4 @@ -import { SelectableValue } from '@grafana/data'; +import { SelectableValue } from '@grafana/data/src'; import { ResultFormat } from '../../types'; diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/QueryEditor.tsx b/public/app/plugins/datasource/influxdb/components/editor/query/QueryEditor.tsx index 079bb5ba02e..acb8d949f4c 100644 --- a/public/app/plugins/datasource/influxdb/components/editor/query/QueryEditor.tsx +++ b/public/app/plugins/datasource/influxdb/components/editor/query/QueryEditor.tsx @@ -1,6 +1,6 @@ import { css } from '@emotion/css'; -import { QueryEditorProps } from '@grafana/data'; +import { QueryEditorProps } from '@grafana/data/src'; import InfluxDatasource from '../../../datasource'; import { buildRawQuery } from '../../../queryUtils'; diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/flux/FluxQueryEditor.tsx b/public/app/plugins/datasource/influxdb/components/editor/query/flux/FluxQueryEditor.tsx index daedc65855e..b5b594f3445 100644 --- a/public/app/plugins/datasource/influxdb/components/editor/query/flux/FluxQueryEditor.tsx +++ b/public/app/plugins/datasource/influxdb/components/editor/query/flux/FluxQueryEditor.tsx @@ -1,7 +1,7 @@ import { css, cx } from '@emotion/css'; import { PureComponent } from 'react'; -import { GrafanaTheme2, SelectableValue } from '@grafana/data'; +import { GrafanaTheme2, SelectableValue } from '@grafana/data/src'; import { getTemplateSrv } from '@grafana/runtime/src'; import { CodeEditor, diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/fsql/FSQLEditor.tsx b/public/app/plugins/datasource/influxdb/components/editor/query/fsql/FSQLEditor.tsx index e25e951c25d..4858da88623 100644 --- a/public/app/plugins/datasource/influxdb/components/editor/query/fsql/FSQLEditor.tsx +++ b/public/app/plugins/datasource/influxdb/components/editor/query/fsql/FSQLEditor.tsx @@ -1,7 +1,7 @@ import { css, cx } from '@emotion/css'; import { PureComponent } from 'react'; -import { GrafanaTheme2 } from '@grafana/data'; +import { GrafanaTheme2 } from '@grafana/data/src'; import { SQLQuery, SqlQueryEditorLazy, applyQueryDefaults } from '@grafana/sql'; import { InlineFormLabel, LinkButton, Themeable2, withTheme2 } from '@grafana/ui'; diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/getTemplateVariableOptions.ts b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/getTemplateVariableOptions.ts index b3e9860798e..51db862e4d9 100644 --- a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/getTemplateVariableOptions.ts +++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/getTemplateVariableOptions.ts @@ -1,4 +1,4 @@ -import { TypedVariableModel } from '@grafana/data'; +import { TypedVariableModel } from '@grafana/data/src'; import { getTemplateSrv } from '@grafana/runtime/src'; export function getTemplateVariableOptions(wrapper: (v: TypedVariableModel) => string) { diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/withTemplateVariableOptions.ts b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/withTemplateVariableOptions.ts index c346946dbfc..89bd1372bcd 100644 --- a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/withTemplateVariableOptions.ts +++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/withTemplateVariableOptions.ts @@ -1,5 +1,5 @@ // helper function to make it easy to call this from the widget-render-code -import { TypedVariableModel } from '@grafana/data'; +import { TypedVariableModel } from '@grafana/data/src'; import { getTemplateVariableOptions } from './getTemplateVariableOptions'; diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/wrapper.ts b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/wrapper.ts index 745ada1dd39..769a9a435a4 100644 --- a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/wrapper.ts +++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/wrapper.ts @@ -1,4 +1,4 @@ -import { TypedVariableModel } from '@grafana/data'; +import { TypedVariableModel } from '@grafana/data/src'; export function wrapRegex(v: TypedVariableModel): string { return `/^$${v.name}$/`; diff --git a/public/app/plugins/datasource/influxdb/influxql_metadata_query.ts b/public/app/plugins/datasource/influxdb/influxql_metadata_query.ts index 314b70c2d15..b343f668018 100644 --- a/public/app/plugins/datasource/influxdb/influxql_metadata_query.ts +++ b/public/app/plugins/datasource/influxdb/influxql_metadata_query.ts @@ -1,4 +1,4 @@ -import { ScopedVars } from '@grafana/data'; +import { ScopedVars } from '@grafana/data/src'; import config from 'app/core/config'; import InfluxDatasource from './datasource'; diff --git a/public/app/plugins/datasource/tempo/_importedDependencies/datasources/prometheus/RawQuery.tsx b/public/app/plugins/datasource/tempo/_importedDependencies/datasources/prometheus/RawQuery.tsx index bbf7c27cc5c..742b12b9d50 100644 --- a/public/app/plugins/datasource/tempo/_importedDependencies/datasources/prometheus/RawQuery.tsx +++ b/public/app/plugins/datasource/tempo/_importedDependencies/datasources/prometheus/RawQuery.tsx @@ -1,7 +1,7 @@ import { css, cx } from '@emotion/css'; import Prism, { Grammar } from 'prismjs'; -import { GrafanaTheme2 } from '@grafana/data'; +import { GrafanaTheme2 } from '@grafana/data/src'; import { useTheme2 } from '@grafana/ui'; export interface Props { diff --git a/public/app/plugins/datasource/tempo/types.ts b/public/app/plugins/datasource/tempo/types.ts index 02dbe712969..de6c050fb6c 100644 --- a/public/app/plugins/datasource/tempo/types.ts +++ b/public/app/plugins/datasource/tempo/types.ts @@ -1,4 +1,4 @@ -import { DataSourceJsonData } from '@grafana/data'; +import { DataSourceJsonData } from '@grafana/data/src'; import { NodeGraphOptions, TraceToLogsOptions } from '@grafana/o11y-ds-frontend'; import { TempoQuery as TempoBase, TempoQueryType, TraceqlFilter } from './dataquery.gen'; diff --git a/public/app/plugins/panel/barchart/bars.ts b/public/app/plugins/panel/barchart/bars.ts index 40a3c62f73d..7d3e318eea3 100644 --- a/public/app/plugins/panel/barchart/bars.ts +++ b/public/app/plugins/panel/barchart/bars.ts @@ -1,6 +1,7 @@ import uPlot, { Axis, AlignedData, Scale } from 'uplot'; -import { colorManipulator, DataFrame, dateTimeFormat, GrafanaTheme2, systemDateFormats, TimeZone } from '@grafana/data'; +import { DataFrame, dateTimeFormat, GrafanaTheme2, systemDateFormats, TimeZone } from '@grafana/data'; +import { alpha } from '@grafana/data/src/themes/colorManipulator'; import { StackingMode, VisibilityMode, @@ -544,8 +545,7 @@ export function getConfig(opts: BarsOptions, theme: GrafanaTheme2) { }); barsColors.push({ - fill: - fillOpacity < 1 ? colors.map((c) => (c != null ? colorManipulator.alpha(c, fillOpacity) : null)) : colors, + fill: fillOpacity < 1 ? colors.map((c) => (c != null ? alpha(c, fillOpacity) : null)) : colors, stroke: colors, }); } diff --git a/public/app/plugins/panel/barchart/utils.ts b/public/app/plugins/panel/barchart/utils.ts index ebd8ac300af..9b25e678f1f 100644 --- a/public/app/plugins/panel/barchart/utils.ts +++ b/public/app/plugins/panel/barchart/utils.ts @@ -13,7 +13,7 @@ import { getFieldSeriesColor, outerJoinDataFrames, } from '@grafana/data'; -import { decoupleHideFromState } from '@grafana/data/internal'; +import { decoupleHideFromState } from '@grafana/data/src/field/fieldState'; import { AxisColorMode, AxisPlacement, diff --git a/public/app/plugins/panel/bargauge/BarGaugeLegend.tsx b/public/app/plugins/panel/bargauge/BarGaugeLegend.tsx index 5364552267a..0ddecee36f6 100644 --- a/public/app/plugins/panel/bargauge/BarGaugeLegend.tsx +++ b/public/app/plugins/panel/bargauge/BarGaugeLegend.tsx @@ -1,6 +1,7 @@ import { memo } from 'react'; -import { Field, cacheFieldDisplayNames, DataFrame, FieldType, getFieldSeriesColor } from '@grafana/data'; +import { cacheFieldDisplayNames, DataFrame, FieldType, getFieldSeriesColor } from '@grafana/data'; +import { Field } from '@grafana/data/'; import { AxisPlacement, VizLegendOptions } from '@grafana/schema'; import { useTheme2, VizLayout, VizLayoutLegendProps, VizLegend, VizLegendItem } from '@grafana/ui'; import { getDisplayValuesForCalcs } from '@grafana/ui/internal'; diff --git a/public/app/plugins/panel/candlestick/fields.ts b/public/app/plugins/panel/candlestick/fields.ts index 5019dfe06d0..c370b953a72 100644 --- a/public/app/plugins/panel/candlestick/fields.ts +++ b/public/app/plugins/panel/candlestick/fields.ts @@ -7,7 +7,7 @@ import { outerJoinDataFrames, TimeRange, } from '@grafana/data'; -import { maybeSortFrame } from '@grafana/data/internal'; +import { maybeSortFrame } from '@grafana/data/src/transformations/transformers/joinDataFrames'; import { findField } from 'app/features/dimensions'; import { prepareGraphableFields } from '../timeseries/utils'; diff --git a/public/app/plugins/panel/canvas/components/CanvasTooltip.tsx b/public/app/plugins/panel/canvas/components/CanvasTooltip.tsx index ceb17a8ce7d..aa756baa9c8 100644 --- a/public/app/plugins/panel/canvas/components/CanvasTooltip.tsx +++ b/public/app/plugins/panel/canvas/components/CanvasTooltip.tsx @@ -12,8 +12,8 @@ import { getFieldDisplayName, ScopedVars, ValueLinkConfig, - ActionModel, -} from '@grafana/data'; +} from '@grafana/data/src'; +import { ActionModel } from '@grafana/data/src/types/action'; import { Portal, useStyles2, VizTooltipContainer } from '@grafana/ui'; import { VizTooltipContent, diff --git a/public/app/plugins/panel/canvas/editor/connectionEditor.tsx b/public/app/plugins/panel/canvas/editor/connectionEditor.tsx index 869bcec4adb..96e8a21b331 100644 --- a/public/app/plugins/panel/canvas/editor/connectionEditor.tsx +++ b/public/app/plugins/panel/canvas/editor/connectionEditor.tsx @@ -1,6 +1,6 @@ import { get as lodashGet } from 'lodash'; -import { NestedPanelOptions, NestedValueAccess } from '@grafana/data/internal'; +import { NestedPanelOptions, NestedValueAccess } from '@grafana/data/src/utils/OptionsUIBuilders'; import { Scene } from 'app/features/canvas/runtime/scene'; import { setOptionImmutably } from 'app/features/dashboard/components/PanelEditor/utils'; diff --git a/public/app/plugins/panel/canvas/editor/element/QuickPositioning.tsx b/public/app/plugins/panel/canvas/editor/element/QuickPositioning.tsx index c63a14aabc6..acfe2f3b755 100644 --- a/public/app/plugins/panel/canvas/editor/element/QuickPositioning.tsx +++ b/public/app/plugins/panel/canvas/editor/element/QuickPositioning.tsx @@ -1,6 +1,6 @@ import { css } from '@emotion/css'; -import { GrafanaTheme2 } from '@grafana/data'; +import { GrafanaTheme2 } from '@grafana/data/src'; import { IconButton, useStyles2 } from '@grafana/ui'; import { ElementState } from 'app/features/canvas/runtime/element'; import { QuickPlacement } from 'app/features/canvas/types'; diff --git a/public/app/plugins/panel/canvas/editor/element/elementEditor.tsx b/public/app/plugins/panel/canvas/editor/element/elementEditor.tsx index 4e0164319ea..bdad1130a50 100644 --- a/public/app/plugins/panel/canvas/editor/element/elementEditor.tsx +++ b/public/app/plugins/panel/canvas/editor/element/elementEditor.tsx @@ -1,6 +1,6 @@ import { get as lodashGet } from 'lodash'; -import { NestedPanelOptions, NestedValueAccess } from '@grafana/data/internal'; +import { NestedPanelOptions, NestedValueAccess } from '@grafana/data/src/utils/OptionsUIBuilders'; import { CanvasElementOptions } from 'app/features/canvas/element'; import { canvasElementRegistry, diff --git a/public/app/plugins/panel/canvas/editor/inline/InlineEditBody.tsx b/public/app/plugins/panel/canvas/editor/inline/InlineEditBody.tsx index 8c6a2764035..5b13b982eb8 100644 --- a/public/app/plugins/panel/canvas/editor/inline/InlineEditBody.tsx +++ b/public/app/plugins/panel/canvas/editor/inline/InlineEditBody.tsx @@ -4,7 +4,8 @@ import { useMemo, useState } from 'react'; import { useObservable } from 'react-use'; import { DataFrame, GrafanaTheme2, PanelOptionsEditorBuilder, StandardEditorContext } from '@grafana/data'; -import { NestedValueAccess, PanelOptionsSupplier } from '@grafana/data/internal'; +import { PanelOptionsSupplier } from '@grafana/data/src/panel/PanelPlugin'; +import { NestedValueAccess } from '@grafana/data/src/utils/OptionsUIBuilders'; import { useStyles2 } from '@grafana/ui'; import { AddLayerButton } from 'app/core/components/Layers/AddLayerButton'; import { FrameState } from 'app/features/canvas/runtime/frame'; diff --git a/public/app/plugins/panel/canvas/editor/layer/layerEditor.tsx b/public/app/plugins/panel/canvas/editor/layer/layerEditor.tsx index 69a0e9aa29e..59c9b40fd46 100644 --- a/public/app/plugins/panel/canvas/editor/layer/layerEditor.tsx +++ b/public/app/plugins/panel/canvas/editor/layer/layerEditor.tsx @@ -1,6 +1,6 @@ import { get as lodashGet } from 'lodash'; -import { NestedPanelOptions, NestedValueAccess } from '@grafana/data/internal'; +import { NestedPanelOptions, NestedValueAccess } from '@grafana/data/src/utils/OptionsUIBuilders'; import { ElementState } from 'app/features/canvas/runtime/element'; import { FrameState } from 'app/features/canvas/runtime/frame'; import { Scene } from 'app/features/canvas/runtime/scene'; diff --git a/public/app/plugins/panel/canvas/editor/options.ts b/public/app/plugins/panel/canvas/editor/options.ts index 48640dfddb0..221ab5f7979 100644 --- a/public/app/plugins/panel/canvas/editor/options.ts +++ b/public/app/plugins/panel/canvas/editor/options.ts @@ -1,7 +1,7 @@ import { capitalize } from 'lodash'; import { FieldType } from '@grafana/data'; -import { PanelOptionsSupplier } from '@grafana/data/internal'; +import { PanelOptionsSupplier } from '@grafana/data/src/panel/PanelPlugin'; import { ConnectionDirection } from 'app/features/canvas/element'; import { SVGElements } from 'app/features/canvas/runtime/element'; import { ColorDimensionEditor, ResourceDimensionEditor, ScaleDimensionEditor } from 'app/features/dimensions/editors'; diff --git a/public/app/plugins/panel/canvas/utils.ts b/public/app/plugins/panel/canvas/utils.ts index 386466d3378..bf5fb30b15f 100644 --- a/public/app/plugins/panel/canvas/utils.ts +++ b/public/app/plugins/panel/canvas/utils.ts @@ -1,6 +1,7 @@ import { isNumber, isString } from 'lodash'; -import { DataFrame, Field, AppEvents, getFieldDisplayName, PluginState, SelectableValue } from '@grafana/data'; +import { AppEvents, getFieldDisplayName, PluginState, SelectableValue } from '@grafana/data'; +import { DataFrame, Field } from '@grafana/data/'; import appEvents from 'app/core/app_events'; import { hasAlphaPanels, config } from 'app/core/config'; import { diff --git a/public/app/plugins/panel/datagrid/components/DatagridContextMenu.tsx b/public/app/plugins/panel/datagrid/components/DatagridContextMenu.tsx index 1e06330c88d..f9629ce7053 100644 --- a/public/app/plugins/panel/datagrid/components/DatagridContextMenu.tsx +++ b/public/app/plugins/panel/datagrid/components/DatagridContextMenu.tsx @@ -3,7 +3,7 @@ import { capitalize } from 'lodash'; import * as React from 'react'; import { DataFrame, FieldType } from '@grafana/data'; -import { convertFieldType } from '@grafana/data/internal'; +import { convertFieldType } from '@grafana/data/src/transformations/transformers/convertFieldType'; import { reportInteraction } from '@grafana/runtime'; import { ContextMenu, MenuGroup, MenuItem } from '@grafana/ui'; import { MenuDivider } from '@grafana/ui/internal'; diff --git a/public/app/plugins/panel/geomap/components/MarkersLegend.tsx b/public/app/plugins/panel/geomap/components/MarkersLegend.tsx index 34eda649940..2d6cdabfc5d 100644 --- a/public/app/plugins/panel/geomap/components/MarkersLegend.tsx +++ b/public/app/plugins/panel/geomap/components/MarkersLegend.tsx @@ -4,13 +4,8 @@ import { useMemo } from 'react'; import { useObservable } from 'react-use'; import { of } from 'rxjs'; -import { - getMinMaxAndDelta, - DataFrame, - formattedValueToString, - getFieldColorModeForField, - GrafanaTheme2, -} from '@grafana/data'; +import { DataFrame, formattedValueToString, getFieldColorModeForField, GrafanaTheme2 } from '@grafana/data'; +import { getMinMaxAndDelta } from '@grafana/data/src/field/scale'; import { useStyles2, VizLegendItem } from '@grafana/ui'; import { ColorScale } from 'app/core/components/ColorScale/ColorScale'; import { SanitizedSVG } from 'app/core/components/SVG/SanitizedSVG'; diff --git a/public/app/plugins/panel/geomap/editor/layerEditor.tsx b/public/app/plugins/panel/geomap/editor/layerEditor.tsx index 064e6189cf7..e0676fab740 100644 --- a/public/app/plugins/panel/geomap/editor/layerEditor.tsx +++ b/public/app/plugins/panel/geomap/editor/layerEditor.tsx @@ -1,7 +1,7 @@ import { get as lodashGet, isEqual } from 'lodash'; import { FrameGeometrySourceMode, getFrameMatchers, MapLayerOptions } from '@grafana/data'; -import { NestedPanelOptions, NestedValueAccess } from '@grafana/data/internal'; +import { NestedPanelOptions, NestedValueAccess } from '@grafana/data/src/utils/OptionsUIBuilders'; import { setOptionImmutably } from 'app/features/dashboard/components/PanelEditor/utils'; import { addLocationFields } from 'app/features/geo/editor/locationEditor'; diff --git a/public/app/plugins/panel/geomap/layers/data/routeLayer.tsx b/public/app/plugins/panel/geomap/layers/data/routeLayer.tsx index 366b687c5aa..43e9500ad0c 100644 --- a/public/app/plugins/panel/geomap/layers/data/routeLayer.tsx +++ b/public/app/plugins/panel/geomap/layers/data/routeLayer.tsx @@ -20,8 +20,8 @@ import { DataHoverClearEvent, DataFrame, FieldType, - colorManipulator } from '@grafana/data'; +import { alpha } from '@grafana/data/src/themes/colorManipulator'; import { MapLayerOptions, FrameGeometrySourceMode } from '@grafana/schema'; import { FrameVectorSource } from 'app/features/geo/utils/frameVectorSource'; import { getGeometryField, getLocationMatchers } from 'app/features/geo/utils/location'; @@ -207,10 +207,10 @@ export const routeLayer: MapLayerRegistryItem = { image: new Circle({ radius: crosshairRadius, stroke: new Stroke({ - color: colorManipulator.alpha(crosshairColor, 1), + color: alpha(crosshairColor, 1), width: 1, }), - fill: new Fill({ color: colorManipulator.alpha(crosshairColor, 0.4) }), + fill: new Fill({ color: alpha(crosshairColor, 0.4) }), }), }); const lineStyle = new Style({ diff --git a/public/app/plugins/panel/geomap/utils/checkFeatureMatchesStyleRule.ts b/public/app/plugins/panel/geomap/utils/checkFeatureMatchesStyleRule.ts index cc0558c4e44..569bbdf7c7b 100644 --- a/public/app/plugins/panel/geomap/utils/checkFeatureMatchesStyleRule.ts +++ b/public/app/plugins/panel/geomap/utils/checkFeatureMatchesStyleRule.ts @@ -1,6 +1,6 @@ import { FeatureLike } from 'ol/Feature'; -import { compareValues } from '@grafana/data/internal'; +import { compareValues } from '@grafana/data/src/transformations/matchers/compareValues'; import { FeatureRuleConfig } from '../types'; diff --git a/public/app/plugins/panel/geomap/utils/tooltip.ts b/public/app/plugins/panel/geomap/utils/tooltip.ts index 547ef6e498b..74fc3d6a8ba 100644 --- a/public/app/plugins/panel/geomap/utils/tooltip.ts +++ b/public/app/plugins/panel/geomap/utils/tooltip.ts @@ -2,7 +2,7 @@ import { debounce } from 'lodash'; import { MapBrowserEvent } from 'ol'; import { toLonLat } from 'ol/proj'; -import { DataFrame, DataHoverClearEvent } from '@grafana/data'; +import { DataFrame, DataHoverClearEvent } from '@grafana/data/src'; import { GeomapPanel } from '../GeomapPanel'; import { GeomapHoverPayload, GeomapLayerHover } from '../event'; diff --git a/public/app/plugins/panel/geomap/utils/utils.ts b/public/app/plugins/panel/geomap/utils/utils.ts index 44bb31c0876..6587dda7ee2 100644 --- a/public/app/plugins/panel/geomap/utils/utils.ts +++ b/public/app/plugins/panel/geomap/utils/utils.ts @@ -1,7 +1,8 @@ import { Map as OpenLayersMap } from 'ol'; import { defaults as interactionDefaults } from 'ol/interaction'; -import { DataFrame, GrafanaTheme2, SelectableValue } from '@grafana/data'; +import { SelectableValue } from '@grafana/data'; +import { DataFrame, GrafanaTheme2 } from '@grafana/data/src'; import { getColorDimension, getScalarDimension, getScaledDimension, getTextDimension } from 'app/features/dimensions'; import { getGrafanaDatasource } from 'app/plugins/datasource/grafana/datasource'; diff --git a/public/app/plugins/panel/graph/data_processor.ts b/public/app/plugins/panel/graph/data_processor.ts index 0b97dd6efbd..21afccf65d3 100644 --- a/public/app/plugins/panel/graph/data_processor.ts +++ b/public/app/plugins/panel/graph/data_processor.ts @@ -1,7 +1,7 @@ import { find } from 'lodash'; import { DataFrame, dateTime, Field, FieldType, getFieldDisplayName, getTimeField, TimeRange } from '@grafana/data'; -import { applyNullInsertThreshold } from '@grafana/data/internal'; +import { applyNullInsertThreshold } from '@grafana/data/src/transformations/transformers/nulls/nullInsertThreshold'; import { colors } from '@grafana/ui'; import config from 'app/core/config'; import TimeSeries from 'app/core/time_series2'; diff --git a/public/app/plugins/panel/histogram/Histogram.tsx b/public/app/plugins/panel/histogram/Histogram.tsx index 3225018263a..024d3105a51 100644 --- a/public/app/plugins/panel/histogram/Histogram.tsx +++ b/public/app/plugins/panel/histogram/Histogram.tsx @@ -9,9 +9,11 @@ import { getFieldSeriesColor, GrafanaTheme2, roundDecimals, +} from '@grafana/data'; +import { histogramBucketSizes, histogramFrameBucketMaxFieldName, -} from '@grafana/data'; +} from '@grafana/data/src/transformations/transformers/histogram'; import { VizLegendOptions, ScaleDistribution, AxisPlacement, ScaleDirection, ScaleOrientation } from '@grafana/schema'; import { Themeable2, diff --git a/public/app/plugins/panel/histogram/HistogramPanel.tsx b/public/app/plugins/panel/histogram/HistogramPanel.tsx index 6ec723bd766..082b0be63c4 100644 --- a/public/app/plugins/panel/histogram/HistogramPanel.tsx +++ b/public/app/plugins/panel/histogram/HistogramPanel.tsx @@ -1,14 +1,7 @@ import { useMemo } from 'react'; -import { - histogramFieldsToFrame, - joinHistograms, - DataFrameType, - PanelProps, - buildHistogram, - cacheFieldDisplayNames, - getHistogramFields, -} from '@grafana/data'; +import { DataFrameType, PanelProps, buildHistogram, cacheFieldDisplayNames, getHistogramFields } from '@grafana/data'; +import { histogramFieldsToFrame, joinHistograms } from '@grafana/data/src/transformations/transformers/histogram'; import { TooltipDisplayMode, TooltipPlugin2, useTheme2 } from '@grafana/ui'; import { TooltipHoverMode } from '@grafana/ui/internal'; diff --git a/public/app/plugins/panel/histogram/module.tsx b/public/app/plugins/panel/histogram/module.tsx index 2584b008737..cf95bbc463d 100644 --- a/public/app/plugins/panel/histogram/module.tsx +++ b/public/app/plugins/panel/histogram/module.tsx @@ -4,8 +4,8 @@ import { FieldType, identityOverrideProcessor, PanelPlugin, - histogramFieldInfo, } from '@grafana/data'; +import { histogramFieldInfo } from '@grafana/data/src/transformations/transformers/histogram'; import { commonOptionsBuilder, graphFieldOptions } from '@grafana/ui'; import { StackingEditor } from '@grafana/ui/internal'; diff --git a/public/app/plugins/panel/histogram/utils.ts b/public/app/plugins/panel/histogram/utils.ts index 25e1f33c4bd..51d041050bf 100644 --- a/public/app/plugins/panel/histogram/utils.ts +++ b/public/app/plugins/panel/histogram/utils.ts @@ -1,9 +1,8 @@ +import { DataFrame, FieldType } from '@grafana/data'; import { isHistogramFrameBucketMinFieldName, isHistogramFrameBucketMaxFieldName, - DataFrame, - FieldType, -} from '@grafana/data'; +} from '@grafana/data/src/transformations/transformers/histogram'; export function originalDataHasHistogram(frames?: DataFrame[]): boolean { if (frames?.length !== 1) { diff --git a/public/app/plugins/panel/logs/LogsPanel.tsx b/public/app/plugins/panel/logs/LogsPanel.tsx index be0b279952a..a335e830aca 100644 --- a/public/app/plugins/panel/logs/LogsPanel.tsx +++ b/public/app/plugins/panel/logs/LogsPanel.tsx @@ -29,8 +29,8 @@ import { urlUtil, LogSortOrderChangeEvent, LoadingState, - rangeUtil, } from '@grafana/data'; +import { convertRawToRange } from '@grafana/data/src/datetime/rangeutil'; import { config, getAppEvents } from '@grafana/runtime'; import { ScrollContainer, usePanelContext, useStyles2 } from '@grafana/ui'; import { getFieldLinksForExplore } from 'app/features/explore/utils/links'; @@ -574,7 +574,7 @@ export async function requestMoreLogs( return []; } - const range: TimeRange = rangeUtil.convertRawToRange({ + const range: TimeRange = convertRawToRange({ from: dateTimeForTimeZone(timeZone, timeRange.from), to: dateTimeForTimeZone(timeZone, timeRange.to), }); diff --git a/public/app/plugins/panel/nodeGraph/Node.test.tsx b/public/app/plugins/panel/nodeGraph/Node.test.tsx index 2c9bf841394..a73f0b8334e 100644 --- a/public/app/plugins/panel/nodeGraph/Node.test.tsx +++ b/public/app/plugins/panel/nodeGraph/Node.test.tsx @@ -1,6 +1,6 @@ import { render, screen } from '@testing-library/react'; -import { FieldType } from '@grafana/data'; +import { FieldType } from '@grafana/data/src'; import { Node } from './Node'; diff --git a/public/app/plugins/panel/stat/StatPanel.tsx b/public/app/plugins/panel/stat/StatPanel.tsx index 6d1c35cc63a..2411ab49943 100644 --- a/public/app/plugins/panel/stat/StatPanel.tsx +++ b/public/app/plugins/panel/stat/StatPanel.tsx @@ -10,7 +10,7 @@ import { NumericRange, PanelProps, } from '@grafana/data'; -import { findNumericFieldMinMax } from '@grafana/data/internal'; +import { findNumericFieldMinMax } from '@grafana/data/src/field/fieldOverrides'; import { BigValueTextMode, BigValueGraphMode } from '@grafana/schema'; import { BigValue, DataLinksContextMenu, VizRepeater, VizRepeaterRenderValueProps } from '@grafana/ui'; import { DataLinksContextMenuApi } from '@grafana/ui/internal'; diff --git a/public/app/plugins/panel/status-history/utils.ts b/public/app/plugins/panel/status-history/utils.ts index d077a54a959..cd683b7129c 100644 --- a/public/app/plugins/panel/status-history/utils.ts +++ b/public/app/plugins/panel/status-history/utils.ts @@ -1,4 +1,5 @@ -import { DataFrame, ActionModel, Field, InterpolateFunction, LinkModel } from '@grafana/data'; +import { ActionModel, Field, InterpolateFunction, LinkModel } from '@grafana/data'; +import { DataFrame } from '@grafana/data/'; import { getActions } from 'app/features/actions/utils'; export const getDataLinks = (field: Field, rowIdx: number) => { diff --git a/public/app/plugins/panel/table/migrations.ts b/public/app/plugins/panel/table/migrations.ts index aa4c635682c..734376e18be 100644 --- a/public/app/plugins/panel/table/migrations.ts +++ b/public/app/plugins/panel/table/migrations.ts @@ -10,7 +10,7 @@ import { DataFrame, FieldType, } from '@grafana/data'; -import { ReduceTransformerOptions } from '@grafana/data/internal'; +import { ReduceTransformerOptions } from '@grafana/data/src/transformations/transformers/reduce'; import { Options } from './panelcfg.gen'; diff --git a/public/app/plugins/panel/timeseries/utils.ts b/public/app/plugins/panel/timeseries/utils.ts index 8b974ac38fa..02fc7ea3b34 100644 --- a/public/app/plugins/panel/timeseries/utils.ts +++ b/public/app/plugins/panel/timeseries/utils.ts @@ -7,10 +7,10 @@ import { isBooleanUnit, TimeRange, cacheFieldDisplayNames, - applyNullInsertThreshold, - nullToValue, } from '@grafana/data'; -import { convertFieldType } from '@grafana/data/internal'; +import { convertFieldType } from '@grafana/data/src/transformations/transformers/convertFieldType'; +import { applyNullInsertThreshold } from '@grafana/data/src/transformations/transformers/nulls/nullInsertThreshold'; +import { nullToValue } from '@grafana/data/src/transformations/transformers/nulls/nullToValue'; import { GraphFieldConfig, LineInterpolation, TooltipDisplayMode, VizTooltipOptions } from '@grafana/schema'; import { buildScaleKey } from '@grafana/ui/internal'; diff --git a/public/app/plugins/panel/trend/TrendPanel.tsx b/public/app/plugins/panel/trend/TrendPanel.tsx index ff54529bbe4..f043c113b1f 100644 --- a/public/app/plugins/panel/trend/TrendPanel.tsx +++ b/public/app/plugins/panel/trend/TrendPanel.tsx @@ -1,14 +1,7 @@ import { useMemo } from 'react'; -import { - isLikelyAscendingVector, - DataFrame, - FieldMatcherID, - fieldMatchers, - FieldType, - PanelProps, - TimeRange, -} from '@grafana/data'; +import { DataFrame, FieldMatcherID, fieldMatchers, FieldType, PanelProps, TimeRange } from '@grafana/data'; +import { isLikelyAscendingVector } from '@grafana/data/src/transformations/transformers/joinDataFrames'; import { config, PanelDataErrorView } from '@grafana/runtime'; import { KeyboardPlugin, TooltipDisplayMode, usePanelContext, TooltipPlugin2 } from '@grafana/ui'; import { TooltipHoverMode } from '@grafana/ui/internal'; diff --git a/public/app/plugins/panel/xychart/XYChartPanel.tsx b/public/app/plugins/panel/xychart/XYChartPanel.tsx index e3e667730c2..31d4784a7aa 100644 --- a/public/app/plugins/panel/xychart/XYChartPanel.tsx +++ b/public/app/plugins/panel/xychart/XYChartPanel.tsx @@ -1,7 +1,8 @@ import { css } from '@emotion/css'; import { useMemo } from 'react'; -import { colorManipulator, FALLBACK_COLOR, PanelProps } from '@grafana/data'; +import { FALLBACK_COLOR, PanelProps } from '@grafana/data'; +import { alpha } from '@grafana/data/src/themes/colorManipulator'; import { config } from '@grafana/runtime'; import { TooltipDisplayMode, @@ -71,7 +72,7 @@ export const XYChartPanel2 = (props: Props2) => { items.push({ yAxis: 1, // TODO: pull from y field label: s.name.value, - color: colorManipulator.alpha(s.color.fixed ?? FALLBACK_COLOR, 1), + color: alpha(s.color.fixed ?? FALLBACK_COLOR, 1), getItemKey: () => `${idx}-${s.name.value}`, fieldName: yField.state?.displayName ?? yField.name, disabled: yField.state?.hideFrom?.viz ?? false, diff --git a/public/app/plugins/panel/xychart/XYChartTooltip.tsx b/public/app/plugins/panel/xychart/XYChartTooltip.tsx index f72a67b7b5e..f9b0d588d31 100644 --- a/public/app/plugins/panel/xychart/XYChartTooltip.tsx +++ b/public/app/plugins/panel/xychart/XYChartTooltip.tsx @@ -1,6 +1,7 @@ import { ReactNode } from 'react'; -import { colorManipulator, DataFrame, InterpolateFunction, LinkModel } from '@grafana/data'; +import { DataFrame, InterpolateFunction, LinkModel } from '@grafana/data'; +import { alpha } from '@grafana/data/src/themes/colorManipulator'; import { VizTooltipContent, VizTooltipFooter, @@ -66,7 +67,7 @@ export const XYChartTooltip = ({ const headerItem: VizTooltipItem = { label, value: '', - color: colorManipulator.alpha(seriesColor ?? '#fff', 0.5), + color: alpha(seriesColor ?? '#fff', 0.5), colorIndicator: ColorIndicator.marker_md, }; diff --git a/public/app/plugins/panel/xychart/scatter.ts b/public/app/plugins/panel/xychart/scatter.ts index d7bb53a3838..b2d9156ffbb 100644 --- a/public/app/plugins/panel/xychart/scatter.ts +++ b/public/app/plugins/panel/xychart/scatter.ts @@ -11,8 +11,8 @@ import { MappingType, SpecialValueMatch, ThresholdsMode, - colorManipulator, } from '@grafana/data'; +import { alpha } from '@grafana/data/src/themes/colorManipulator'; import { AxisPlacement, FieldColorModeId, ScaleDirection, ScaleOrientation, VisibilityMode } from '@grafana/schema'; import { UPlotConfigBuilder } from '@grafana/ui'; import { FacetedData, FacetSeries } from '@grafana/ui/internal'; @@ -86,8 +86,8 @@ export const prepConfig = (xySeries: XYSeries[], theme: GrafanaTheme2) => { let pointAlpha = scatterInfo.fillOpacity / 100; - u.ctx.fillStyle = colorManipulator.alpha((series.fill as any)(), pointAlpha); - u.ctx.strokeStyle = colorManipulator.alpha((series.stroke as any)(), 1); + u.ctx.fillStyle = alpha((series.fill as any)(), pointAlpha); + u.ctx.strokeStyle = alpha((series.stroke as any)(), 1); u.ctx.lineWidth = strokeWidth; let deg360 = 2 * Math.PI; @@ -138,8 +138,8 @@ export const prepConfig = (xySeries: XYSeries[], theme: GrafanaTheme2) => { if (pointColors[i] !== curColorIdx) { curColorIdx = pointColors[i]; let c = curColorIdx === -1 ? FALLBACK_COLOR : pointPalette[curColorIdx]; - u.ctx.fillStyle = paletteHasAlpha ? c : colorManipulator.alpha(c as string, pointAlpha); - u.ctx.strokeStyle = colorManipulator.alpha(c as string, 1); + u.ctx.fillStyle = paletteHasAlpha ? c : alpha(c as string, pointAlpha); + u.ctx.strokeStyle = alpha(c as string, 1); } } @@ -421,8 +421,8 @@ export const prepConfig = (xySeries: XYSeries[], theme: GrafanaTheme2) => { pathBuilder: drawBubbles, // drawBubbles({disp: {size: {values: () => }}}) theme, scaleKey: '', // facets' scales used (above) - lineColor: colorManipulator.alpha(lineColor ?? '#ffff', 1), - fillColor: colorManipulator.alpha(pointColor ?? '#ffff', 0.5), + lineColor: alpha(lineColor ?? '#ffff', 1), + fillColor: alpha(pointColor ?? '#ffff', 0.5), show: !field.state?.hideFrom?.viz, }); }); diff --git a/public/app/plugins/panel/xychart/utils.ts b/public/app/plugins/panel/xychart/utils.ts index 4425666fe0b..47884a7540b 100644 --- a/public/app/plugins/panel/xychart/utils.ts +++ b/public/app/plugins/panel/xychart/utils.ts @@ -12,7 +12,7 @@ import { FieldMatcherID, FieldConfigSource, } from '@grafana/data'; -import { decoupleHideFromState } from '@grafana/data/internal'; +import { decoupleHideFromState } from '@grafana/data/src/field/fieldState'; import { config } from '@grafana/runtime'; import { VisibilityMode } from '@grafana/schema'; diff --git a/public/app/routes/RoutesWrapper.tsx b/public/app/routes/RoutesWrapper.tsx index ee0318cb7a7..7e4701f040e 100644 --- a/public/app/routes/RoutesWrapper.tsx +++ b/public/app/routes/RoutesWrapper.tsx @@ -4,7 +4,7 @@ import { ComponentType, ReactNode } from 'react'; import { Router } from 'react-router-dom'; import { CompatRouter } from 'react-router-dom-v5-compat'; -import { GrafanaTheme2 } from '@grafana/data'; +import { GrafanaTheme2 } from '@grafana/data/'; import { config, locationService, From d82a877f6569b4a61d49dfa34ae52a52c10ab108 Mon Sep 17 00:00:00 2001 From: Ashley Harrison Date: Mon, 17 Mar 2025 12:27:40 +0000 Subject: [PATCH 092/117] GrafanaUI: Mark up or ignore remaining grafana-ui translations (#102203) * markup or ignore remaining grafana-ui translations * fix unit tests, commit betterer results which somehow didn't get autocommitted?! :o * fix SharedPreferences unit test * fix remaining unit tests * fix azure e2e test * better solution --- .betterer.results | 99 ++----------------- e2e/cloud-plugins-suite/azure-monitor.spec.ts | 5 +- .../src/components/DataSourcePicker.test.tsx | 4 +- .../DataLinks/DataLinkSuggestions.tsx | 2 +- .../components/FileDropzone/FileDropzone.tsx | 8 +- .../components/FileDropzone/FileListItem.tsx | 11 ++- .../src/components/FileUpload/FileUpload.tsx | 3 +- .../InteractiveTable/Expander/index.tsx | 3 +- .../FieldNameByRegexMatcherEditor.tsx | 9 +- .../MatchersUI/FieldValueMatcher.tsx | 5 +- .../src/components/Menu/MenuItem.tsx | 3 +- .../Monaco/ReactMonacoEditorLazy.tsx | 10 +- .../src/components/PanelChrome/PanelMenu.tsx | 5 +- .../src/components/Select/MultiValue.tsx | 11 ++- .../src/components/Select/SelectBase.tsx | 10 +- .../src/components/Select/SelectMenu.tsx | 6 +- .../src/components/Table/CellActions.tsx | 17 +++- .../src/components/Table/FilterList.tsx | 16 ++- .../src/components/Table/FilterPopup.tsx | 4 +- .../components/Table/TableCellInspector.tsx | 4 +- .../TableInputCSV/TableInputCSV.tsx | 4 +- .../src/components/Tags/TagList.tsx | 3 +- .../src/components/TagsInput/TagItem.tsx | 3 +- .../components/TagsInput/TagsInput.test.tsx | 4 +- .../src/components/Toggletip/Toggletip.tsx | 3 +- .../ToolbarButton/ToolbarButtonRow.tsx | 3 +- .../src/components/UnitPicker/UnitPicker.tsx | 3 +- .../components/UsersIndicator/UserIcon.tsx | 4 +- .../UsersIndicator/UsersIndicator.tsx | 6 +- .../src/components/VizTooltip/SeriesTable.tsx | 3 +- .../grafana-ui/src/options/builder/axis.tsx | 6 +- .../src/options/builder/stacking.tsx | 11 ++- .../SharedPreferences.test.tsx | 4 +- .../pages/DashboardScenePage.test.tsx | 2 +- .../FieldToConfigMappingEditor.test.tsx | 2 +- .../ArgQueryEditor/ArgQueryEditor.test.tsx | 2 +- .../LogGroups/LogGroupsSelector.test.tsx | 2 +- .../SearchTraceQLEditor/SearchField.test.tsx | 2 +- public/locales/en-US/grafana.json | 71 ++++++++++++- 39 files changed, 213 insertions(+), 160 deletions(-) diff --git a/.betterer.results b/.betterer.results index 6849eaed996..c5c5835206e 100644 --- a/.betterer.results +++ b/.betterer.results @@ -548,9 +548,6 @@ exports[`better eslint`] = { "packages/grafana-ui/src/components/DataLinks/DataLinkInput.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], - "packages/grafana-ui/src/components/DataLinks/DataLinkSuggestions.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] - ], "packages/grafana-ui/src/components/DataSourceSettings/CustomHeadersSettings.tsx:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"] @@ -559,15 +556,6 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"] ], - "packages/grafana-ui/src/components/FileDropzone/FileDropzone.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] - ], - "packages/grafana-ui/src/components/FileDropzone/FileListItem.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] - ], - "packages/grafana-ui/src/components/FileUpload/FileUpload.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] - ], "packages/grafana-ui/src/components/Forms/Legacy/Input/Input.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Do not use any type assertions.", "1"], @@ -585,67 +573,39 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "1"], [0, 0, 0, "Unexpected any. Specify a different type.", "2"] ], - "packages/grafana-ui/src/components/InteractiveTable/Expander/index.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] - ], "packages/grafana-ui/src/components/JSONFormatter/json_explorer/json_explorer.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"] ], - "packages/grafana-ui/src/components/MatchersUI/FieldNameByRegexMatcherEditor.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] - ], "packages/grafana-ui/src/components/MatchersUI/FieldValueMatcher.tsx:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"] + [0, 0, 0, "Do not use any type assertions.", "0"] ], "packages/grafana-ui/src/components/MatchersUI/fieldMatchersUI.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], - "packages/grafana-ui/src/components/Menu/MenuItem.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] - ], "packages/grafana-ui/src/components/Modal/ModalsContext.tsx:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"], [0, 0, 0, "Unexpected any. Specify a different type.", "2"], [0, 0, 0, "Unexpected any. Specify a different type.", "3"] ], - "packages/grafana-ui/src/components/Monaco/ReactMonacoEditorLazy.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"] - ], "packages/grafana-ui/src/components/PanelChrome/PanelContext.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"] ], - "packages/grafana-ui/src/components/PanelChrome/PanelMenu.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"] - ], "packages/grafana-ui/src/components/PanelChrome/index.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], "packages/grafana-ui/src/components/Segment/SegmentSelect.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], - "packages/grafana-ui/src/components/Select/MultiValue.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] - ], "packages/grafana-ui/src/components/Select/SelectBase.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Do not use any type assertions.", "1"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"], + [0, 0, 0, "Unexpected any. Specify a different type.", "2"], + [0, 0, 0, "Unexpected any. Specify a different type.", "3"], [0, 0, 0, "Unexpected any. Specify a different type.", "4"], - [0, 0, 0, "Unexpected any. Specify a different type.", "5"], - [0, 0, 0, "Unexpected any. Specify a different type.", "6"], - [0, 0, 0, "Unexpected any. Specify a different type.", "7"] - ], - "packages/grafana-ui/src/components/Select/SelectMenu.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"] + [0, 0, 0, "Unexpected any. Specify a different type.", "5"] ], "packages/grafana-ui/src/components/Select/ValueContainer.tsx:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] @@ -691,21 +651,11 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "1"], [0, 0, 0, "Unexpected any. Specify a different type.", "2"] ], - "packages/grafana-ui/src/components/Table/CellActions.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"] - ], "packages/grafana-ui/src/components/Table/Filter.tsx:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], - "packages/grafana-ui/src/components/Table/FilterList.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"] - ], "packages/grafana-ui/src/components/Table/FilterPopup.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "Unexpected any. Specify a different type.", "1"] + [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], "packages/grafana-ui/src/components/Table/FooterRow.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], @@ -726,8 +676,7 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "3"] ], "packages/grafana-ui/src/components/Table/TableCellInspector.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "Unexpected any. Specify a different type.", "1"] + [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], "packages/grafana-ui/src/components/Table/reducer.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], @@ -746,33 +695,9 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "4"], [0, 0, 0, "Unexpected any. Specify a different type.", "5"] ], - "packages/grafana-ui/src/components/TableInputCSV/TableInputCSV.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] - ], "packages/grafana-ui/src/components/Tags/Tag.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], - "packages/grafana-ui/src/components/Tags/TagList.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] - ], - "packages/grafana-ui/src/components/TagsInput/TagItem.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] - ], - "packages/grafana-ui/src/components/Toggletip/Toggletip.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] - ], - "packages/grafana-ui/src/components/ToolbarButton/ToolbarButtonRow.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] - ], - "packages/grafana-ui/src/components/UnitPicker/UnitPicker.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] - ], - "packages/grafana-ui/src/components/UsersIndicator/UserIcon.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] - ], - "packages/grafana-ui/src/components/UsersIndicator/UsersIndicator.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] - ], "packages/grafana-ui/src/components/ValuePicker/ValuePicker.tsx:5381": [ [0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "0"] ], @@ -784,9 +709,6 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Do not use any type assertions.", "1"] ], - "packages/grafana-ui/src/components/VizTooltip/SeriesTable.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"] - ], "packages/grafana-ui/src/components/VizTooltip/VizTooltip.tsx:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"] @@ -815,18 +737,9 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"] ], - "packages/grafana-ui/src/options/builder/axis.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"] - ], "packages/grafana-ui/src/options/builder/hideSeries.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], - "packages/grafana-ui/src/options/builder/stacking.tsx:5381": [ - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"], - [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"] - ], "packages/grafana-ui/src/slate-plugins/braces.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], diff --git a/e2e/cloud-plugins-suite/azure-monitor.spec.ts b/e2e/cloud-plugins-suite/azure-monitor.spec.ts index 1c6db341089..23de1596f79 100644 --- a/e2e/cloud-plugins-suite/azure-monitor.spec.ts +++ b/e2e/cloud-plugins-suite/azure-monitor.spec.ts @@ -222,10 +222,7 @@ describe('Azure monitor datasource', () => { queriesForm: () => { e2eSelectors.queryEditor.header.select().find('input').type('Azure Resource Graph{enter}'); cy.wait(1000); // Need to wait for code editor to completely load - e2eSelectors.queryEditor.argsQueryEditor.subscriptions - .input() - .find('[aria-label="select-clear-value"]') - .click(); + e2eSelectors.queryEditor.argsQueryEditor.subscriptions.input().find('[aria-label="Clear value"]').click(); e2eSelectors.queryEditor.argsQueryEditor.subscriptions.input().find('input').type('datasources{enter}'); e2e.components.CodeEditor.container().type( "Resources | where resourceGroup == 'cloud-plugins-e2e-test-azmon' | project name, resourceGroup" diff --git a/packages/grafana-runtime/src/components/DataSourcePicker.test.tsx b/packages/grafana-runtime/src/components/DataSourcePicker.test.tsx index 6480a2644dc..6f7ceb6da00 100644 --- a/packages/grafana-runtime/src/components/DataSourcePicker.test.tsx +++ b/packages/grafana-runtime/src/components/DataSourcePicker.test.tsx @@ -11,7 +11,7 @@ describe('DataSourcePicker', () => { const onClear = jest.fn(); const select = render(); - const clearButton = select.getByLabelText('select-clear-value'); + const clearButton = select.getByLabelText('Clear value'); await userEvent.click(clearButton); expect(onClear).toHaveBeenCalled(); }); @@ -20,7 +20,7 @@ describe('DataSourcePicker', () => { const select = render(); expect(() => { - select.getByLabelText('select-clear-value'); + select.getByLabelText('Clear value'); }).toThrowError(); }); diff --git a/packages/grafana-ui/src/components/DataLinks/DataLinkSuggestions.tsx b/packages/grafana-ui/src/components/DataLinks/DataLinkSuggestions.tsx index 2e6ca8d215a..9d943c4e0c3 100644 --- a/packages/grafana-ui/src/components/DataLinks/DataLinkSuggestions.tsx +++ b/packages/grafana-ui/src/components/DataLinks/DataLinkSuggestions.tsx @@ -87,7 +87,7 @@ export const DataLinkSuggestions = ({ suggestions, ...otherProps }: DataLinkSugg - + {errors.map((error) => { switch (error.code) { case ErrorCode.FileTooLarge: diff --git a/packages/grafana-ui/src/components/FileDropzone/FileListItem.tsx b/packages/grafana-ui/src/components/FileDropzone/FileListItem.tsx index 4b69dc72219..4af1d39bdd1 100644 --- a/packages/grafana-ui/src/components/FileDropzone/FileListItem.tsx +++ b/packages/grafana-ui/src/components/FileDropzone/FileListItem.tsx @@ -4,7 +4,7 @@ import { formattedValueToString, getValueFormat, GrafanaTheme2 } from '@grafana/ import { useStyles2 } from '../../themes'; import { trimFileName } from '../../utils/file'; -import { Trans } from '../../utils/i18n'; +import { t, Trans } from '../../utils/i18n'; import { Button } from '../Button'; import { Icon } from '../Icon/Icon'; import { IconButton } from '../IconButton/IconButton'; @@ -26,7 +26,14 @@ export function FileListItem({ file: customFile, removeFile }: FileListItemProps return ( <> {error.message} - {retryUpload && } + {retryUpload && ( + + )} {removeFile && ( diff --git a/packages/grafana-ui/src/components/InteractiveTable/Expander/index.tsx b/packages/grafana-ui/src/components/InteractiveTable/Expander/index.tsx index e40d34d4ae8..ac9a4563f67 100644 --- a/packages/grafana-ui/src/components/InteractiveTable/Expander/index.tsx +++ b/packages/grafana-ui/src/components/InteractiveTable/Expander/index.tsx @@ -1,6 +1,7 @@ import { css } from '@emotion/css'; import { CellProps, HeaderProps } from 'react-table'; +import { t } from '../../../utils/i18n'; import { IconButton } from '../../IconButton/IconButton'; const expanderContainerStyles = css({ @@ -13,7 +14,7 @@ export function ExpanderCell({ row, __rowID }: CellProps >((props [onChange] ); - return ; + return ( + + ); }); FieldNameByRegexMatcherEditor.displayName = 'FieldNameByRegexMatcherEditor'; diff --git a/packages/grafana-ui/src/components/MatchersUI/FieldValueMatcher.tsx b/packages/grafana-ui/src/components/MatchersUI/FieldValueMatcher.tsx index 3efd06c618e..f5d28b03df7 100644 --- a/packages/grafana-ui/src/components/MatchersUI/FieldValueMatcher.tsx +++ b/packages/grafana-ui/src/components/MatchersUI/FieldValueMatcher.tsx @@ -14,6 +14,7 @@ import { import { ComparisonOperation } from '@grafana/schema'; import { useStyles2 } from '../../themes'; +import { t } from '../../utils/i18n'; import { Input } from '../Input/Input'; import { Select } from '../Select/Select'; @@ -70,7 +71,7 @@ export const FieldValueMatcherEditor = ({ options, onChange }: Props) => { value={reducer.current} options={reducer.options} onChange={onSetReducer} - placeholder="Select field reducer" + placeholder={t('grafana-ui.field-value-matcher.select-field-placeholder', 'Select field reducer')} /> {opts.reducer && !isBool && ( <> @@ -78,7 +79,7 @@ export const FieldValueMatcherEditor = ({ options, onChange }: Props) => { value={comparisonOperationOptions.find((v) => v.value === opts.op)} options={comparisonOperationOptions} onChange={onChangeOp} - aria-label={'Comparison operator'} + aria-label={t('grafana-ui.field-value-matcher.operator-label', 'Comparison operator')} width={19} /> diff --git a/packages/grafana-ui/src/components/Menu/MenuItem.tsx b/packages/grafana-ui/src/components/Menu/MenuItem.tsx index c2a4654113a..f295b8eb22b 100644 --- a/packages/grafana-ui/src/components/Menu/MenuItem.tsx +++ b/packages/grafana-ui/src/components/Menu/MenuItem.tsx @@ -7,6 +7,7 @@ import { GrafanaTheme2, LinkTarget } from '@grafana/data'; import { useStyles2 } from '../../themes'; import { getFocusStyles } from '../../themes/mixins'; import { IconName } from '../../types/icon'; +import { t } from '../../utils/i18n'; import { Icon } from '../Icon/Icon'; import { Stack } from '../Layout/Stack/Stack'; @@ -180,7 +181,7 @@ export const MenuItem = React.memo(
{hasShortcut && (
- + {shortcut}
)} diff --git a/packages/grafana-ui/src/components/Monaco/ReactMonacoEditorLazy.tsx b/packages/grafana-ui/src/components/Monaco/ReactMonacoEditorLazy.tsx index 4946ead2ba5..f5dc860567c 100644 --- a/packages/grafana-ui/src/components/Monaco/ReactMonacoEditorLazy.tsx +++ b/packages/grafana-ui/src/components/Monaco/ReactMonacoEditorLazy.tsx @@ -4,6 +4,7 @@ import { GrafanaTheme2 } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; import { useStyles2 } from '../../themes'; +import { t } from '../../utils/i18n'; import { useAsyncDependency } from '../../utils/useAsyncDependency'; import { ErrorWithStack } from '../ErrorBoundary/ErrorWithStack'; import { LoadingPlaceholder } from '../LoadingPlaceholder/LoadingPlaceholder'; @@ -22,13 +23,18 @@ export const ReactMonacoEditorLazy = (props: ReactMonacoEditorProps) => { ); if (loading) { - return ; + return ( + + ); } if (error) { return ( diff --git a/packages/grafana-ui/src/components/PanelChrome/PanelMenu.tsx b/packages/grafana-ui/src/components/PanelChrome/PanelMenu.tsx index d11fd2d4243..5116b76e41c 100644 --- a/packages/grafana-ui/src/components/PanelChrome/PanelMenu.tsx +++ b/packages/grafana-ui/src/components/PanelChrome/PanelMenu.tsx @@ -3,6 +3,7 @@ import { ReactElement, useCallback } from 'react'; import { selectors } from '@grafana/e2e-selectors'; +import { t } from '../../utils/i18n'; import { Dropdown } from '../Dropdown/Dropdown'; import { ToolbarButton } from '../ToolbarButton'; import { TooltipPlacement } from '../Tooltip'; @@ -40,8 +41,8 @@ export function PanelMenu({ return ( ) => { const theme = useTheme2(); const styles = getSelectStyles(theme); - return ; + return ( + + ); }; diff --git a/packages/grafana-ui/src/components/Select/SelectBase.tsx b/packages/grafana-ui/src/components/Select/SelectBase.tsx index 6a173554360..899a9a460d8 100644 --- a/packages/grafana-ui/src/components/Select/SelectBase.tsx +++ b/packages/grafana-ui/src/components/Select/SelectBase.tsx @@ -1,4 +1,3 @@ -import { t } from 'i18next'; import { isArray, negate } from 'lodash'; import { ComponentProps, useCallback, useEffect, useRef, useState } from 'react'; import * as React from 'react'; @@ -15,7 +14,7 @@ import Creatable from 'react-select/creatable'; import { SelectableValue, toOption } from '@grafana/data'; import { useTheme2 } from '../../themes'; -import { Trans } from '../../utils/i18n'; +import { t, Trans } from '../../utils/i18n'; import { Icon } from '../Icon/Icon'; import { Spinner } from '../Spinner/Spinner'; @@ -351,7 +350,7 @@ export function SelectBase({ { e.preventDefault(); @@ -369,7 +368,10 @@ export function SelectBase({ }, NoOptionsMessage() { return ( -
+
{noOptionsMessage}
); diff --git a/packages/grafana-ui/src/components/Select/SelectMenu.tsx b/packages/grafana-ui/src/components/Select/SelectMenu.tsx index e19c8d87546..779b737ef15 100644 --- a/packages/grafana-ui/src/components/Select/SelectMenu.tsx +++ b/packages/grafana-ui/src/components/Select/SelectMenu.tsx @@ -8,7 +8,7 @@ import { SelectableValue, toIconName } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; import { useTheme2 } from '../../themes/ThemeContext'; -import { Trans } from '../../utils/i18n'; +import { t, Trans } from '../../utils/i18n'; import { clearButtonStyles } from '../Button'; import { Icon } from '../Icon/Icon'; import { ScrollContainer } from '../ScrollContainer/ScrollContainer'; @@ -52,7 +52,7 @@ export const SelectMenu = ({ data-testid={selectors.components.Select.menu} className={styles.menu} style={{ maxHeight }} - aria-label="Select options menu" + aria-label={t('grafana-ui.select.menu-label', 'Select options menu')} > {toggleAllOptions && ( @@ -185,7 +185,7 @@ export const VirtualizedSelectMenu = ({ className={styles.menu} height={heightEstimate} width={widthEstimate} - aria-label="Select options menu" + aria-label={t('grafana-ui.select.menu-label', 'Select options menu')} itemCount={flattenedChildren.length} itemSize={VIRTUAL_LIST_ITEM_HEIGHT} > diff --git a/packages/grafana-ui/src/components/Table/CellActions.tsx b/packages/grafana-ui/src/components/Table/CellActions.tsx index 8c70d56a481..8adfe7e9747 100644 --- a/packages/grafana-ui/src/components/Table/CellActions.tsx +++ b/packages/grafana-ui/src/components/Table/CellActions.tsx @@ -2,6 +2,7 @@ import { useCallback } from 'react'; import * as React from 'react'; import { IconSize } from '../../types/icon'; +import { t } from '../../utils/i18n'; import { IconButton } from '../IconButton/IconButton'; import { Stack } from '../Layout/Stack/Stack'; import { TooltipPlacement } from '../Tooltip'; @@ -58,7 +59,7 @@ export function CellActions({ {inspectEnabled && ( { if (setInspectCell) { setInspectCell({ value: cell.value, mode: previewMode }); @@ -68,10 +69,20 @@ export function CellActions({ /> )} {showFilters && ( - + )} {showFilters && ( - + )}
diff --git a/packages/grafana-ui/src/components/Table/FilterList.tsx b/packages/grafana-ui/src/components/Table/FilterList.tsx index cce379ce575..9aa254062cc 100644 --- a/packages/grafana-ui/src/components/Table/FilterList.tsx +++ b/packages/grafana-ui/src/components/Table/FilterList.tsx @@ -7,7 +7,7 @@ import { GrafanaTheme2, formattedValueToString, getValueFormat, SelectableValue import { ButtonSelect, Checkbox, FilterInput, Label, Stack } from '..'; import { useStyles2, useTheme2 } from '../../themes'; -import { Trans } from '../../utils/i18n'; +import { t, Trans } from '../../utils/i18n'; interface Props { values: SelectableValue[]; @@ -172,7 +172,13 @@ export const FilterList = ({ return ( - {!showOperators && } + {!showOperators && ( + + )} {showOperators && ( - + )} {items.length > 0 ? ( diff --git a/packages/grafana-ui/src/components/Table/FilterPopup.tsx b/packages/grafana-ui/src/components/Table/FilterPopup.tsx index 30a3cf0d021..f80f9fb0627 100644 --- a/packages/grafana-ui/src/components/Table/FilterPopup.tsx +++ b/packages/grafana-ui/src/components/Table/FilterPopup.tsx @@ -6,7 +6,7 @@ import { Field, GrafanaTheme2, SelectableValue } from '@grafana/data'; import { Button, ClickOutsideWrapper, IconButton, Label, Stack } from '..'; import { useStyles2, useTheme2 } from '../../themes'; -import { Trans } from '../../utils/i18n'; +import { t, Trans } from '../../utils/i18n'; import { FilterList } from './FilterList'; import { TableStyles } from './styles'; @@ -75,7 +75,7 @@ export const FilterPopup = ({ { setMatchCase((s) => !s); diff --git a/packages/grafana-ui/src/components/Table/TableCellInspector.tsx b/packages/grafana-ui/src/components/Table/TableCellInspector.tsx index c9a78b51d53..21d8a5cde81 100644 --- a/packages/grafana-ui/src/components/Table/TableCellInspector.tsx +++ b/packages/grafana-ui/src/components/Table/TableCellInspector.tsx @@ -1,7 +1,7 @@ import { isString } from 'lodash'; import { useState } from 'react'; -import { Trans } from '../../utils/i18n'; +import { t, Trans } from '../../utils/i18n'; import { ClipboardButton } from '../ClipboardButton/ClipboardButton'; import { Drawer } from '../Drawer/Drawer'; import { Stack } from '../Layout/Stack/Stack'; @@ -68,7 +68,7 @@ export function TableCellInspector({ value, onDismiss, mode }: TableCellInspecto ); return ( - + text} style={{ marginLeft: 'auto', width: '200px' }}> Copy to Clipboard diff --git a/packages/grafana-ui/src/components/TableInputCSV/TableInputCSV.tsx b/packages/grafana-ui/src/components/TableInputCSV/TableInputCSV.tsx index c9559c8d07b..75a231b840e 100644 --- a/packages/grafana-ui/src/components/TableInputCSV/TableInputCSV.tsx +++ b/packages/grafana-ui/src/components/TableInputCSV/TableInputCSV.tsx @@ -7,7 +7,7 @@ import { DataFrame, CSVConfig, readCSV, GrafanaTheme2 } from '@grafana/data'; import { stylesFactory, withTheme2 } from '../../themes'; import { Themeable2 } from '../../types/theme'; -import { Trans } from '../../utils/i18n'; +import { t, Trans } from '../../utils/i18n'; import { Icon } from '../Icon/Icon'; import { TextArea } from '../TextArea/TextArea'; @@ -74,7 +74,7 @@ export class UnThemedTableInputCSV extends PureComponent {