diff --git a/.betterer.results b/.betterer.results index bafa487b8df..2edb5a615c0 100644 --- a/.betterer.results +++ b/.betterer.results @@ -835,8 +835,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, "Unexpected any. Specify a different type.", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "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"], @@ -3120,9 +3119,7 @@ exports[`better eslint`] = { ], "public/app/features/dashboard/components/GenAI/GenAIHistory.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 ", "1"] ], "public/app/features/dashboard/components/GenAI/MinimalisticPagination.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] @@ -4096,7 +4093,9 @@ 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 ", "7"], + [0, 0, 0, "No untranslated strings. Wrap text with ", "8"], + [0, 0, 0, "No untranslated strings. Wrap text with ", "9"] ], "public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/AccordianReferences.tsx:5381": [ [0, 0, 0, "Styles should be written using objects.", "0"], diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 5bc3cab07ce..cfc637c729b 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -369,6 +369,7 @@ /package.json @grafana/frontend-ops /nx.json @grafana/frontend-ops /project.json @grafana/frontend-ops +/.nxignore @grafana/frontend-ops /tsconfig.json @grafana/frontend-ops /.editorconfig @grafana/frontend-ops /.eslintignore @grafana/frontend-ops @@ -403,7 +404,6 @@ playwright.config.ts @grafana/plugins-platform-frontend /public/app/core/components/TimelineChart/ @grafana/dataviz-squad /public/app/core/components/Form/ @grafana/grafana-frontend-platform /public/app/core/history/ @grafana/explore-squad -/public/app/features/all.ts @grafana/grafana-frontend-platform /public/app/features/admin/ @grafana/identity-access-team # Temp owners until Enterprise team takes over @@ -502,6 +502,7 @@ playwright.config.ts @grafana/plugins-platform-frontend /public/lib/ @grafana/grafana-frontend-platform /public/lib/monaco-languages/kusto.ts @grafana/partner-datasources /public/maps/ @ryantxu +/public/mockServiceWorker.js @grafana/frontend-ops /public/robots.txt @grafana/frontend-ops /public/fonts/ @grafana/grafana-frontend-platform /public/sass/ @grafana/grafana-frontend-platform diff --git a/.github/commands.json b/.github/commands.json index dac2f7ed60d..568ea8d6316 100644 --- a/.github/commands.json +++ b/.github/commands.json @@ -483,6 +483,14 @@ "url": "https://github.com/orgs/grafana/projects/202" } }, + { + "type": "label", + "name": "type/build-packaging", + "action": "addToProject", + "addToProject": { + "url": "https://github.com/orgs/grafana/projects/509" + } + }, { "type": "label", "name": "type/accessibility", @@ -656,7 +664,7 @@ "name": "area/security", "action": "addToProject", "addToProject": { - "url": "https://github.com/orgs/grafana/projects/47" + "url": "https://github.com/orgs/grafana/projects/470" } }, { diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index c0d2a24b0ac..d23ca18e612 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -74,8 +74,15 @@ jobs: sparse-checkout: | .github/workflows CHANGELOG.md + .nvmrc + .prettierignore + .prettierrc.js fetch-depth: 0 fetch-tags: true + - name: Setup nodejs environment + uses: actions/setup-node@v4 + with: + node-version-file: .nvmrc - name: "Configure git user" run: | git config --local user.name "github-actions[bot]" @@ -120,9 +127,11 @@ jobs: fi git diff CHANGELOG.md - git add CHANGELOG.md + + - name: "Prettify CHANGELOG.md" + run: npx prettier --write CHANGELOG.md - name: "Commit changelog changes" - run: git commit --allow-empty -m "Update changelog" CHANGELOG.md + run: git add CHANGELOG.md && git commit --allow-empty -m "Update changelog" CHANGELOG.md - name: "git push" if: ${{ inputs.dry_run }} != true run: git push diff --git a/.github/workflows/detect-breaking-changes-levitate.yml b/.github/workflows/detect-breaking-changes-levitate.yml index ad0fcdbcdcf..b35e86724fa 100644 --- a/.github/workflows/detect-breaking-changes-levitate.yml +++ b/.github/workflows/detect-breaking-changes-levitate.yml @@ -254,6 +254,8 @@ jobs: [Read our guideline](https://github.com/grafana/grafana/blob/main/contribute/breaking-changes-guide/breaking-changes-guide.md) [Console output](${{ steps.levitate-run.outputs.job_link }}) + + * Your pull request merge won't be blocked. GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }} # Remove comment from the PR (no more breaking changes) @@ -353,5 +355,9 @@ jobs: }); - name: Exit - run: exit ${{ steps.levitate-run.outputs.exit_code }} + run: | + if [ "${{ steps.levitate-run.outputs.exit_code }}" -ne 0 ]; then + echo "Breaking changes detected. Please check the levitate report in your pull request. This workflow won't block merging." + fi + exit ${{ steps.levitate-run.outputs.exit_code }} shell: bash diff --git a/.github/workflows/i18n-crowdin-download.yml b/.github/workflows/i18n-crowdin-download.yml index 440ee9068ba..cba14abe43b 100644 --- a/.github/workflows/i18n-crowdin-download.yml +++ b/.github/workflows/i18n-crowdin-download.yml @@ -14,10 +14,6 @@ jobs: pull-requests: write # needed to update PR description, labels, etc steps: - - uses: actions/checkout@v4 - with: - ref: ${{ github.head_ref }} - - name: Generate token id: generate_token uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92 @@ -25,9 +21,14 @@ jobs: app_id: ${{ secrets.GRAFANA_PR_AUTOMATION_APP_ID }} private_key: ${{ secrets.GRAFANA_PR_AUTOMATION_APP_PEM }} + - uses: actions/checkout@v4 + with: + ref: ${{ github.head_ref }} + token: ${{ steps.generate_token.outputs.token }} + - name: Download sources id: crowdin-download - uses: crowdin/github-action@v1 + uses: crowdin/github-action@v2 with: upload_sources: false upload_translations: false diff --git a/.github/workflows/i18n-crowdin-upload.yml b/.github/workflows/i18n-crowdin-upload.yml index 9e028b5386f..39a89c5aad2 100644 --- a/.github/workflows/i18n-crowdin-upload.yml +++ b/.github/workflows/i18n-crowdin-upload.yml @@ -17,7 +17,7 @@ jobs: uses: actions/checkout@v4 - name: Upload sources - uses: crowdin/github-action@v1 + uses: crowdin/github-action@v2 with: upload_sources: true upload_sources_args: '--dest=public/locales/en-US/grafana.json' diff --git a/.github/workflows/release-pr.yml b/.github/workflows/release-pr.yml index 9304ca5301c..d6bcd7d5446 100644 --- a/.github/workflows/release-pr.yml +++ b/.github/workflows/release-pr.yml @@ -74,6 +74,10 @@ jobs: fetch-depth: '0' fetch-tags: 'false' path: .grafana-main + - name: Setup nodejs environment + uses: actions/setup-node@v4 + with: + node-version-file: .nvmrc - name: Configure git user run: | git config --local user.name "github-actions[bot]" @@ -120,7 +124,9 @@ jobs: rm -f CHANGELOG.part changelog_items.md git diff CHANGELOG.md - + + - name: "Prettify CHANGELOG.md" + run: npx prettier --write CHANGELOG.md - name: Commit CHANGELOG.md changes run: git add CHANGELOG.md && git commit --allow-empty -m "Update changelog" CHANGELOG.md diff --git a/.nxignore b/.nxignore new file mode 100644 index 00000000000..edf9f018d25 --- /dev/null +++ b/.nxignore @@ -0,0 +1 @@ +!conf/custom.ini diff --git a/.prettierignore b/.prettierignore index 76bf2adf696..8bf9dc13276 100644 --- a/.prettierignore +++ b/.prettierignore @@ -28,5 +28,8 @@ public/api-merged.json public/api-enterprise-spec.json public/openapi3.json +# Generated mock service worker +public/mockServiceWorker.js + # Crowdin files public/locales/**/*.json diff --git a/conf/defaults.ini b/conf/defaults.ini index e164bf0fbd2..49209a9ea69 100644 --- a/conf/defaults.ini +++ b/conf/defaults.ini @@ -1996,3 +1996,6 @@ frontend_poll_interval = 2s # Should UI tests fail when console log/warn/erroring? # Does not affect the result when running on CI - only for allowing devs to choose this behaviour locally fail_tests_on_console = true +# Whether or not to enable the MSW mock API, which intercepts requests and returns mock data +# Should only be used for local development or demo purposes +mock_api = false diff --git a/docs/sources/administration/data-source-management/teamlbac/_index.md b/docs/sources/administration/data-source-management/teamlbac/_index.md index c8296dc1ef5..cda80b0cec0 100644 --- a/docs/sources/administration/data-source-management/teamlbac/_index.md +++ b/docs/sources/administration/data-source-management/teamlbac/_index.md @@ -19,7 +19,11 @@ Team Label Based Access Control (LBAC) simplifies and streamlines data source ac {{< admonition type="note" >}} Creating Team LBAC rules is available for preview for logs with Loki in Grafana Cloud. Report any unexpected behavior to the Grafana Support team. -{{< /admonition >}} + +To use Team LBAC rules you must enable the `teamHttpHeaders` feature toggle because the feature uses HTTP headers for the LBAC rules requests. + +- Be sure that you are running Grafana Enterprise. + {{< /admonition >}} You can configure user access based upon team memberships using LogQL. Team LBAC controls access to logs depending on the rules set for each team. diff --git a/docs/sources/administration/data-source-management/teamlbac/configure-teamlbac-for-loki/index.md b/docs/sources/administration/data-source-management/teamlbac/configure-teamlbac-for-loki/index.md index 90926100c78..ff8e543c7fa 100644 --- a/docs/sources/administration/data-source-management/teamlbac/configure-teamlbac-for-loki/index.md +++ b/docs/sources/administration/data-source-management/teamlbac/configure-teamlbac-for-loki/index.md @@ -19,6 +19,7 @@ Team LBAC is available in private preview on Grafana Cloud for Loki created with To be able to use Team LBAC rules, you need to enable the feature toggle `teamHttpHeaders` on your Grafana instance. Contact support to enable the feature toggle for you. +- Be sure that you are running Grafana Enterprise. - Be sure that you have the permission setup to create a loki tenant in Grafana Cloud - Be sure that you have admin data source permissions for Grafana. diff --git a/docs/sources/administration/data-source-management/teamlbac/create-teamlbac-rules/index.md b/docs/sources/administration/data-source-management/teamlbac/create-teamlbac-rules/index.md index c52d8e79e86..3cb872a8ed4 100644 --- a/docs/sources/administration/data-source-management/teamlbac/create-teamlbac-rules/index.md +++ b/docs/sources/administration/data-source-management/teamlbac/create-teamlbac-rules/index.md @@ -18,6 +18,9 @@ Team LBAC is available on Cloud for data sources created with basic authenticati ## Before you begin +To be able to use Team LBAC rules, you need to enable the feature toggle `teamHttpHeaders` on your Grafana instance. Contact support to enable the feature toggle for you. + +- Be sure that you are running Grafana Enterprise. - Be sure that you have admin data source permissions for Grafana. - Be sure that you have a team setup in Grafana. diff --git a/docs/sources/alerting/alerting-rules/create-grafana-managed-rule.md b/docs/sources/alerting/alerting-rules/create-grafana-managed-rule.md index 66d2e30c660..b0e4cd732cd 100644 --- a/docs/sources/alerting/alerting-rules/create-grafana-managed-rule.md +++ b/docs/sources/alerting/alerting-rules/create-grafana-managed-rule.md @@ -83,7 +83,7 @@ Grafana-managed rules are the most flexible alert rule type. They allow you to c Multiple alert instances can be created as a result of one alert rule (also known as a multi-dimensional alerting). {{% admonition type="note" %}} -For Grafana Cloud, you can create 100 free Grafana-managed alert rules. +For Grafana Cloud Free Forever, you can create up to 100 free Grafana-managed alert rules with each alert rule having a maximum of 1000 alert instances. {{% /admonition %}} Grafana managed alert rules can only be edited or deleted by users with Edit permissions for the folder storing the rules. @@ -251,7 +251,7 @@ You can configure the alert instance state when its evaluation returns no data: | No Data configuration | Description | | --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | No Data | The default option. Sets alert instance state to `No data`.
The alert rule also creates a new alert instance `DatasourceNoData` with the name and UID of the alert rule, and UID of the datasource that returned no data as labels. | -| Alerting | Sets alert instance state to `Alerting`. It transitions from `Pending` to `Alerting` after the [pending period](ref:pending-period) has finished. | +| Alerting | Sets the alert instance state to `Pending` and then transitions to `Alerting` once the [pending period](ref:pending-period) ends. If you sent the pending period to 0, the alert instance state is immediately set to `Alerting`. | | Normal | Sets alert instance state to `Normal`. | | Keep Last State | Maintains the alert instance in its last state. Useful for mitigating temporary issues, refer to [Keep last state](ref:keep-last-state). | diff --git a/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-email.md b/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-email.md index 8295288797b..81b6ccac4d8 100644 --- a/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-email.md +++ b/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-email.md @@ -75,6 +75,9 @@ To set up email integration, complete the following steps. 1. Enter a contact point name. 1. From the Integration list, select **Email**. 1. Enter the email addresses you want to send notifications to. + + E-mail addresses are case sensitive. Ensure that the e-mail address entered is correct. + 1. Click **Test** to check that your integration works. 1. Click **Save contact point**. diff --git a/docs/sources/developers/http_api/auth.md b/docs/sources/developers/http_api/auth.md index 71b1b5c491f..2f3dd915dcb 100644 --- a/docs/sources/developers/http_api/auth.md +++ b/docs/sources/developers/http_api/auth.md @@ -89,47 +89,13 @@ Endpoint is obsolete and has been moved to [Grafana service account API]({{< rel `POST /api/auth/keys` -**Required permissions** - -See note in the [introduction]({{< ref "#authentication-api" >}}) for an explanation. - -| Action | Scope | -| ---------------- | ----- | -| `apikeys:create` | n/a | - -**Example Request**: - -```http -POST /api/auth/keys HTTP/1.1 -Accept: application/json -Content-Type: application/json -Authorization: Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk - -{ - "name": "mykey", - "role": "Admin", - "secondsToLive": 86400 -} -``` - -JSON Body schema: - -- **name** – The key name -- **role** – Sets the access level/Grafana Role for the key. Can be one of the following values: `None`, `Viewer`, `Editor` or `Admin`. -- **secondsToLive** – Sets the key expiration in seconds. It is optional. If it is a positive number an expiration date for the key is set. If it is null, zero or is omitted completely (unless `api_key_max_seconds_to_live` configuration option is set) the key will never expire. - -Error statuses: - -- **400** – `api_key_max_seconds_to_live` is set but no `secondsToLive` is specified or `secondsToLive` is greater than this value. -- **500** – The key was unable to be stored in the database. - **Example Response**: ```http -HTTP/1.1 301 +HTTP/1.1 410 Content-Type: application/json -"" +{"message":"this endpoint has been removed, please use POST /api/serviceaccounts and POST /api/serviceaccounts/{id}/tokens instead"} ``` ## Delete API Key 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 a0fae3e97e7..150b4273f92 100644 --- a/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md +++ b/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md @@ -62,6 +62,7 @@ Most [generally available](https://grafana.com/docs/release-life-cycle/#general- | `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 | | +| `promQLScope` | In-development feature that will allow injection of labels into prometheus queries. | Yes | | `groupToNestedTableTransformation` | Enables the group to nested table transformation | Yes | | `tlsMemcached` | Use TLS-enabled memcached in the enterprise caching feature | Yes | | `cloudWatchNewLabelParsing` | Updates CloudWatch label parsing to be more accurate | Yes | @@ -172,7 +173,6 @@ Experimental features might be changed or removed without prior notice. | `tableSharedCrosshair` | Enables shared crosshair in table panel | | `kubernetesFeatureToggles` | Use the kubernetes API for feature toggle management in the frontend | | `newFolderPicker` | Enables the nested folder picker without having nested folders enabled | -| `promQLScope` | In-development feature that will allow injection of labels into prometheus queries. | | `sqlExpressions` | Enables using SQL and DuckDB functions as Expressions. | | `nodeGraphDotLayout` | Changed the layout algorithm for the node graph | | `kubernetesAggregator` | Enable grafana's embedded kube-aggregator | @@ -192,7 +192,6 @@ Experimental features might be changed or removed without prior notice. | `dashboardRestoreUI` | Enables the frontend to be able to restore a recently deleted dashboard | | `backgroundPluginInstaller` | Enable background plugin installer | | `dataplaneAggregator` | Enable grafana dataplane aggregator | -| `adhocFilterOneOf` | Exposes a new 'one of' operator for ad-hoc filters. This operator allows users to filter by multiple values in a single filter. | | `newFiltersUI` | Enables new combobox style UI for the Ad hoc filters variable in scenes architecture | | `lokiSendDashboardPanelNames` | Send dashboard and panel names to Loki when querying | | `singleTopNav` | Unifies the top search bar and breadcrumb bar into one | diff --git a/e2e/dashboards-suite/dashboard-browse.spec.ts b/e2e/dashboards-suite/dashboard-browse.spec.ts index 4e9728b7a65..a39c0ca373d 100644 --- a/e2e/dashboards-suite/dashboard-browse.spec.ts +++ b/e2e/dashboards-suite/dashboard-browse.spec.ts @@ -49,4 +49,12 @@ describe('Dashboard browse', () => { e2e.flows.confirmDelete(); e2e.pages.BrowseDashboards.table.row('E2E Test - Import Dashboard').should('not.exist'); }); + + afterEach(() => { + // Permanently delete dashboard + e2e.pages.RecentlyDeleted.visit(); + e2e.pages.Search.table.row('E2E Test - Import Dashboard').find('[type="checkbox"]').click({ force: true }); + cy.contains('button', 'Delete permanently').click(); + e2e.flows.confirmDelete(); + }); }); diff --git a/e2e/dashboards-suite/dashboard-restore.spec.ts b/e2e/dashboards-suite/dashboard-restore.spec.ts new file mode 100644 index 00000000000..270b9794e31 --- /dev/null +++ b/e2e/dashboards-suite/dashboard-restore.spec.ts @@ -0,0 +1,82 @@ +import testDashboard from '../dashboards/TestRestoreDashboard.json'; +import { e2e } from '../utils'; + +describe('Dashboard restore', () => { + beforeEach(() => { + e2e.flows.login(Cypress.env('USERNAME'), Cypress.env('PASSWORD')); + }); + + it('Should delete, restore and permanently delete from the Dashboards page', () => { + e2e.flows.importDashboard(testDashboard, 1000, true); + + e2e.pages.Dashboards.visit(); + + // Delete dashboard + e2e.pages.BrowseDashboards.table + .row('E2E Test - Restore Dashboard') + .find('[type="checkbox"]') + .click({ force: true }); + deleteDashboard('Delete'); + + // Dashboard should appear in Recently Deleted + e2e.pages.RecentlyDeleted.visit(); + e2e.pages.Search.table.row('E2E Test - Restore Dashboard').should('exist'); + + // Restore dashboard + e2e.pages.Search.table.row('E2E Test - Restore Dashboard').find('[type="checkbox"]').click({ force: true }); + cy.contains('button', 'Restore').click(); + cy.contains('p', 'This action will restore 1 dashboard.').should('be.visible'); + e2e.pages.ConfirmModal.delete().click(); + e2e.components.Alert.alertV2('success').contains('Dashboard E2E Test - Restore Dashboard restored').should('exist'); + + // Dashboard should appear in Browse + e2e.pages.Dashboards.visit(); + e2e.pages.BrowseDashboards.table.row('E2E Test - Restore Dashboard').should('exist'); + + // Delete dashboard + e2e.pages.BrowseDashboards.table + .row('E2E Test - Restore Dashboard') + .find('[type="checkbox"]') + .click({ force: true }); + deleteDashboard('Delete'); + + // Permanently delete dashboard + permanentlyDeleteDashboard(); + }); + + it('Should delete, restore and permanently delete from the Dashboard settings', () => { + e2e.flows.importDashboard(testDashboard, 1000, true); + + e2e.flows.openDashboard({ uid: '355ac6c2-8a12-4469-8b99-4750eb8d0966' }); + e2e.pages.Dashboard.DashNav.settingsButton().click(); + deleteDashboard('Delete dashboard'); + + // Permanently delete dashboard + permanentlyDeleteDashboard(); + }); +}); + +const deleteDashboard = (buttonName: string) => { + cy.contains('button', buttonName).click(); + e2e.flows.confirmDelete(); + e2e.components.Alert.alertV2('success') + .contains('Dashboard E2E Test - Restore Dashboard moved to Recently deleted') + .should('exist'); + e2e.pages.BrowseDashboards.table.row('E2E Test - Restore Dashboard').should('not.exist'); +}; + +const permanentlyDeleteDashboard = () => { + // Permanently delete dashboard + e2e.pages.RecentlyDeleted.visit(); + e2e.pages.Search.table.row('E2E Test - Restore Dashboard').find('[type="checkbox"]').click({ force: true }); + cy.contains('button', 'Delete permanently').click(); + cy.contains('p', 'This action will delete 1 dashboard.').should('be.visible'); + e2e.flows.confirmDelete(); + e2e.components.Alert.alertV2('success').contains('Dashboard E2E Test - Restore Dashboard deleted').should('exist'); + + // Dashboard should not appear in Recently Deleted or Browse + e2e.pages.Search.table.row('E2E Test - Restore Dashboard').should('not.exist'); + + e2e.pages.Dashboards.visit(); + e2e.pages.BrowseDashboards.table.row('E2E Test - Restore Dashboard').should('not.exist'); +}; diff --git a/e2e/dashboards/TestRestoreDashboard.json b/e2e/dashboards/TestRestoreDashboard.json new file mode 100644 index 00000000000..b34ff4c0c05 --- /dev/null +++ b/e2e/dashboards/TestRestoreDashboard.json @@ -0,0 +1,209 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "gnetId": null, + "graphTooltip": 0, + "id": 322, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": null, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 6, + "options": { + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "text": {} + }, + "pluginVersion": "8.3.0-pre", + "title": "Gauge Example", + "type": "gauge" + }, + { + "datasource": null, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 8 + }, + "id": 4, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "8.3.0-pre", + "title": "Stat", + "type": "stat" + }, + { + "datasource": null, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "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 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 16 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single" + } + }, + "title": "Time series example", + "type": "timeseries" + } + ], + "refresh": false, + "schemaVersion": 31, + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "2021-09-01T04:00:00.000Z", + "to": "2021-09-15T04:00:00.000Z" + }, + "timepicker": {}, + "timezone": "", + "title": "E2E Test - Restore Dashboard", + "uid": "355ac6c2-8a12-4469-8b99-4750eb8d0966", + "version": 4 +} diff --git a/e2e/utils/flows/deleteDashboard.ts b/e2e/utils/flows/deleteDashboard.ts index de492012c2f..6b39a0020a8 100644 --- a/e2e/utils/flows/deleteDashboard.ts +++ b/e2e/utils/flows/deleteDashboard.ts @@ -29,6 +29,7 @@ export const deleteDashboard = ({ quick = false, title, uid }: DeleteDashboardCo const quickDelete = (uid: string) => { cy.request('DELETE', fromBaseUrl(`/api/dashboards/uid/${uid}`)); + cy.request('DELETE', fromBaseUrl(`/api/dashboards/uid/${uid}/trash`)); }; const uiDelete = (uid: string, title: string) => { diff --git a/go.mod b/go.mod index c32b6d6d003..3571b3a20fe 100644 --- a/go.mod +++ b/go.mod @@ -54,8 +54,8 @@ require ( github.com/go-jose/go-jose/v3 v3.0.3 // @grafana/identity-access-team github.com/go-kit/log v0.2.1 // @grafana/grafana-backend-group github.com/go-ldap/ldap/v3 v3.4.4 // @grafana/identity-access-team - github.com/go-openapi/loads v0.21.5 // @grafana/alerting-backend - github.com/go-openapi/runtime v0.27.1 // @grafana/alerting-backend + github.com/go-openapi/loads v0.22.0 // @grafana/alerting-backend + github.com/go-openapi/runtime v0.28.0 // @grafana/alerting-backend github.com/go-openapi/strfmt v0.23.0 // @grafana/alerting-backend github.com/go-redis/redis/v8 v8.11.5 // @grafana/grafana-backend-group github.com/go-sourcemap/sourcemap v2.1.3+incompatible // @grafana/grafana-backend-group @@ -89,7 +89,7 @@ require ( github.com/grafana/grafana-cloud-migration-snapshot v1.2.0 // @grafana/grafana-operator-experience-squad github.com/grafana/grafana-google-sdk-go v0.1.0 // @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.245.0 // @grafana/plugins-platform-backend + github.com/grafana/grafana-plugin-sdk-go v0.246.0 // @grafana/plugins-platform-backend github.com/grafana/grafana/pkg/aggregator v0.0.0-20240813192817-1b0e6b5c09b2 // @grafana/grafana-app-platform-squad github.com/grafana/grafana/pkg/apimachinery v0.0.0-20240821155123-6891eb1d35da // @grafana/grafana-app-platform-squad github.com/grafana/grafana/pkg/apiserver v0.0.0-20240821155123-6891eb1d35da // @grafana/grafana-app-platform-squad @@ -126,7 +126,7 @@ require ( github.com/matttproud/golang_protobuf_extensions v1.0.4 // @grafana/alerting-backend github.com/microsoft/go-mssqldb v1.7.0 // @grafana/grafana-bi-squad github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c //@grafana/identity-access-team - github.com/mocktools/go-smtp-mock/v2 v2.3.0 // @grafana/grafana-backend-group + github.com/mocktools/go-smtp-mock/v2 v2.3.1 // @grafana/grafana-backend-group github.com/modern-go/reflect2 v1.0.2 // @grafana/alerting-backend github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // @grafana/alerting-backend github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // @grafana/grafana-operator-experience-squad @@ -161,14 +161,14 @@ require ( go.opentelemetry.io/collector/pdata v1.6.0 // @grafana/grafana-backend-group go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // @grafana/plugins-platform-backend go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.53.0 // @grafana/grafana-operator-experience-squad - go.opentelemetry.io/contrib/propagators/jaeger v1.28.0 // @grafana/grafana-backend-group - go.opentelemetry.io/contrib/samplers/jaegerremote v0.22.0 // @grafana/grafana-backend-group - go.opentelemetry.io/otel v1.28.0 // @grafana/grafana-backend-group + go.opentelemetry.io/contrib/propagators/jaeger v1.29.0 // @grafana/grafana-backend-group + go.opentelemetry.io/contrib/samplers/jaegerremote v0.23.0 // @grafana/grafana-backend-group + go.opentelemetry.io/otel v1.29.0 // @grafana/grafana-backend-group go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // @grafana/grafana-backend-group - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // @grafana/grafana-backend-group + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 // @grafana/grafana-backend-group go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 // @grafana/grafana-backend-group - go.opentelemetry.io/otel/sdk v1.28.0 // @grafana/grafana-backend-group - go.opentelemetry.io/otel/trace v1.28.0 // @grafana/grafana-backend-group + go.opentelemetry.io/otel/sdk v1.29.0 // @grafana/grafana-backend-group + go.opentelemetry.io/otel/trace v1.29.0 // @grafana/grafana-backend-group go.uber.org/atomic v1.11.0 // @grafana/alerting-backend go.uber.org/goleak v1.3.0 // @grafana/grafana-search-and-storage gocloud.dev v0.39.0 // @grafana/grafana-app-platform-squad @@ -278,13 +278,13 @@ require ( github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/go-logr/logr v1.4.2 // indirect; @grafana/grafana-app-platform-squad github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-openapi/analysis v0.22.2 // indirect + github.com/go-openapi/analysis v0.23.0 // indirect github.com/go-openapi/errors v0.22.0 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect - github.com/go-openapi/jsonreference v0.20.4 // indirect - github.com/go-openapi/spec v0.20.14 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect + github.com/go-openapi/spec v0.21.0 // indirect github.com/go-openapi/swag v0.23.0 // indirect - github.com/go-openapi/validate v0.23.0 // indirect + github.com/go-openapi/validate v0.24.0 // indirect github.com/goccy/go-json v0.10.2 // indirect github.com/gofrs/uuid v4.4.0+incompatible // indirect github.com/gogo/googleapis v1.4.1 // indirect @@ -432,10 +432,10 @@ require ( go.etcd.io/etcd/api/v3 v3.5.14 // indirect go.etcd.io/etcd/client/pkg/v3 v3.5.14 // indirect go.etcd.io/etcd/client/v3 v3.5.14 // indirect - go.mongodb.org/mongo-driver v1.15.0 // indirect + go.mongodb.org/mongo-driver v1.16.1 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect - go.opentelemetry.io/otel/metric v1.28.0 // indirect + go.opentelemetry.io/otel/metric v1.29.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/mock v0.4.0 // indirect go.uber.org/multierr v1.11.0 // indirect @@ -444,8 +444,8 @@ require ( golang.org/x/term v0.23.0 // indirect golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 // indirect google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988 // indirect; @grafana/grafana-backend-group - google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/fsnotify/fsnotify.v1 v1.4.7 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/go.sum b/go.sum index 16369444194..f2e128c0ede 100644 --- a/go.sum +++ b/go.sum @@ -1951,8 +1951,9 @@ github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/analysis v0.21.5/go.mod h1:25YcZosX9Lwz2wBsrFrrsL8bmjjXdlyP6zsr2AMy29M= github.com/go-openapi/analysis v0.22.0/go.mod h1:acDnkkCI2QxIo8sSIPgmp1wUlRohV7vfGtAIVae73b0= -github.com/go-openapi/analysis v0.22.2 h1:ZBmNoP2h5omLKr/srIC9bfqrUGzT6g6gNv03HE9Vpj0= github.com/go-openapi/analysis v0.22.2/go.mod h1:pDF4UbZsQTo/oNuRfAWWd4dAh4yuYf//LYorPTjrpvo= +github.com/go-openapi/analysis v0.23.0 h1:aGday7OWupfMs+LbmLZG4k0MYXIANxcuBTYUC03zFCU= +github.com/go-openapi/analysis v0.23.0/go.mod h1:9mz9ZWaSlV8TvjQHLl2mUW2PbZtemkE8yA5v22ohupo= github.com/go-openapi/errors v0.21.0/go.mod h1:jxNTMUxRCKj65yb/okJGEtahVd7uvWnuWfj53bse4ho= github.com/go-openapi/errors v0.22.0 h1:c4xY/OLxUBSTiepAg3j/MHuAv5mJhnf53LLMWFB+u/w= github.com/go-openapi/errors v0.22.0/go.mod h1:J3DmZScxCDufmIMsdOuDHxJbdOGC0xtUynjIx092vXE= @@ -1964,17 +1965,21 @@ github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kO github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/jsonreference v0.20.3/go.mod h1:FviDZ46i9ivh810gqzFLl5NttD5q3tSlMLqLr6okedM= -github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= +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/loads v0.21.3/go.mod h1:Y3aMR24iHbKHppOj91nQ/SHc0cuPbAr4ndY4a02xydc= -github.com/go-openapi/loads v0.21.5 h1:jDzF4dSoHw6ZFADCGltDb2lE4F6De7aWSpe+IcsRzT0= github.com/go-openapi/loads v0.21.5/go.mod h1:PxTsnFBoBe+z89riT+wYt3prmSBP6GDAQh2l9H1Flz8= -github.com/go-openapi/runtime v0.27.1 h1:ae53yaOoh+fx/X5Eaq8cRmavHgDma65XPZuvBqvJYto= +github.com/go-openapi/loads v0.22.0 h1:ECPGd4jX1U6NApCGG1We+uEozOAvXvJSF4nnwHZ8Aco= +github.com/go-openapi/loads v0.22.0/go.mod h1:yLsaTCS92mnSAZX5WWoxszLj0u+Ojl+Zs5Stn1oF+rs= github.com/go-openapi/runtime v0.27.1/go.mod h1:fijeJEiEclyS8BRurYE1DE5TLb9/KZl6eAdbzjsrlLU= +github.com/go-openapi/runtime v0.28.0 h1:gpPPmWSNGo214l6n8hzdXYhPuJcGtziTOgUpvsFWGIQ= +github.com/go-openapi/runtime v0.28.0/go.mod h1:QN7OzcS+XuYmkQLw05akXk0jRH/eZ3kb18+1KwW9gyc= github.com/go-openapi/spec v0.20.12/go.mod h1:iSCgnBcwbMW9SfzJb8iYynXvcY6C/QFrI7otzF7xGM4= github.com/go-openapi/spec v0.20.13/go.mod h1:8EOhTpBoFiask8rrgwbLC3zmJfz4zsCUueRuPM6GNkw= -github.com/go-openapi/spec v0.20.14 h1:7CBlRnw+mtjFGlPDRZmAMnq35cRzI91xj03HVyUi/Do= github.com/go-openapi/spec v0.20.14/go.mod h1:8EOhTpBoFiask8rrgwbLC3zmJfz4zsCUueRuPM6GNkw= +github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY= +github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk= github.com/go-openapi/strfmt v0.21.10/go.mod h1:vNDMwbilnl7xKiO/Ve/8H8Bb2JIInBnH+lqiw6QWgis= github.com/go-openapi/strfmt v0.22.0/go.mod h1:HzJ9kokGIju3/K6ap8jL+OlGAbjpSv27135Yr9OivU4= github.com/go-openapi/strfmt v0.23.0 h1:nlUS6BCqcnAk0pyhi9Y+kdDVZdZMHfEKQiS4HaMgO/c= @@ -1986,8 +1991,9 @@ github.com/go-openapi/swag v0.22.9/go.mod h1:3/OXnFfnMAwBD099SwYRk7GD3xOrr1iL7d/ 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-openapi/validate v0.22.4/go.mod h1:qm6O8ZIcPVdSY5219468Jv7kBdGvkiZLPOmqnqTUZ2A= -github.com/go-openapi/validate v0.23.0 h1:2l7PJLzCis4YUGEoW6eoQw3WhyM65WSIcjX6SQnlfDw= github.com/go-openapi/validate v0.23.0/go.mod h1:EeiAZ5bmpSIOJV1WLfyYF9qp/B1ZgSaEpHTJHtN5cbE= +github.com/go-openapi/validate v0.24.0 h1:LdfDKwNbpB6Vn40xhTdNZAnfLECL81w+VX3BumrGD58= +github.com/go-openapi/validate v0.24.0/go.mod h1:iyeX1sEufmv3nPbBdX3ieNviWnOZaJ1+zquzJEf2BAQ= github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= @@ -2281,8 +2287,8 @@ github.com/grafana/grafana-google-sdk-go v0.1.0/go.mod h1:Vo2TKWfDVmNTELBUM+3lkr 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.114.0/go.mod h1:D7x3ah+1d4phNXpbnOaxa/osSaZlwh9/ZUnGGzegRbk= -github.com/grafana/grafana-plugin-sdk-go v0.245.0 h1:2KCKA86//O20ffL6WKzHGx5scBbdV7GyEFGnH8Hdv7M= -github.com/grafana/grafana-plugin-sdk-go v0.245.0/go.mod h1:1X8Kgo/SK91Qo1WBCKjPSKrfgjpQys1OkQsHhA78TLg= +github.com/grafana/grafana-plugin-sdk-go v0.246.0 h1:id7MPpONfZhSlhE5K4LU1rBqaVcpe2EDqqPdyb7UTfw= +github.com/grafana/grafana-plugin-sdk-go v0.246.0/go.mod h1:bK7/yelc8cANvNzXPbXk64I4qkqeyQfnyIx4U9y/ItY= github.com/grafana/grafana/pkg/aggregator v0.0.0-20240813192817-1b0e6b5c09b2 h1:2H9x4q53pkfUGtSNYD1qSBpNnxrFgylof/TYADb5xMI= github.com/grafana/grafana/pkg/aggregator v0.0.0-20240813192817-1b0e6b5c09b2/go.mod h1:gBLBniiSUQvyt4LRrpIeysj8Many0DV+hdUKifRE0Ec= github.com/grafana/grafana/pkg/apimachinery v0.0.0-20240821155123-6891eb1d35da h1:2E3c/I3ayAy4Z1GwIPqXNZcpUccRapE1aBXA1ho4g7o= @@ -2745,8 +2751,8 @@ github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4 github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= 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/mocktools/go-smtp-mock/v2 v2.3.0 h1:jgTDBEoQ8Kpw/fPWxy6qR2pGwtNn5j01T3Wut4xJo5Y= -github.com/mocktools/go-smtp-mock/v2 v2.3.0/go.mod h1:n8aNpDYncZHH/cZHtJKzQyeYT/Dut00RghVM+J1Ed94= +github.com/mocktools/go-smtp-mock/v2 v2.3.1 h1:wq75NDSsOy5oHo/gEQQT0fRRaYKRqr1IdkjhIPXxagM= +github.com/mocktools/go-smtp-mock/v2 v2.3.1/go.mod h1:h9AOf/IXLSU2m/1u4zsjtOM/WddPwdOUBz56dV9f81M= 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= @@ -3302,8 +3308,8 @@ go.etcd.io/etcd/server/v3 v3.5.13/go.mod h1:K/8nbsGupHqmr5MkgaZpLlH1QdX1pcNQLAkO go.mongodb.org/mongo-driver v1.1.0/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.13.1/go.mod h1:wcDf1JBCXy2mOW0bWHwO/IOYqdca1MPCwDtFu/Z9+eo= go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= -go.mongodb.org/mongo-driver v1.15.0 h1:rJCKC8eEliewXjZGf0ddURtl7tTVy1TK3bfl0gkUSLc= -go.mongodb.org/mongo-driver v1.15.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= +go.mongodb.org/mongo-driver v1.16.1 h1:rIVLL3q0IHM39dvE+z2ulZLp9ENZKThVfuvN/IiN4l8= +go.mongodb.org/mongo-driver v1.16.1/go.mod h1:oB6AhJQvFQL4LEHyXi6aJzQJtBiTQHiAd83l0GdFaiw= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -3333,10 +3339,10 @@ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1: go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0/go.mod h1:DKdbWcT4GH1D0Y3Sqt/PFXt2naRKDWtU+eE6oLdFNA8= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg= -go.opentelemetry.io/contrib/propagators/jaeger v1.28.0 h1:xQ3ktSVS128JWIaN1DiPGIjcH+GsvkibIAVRWFjS9eM= -go.opentelemetry.io/contrib/propagators/jaeger v1.28.0/go.mod h1:O9HIyI2kVBrFoEwQZ0IN6PHXykGoit4mZV2aEjkTRH4= -go.opentelemetry.io/contrib/samplers/jaegerremote v0.22.0 h1:OYxqumWcd1yaV/qvCt1B7Sru9OeUNGjeXq/oldx3AGk= -go.opentelemetry.io/contrib/samplers/jaegerremote v0.22.0/go.mod h1:2tZTRqCbvx7nG57wUwd5NQpNVujOWnR84iPLllIH0Ok= +go.opentelemetry.io/contrib/propagators/jaeger v1.29.0 h1:+YPiqF5rR6PqHBlmEFLPumbSP0gY0WmCGFayXRcCLvs= +go.opentelemetry.io/contrib/propagators/jaeger v1.29.0/go.mod h1:6PD7q7qquWSp3Z4HeM3e/2ipRubaY1rXZO8NIHVDZjs= +go.opentelemetry.io/contrib/samplers/jaegerremote v0.23.0 h1:qKi9ntCcronqWqfuKxqrxZlZd82jXJEgGiAWH1+phxo= +go.opentelemetry.io/contrib/samplers/jaegerremote v0.23.0/go.mod h1:1kbAgQa5lgYC3rC6cE3jSxQ/Q13l33wv/WI8U+htwag= go.opentelemetry.io/otel v1.17.0/go.mod h1:I2vmBGtFaODIVMBSTPVDlJSzBDNf93k60E6Ft0nyjo0= go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= @@ -3344,13 +3350,13 @@ go.opentelemetry.io/otel v1.22.0/go.mod h1:eoV4iAi3Ea8LkAEI9+GFT44O6T/D0GWAVFyZV go.opentelemetry.io/otel v1.23.0/go.mod h1:YCycw9ZeKhcJFrb34iVSkyT0iczq/zYDtZYFufObyB0= go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= go.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg= -go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= -go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= +go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw= +go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8= go.opentelemetry.io/otel/exporters/jaeger v1.17.0 h1:D7UpUy2Xc2wsi1Ras6V40q806WM07rqoCWzXu7Sqy+4= go.opentelemetry.io/otel/exporters/jaeger v1.17.0/go.mod h1:nPCqOnEH9rNLKqH/+rrUjiMzHJdV1BlpKcTwRTyKkKI= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0/go.mod h1:h95q0LBGh7hlAC08X2DhSeyIG02YQ0UyioTCVAqRPmc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 h1:dIIDULZJpgdiHz5tXrTgKIMLkus6jEFa7x5SOKcyR7E= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0/go.mod h1:jlRVBe7+Z1wyxFSUs48L6OBQZ5JwH2Hg/Vbl+t9rAgI= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0/go.mod h1:8GlBGcDk8KKi7n+2S4BT/CPZQYH3erLu0/k64r1MYgo= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 h1:R3X6ZXmNPRR8ul6i3WgFURCHzaXjHdm0karRG/+dj3s= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0/go.mod h1:QWFXnDavXWwMx2EEcZsf3yxgEKAqsxQ+Syjp+seyInw= @@ -3362,14 +3368,14 @@ go.opentelemetry.io/otel/metric v1.22.0/go.mod h1:evJGjVpZv0mQ5QBRJoBF64yMuOf4xC go.opentelemetry.io/otel/metric v1.23.0/go.mod h1:MqUW2X2a6Q8RN96E2/nqNoT+z9BSms20Jb7Bbp+HiTo= go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= go.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s= -go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= -go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= +go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc= +go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8= go.opentelemetry.io/otel/sdk v1.17.0/go.mod h1:U87sE0f5vQB7hwUoW98pW5Rz4ZDuCFBZFNUBlSgmDFQ= go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= go.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw= -go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE= -go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= +go.opentelemetry.io/otel/sdk v1.29.0 h1:vkqKjk7gwhS8VaWb0POZKmIEDimRCMsopNYnriHyryo= +go.opentelemetry.io/otel/sdk v1.29.0/go.mod h1:pM8Dx5WKnvxLCb+8lG1PRNIDxu9g9b9g59Qr7hfAAok= go.opentelemetry.io/otel/trace v1.17.0/go.mod h1:I/4vKTgFclIsXRVucpH25X0mpFSczM7aHeaz0ZBLWjY= go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= @@ -3377,8 +3383,8 @@ go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40 go.opentelemetry.io/otel/trace v1.23.0/go.mod h1:GSGTbIClEsuZrGIzoEHqsVfxgn5UkggkflQwDScNUsk= go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= go.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I= -go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= -go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= +go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4= +go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= @@ -4328,8 +4334,8 @@ google.golang.org/genproto/googleapis/api v0.0.0-20240213162025-012b6fc9bca9/go. google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8= 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-20240415180920-8c6c420018be/go.mod h1:dvdCTIoAGbkWbcIKBniID56/7XHTt6WfxXNMxuziJ+w= -google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988 h1:+/tmTy5zAieooKIXfzDm9KiA3Bv6JBwriRN9LY+yayk= -google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988/go.mod h1:4+X6GvPs+25wZKbQq9qyAXrwIRExv7w0Ea6MgZLZiDM= +google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd h1:BBOTEWLuuEGQy9n1y9MhVJ9Qt0BDu21X8qZs71/uPZo= +google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd/go.mod h1:fO8wJzT2zbQbAjbIoos1285VfEIYKDDY+Dt+WpTkh6g= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230807174057-1744710a1577/go.mod h1:NjCQG/D8JandXxM57PZbAJL1DCNL6EypA0vPPwfsc7c= google.golang.org/genproto/googleapis/bytestream v0.0.0-20231030173426-d783a09b4405/go.mod h1:GRUCuLdzVqZte8+Dl/D4N25yLzcGqqWaYkeVOwulFqw= @@ -4374,8 +4380,8 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20240311132316-a219d84964c2/go. google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= google.golang.org/genproto/googleapis/rpc v0.0.0-20240415141817-7cd4c1c1f9ec/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 h1:V71AcdLZr2p8dC9dbOIMCpqi4EmRl8wUwnJzXXLmbmc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= diff --git a/go.work.sum b/go.work.sum index e1e7999bf90..65b36a0159d 100644 --- a/go.work.sum +++ b/go.work.sum @@ -604,6 +604,8 @@ github.com/dhui/dktest v0.3.0 h1:kwX5a7EkLcjo7VpsPQSYJcKGbXBXdjI9FGjuUj1jn6I= github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= +github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= +github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815 h1:bWDMxwH3px2JBh6AyO7hdCn/PkvCZXii8TGj7sbtEbQ= github.com/drone/drone-runtime v1.1.0 h1:IsKbwiLY6+ViNBzX0F8PERJVZZcEJm9rgxEh3uZP5IE= github.com/drone/drone-runtime v1.1.0/go.mod h1:+osgwGADc/nyl40J0fdsf8Z09bgcBZXvXXnLOY48zYs= @@ -883,8 +885,12 @@ github.com/mitchellh/iochan v1.0.0 h1:C+X3KsSTLFVBr/tK1eYN/vs4rJcvsiLU338UhYPJWe github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= 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/mocktools/go-smtp-mock/v2 v2.3.1 h1:wq75NDSsOy5oHo/gEQQT0fRRaYKRqr1IdkjhIPXxagM= +github.com/mocktools/go-smtp-mock/v2 v2.3.1/go.mod h1:h9AOf/IXLSU2m/1u4zsjtOM/WddPwdOUBz56dV9f81M= github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5 h1:8Q0qkMVC/MmWkpIdlvZgcv2o2jrlF6zqVOh7W5YHdMA= github.com/montanaflynn/stats v0.7.0 h1:r3y12KyNxj/Sb/iOE46ws+3mS1+MZca1wlHQFPsY/JU= +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.2 h1:XaDbnRvt2+1vgr0b/l0qh4mJAfIxE0bKXtz2Znl3GGI= github.com/mostynb/go-grpc-compression v1.2.2/go.mod h1:GOCr2KBxXcblCuczg3YdLQlcin1/NfyDA348ckuCH6w= github.com/nakagami/firebirdsql v0.0.0-20190310045651-3c02a58cfed8 h1:P48LjvUQpTReR3TQRbxSeSBsMXzfK0uol7eRcr7VBYQ= @@ -1165,6 +1171,7 @@ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.48.0/go.mod h1: go.opentelemetry.io/contrib/propagators/b3 v1.23.0 h1:aaIGWc5JdfRGpCafLRxMJbD65MfTa206AwSKkvGS0Hg= go.opentelemetry.io/contrib/propagators/b3 v1.23.0/go.mod h1:Gyz7V7XghvwTq+mIhLFlTgcc03UDroOg8vezs4NLhwU= go.opentelemetry.io/otel v1.26.0/go.mod h1:UmLkJHUAidDval2EICqBMbnAd0/m2vmpf/dAM+fvFs4= +go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= go.opentelemetry.io/otel/bridge/opencensus v1.26.0 h1:DZzxj9QjznMVoehskOJnFP2gsTCWtDTFBDvFhPAY7nc= go.opentelemetry.io/otel/bridge/opencensus v1.26.0/go.mod h1:rJiX0KrF5m8Tm1XE8jLczpAv5zUaDcvhKecFG0ZoFG4= go.opentelemetry.io/otel/bridge/opentracing v1.26.0 h1:Q/dHj0DOhfLMAs5u5ucAbC7gy66x9xxsZRLpHCJ4XhI= @@ -1181,12 +1188,14 @@ go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.23.1/go.mod h1:Qr0qomr go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.24.0 h1:s0PHtIkN+3xrbDOpt2M8OTG92cWqUESvzh2MxiR5xY8= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.24.0/go.mod h1:hZlFbDbRt++MMPCCfSJfmhkGIWnX1h3XjkfxZUjLrIA= go.opentelemetry.io/otel/metric v1.26.0/go.mod h1:SY+rHOI4cEawI9a7N1A4nIg/nTQXe1ccCNWYOJUrpX4= +go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= go.opentelemetry.io/otel/sdk v1.22.0/go.mod h1:iu7luyVGYovrRpe2fmj3CVKouQNdTOkxtLzPvPz1DOc= go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= go.opentelemetry.io/otel/sdk v1.26.0/go.mod h1:0p8MXpqLeJ0pzcszQQN4F0S5FVjBLgypeGSngLsmirs= go.opentelemetry.io/otel/sdk/metric v1.26.0 h1:cWSks5tfriHPdWFnl+qpX3P681aAYqlZHcAyHw5aU9Y= go.opentelemetry.io/otel/sdk/metric v1.26.0/go.mod h1:ClMFFknnThJCksebJwz7KIyEDHO+nTB6gK8obLy8RyE= go.opentelemetry.io/otel/trace v1.26.0/go.mod h1:4iDxvGDQuUkHve82hJJ8UqrwswHYsZuWCBllGV2U2y0= +go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8= diff --git a/package.json b/package.json index a6d5207cf8b..281fd5bc892 100644 --- a/package.json +++ b/package.json @@ -91,7 +91,7 @@ "@rtk-query/codegen-openapi": "^1.2.0", "@rtsao/plugin-proposal-class-properties": "7.0.1-patch.1", "@swc/core": "1.4.2", - "@swc/helpers": "0.5.12", + "@swc/helpers": "0.5.13", "@testing-library/dom": "10.0.0", "@testing-library/jest-dom": "6.4.2", "@testing-library/react": "15.0.2", @@ -122,7 +122,7 @@ "@types/lodash": "4.17.7", "@types/logfmt": "^1.2.3", "@types/lucene": "^2", - "@types/node": "20.16.3", + "@types/node": "20.16.4", "@types/node-forge": "^1", "@types/ol-ext": "npm:@siedlerchr/types-ol-ext@3.2.4", "@types/pluralize": "^0.0.33", @@ -146,7 +146,7 @@ "@types/slate-plain-serializer": "0.7.5", "@types/slate-react": "0.22.9", "@types/swagger-ui-react": "4.18.3", - "@types/systemjs": "6.13.5", + "@types/systemjs": "6.15.0", "@types/testing-library__jest-dom": "5.14.9", "@types/tinycolor2": "1.4.6", "@types/uuid": "9.0.8", @@ -157,7 +157,7 @@ "@typescript-eslint/parser": "6.21.0", "autoprefixer": "10.4.20", "babel-loader": "9.1.3", - "blob-polyfill": "7.0.20220408", + "blob-polyfill": "9.0.20240710", "browserslist": "^4.21.4", "chance": "^1.0.10", "chrome-remote-interface": "0.33.2", @@ -175,20 +175,20 @@ "eslint": "8.57.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jest": "28.8.1", + "eslint-plugin-jest": "28.8.2", "eslint-plugin-jest-dom": "^5.4.0", "eslint-plugin-jsdoc": "48.11.0", - "eslint-plugin-jsx-a11y": "6.9.0", + "eslint-plugin-jsx-a11y": "6.10.0", "eslint-plugin-lodash": "7.4.0", "eslint-plugin-no-barrel-files": "^1.1.0", - "eslint-plugin-react": "7.35.0", + "eslint-plugin-react": "7.35.2", "eslint-plugin-react-hooks": "4.6.0", "eslint-plugin-testing-library": "^6.2.2", "eslint-scope": "^8.0.0", "eslint-webpack-plugin": "4.2.0", "expose-loader": "5.0.0", "fork-ts-checker-webpack-plugin": "9.0.2", - "glob": "10.4.1", + "glob": "11.0.0", "html-loader": "5.1.0", "html-webpack-plugin": "5.6.0", "http-server": "14.1.1", @@ -210,7 +210,7 @@ "ngtemplate-loader": "2.1.0", "node-notifier": "10.0.1", "nx": "19.2.0", - "postcss": "8.4.41", + "postcss": "8.4.45", "postcss-loader": "8.1.1", "postcss-reporter": "7.1.0", "postcss-scss": "4.0.9", @@ -220,7 +220,7 @@ "react-select-event": "5.5.1", "react-test-renderer": "18.2.0", "redux-mock-store": "1.5.4", - "rimraf": "5.0.7", + "rimraf": "6.0.1", "rudder-sdk-js": "2.48.17", "sass": "1.77.8", "sass-loader": "14.2.1", @@ -268,7 +268,7 @@ "@grafana/prometheus": "workspace:*", "@grafana/runtime": "workspace:*", "@grafana/saga-icons": "workspace:*", - "@grafana/scenes": "^5.11.1", + "@grafana/scenes": "^5.13.0", "@grafana/schema": "workspace:*", "@grafana/sql": "workspace:*", "@grafana/ui": "workspace:*", @@ -354,7 +354,7 @@ "ol-ext": "4.0.23", "pluralize": "^8.0.0", "prismjs": "1.29.0", - "rc-slider": "10.6.2", + "rc-slider": "11.1.5", "rc-time-picker": "3.7.3", "rc-tree": "5.8.8", "re-resizable": "6.9.17", @@ -445,5 +445,10 @@ "prettier@3.3.3": { "unplugged": true } + }, + "msw": { + "workerDirectory": [ + "public" + ] } } diff --git a/packages/grafana-data/package.json b/packages/grafana-data/package.json index 6c3f8d197d7..736499dca19 100644 --- a/packages/grafana-data/package.json +++ b/packages/grafana-data/package.json @@ -66,7 +66,7 @@ "@types/dompurify": "^3.0.0", "@types/history": "4.7.11", "@types/lodash": "4.17.7", - "@types/node": "20.16.3", + "@types/node": "20.16.4", "@types/papaparse": "5.3.14", "@types/react": "18.3.3", "@types/react-dom": "18.2.25", @@ -74,7 +74,7 @@ "esbuild": "0.20.2", "react": "18.2.0", "react-dom": "18.2.0", - "rimraf": "5.0.7", + "rimraf": "6.0.1", "rollup": "2.79.1", "rollup-plugin-dts": "^5.0.0", "rollup-plugin-esbuild": "5.0.0", diff --git a/packages/grafana-data/src/types/featureToggles.gen.ts b/packages/grafana-data/src/types/featureToggles.gen.ts index 4b458ca1e3d..9aa802a82b2 100644 --- a/packages/grafana-data/src/types/featureToggles.gen.ts +++ b/packages/grafana-data/src/types/featureToggles.gen.ts @@ -201,7 +201,6 @@ export interface FeatureToggles { prometheusAzureOverrideAudience?: boolean; backgroundPluginInstaller?: boolean; dataplaneAggregator?: boolean; - adhocFilterOneOf?: boolean; newFiltersUI?: boolean; lokiSendDashboardPanelNames?: boolean; singleTopNav?: boolean; diff --git a/packages/grafana-data/src/types/trace.ts b/packages/grafana-data/src/types/trace.ts index 27b16a9f73c..8346f07dfb9 100644 --- a/packages/grafana-data/src/types/trace.ts +++ b/packages/grafana-data/src/types/trace.ts @@ -13,6 +13,7 @@ export type TraceLog = { // Millisecond epoch time timestamp: number; fields: TraceKeyValuePair[]; + name?: string; }; export type TraceSpanReference = { diff --git a/packages/grafana-e2e-selectors/package.json b/packages/grafana-e2e-selectors/package.json index 93c93582786..2cdb068e4b1 100644 --- a/packages/grafana-e2e-selectors/package.json +++ b/packages/grafana-e2e-selectors/package.json @@ -40,9 +40,9 @@ }, "devDependencies": { "@rollup/plugin-node-resolve": "15.2.3", - "@types/node": "20.16.3", + "@types/node": "20.16.4", "esbuild": "0.20.2", - "rimraf": "5.0.7", + "rimraf": "6.0.1", "rollup": "2.79.1", "rollup-plugin-dts": "^5.0.0", "rollup-plugin-esbuild": "5.0.0", diff --git a/packages/grafana-e2e-selectors/src/selectors/pages.ts b/packages/grafana-e2e-selectors/src/selectors/pages.ts index 45c453130fa..b0a8b9710cf 100644 --- a/packages/grafana-e2e-selectors/src/selectors/pages.ts +++ b/packages/grafana-e2e-selectors/src/selectors/pages.ts @@ -57,6 +57,7 @@ export const Pages = { navV2: 'data-testid Dashboard navigation', publicDashboardTag: 'data-testid public dashboard tag', shareButton: 'data-testid share-button', + settingsButton: 'data-testid settings-button', scrollContainer: 'data-testid Dashboard canvas scroll container', newShareButton: { container: 'data-testid new share button', @@ -239,6 +240,9 @@ export const Pages = { */ dashboards: (title: string) => `Dashboard search item ${title}`, }, + RecentlyDeleted: { + url: '/dashboard/recently-deleted', + }, SaveDashboardAsModal: { newName: 'Save dashboard title field', save: 'Save dashboard button', @@ -375,6 +379,10 @@ export const Pages = { FolderView: { url: '/?search=open&layout=folders', }, + table: { + body: 'data-testid search-table', + row: (name: string) => `data-testid search row ${name}`, + }, }, PublicDashboards: { ListItem: { diff --git a/packages/grafana-flamegraph/package.json b/packages/grafana-flamegraph/package.json index 70b54a6f5ab..54d88edad67 100644 --- a/packages/grafana-flamegraph/package.json +++ b/packages/grafana-flamegraph/package.json @@ -68,7 +68,7 @@ "@types/d3": "^7", "@types/jest": "^29.5.4", "@types/lodash": "4.17.7", - "@types/node": "20.16.3", + "@types/node": "20.16.4", "@types/react": "18.3.3", "@types/react-virtualized-auto-sizer": "1.0.4", "@types/tinycolor2": "1.4.6", diff --git a/packages/grafana-icons/package.json b/packages/grafana-icons/package.json index 195276ec300..f0d8270af4c 100644 --- a/packages/grafana-icons/package.json +++ b/packages/grafana-icons/package.json @@ -45,14 +45,14 @@ "@svgr/plugin-prettier": "^8.1.0", "@svgr/plugin-svgo": "^8.1.0", "@types/babel__core": "^7", - "@types/node": "20.16.3", + "@types/node": "20.16.4", "@types/react": "18.3.3", "@types/react-dom": "18.2.25", "esbuild": "0.20.2", "prettier": "3.3.3", "react": "18.2.0", "react-dom": "18.2.0", - "rimraf": "5.0.7", + "rimraf": "6.0.1", "rollup": "2.79.1", "rollup-plugin-dts": "^6.1.0", "rollup-plugin-esbuild": "5.0.0", diff --git a/packages/grafana-o11y-ds-frontend/package.json b/packages/grafana-o11y-ds-frontend/package.json index e77535ffac9..a6d517d8883 100644 --- a/packages/grafana-o11y-ds-frontend/package.json +++ b/packages/grafana-o11y-ds-frontend/package.json @@ -36,9 +36,9 @@ "@testing-library/react": "15.0.2", "@testing-library/user-event": "14.5.2", "@types/jest": "^29.5.4", - "@types/node": "20.16.3", + "@types/node": "20.16.4", "@types/react": "18.3.3", - "@types/systemjs": "6.13.5", + "@types/systemjs": "6.15.0", "@types/testing-library__jest-dom": "5.14.9", "jest": "^29.6.4", "react": "18.2.0", diff --git a/packages/grafana-plugin-configs/package.json b/packages/grafana-plugin-configs/package.json index f59482e57c7..65ab933b40f 100644 --- a/packages/grafana-plugin-configs/package.json +++ b/packages/grafana-plugin-configs/package.json @@ -14,7 +14,7 @@ "eslint": "8.57.0", "eslint-webpack-plugin": "4.2.0", "fork-ts-checker-webpack-plugin": "9.0.2", - "glob": "10.4.1", + "glob": "11.0.0", "replace-in-file-webpack-plugin": "1.0.6", "swc-loader": "0.2.6", "typescript": "5.5.4", diff --git a/packages/grafana-prometheus/package.json b/packages/grafana-prometheus/package.json index 87ca2c1148a..bd99b7403b2 100644 --- a/packages/grafana-prometheus/package.json +++ b/packages/grafana-prometheus/package.json @@ -81,7 +81,7 @@ "@rollup/plugin-image": "3.0.3", "@rollup/plugin-node-resolve": "15.2.3", "@swc/core": "1.4.2", - "@swc/helpers": "0.5.12", + "@swc/helpers": "0.5.13", "@testing-library/dom": "10.0.0", "@testing-library/jest-dom": "6.4.2", "@testing-library/react": "15.0.2", @@ -92,7 +92,7 @@ "@types/jest": "29.5.12", "@types/jquery": "3.5.30", "@types/lodash": "4.17.7", - "@types/node": "20.16.3", + "@types/node": "20.16.4", "@types/pluralize": "^0.0.33", "@types/prismjs": "1.26.4", "@types/react": "18.3.3", @@ -110,15 +110,15 @@ "eslint": "8.57.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jest": "28.8.1", + "eslint-plugin-jest": "28.8.2", "eslint-plugin-jsdoc": "48.11.0", - "eslint-plugin-jsx-a11y": "6.9.0", + "eslint-plugin-jsx-a11y": "6.10.0", "eslint-plugin-lodash": "7.4.0", - "eslint-plugin-react": "7.35.0", + "eslint-plugin-react": "7.35.2", "eslint-plugin-react-hooks": "4.6.0", "eslint-webpack-plugin": "4.2.0", "fork-ts-checker-webpack-plugin": "9.0.2", - "glob": "10.4.1", + "glob": "11.0.0", "jest": "29.7.0", "jest-environment-jsdom": "29.7.0", "jest-matcher-utils": "29.7.0", diff --git a/packages/grafana-prometheus/src/components/VariableQueryEditor.test.tsx b/packages/grafana-prometheus/src/components/VariableQueryEditor.test.tsx index dd9b17beb3c..cb0f96ef54d 100644 --- a/packages/grafana-prometheus/src/components/VariableQueryEditor.test.tsx +++ b/packages/grafana-prometheus/src/components/VariableQueryEditor.test.tsx @@ -265,6 +265,8 @@ describe('PromVariableQueryEditor', () => { const labelSelect = screen.getByLabelText('label-select'); await userEvent.type(labelSelect, 'this'); await selectOptionInTest(labelSelect, 'this'); + //display label in label select + await waitFor(() => expect(screen.getByText('this')).toBeInTheDocument()); await waitFor(() => expect(onChange).toHaveBeenCalledWith({ diff --git a/packages/grafana-prometheus/src/components/VariableQueryEditor.tsx b/packages/grafana-prometheus/src/components/VariableQueryEditor.tsx index 6c1c470c69d..ab7f041590c 100644 --- a/packages/grafana-prometheus/src/components/VariableQueryEditor.tsx +++ b/packages/grafana-prometheus/src/components/VariableQueryEditor.tsx @@ -2,7 +2,7 @@ import debounce from 'debounce-promise'; import { FormEvent, useCallback, useEffect, useState } from 'react'; -import { QueryEditorProps, SelectableValue } from '@grafana/data'; +import { QueryEditorProps, SelectableValue, toOption } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; import { AsyncSelect, InlineField, InlineFieldRow, Input, Select, TextArea } from '@grafana/ui'; @@ -286,7 +286,7 @@ export const PromVariableQueryEditor = ({ onChange, query, datasource, range }: { render(); const input = screen.getByRole('combobox'); - userEvent.click(input); + await userEvent.click(input); const item = await screen.findByRole('option', { name: 'Option 1' }); await userEvent.click(item); diff --git a/packages/grafana-ui/src/components/Table/RowsList.tsx b/packages/grafana-ui/src/components/Table/RowsList.tsx index 7e00eded5bb..4d3d7a1afb4 100644 --- a/packages/grafana-ui/src/components/Table/RowsList.tsx +++ b/packages/grafana-ui/src/components/Table/RowsList.tsx @@ -398,12 +398,15 @@ export const RowsList = (props: RowsListProps) => { } }; + // Key the virtualizer for expanded rows + const expandedKey = Object.keys(tableState.expanded).join('|'); + return ( <> void; mode: TableCellInspectorMode; @@ -28,11 +30,17 @@ export function TableCellInspector({ value, onDismiss, mode }: TableCellInspecto if (trimmedValue[0] === '{' || trimmedValue[0] === '[' || mode === 'code') { try { value = JSON.parse(value); - displayValue = JSON.stringify(value, null, ''); - } catch {} + displayValue = JSON.stringify(value, null, ' '); + } catch (error: any) { + // Display helpful error to help folks diagnose json errors + console.log( + 'Failed to parse JSON in Table cell inspector (this will cause JSON to not print nicely): ', + error.message + ); + } } } else { - displayValue = JSON.stringify(value, null, ''); + displayValue = JSON.stringify(value); } let text = displayValue; @@ -63,7 +71,7 @@ export function TableCellInspector({ value, onDismiss, mode }: TableCellInspecto text} style={{ marginLeft: 'auto', width: '200px' }}> - Copy to Clipboard + Copy to Clipboard {currentMode === 'code' ? ( `s are `inline-block`. This assumes that, and vertically + // centers them. This won't apply should you reset them to `block` level. + verticalAlign: 'middle', + // Note: ``s are deliberately not made responsive by default. + // For the rationale behind this, see the comments on the `.img-fluid` class. + }, + + fieldset: { + // Chrome and Firefox set a `min-width: min-content;` on fieldsets, + // so we reset that to ensure it behaves more like a standard block element. + // See https://github.com/twbs/bootstrap/issues/12359. + minWidth: 0, + // Reset the default outline behavior of fieldsets so they don't affect page layout. + padding: 0, + margin: 0, + border: 0, + }, + + legend: { + // Reset the entire legend element to match the `fieldset` + display: 'block', + width: '100%', + padding: 0, + marginBottom: theme.spacing(1), + fontSize: theme.spacing(3), + lineHeight: 'inherit', + border: 0, + }, + // Ex: 14px base font * 85% = about 12px 'small, .small': { fontSize: theme.typography.bodySmall.fontSize, @@ -193,7 +248,9 @@ export function getElementStyles(theme: GrafanaTheme2) { background: theme.colors.warning.main, }, - 'ul, ol': { + 'ul, ol, dl': { + marginTop: 0, + marginBottom: 0, padding: 0, }, 'ul ul, ul ol, ol ol, ol ul': { @@ -202,9 +259,9 @@ export function getElementStyles(theme: GrafanaTheme2) { li: { lineHeight: theme.typography.body.lineHeight, }, - - dl: { - marginBottom: theme.spacing(2), + dd: { + marginBottom: theme.spacing(1), + marginLeft: 0, // Undo browser default }, 'dt, dd': { lineHeight: theme.typography.body.lineHeight, @@ -218,8 +275,10 @@ export function getElementStyles(theme: GrafanaTheme2) { // 2. Correct font properties not being inherited. // 3. Address margins set differently in Firefox 4+, Safari, and Chrome. 'button, input, optgroup, select, textarea': { + borderRadius: theme.shape.radius.default, color: 'inherit', font: 'inherit', + lineHeight: 'inherit', margin: 0, }, @@ -239,6 +298,14 @@ export function getElementStyles(theme: GrafanaTheme2) { cursor: 'pointer', }, + 'input[type="search"]': { + // This overrides the extra rounded corners on search inputs in iOS so that our + // `.form-control` class can properly style them. Note that this cannot simply + // be added to `.form-control` as it's not specific enough. For details, see + // https://github.com/twbs/bootstrap/issues/11586. + WebkitAppearance: 'none', + }, + // Remove inner padding and search cancel button in Safari and Chrome on OS X. // Safari (but not Chrome) clips the cancel button when the search input has // padding (and `textfield` appearance). @@ -247,12 +314,23 @@ export function getElementStyles(theme: GrafanaTheme2) { }, table: { + // Reset for nesting within parents with `background-color`. + backgroundColor: 'transparent', borderCollapse: 'collapse', borderSpacing: 0, }, + caption: { + paddingTop: theme.spacing(0.5), + paddingBottom: theme.spacing(0.5), + color: theme.colors.text.secondary, + textAlign: 'left', + captionSide: 'bottom', + }, + th: { fontWeight: theme.typography.fontWeightMedium, + textAlign: 'left', }, 'td, th': { @@ -312,6 +390,33 @@ export function getElementStyles(theme: GrafanaTheme2) { }, }, + // iOS "clickable elements" fix for role="button" + // + // Fixes "clickability" issue (and more generally, the firing of events such as focus as well) + // for traditionally non-focusable elements with role="button" + // see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile + "[role='button']": { + cursor: 'pointer', + }, + + // Always hide an element with the `hidden` HTML attribute (from PureCSS). + '[hidden]': { + display: 'none !important', + }, + + // Avoid 300ms click delay on touch devices that support the `touch-action` CSS property. + // + // In particular, unlike most other browsers, IE11+Edge on Windows 10 on touch devices and IE Mobile 10-11 + // DON'T remove the click delay when `` is present. + // However, they DO support removing the click delay via `touch-action: manipulation`. + // See: + // * http://v4-alpha.getbootstrap.com/content/reboot/#click-delay-optimization-for-touch + // * http://caniuse.com/#feat=css-touch-action + // * http://patrickhlauke.github.io/touch/tests/results/#suppressing-300ms-delay + "a, area, button, [role='button'], input, label, select, summary, textarea": { + touchAction: 'manipulation', + }, + '.text-link': { textDecoration: 'underline', }, diff --git a/packages/grafana-ui/src/themes/GlobalStyles/utilityClasses.ts b/packages/grafana-ui/src/themes/GlobalStyles/utilityClasses.ts index 9a2fea24cf5..ef3a927c31b 100644 --- a/packages/grafana-ui/src/themes/GlobalStyles/utilityClasses.ts +++ b/packages/grafana-ui/src/themes/GlobalStyles/utilityClasses.ts @@ -1,3 +1,4 @@ +import { CSSInterpolation } from '@emotion/css'; import { css } from '@emotion/react'; import { GrafanaTheme2 } from '@grafana/data'; @@ -33,6 +34,27 @@ function buttonSizeMixin(paddingY: string, paddingX: string, fontSize: string, b }; } +function widthMixin(theme: GrafanaTheme2, max: number) { + let result: CSSInterpolation = {}; + for (let i = 1; i <= max; i++) { + const width = `${theme.spacing(2 * i)} !important`; + result[`.width-${i}`] = { + width, + }; + result[`.max-width-${i}`] = { + maxWidth: width, + flexGrow: 1, + }; + result[`.min-width-${i}`] = { + minWidth: width, + }; + result[`.offset-width-${i}`] = { + marginLeft: width, + }; + } + return result; +} + export function getUtilityClassStyles(theme: GrafanaTheme2) { return css({ '.highlight-word': { @@ -140,5 +162,6 @@ export function getUtilityClassStyles(theme: GrafanaTheme2) { '.typeahead': { zIndex: theme.zIndex.typeahead, }, + ...widthMixin(theme, 30), }); } diff --git a/pkg/aggregator/apis/aggregation/v0alpha1/register.go b/pkg/aggregator/apis/aggregation/v0alpha1/register.go index 7d1ac05cc2b..f9a075b023d 100644 --- a/pkg/aggregator/apis/aggregation/v0alpha1/register.go +++ b/pkg/aggregator/apis/aggregation/v0alpha1/register.go @@ -5,7 +5,6 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" - common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1" "github.com/grafana/grafana/pkg/apimachinery/utils" ) @@ -15,7 +14,7 @@ const ( APIVERSION = GROUP + "/" + VERSION ) -var DataPlaneServiceResourceInfo = common.NewResourceInfo(GROUP, VERSION, +var DataPlaneServiceResourceInfo = utils.NewResourceInfo(GROUP, VERSION, "dataplaneservices", "dataplaneservice", "DataPlaneService", func() runtime.Object { return &DataPlaneService{} }, func() runtime.Object { return &DataPlaneServiceList{} }, diff --git a/pkg/aggregator/go.mod b/pkg/aggregator/go.mod index 0c7d1b10513..bdfe0ee2829 100644 --- a/pkg/aggregator/go.mod +++ b/pkg/aggregator/go.mod @@ -4,12 +4,12 @@ go 1.23.0 require ( github.com/emicklei/go-restful/v3 v3.11.0 - github.com/grafana/grafana-plugin-sdk-go v0.245.0 + github.com/grafana/grafana-plugin-sdk-go v0.246.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 github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/otel v1.28.0 + go.opentelemetry.io/otel v1.29.0 k8s.io/api v0.31.0 k8s.io/apimachinery v0.31.0 k8s.io/apiserver v0.31.0 @@ -46,7 +46,7 @@ require ( 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.20.4 // 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.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect @@ -120,13 +120,13 @@ require ( go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.53.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect - go.opentelemetry.io/contrib/propagators/jaeger v1.28.0 // indirect - go.opentelemetry.io/contrib/samplers/jaegerremote v0.22.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect + go.opentelemetry.io/contrib/propagators/jaeger v1.29.0 // indirect + go.opentelemetry.io/contrib/samplers/jaegerremote v0.23.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 // indirect - go.opentelemetry.io/otel/metric v1.28.0 // indirect - go.opentelemetry.io/otel/sdk v1.28.0 // indirect - go.opentelemetry.io/otel/trace v1.28.0 // indirect + go.opentelemetry.io/otel/metric v1.29.0 // indirect + go.opentelemetry.io/otel/sdk v1.29.0 // indirect + go.opentelemetry.io/otel/trace v1.29.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect @@ -144,8 +144,8 @@ require ( golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 // indirect gonum.org/v1/gonum v0.14.0 // indirect google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect google.golang.org/grpc v1.65.0 // indirect google.golang.org/protobuf v1.34.2 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect diff --git a/pkg/aggregator/go.sum b/pkg/aggregator/go.sum index 951c74f2017..95ca7c494bf 100644 --- a/pkg/aggregator/go.sum +++ b/pkg/aggregator/go.sum @@ -79,8 +79,8 @@ github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= 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.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= -github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= +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-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -130,8 +130,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.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grafana/grafana-plugin-sdk-go v0.245.0 h1:2KCKA86//O20ffL6WKzHGx5scBbdV7GyEFGnH8Hdv7M= -github.com/grafana/grafana-plugin-sdk-go v0.245.0/go.mod h1:1X8Kgo/SK91Qo1WBCKjPSKrfgjpQys1OkQsHhA78TLg= +github.com/grafana/grafana-plugin-sdk-go v0.246.0 h1:id7MPpONfZhSlhE5K4LU1rBqaVcpe2EDqqPdyb7UTfw= +github.com/grafana/grafana-plugin-sdk-go v0.246.0/go.mod h1:bK7/yelc8cANvNzXPbXk64I4qkqeyQfnyIx4U9y/ItY= 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= @@ -349,26 +349,26 @@ go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0. go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.53.0/go.mod h1:ImRBLMJv177/pwiLZ7tU7HDGNdBv7rS0HQ99eN/zBl8= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg= -go.opentelemetry.io/contrib/propagators/jaeger v1.28.0 h1:xQ3ktSVS128JWIaN1DiPGIjcH+GsvkibIAVRWFjS9eM= -go.opentelemetry.io/contrib/propagators/jaeger v1.28.0/go.mod h1:O9HIyI2kVBrFoEwQZ0IN6PHXykGoit4mZV2aEjkTRH4= -go.opentelemetry.io/contrib/samplers/jaegerremote v0.22.0 h1:OYxqumWcd1yaV/qvCt1B7Sru9OeUNGjeXq/oldx3AGk= -go.opentelemetry.io/contrib/samplers/jaegerremote v0.22.0/go.mod h1:2tZTRqCbvx7nG57wUwd5NQpNVujOWnR84iPLllIH0Ok= +go.opentelemetry.io/contrib/propagators/jaeger v1.29.0 h1:+YPiqF5rR6PqHBlmEFLPumbSP0gY0WmCGFayXRcCLvs= +go.opentelemetry.io/contrib/propagators/jaeger v1.29.0/go.mod h1:6PD7q7qquWSp3Z4HeM3e/2ipRubaY1rXZO8NIHVDZjs= +go.opentelemetry.io/contrib/samplers/jaegerremote v0.23.0 h1:qKi9ntCcronqWqfuKxqrxZlZd82jXJEgGiAWH1+phxo= +go.opentelemetry.io/contrib/samplers/jaegerremote v0.23.0/go.mod h1:1kbAgQa5lgYC3rC6cE3jSxQ/Q13l33wv/WI8U+htwag= go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= -go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= -go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= +go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw= +go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 h1:dIIDULZJpgdiHz5tXrTgKIMLkus6jEFa7x5SOKcyR7E= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0/go.mod h1:jlRVBe7+Z1wyxFSUs48L6OBQZ5JwH2Hg/Vbl+t9rAgI= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 h1:R3X6ZXmNPRR8ul6i3WgFURCHzaXjHdm0karRG/+dj3s= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0/go.mod h1:QWFXnDavXWwMx2EEcZsf3yxgEKAqsxQ+Syjp+seyInw= go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= -go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= -go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= +go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc= +go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8= go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= -go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE= -go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= +go.opentelemetry.io/otel/sdk v1.29.0 h1:vkqKjk7gwhS8VaWb0POZKmIEDimRCMsopNYnriHyryo= +go.opentelemetry.io/otel/sdk v1.29.0/go.mod h1:pM8Dx5WKnvxLCb+8lG1PRNIDxu9g9b9g59Qr7hfAAok= go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= -go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= -go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= +go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4= +go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ= go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -472,10 +472,10 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988 h1:CT2Thj5AuPV9phrYMtzX11k+XkzMGfRAet42PmoTATM= google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988/go.mod h1:7uvplUBj4RjHAxIZ//98LzOvrQ04JBkaixRmCMI29hc= -google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988 h1:+/tmTy5zAieooKIXfzDm9KiA3Bv6JBwriRN9LY+yayk= -google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988/go.mod h1:4+X6GvPs+25wZKbQq9qyAXrwIRExv7w0Ea6MgZLZiDM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 h1:V71AcdLZr2p8dC9dbOIMCpqi4EmRl8wUwnJzXXLmbmc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd h1:BBOTEWLuuEGQy9n1y9MhVJ9Qt0BDu21X8qZs71/uPZo= +google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd/go.mod h1:fO8wJzT2zbQbAjbIoos1285VfEIYKDDY+Dt+WpTkh6g= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/grpc v1.18.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= diff --git a/pkg/api/apikey.go b/pkg/api/apikey.go index bab21403f55..ea2fe9c1e34 100644 --- a/pkg/api/apikey.go +++ b/pkg/api/apikey.go @@ -113,15 +113,16 @@ func (hs *HTTPServer) DeleteAPIKey(c *contextmodel.ReqContext) response.Response // see: https://grafana.com/docs/grafana/next/administration/service-accounts/migrate-api-keys/. // // Responses: -// 301: statusMovedPermanently +// 410: goneError func (hs *HTTPServer) AddAPIKey(c *contextmodel.ReqContext) response.Response { - // Set the Location header to the new URL hs.log.Warn("Obsolete and Permanently moved API endpoint called", "path", c.Req.URL.Path) - c.Context.Resp.Header().Set("Location", "/api/serviceaccounts/tokens") - // Respond with a 301 Moved Permanently status code - // the Location header is enough for clients to know where to go next. - return response.JSON(http.StatusMovedPermanently, nil) + // Respond with a 410 Gone status code + return response.Error( + http.StatusGone, + "this endpoint has been removed, please use POST /api/serviceaccounts and POST /api/serviceaccounts/{id}/tokens instead", + nil, + ) } // swagger:parameters getAPIkeys @@ -146,10 +147,3 @@ type GetAPIkeyResponse struct { // in: body Body []*dtos.ApiKeyDTO `json:"body"` } - -// swagger:response postAPIkeyResponse -type PostAPIkeyResponse struct { - // The response message - // in: body - Body dtos.NewApiKeyResult `json:"body"` -} diff --git a/pkg/api/http_server.go b/pkg/api/http_server.go index 9f5ac6b79fd..6f1295aa48f 100644 --- a/pkg/api/http_server.go +++ b/pkg/api/http_server.go @@ -604,6 +604,7 @@ func (hs *HTTPServer) addMiddlewaresAndStaticRoutes() { hs.mapStatic(m, hs.Cfg.StaticRootPath, "build", "public/build") hs.mapStatic(m, hs.Cfg.StaticRootPath, "", "public", "/public/views/swagger.html") hs.mapStatic(m, hs.Cfg.StaticRootPath, "robots.txt", "robots.txt") + hs.mapStatic(m, hs.Cfg.StaticRootPath, "mockServiceWorker.js", "mockServiceWorker.js") if hs.Cfg.ImageUploadProvider == "local" { hs.mapStatic(m, hs.Cfg.ImagesDir, "", "/public/img/attachments") @@ -753,6 +754,12 @@ func (hs *HTTPServer) mapStatic(m *web.Mux, rootDir string, dir string, prefix s } } + if prefix == "mockServiceWorker.js" { + headers = func(c *web.Context) { + c.Resp.Header().Set("Content-Type", "application/javascript") + } + } + m.Use(httpstatic.Static( path.Join(rootDir, dir), httpstatic.StaticOptions{ diff --git a/pkg/api/swagger_responses.go b/pkg/api/swagger_responses.go index 5f422b90eff..4b529ca4112 100644 --- a/pkg/api/swagger_responses.go +++ b/pkg/api/swagger_responses.go @@ -77,6 +77,11 @@ type InternalServerError GenericError // swagger:response unauthorisedError type UnauthorizedError GenericError +// GoneError is returned when the requested endpoint was removed. +// +// swagger:response goneError +type GoneError GenericError + // AcceptedResponse // // swagger:response acceptedResponse diff --git a/pkg/apimachinery/go.mod b/pkg/apimachinery/go.mod index 7e46f1a30e6..b186a9dd646 100644 --- a/pkg/apimachinery/go.mod +++ b/pkg/apimachinery/go.mod @@ -18,7 +18,7 @@ require ( github.com/go-jose/go-jose/v3 v3.0.3 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect - github.com/go-openapi/jsonreference v0.20.4 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect github.com/go-openapi/swag v0.23.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.4 // indirect @@ -37,7 +37,7 @@ require ( golang.org/x/sync v0.8.0 // indirect golang.org/x/sys v0.24.0 // indirect golang.org/x/text v0.17.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect google.golang.org/grpc v1.65.0 // indirect google.golang.org/protobuf v1.34.2 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/pkg/apimachinery/go.sum b/pkg/apimachinery/go.sum index aba77b5e0e7..f61ac2b5ab0 100644 --- a/pkg/apimachinery/go.sum +++ b/pkg/apimachinery/go.sum @@ -12,8 +12,8 @@ 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-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.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= -github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= +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/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -131,8 +131,8 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T 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/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 h1:V71AcdLZr2p8dC9dbOIMCpqi4EmRl8wUwnJzXXLmbmc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= diff --git a/pkg/apimachinery/apis/common/v0alpha1/resource.go b/pkg/apimachinery/utils/resource.go similarity index 90% rename from pkg/apimachinery/apis/common/v0alpha1/resource.go rename to pkg/apimachinery/utils/resource.go index 6ccebac6175..17725db2c0c 100644 --- a/pkg/apimachinery/apis/common/v0alpha1/resource.go +++ b/pkg/apimachinery/utils/resource.go @@ -1,7 +1,6 @@ -package v0alpha1 +package utils import ( - "github.com/grafana/grafana/pkg/apimachinery/utils" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -9,7 +8,6 @@ import ( ) // ResourceInfo helps define a k8s resource -// +k8s:openapi-gen=false type ResourceInfo struct { group string version string @@ -19,11 +17,11 @@ type ResourceInfo struct { kind string newObj func() runtime.Object newList func() runtime.Object - columns utils.TableColumns + columns TableColumns } func NewResourceInfo(group, version, resourceName, singularName, kind string, - newObj func() runtime.Object, newList func() runtime.Object, columns utils.TableColumns) ResourceInfo { + newObj func() runtime.Object, newList func() runtime.Object, columns TableColumns) ResourceInfo { shortName := "" // an optional alias helpful in kubectl eg ("sa" for serviceaccounts) return ResourceInfo{group, version, resourceName, singularName, shortName, kind, newObj, newList, columns} } @@ -116,8 +114,8 @@ func (info *ResourceInfo) NewListFunc() runtime.Object { return info.newList() } -func (info *ResourceInfo) TableConverter() utils.TableConvertor { - return utils.NewTableConverter(info.GroupResource(), info.columns) +func (info *ResourceInfo) TableConverter() TableConvertor { + return NewTableConverter(info.GroupResource(), info.columns) } func (info *ResourceInfo) NewNotFound(name string) *errors.StatusError { diff --git a/pkg/apis/alerting_notifications/v0alpha1/register.go b/pkg/apis/alerting_notifications/v0alpha1/register.go index b18547aa181..3e6b1d29125 100644 --- a/pkg/apis/alerting_notifications/v0alpha1/register.go +++ b/pkg/apis/alerting_notifications/v0alpha1/register.go @@ -9,7 +9,6 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apiserver/pkg/registry/generic" - common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1" "github.com/grafana/grafana/pkg/apimachinery/utils" scope "github.com/grafana/grafana/pkg/apis/scope/v0alpha1" ) @@ -25,7 +24,7 @@ const ( ) var ( - TimeIntervalResourceInfo = common.NewResourceInfo(GROUP, VERSION, + TimeIntervalResourceInfo = utils.NewResourceInfo(GROUP, VERSION, "timeintervals", "timeinterval", "TimeInterval", func() runtime.Object { return &TimeInterval{} }, func() runtime.Object { return &TimeIntervalList{} }, @@ -46,7 +45,7 @@ var ( }, }, ) - ReceiverResourceInfo = common.NewResourceInfo(GROUP, VERSION, + ReceiverResourceInfo = utils.NewResourceInfo(GROUP, VERSION, "receivers", "receiver", "Receiver", func() runtime.Object { return &Receiver{} }, func() runtime.Object { return &ReceiverList{} }, diff --git a/pkg/apis/dashboard/v0alpha1/register.go b/pkg/apis/dashboard/v0alpha1/register.go index c7c4b742432..9b8fe08536d 100644 --- a/pkg/apis/dashboard/v0alpha1/register.go +++ b/pkg/apis/dashboard/v0alpha1/register.go @@ -4,7 +4,6 @@ import ( "fmt" "time" - common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1" "github.com/grafana/grafana/pkg/apimachinery/utils" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -17,7 +16,7 @@ const ( APIVERSION = GROUP + "/" + VERSION ) -var DashboardResourceInfo = common.NewResourceInfo(GROUP, VERSION, +var DashboardResourceInfo = utils.NewResourceInfo(GROUP, VERSION, "dashboards", "dashboard", "Dashboard", func() runtime.Object { return &Dashboard{} }, func() runtime.Object { return &DashboardList{} }, @@ -43,7 +42,7 @@ var DashboardResourceInfo = common.NewResourceInfo(GROUP, VERSION, }, ) -var LibraryPanelResourceInfo = common.NewResourceInfo(GROUP, VERSION, +var LibraryPanelResourceInfo = utils.NewResourceInfo(GROUP, VERSION, "librarypanels", "librarypanel", "LibraryPanel", func() runtime.Object { return &LibraryPanel{} }, func() runtime.Object { return &LibraryPanelList{} }, diff --git a/pkg/apis/dashboardsnapshot/v0alpha1/register.go b/pkg/apis/dashboardsnapshot/v0alpha1/register.go index 113bc031fc0..b2bb3ecd70c 100644 --- a/pkg/apis/dashboardsnapshot/v0alpha1/register.go +++ b/pkg/apis/dashboardsnapshot/v0alpha1/register.go @@ -4,7 +4,6 @@ import ( "fmt" "time" - common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1" "github.com/grafana/grafana/pkg/apimachinery/utils" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -17,7 +16,7 @@ const ( APIVERSION = GROUP + "/" + VERSION ) -var DashboardSnapshotResourceInfo = common.NewResourceInfo(GROUP, VERSION, +var DashboardSnapshotResourceInfo = utils.NewResourceInfo(GROUP, VERSION, "dashboardsnapshots", "dashboardsnapshot", "DashboardSnapshot", func() runtime.Object { return &DashboardSnapshot{} }, func() runtime.Object { return &DashboardSnapshotList{} }, diff --git a/pkg/apis/datasource/v0alpha1/register.go b/pkg/apis/datasource/v0alpha1/register.go index 526f48c8a4d..2333aa0d996 100644 --- a/pkg/apis/datasource/v0alpha1/register.go +++ b/pkg/apis/datasource/v0alpha1/register.go @@ -4,7 +4,6 @@ import ( "fmt" "time" - common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1" "github.com/grafana/grafana/pkg/apimachinery/utils" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -15,7 +14,7 @@ const ( VERSION = "v0alpha1" ) -var GenericConnectionResourceInfo = common.NewResourceInfo(GROUP, VERSION, +var GenericConnectionResourceInfo = utils.NewResourceInfo(GROUP, VERSION, "connections", "connection", "DataSourceConnection", func() runtime.Object { return &DataSourceConnection{} }, func() runtime.Object { return &DataSourceConnectionList{} }, diff --git a/pkg/apis/featuretoggle/v0alpha1/register.go b/pkg/apis/featuretoggle/v0alpha1/register.go index b3b6129c471..efcad19821b 100644 --- a/pkg/apis/featuretoggle/v0alpha1/register.go +++ b/pkg/apis/featuretoggle/v0alpha1/register.go @@ -3,7 +3,6 @@ package v0alpha1 import ( "fmt" - common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1" "github.com/grafana/grafana/pkg/apimachinery/utils" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" @@ -17,7 +16,7 @@ const ( ) // FeatureResourceInfo represents each feature that may have a toggle -var FeatureResourceInfo = common.NewResourceInfo(GROUP, VERSION, +var FeatureResourceInfo = utils.NewResourceInfo(GROUP, VERSION, "features", "feature", "Feature", func() runtime.Object { return &Feature{} }, func() runtime.Object { return &FeatureList{} }, @@ -42,7 +41,7 @@ var FeatureResourceInfo = common.NewResourceInfo(GROUP, VERSION, ) // TogglesResourceInfo represents the actual configuration -var TogglesResourceInfo = common.NewResourceInfo(GROUP, VERSION, +var TogglesResourceInfo = utils.NewResourceInfo(GROUP, VERSION, "featuretoggles", "featuretoggle", "FeatureToggles", func() runtime.Object { return &FeatureToggles{} }, func() runtime.Object { return &FeatureTogglesList{} }, diff --git a/pkg/apis/folder/v0alpha1/register.go b/pkg/apis/folder/v0alpha1/register.go index a56362276b9..7decb813d5c 100644 --- a/pkg/apis/folder/v0alpha1/register.go +++ b/pkg/apis/folder/v0alpha1/register.go @@ -3,7 +3,6 @@ package v0alpha1 import ( "fmt" - common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1" "github.com/grafana/grafana/pkg/apimachinery/utils" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -17,7 +16,7 @@ const ( APIVERSION = GROUP + "/" + VERSION ) -var FolderResourceInfo = common.NewResourceInfo(GROUP, VERSION, +var FolderResourceInfo = utils.NewResourceInfo(GROUP, VERSION, RESOURCE, "folder", "Folder", func() runtime.Object { return &Folder{} }, func() runtime.Object { return &FolderList{} }, diff --git a/pkg/apis/identity/v0alpha1/doc.go b/pkg/apis/iam/v0alpha1/doc.go similarity index 73% rename from pkg/apis/identity/v0alpha1/doc.go rename to pkg/apis/iam/v0alpha1/doc.go index 5aaa55b2731..ae200d6cfe5 100644 --- a/pkg/apis/identity/v0alpha1/doc.go +++ b/pkg/apis/iam/v0alpha1/doc.go @@ -1,6 +1,6 @@ // +k8s:deepcopy-gen=package // +k8s:openapi-gen=true // +k8s:defaulter-gen=TypeMeta -// +groupName=identity.grafana.app +// +groupName=iam.grafana.app -package v0alpha1 // import "github.com/grafana/grafana/pkg/apis/identity/v0alpha1" +package v0alpha1 // import "github.com/grafana/grafana/pkg/apis/iam/v0alpha1" diff --git a/pkg/apis/identity/v0alpha1/register.go b/pkg/apis/iam/v0alpha1/register.go similarity index 86% rename from pkg/apis/identity/v0alpha1/register.go rename to pkg/apis/iam/v0alpha1/register.go index ba97f4555e1..688befc53b2 100644 --- a/pkg/apis/identity/v0alpha1/register.go +++ b/pkg/apis/iam/v0alpha1/register.go @@ -4,7 +4,6 @@ import ( "fmt" "time" - common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1" "github.com/grafana/grafana/pkg/apimachinery/utils" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -12,12 +11,12 @@ import ( ) const ( - GROUP = "identity.grafana.app" + GROUP = "iam.grafana.app" VERSION = "v0alpha1" APIVERSION = GROUP + "/" + VERSION ) -var UserResourceInfo = common.NewResourceInfo(GROUP, VERSION, +var UserResourceInfo = utils.NewResourceInfo(GROUP, VERSION, "users", "user", "User", func() runtime.Object { return &User{} }, func() runtime.Object { return &UserList{} }, @@ -43,7 +42,7 @@ var UserResourceInfo = common.NewResourceInfo(GROUP, VERSION, }, ) -var TeamResourceInfo = common.NewResourceInfo(GROUP, VERSION, +var TeamResourceInfo = utils.NewResourceInfo(GROUP, VERSION, "teams", "team", "Team", func() runtime.Object { return &Team{} }, func() runtime.Object { return &TeamList{} }, @@ -69,25 +68,25 @@ var TeamResourceInfo = common.NewResourceInfo(GROUP, VERSION, }, ) -var ServiceAccountResourceInfo = common.NewResourceInfo(GROUP, VERSION, +var ServiceAccountResourceInfo = utils.NewResourceInfo(GROUP, VERSION, "serviceaccounts", "serviceaccount", "ServiceAccount", func() runtime.Object { return &ServiceAccount{} }, func() runtime.Object { return &ServiceAccountList{} }, utils.TableColumns{ Definition: []metav1.TableColumnDefinition{ {Name: "Name", Type: "string", Format: "name"}, - {Name: "Account", Type: "string", Format: "string", Description: "The service account email"}, - {Name: "Email", Type: "string", Format: "string", Description: "The user email"}, + {Name: "Title", Type: "string", Format: "string"}, + {Name: "Disabled", Type: "boolean"}, {Name: "Created At", Type: "date"}, }, Reader: func(obj any) ([]interface{}, error) { - u, ok := obj.(*ServiceAccount) + sa, ok := obj.(*ServiceAccount) if ok { return []interface{}{ - u.Name, - u.Spec.Name, - u.Spec.Email, - u.CreationTimestamp.UTC().Format(time.RFC3339), + sa.Name, + sa.Spec.Title, + sa.Spec.Disabled, + sa.CreationTimestamp.UTC().Format(time.RFC3339), }, nil } return nil, fmt.Errorf("expected service account") @@ -95,7 +94,7 @@ var ServiceAccountResourceInfo = common.NewResourceInfo(GROUP, VERSION, }, ) -var SSOSettingResourceInfo = common.NewResourceInfo( +var SSOSettingResourceInfo = utils.NewResourceInfo( GROUP, VERSION, "ssosettings", "ssosetting", "SSOSetting", func() runtime.Object { return &SSOSetting{} }, func() runtime.Object { return &SSOSettingList{} }, @@ -121,7 +120,7 @@ var SSOSettingResourceInfo = common.NewResourceInfo( }, ) -var TeamBindingResourceInfo = common.NewResourceInfo( +var TeamBindingResourceInfo = utils.NewResourceInfo( GROUP, VERSION, "teambindings", "teambinding", "TeamBinding", func() runtime.Object { return &TeamBinding{} }, func() runtime.Object { return &TeamBindingList{} }, @@ -164,6 +163,7 @@ func AddKnownTypes(scheme *runtime.Scheme, version string) { &UserTeamList{}, &ServiceAccount{}, &ServiceAccountList{}, + &ServiceAccountTokenList{}, &Team{}, &TeamList{}, &IdentityDisplayResults{}, diff --git a/pkg/apis/identity/v0alpha1/types_identity.go b/pkg/apis/iam/v0alpha1/types_identity.go similarity index 100% rename from pkg/apis/identity/v0alpha1/types_identity.go rename to pkg/apis/iam/v0alpha1/types_identity.go diff --git a/pkg/apis/iam/v0alpha1/types_servier_account.go b/pkg/apis/iam/v0alpha1/types_servier_account.go new file mode 100644 index 00000000000..8451095c04d --- /dev/null +++ b/pkg/apis/iam/v0alpha1/types_servier_account.go @@ -0,0 +1,42 @@ +package v0alpha1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +type ServiceAccount struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec ServiceAccountSpec `json:"spec,omitempty"` +} + +type ServiceAccountSpec struct { + Title string `json:"title,omitempty"` + Disabled bool `json:"disabled,omitempty"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +type ServiceAccountList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + + Items []ServiceAccount `json:"items,omitempty"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +type ServiceAccountTokenList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + + Items []ServiceAccountToken `json:"items,omitempty"` +} + +type ServiceAccountToken struct { + Name string `json:"name,omitempty"` + Revoked bool `json:"revoked,omitempty"` + Expires *metav1.Time `json:"expires,omitempty"` + LastUsed *metav1.Time `json:"lastUsed,omitempty"` + Created metav1.Time `json:"created"` +} diff --git a/pkg/apis/identity/v0alpha1/types_sso.go b/pkg/apis/iam/v0alpha1/types_sso.go similarity index 100% rename from pkg/apis/identity/v0alpha1/types_sso.go rename to pkg/apis/iam/v0alpha1/types_sso.go diff --git a/pkg/apis/identity/v0alpha1/types_team.go b/pkg/apis/iam/v0alpha1/types_team.go similarity index 100% rename from pkg/apis/identity/v0alpha1/types_team.go rename to pkg/apis/iam/v0alpha1/types_team.go diff --git a/pkg/apis/identity/v0alpha1/types_user.go b/pkg/apis/iam/v0alpha1/types_user.go similarity index 100% rename from pkg/apis/identity/v0alpha1/types_user.go rename to pkg/apis/iam/v0alpha1/types_user.go diff --git a/pkg/apis/identity/v0alpha1/zz_generated.deepcopy.go b/pkg/apis/iam/v0alpha1/zz_generated.deepcopy.go similarity index 90% rename from pkg/apis/identity/v0alpha1/zz_generated.deepcopy.go rename to pkg/apis/iam/v0alpha1/zz_generated.deepcopy.go index e4d9f5eaabf..0ef8cff060b 100644 --- a/pkg/apis/identity/v0alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/iam/v0alpha1/zz_generated.deepcopy.go @@ -220,6 +220,64 @@ func (in *ServiceAccountSpec) DeepCopy() *ServiceAccountSpec { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ServiceAccountToken) DeepCopyInto(out *ServiceAccountToken) { + *out = *in + if in.Expires != nil { + in, out := &in.Expires, &out.Expires + *out = (*in).DeepCopy() + } + if in.LastUsed != nil { + in, out := &in.LastUsed, &out.LastUsed + *out = (*in).DeepCopy() + } + in.Created.DeepCopyInto(&out.Created) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceAccountToken. +func (in *ServiceAccountToken) DeepCopy() *ServiceAccountToken { + if in == nil { + return nil + } + out := new(ServiceAccountToken) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ServiceAccountTokenList) DeepCopyInto(out *ServiceAccountTokenList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]ServiceAccountToken, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceAccountTokenList. +func (in *ServiceAccountTokenList) DeepCopy() *ServiceAccountTokenList { + if in == nil { + return nil + } + out := new(ServiceAccountTokenList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ServiceAccountTokenList) 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 *Team) DeepCopyInto(out *Team) { *out = *in diff --git a/pkg/apis/identity/v0alpha1/zz_generated.defaults.go b/pkg/apis/iam/v0alpha1/zz_generated.defaults.go similarity index 100% rename from pkg/apis/identity/v0alpha1/zz_generated.defaults.go rename to pkg/apis/iam/v0alpha1/zz_generated.defaults.go diff --git a/pkg/apis/identity/v0alpha1/zz_generated.openapi.go b/pkg/apis/iam/v0alpha1/zz_generated.openapi.go similarity index 73% rename from pkg/apis/identity/v0alpha1/zz_generated.openapi.go rename to pkg/apis/iam/v0alpha1/zz_generated.openapi.go index 3fee7aa66fe..8e1357781ab 100644 --- a/pkg/apis/identity/v0alpha1/zz_generated.openapi.go +++ b/pkg/apis/iam/v0alpha1/zz_generated.openapi.go @@ -14,33 +14,35 @@ import ( func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenAPIDefinition { return map[string]common.OpenAPIDefinition{ - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.IdentityDisplay": schema_pkg_apis_identity_v0alpha1_IdentityDisplay(ref), - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.IdentityDisplayResults": schema_pkg_apis_identity_v0alpha1_IdentityDisplayResults(ref), - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.SSOSetting": schema_pkg_apis_identity_v0alpha1_SSOSetting(ref), - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.SSOSettingList": schema_pkg_apis_identity_v0alpha1_SSOSettingList(ref), - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.SSOSettingSpec": schema_pkg_apis_identity_v0alpha1_SSOSettingSpec(ref), - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.ServiceAccount": schema_pkg_apis_identity_v0alpha1_ServiceAccount(ref), - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.ServiceAccountList": schema_pkg_apis_identity_v0alpha1_ServiceAccountList(ref), - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.ServiceAccountSpec": schema_pkg_apis_identity_v0alpha1_ServiceAccountSpec(ref), - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.Team": schema_pkg_apis_identity_v0alpha1_Team(ref), - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.TeamBinding": schema_pkg_apis_identity_v0alpha1_TeamBinding(ref), - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.TeamBindingList": schema_pkg_apis_identity_v0alpha1_TeamBindingList(ref), - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.TeamBindingSpec": schema_pkg_apis_identity_v0alpha1_TeamBindingSpec(ref), - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.TeamList": schema_pkg_apis_identity_v0alpha1_TeamList(ref), - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.TeamMember": schema_pkg_apis_identity_v0alpha1_TeamMember(ref), - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.TeamMemberList": schema_pkg_apis_identity_v0alpha1_TeamMemberList(ref), - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.TeamRef": schema_pkg_apis_identity_v0alpha1_TeamRef(ref), - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.TeamSpec": schema_pkg_apis_identity_v0alpha1_TeamSpec(ref), - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.TeamSubject": schema_pkg_apis_identity_v0alpha1_TeamSubject(ref), - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.User": schema_pkg_apis_identity_v0alpha1_User(ref), - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.UserList": schema_pkg_apis_identity_v0alpha1_UserList(ref), - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.UserSpec": schema_pkg_apis_identity_v0alpha1_UserSpec(ref), - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.UserTeam": schema_pkg_apis_identity_v0alpha1_UserTeam(ref), - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.UserTeamList": schema_pkg_apis_identity_v0alpha1_UserTeamList(ref), + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.IdentityDisplay": schema_pkg_apis_iam_v0alpha1_IdentityDisplay(ref), + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.IdentityDisplayResults": schema_pkg_apis_iam_v0alpha1_IdentityDisplayResults(ref), + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.SSOSetting": schema_pkg_apis_iam_v0alpha1_SSOSetting(ref), + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.SSOSettingList": schema_pkg_apis_iam_v0alpha1_SSOSettingList(ref), + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.SSOSettingSpec": schema_pkg_apis_iam_v0alpha1_SSOSettingSpec(ref), + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.ServiceAccount": schema_pkg_apis_iam_v0alpha1_ServiceAccount(ref), + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.ServiceAccountList": schema_pkg_apis_iam_v0alpha1_ServiceAccountList(ref), + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.ServiceAccountSpec": schema_pkg_apis_iam_v0alpha1_ServiceAccountSpec(ref), + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.ServiceAccountToken": schema_pkg_apis_iam_v0alpha1_ServiceAccountToken(ref), + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.ServiceAccountTokenList": schema_pkg_apis_iam_v0alpha1_ServiceAccountTokenList(ref), + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.Team": schema_pkg_apis_iam_v0alpha1_Team(ref), + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.TeamBinding": schema_pkg_apis_iam_v0alpha1_TeamBinding(ref), + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.TeamBindingList": schema_pkg_apis_iam_v0alpha1_TeamBindingList(ref), + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.TeamBindingSpec": schema_pkg_apis_iam_v0alpha1_TeamBindingSpec(ref), + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.TeamList": schema_pkg_apis_iam_v0alpha1_TeamList(ref), + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.TeamMember": schema_pkg_apis_iam_v0alpha1_TeamMember(ref), + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.TeamMemberList": schema_pkg_apis_iam_v0alpha1_TeamMemberList(ref), + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.TeamRef": schema_pkg_apis_iam_v0alpha1_TeamRef(ref), + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.TeamSpec": schema_pkg_apis_iam_v0alpha1_TeamSpec(ref), + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.TeamSubject": schema_pkg_apis_iam_v0alpha1_TeamSubject(ref), + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.User": schema_pkg_apis_iam_v0alpha1_User(ref), + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.UserList": schema_pkg_apis_iam_v0alpha1_UserList(ref), + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.UserSpec": schema_pkg_apis_iam_v0alpha1_UserSpec(ref), + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.UserTeam": schema_pkg_apis_iam_v0alpha1_UserTeam(ref), + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.UserTeamList": schema_pkg_apis_iam_v0alpha1_UserTeamList(ref), } } -func schema_pkg_apis_identity_v0alpha1_IdentityDisplay(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_pkg_apis_iam_v0alpha1_IdentityDisplay(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -91,7 +93,7 @@ func schema_pkg_apis_identity_v0alpha1_IdentityDisplay(ref common.ReferenceCallb } } -func schema_pkg_apis_identity_v0alpha1_IdentityDisplayResults(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_pkg_apis_iam_v0alpha1_IdentityDisplayResults(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -144,7 +146,7 @@ func schema_pkg_apis_identity_v0alpha1_IdentityDisplayResults(ref common.Referen Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/identity/v0alpha1.IdentityDisplay"), + Ref: ref("github.com/grafana/grafana/pkg/apis/iam/v0alpha1.IdentityDisplay"), }, }, }, @@ -175,11 +177,11 @@ func schema_pkg_apis_identity_v0alpha1_IdentityDisplayResults(ref common.Referen }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.IdentityDisplay"}, + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.IdentityDisplay"}, } } -func schema_pkg_apis_identity_v0alpha1_SSOSetting(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_pkg_apis_iam_v0alpha1_SSOSetting(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -209,18 +211,18 @@ func schema_pkg_apis_identity_v0alpha1_SSOSetting(ref common.ReferenceCallback) "spec": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/identity/v0alpha1.SSOSettingSpec"), + Ref: ref("github.com/grafana/grafana/pkg/apis/iam/v0alpha1.SSOSettingSpec"), }, }, }, }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.SSOSettingSpec", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.SSOSettingSpec", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, } } -func schema_pkg_apis_identity_v0alpha1_SSOSettingList(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_pkg_apis_iam_v0alpha1_SSOSettingList(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -253,7 +255,7 @@ func schema_pkg_apis_identity_v0alpha1_SSOSettingList(ref common.ReferenceCallba Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/identity/v0alpha1.SSOSetting"), + Ref: ref("github.com/grafana/grafana/pkg/apis/iam/v0alpha1.SSOSetting"), }, }, }, @@ -263,11 +265,11 @@ func schema_pkg_apis_identity_v0alpha1_SSOSettingList(ref common.ReferenceCallba }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.SSOSetting", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.SSOSetting", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, } } -func schema_pkg_apis_identity_v0alpha1_SSOSettingSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_pkg_apis_iam_v0alpha1_SSOSettingSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -297,7 +299,7 @@ func schema_pkg_apis_identity_v0alpha1_SSOSettingSpec(ref common.ReferenceCallba } } -func schema_pkg_apis_identity_v0alpha1_ServiceAccount(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_pkg_apis_iam_v0alpha1_ServiceAccount(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -326,18 +328,18 @@ func schema_pkg_apis_identity_v0alpha1_ServiceAccount(ref common.ReferenceCallba "spec": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/identity/v0alpha1.ServiceAccountSpec"), + Ref: ref("github.com/grafana/grafana/pkg/apis/iam/v0alpha1.ServiceAccountSpec"), }, }, }, }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.ServiceAccountSpec", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.ServiceAccountSpec", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, } } -func schema_pkg_apis_identity_v0alpha1_ServiceAccountList(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_pkg_apis_iam_v0alpha1_ServiceAccountList(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -370,7 +372,7 @@ func schema_pkg_apis_identity_v0alpha1_ServiceAccountList(ref common.ReferenceCa Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/identity/v0alpha1.ServiceAccount"), + Ref: ref("github.com/grafana/grafana/pkg/apis/iam/v0alpha1.ServiceAccount"), }, }, }, @@ -380,34 +382,22 @@ func schema_pkg_apis_identity_v0alpha1_ServiceAccountList(ref common.ReferenceCa }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.ServiceAccount", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.ServiceAccount", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, } } -func schema_pkg_apis_identity_v0alpha1_ServiceAccountSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_pkg_apis_iam_v0alpha1_ServiceAccountSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Type: []string{"object"}, Properties: map[string]spec.Schema{ - "name": { + "title": { SchemaProps: spec.SchemaProps{ Type: []string{"string"}, Format: "", }, }, - "email": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "emailVerified": { - SchemaProps: spec.SchemaProps{ - Type: []string{"boolean"}, - Format: "", - }, - }, "disabled": { SchemaProps: spec.SchemaProps{ Type: []string{"boolean"}, @@ -420,87 +410,49 @@ func schema_pkg_apis_identity_v0alpha1_ServiceAccountSpec(ref common.ReferenceCa } } -func schema_pkg_apis_identity_v0alpha1_Team(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_pkg_apis_iam_v0alpha1_ServiceAccountToken(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Type: []string{"object"}, Properties: map[string]spec.Schema{ - "kind": { + "name": { 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: "", + Type: []string{"string"}, + Format: "", }, }, - "apiVersion": { + "revoked": { 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: "", + Type: []string{"boolean"}, + Format: "", }, }, - "metadata": { + "expires": { SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), }, }, - "spec": { + "lastUsed": { SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/identity/v0alpha1.TeamSpec"), + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + }, + }, + "created": { + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), }, }, }, + Required: []string{"created"}, }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.TeamSpec", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, } } -func schema_pkg_apis_identity_v0alpha1_TeamBinding(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{ - Default: map[string]interface{}{}, - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), - }, - }, - "spec": { - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/identity/v0alpha1.TeamBindingSpec"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.TeamBindingSpec", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, - } -} - -func schema_pkg_apis_identity_v0alpha1_TeamBindingList(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_pkg_apis_iam_v0alpha1_ServiceAccountTokenList(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -533,7 +485,7 @@ func schema_pkg_apis_identity_v0alpha1_TeamBindingList(ref common.ReferenceCallb Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/identity/v0alpha1.TeamBinding"), + Ref: ref("github.com/grafana/grafana/pkg/apis/iam/v0alpha1.ServiceAccountToken"), }, }, }, @@ -543,11 +495,138 @@ func schema_pkg_apis_identity_v0alpha1_TeamBindingList(ref common.ReferenceCallb }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.TeamBinding", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.ServiceAccountToken", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, } } -func schema_pkg_apis_identity_v0alpha1_TeamBindingSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_pkg_apis_iam_v0alpha1_Team(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{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), + }, + }, + "spec": { + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/grafana/grafana/pkg/apis/iam/v0alpha1.TeamSpec"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.TeamSpec", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + } +} + +func schema_pkg_apis_iam_v0alpha1_TeamBinding(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{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), + }, + }, + "spec": { + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/grafana/grafana/pkg/apis/iam/v0alpha1.TeamBindingSpec"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.TeamBindingSpec", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + } +} + +func schema_pkg_apis_iam_v0alpha1_TeamBindingList(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{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), + }, + }, + "items": { + SchemaProps: spec.SchemaProps{ + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/grafana/grafana/pkg/apis/iam/v0alpha1.TeamBinding"), + }, + }, + }, + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.TeamBinding", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + } +} + +func schema_pkg_apis_iam_v0alpha1_TeamBindingSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -560,7 +639,7 @@ func schema_pkg_apis_identity_v0alpha1_TeamBindingSpec(ref common.ReferenceCallb Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/identity/v0alpha1.TeamSubject"), + Ref: ref("github.com/grafana/grafana/pkg/apis/iam/v0alpha1.TeamSubject"), }, }, }, @@ -569,18 +648,18 @@ func schema_pkg_apis_identity_v0alpha1_TeamBindingSpec(ref common.ReferenceCallb "teamRef": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/identity/v0alpha1.TeamRef"), + Ref: ref("github.com/grafana/grafana/pkg/apis/iam/v0alpha1.TeamRef"), }, }, }, }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.TeamRef", "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.TeamSubject"}, + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.TeamRef", "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.TeamSubject"}, } } -func schema_pkg_apis_identity_v0alpha1_TeamList(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_pkg_apis_iam_v0alpha1_TeamList(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -613,7 +692,7 @@ func schema_pkg_apis_identity_v0alpha1_TeamList(ref common.ReferenceCallback) co Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/identity/v0alpha1.Team"), + Ref: ref("github.com/grafana/grafana/pkg/apis/iam/v0alpha1.Team"), }, }, }, @@ -623,11 +702,11 @@ func schema_pkg_apis_identity_v0alpha1_TeamList(ref common.ReferenceCallback) co }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.Team", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.Team", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, } } -func schema_pkg_apis_identity_v0alpha1_TeamMember(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_pkg_apis_iam_v0alpha1_TeamMember(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -693,7 +772,7 @@ func schema_pkg_apis_identity_v0alpha1_TeamMember(ref common.ReferenceCallback) } } -func schema_pkg_apis_identity_v0alpha1_TeamMemberList(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_pkg_apis_iam_v0alpha1_TeamMemberList(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -726,7 +805,7 @@ func schema_pkg_apis_identity_v0alpha1_TeamMemberList(ref common.ReferenceCallba Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/identity/v0alpha1.TeamMember"), + Ref: ref("github.com/grafana/grafana/pkg/apis/iam/v0alpha1.TeamMember"), }, }, }, @@ -736,11 +815,11 @@ func schema_pkg_apis_identity_v0alpha1_TeamMemberList(ref common.ReferenceCallba }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.TeamMember", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.TeamMember", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, } } -func schema_pkg_apis_identity_v0alpha1_TeamRef(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_pkg_apis_iam_v0alpha1_TeamRef(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -759,7 +838,7 @@ func schema_pkg_apis_identity_v0alpha1_TeamRef(ref common.ReferenceCallback) com } } -func schema_pkg_apis_identity_v0alpha1_TeamSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_pkg_apis_iam_v0alpha1_TeamSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -783,7 +862,7 @@ func schema_pkg_apis_identity_v0alpha1_TeamSpec(ref common.ReferenceCallback) co } } -func schema_pkg_apis_identity_v0alpha1_TeamSubject(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_pkg_apis_iam_v0alpha1_TeamSubject(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -810,7 +889,7 @@ func schema_pkg_apis_identity_v0alpha1_TeamSubject(ref common.ReferenceCallback) } } -func schema_pkg_apis_identity_v0alpha1_User(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_pkg_apis_iam_v0alpha1_User(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -839,18 +918,18 @@ func schema_pkg_apis_identity_v0alpha1_User(ref common.ReferenceCallback) common "spec": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/identity/v0alpha1.UserSpec"), + Ref: ref("github.com/grafana/grafana/pkg/apis/iam/v0alpha1.UserSpec"), }, }, }, }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.UserSpec", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.UserSpec", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, } } -func schema_pkg_apis_identity_v0alpha1_UserList(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_pkg_apis_iam_v0alpha1_UserList(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -883,7 +962,7 @@ func schema_pkg_apis_identity_v0alpha1_UserList(ref common.ReferenceCallback) co Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/identity/v0alpha1.User"), + Ref: ref("github.com/grafana/grafana/pkg/apis/iam/v0alpha1.User"), }, }, }, @@ -893,11 +972,11 @@ func schema_pkg_apis_identity_v0alpha1_UserList(ref common.ReferenceCallback) co }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.User", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.User", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, } } -func schema_pkg_apis_identity_v0alpha1_UserSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_pkg_apis_iam_v0alpha1_UserSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -939,7 +1018,7 @@ func schema_pkg_apis_identity_v0alpha1_UserSpec(ref common.ReferenceCallback) co } } -func schema_pkg_apis_identity_v0alpha1_UserTeam(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_pkg_apis_iam_v0alpha1_UserTeam(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -954,7 +1033,7 @@ func schema_pkg_apis_identity_v0alpha1_UserTeam(ref common.ReferenceCallback) co "teamRef": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/identity/v0alpha1.TeamRef"), + Ref: ref("github.com/grafana/grafana/pkg/apis/iam/v0alpha1.TeamRef"), }, }, "permission": { @@ -969,11 +1048,11 @@ func schema_pkg_apis_identity_v0alpha1_UserTeam(ref common.ReferenceCallback) co }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.TeamRef"}, + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.TeamRef"}, } } -func schema_pkg_apis_identity_v0alpha1_UserTeamList(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_pkg_apis_iam_v0alpha1_UserTeamList(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -1006,7 +1085,7 @@ func schema_pkg_apis_identity_v0alpha1_UserTeamList(ref common.ReferenceCallback Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/pkg/apis/identity/v0alpha1.UserTeam"), + Ref: ref("github.com/grafana/grafana/pkg/apis/iam/v0alpha1.UserTeam"), }, }, }, @@ -1016,6 +1095,6 @@ func schema_pkg_apis_identity_v0alpha1_UserTeamList(ref common.ReferenceCallback }, }, Dependencies: []string{ - "github.com/grafana/grafana/pkg/apis/identity/v0alpha1.UserTeam", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + "github.com/grafana/grafana/pkg/apis/iam/v0alpha1.UserTeam", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, } } diff --git a/pkg/apis/identity/v0alpha1/zz_generated.openapi_violation_exceptions.list b/pkg/apis/iam/v0alpha1/zz_generated.openapi_violation_exceptions.list similarity index 55% rename from pkg/apis/identity/v0alpha1/zz_generated.openapi_violation_exceptions.list rename to pkg/apis/iam/v0alpha1/zz_generated.openapi_violation_exceptions.list index ed0d379d152..afb10a855dc 100644 --- a/pkg/apis/identity/v0alpha1/zz_generated.openapi_violation_exceptions.list +++ b/pkg/apis/iam/v0alpha1/zz_generated.openapi_violation_exceptions.list @@ -1,3 +1,3 @@ -API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/identity/v0alpha1,TeamBindingSpec,Subjects -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/identity/v0alpha1,IdentityDisplay,IdentityType -API rule violation: names_match,github.com/grafana/grafana/pkg/apis/identity/v0alpha1,IdentityDisplay,InternalID +API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/iam/v0alpha1,TeamBindingSpec,Subjects +API rule violation: names_match,github.com/grafana/grafana/pkg/apis/iam/v0alpha1,IdentityDisplay,IdentityType +API rule violation: names_match,github.com/grafana/grafana/pkg/apis/iam/v0alpha1,IdentityDisplay,InternalID diff --git a/pkg/apis/identity/v0alpha1/types_servier_account.go b/pkg/apis/identity/v0alpha1/types_servier_account.go deleted file mode 100644 index a00d8bb7663..00000000000 --- a/pkg/apis/identity/v0alpha1/types_servier_account.go +++ /dev/null @@ -1,26 +0,0 @@ -package v0alpha1 - -import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -type ServiceAccount struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec ServiceAccountSpec `json:"spec,omitempty"` -} - -type ServiceAccountSpec struct { - Name string `json:"name,omitempty"` - Email string `json:"email,omitempty"` - EmailVerified bool `json:"emailVerified,omitempty"` - Disabled bool `json:"disabled,omitempty"` -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -type ServiceAccountList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - - Items []ServiceAccount `json:"items,omitempty"` -} diff --git a/pkg/apis/peakq/v0alpha1/register.go b/pkg/apis/peakq/v0alpha1/register.go index fdbc6689d73..e314355d107 100644 --- a/pkg/apis/peakq/v0alpha1/register.go +++ b/pkg/apis/peakq/v0alpha1/register.go @@ -5,7 +5,6 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" - common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1" "github.com/grafana/grafana/pkg/apimachinery/utils" ) @@ -15,7 +14,7 @@ const ( APIVERSION = GROUP + "/" + VERSION ) -var QueryTemplateResourceInfo = common.NewResourceInfo(GROUP, VERSION, +var QueryTemplateResourceInfo = utils.NewResourceInfo(GROUP, VERSION, "querytemplates", "querytemplate", "QueryTemplate", func() runtime.Object { return &QueryTemplate{} }, func() runtime.Object { return &QueryTemplateList{} }, diff --git a/pkg/apis/playlist/v0alpha1/register.go b/pkg/apis/playlist/v0alpha1/register.go index ce5dddbee6f..194549fc4c7 100644 --- a/pkg/apis/playlist/v0alpha1/register.go +++ b/pkg/apis/playlist/v0alpha1/register.go @@ -4,7 +4,6 @@ import ( "fmt" "time" - common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1" "github.com/grafana/grafana/pkg/apimachinery/utils" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -16,10 +15,10 @@ const ( VERSION = "v0alpha1" APIVERSION = GROUP + "/" + VERSION RESOURCE = "playlists" - GROUPRESOURCE = GROUP + "/" + RESOURCE + RESOURCEGROUP = RESOURCE + "." + GROUP ) -var PlaylistResourceInfo = common.NewResourceInfo(GROUP, VERSION, +var PlaylistResourceInfo = utils.NewResourceInfo(GROUP, VERSION, RESOURCE, "playlist", "Playlist", func() runtime.Object { return &Playlist{} }, func() runtime.Object { return &PlaylistList{} }, diff --git a/pkg/apis/query/v0alpha1/register.go b/pkg/apis/query/v0alpha1/register.go index faabe486aca..14ba3560315 100644 --- a/pkg/apis/query/v0alpha1/register.go +++ b/pkg/apis/query/v0alpha1/register.go @@ -4,7 +4,6 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" - common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1" "github.com/grafana/grafana/pkg/apimachinery/utils" ) @@ -14,14 +13,14 @@ const ( APIVERSION = GROUP + "/" + VERSION ) -var DataSourceApiServerResourceInfo = common.NewResourceInfo(GROUP, VERSION, +var DataSourceApiServerResourceInfo = utils.NewResourceInfo(GROUP, VERSION, "datasourceapiservers", "datasourceapiserver", "DataSourceApiServer", func() runtime.Object { return &DataSourceApiServer{} }, func() runtime.Object { return &DataSourceApiServerList{} }, utils.TableColumns{}, // default table converter ) -var QueryTypeDefinitionResourceInfo = common.NewResourceInfo(GROUP, VERSION, +var QueryTypeDefinitionResourceInfo = utils.NewResourceInfo(GROUP, VERSION, "querytypes", "querytype", "QueryTypeDefinition", func() runtime.Object { return &QueryTypeDefinition{} }, func() runtime.Object { return &QueryTypeDefinitionList{} }, diff --git a/pkg/apis/scope/v0alpha1/register.go b/pkg/apis/scope/v0alpha1/register.go index 7d301cba8a9..e4c514c062d 100644 --- a/pkg/apis/scope/v0alpha1/register.go +++ b/pkg/apis/scope/v0alpha1/register.go @@ -4,7 +4,6 @@ import ( "fmt" "time" - common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1" "github.com/grafana/grafana/pkg/apimachinery/utils" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -17,7 +16,7 @@ const ( APIVERSION = GROUP + "/" + VERSION ) -var ScopeResourceInfo = common.NewResourceInfo(GROUP, VERSION, +var ScopeResourceInfo = utils.NewResourceInfo(GROUP, VERSION, "scopes", "scope", "Scope", func() runtime.Object { return &Scope{} }, func() runtime.Object { return &ScopeList{} }, @@ -43,7 +42,7 @@ var ScopeResourceInfo = common.NewResourceInfo(GROUP, VERSION, }, // default table converter ) -var ScopeDashboardBindingResourceInfo = common.NewResourceInfo(GROUP, VERSION, +var ScopeDashboardBindingResourceInfo = utils.NewResourceInfo(GROUP, VERSION, "scopedashboardbindings", "scopedashboardbinding", "ScopeDashboardBinding", func() runtime.Object { return &ScopeDashboardBinding{} }, func() runtime.Object { return &ScopeDashboardBindingList{} }, @@ -69,7 +68,7 @@ var ScopeDashboardBindingResourceInfo = common.NewResourceInfo(GROUP, VERSION, }, ) -var ScopeNodeResourceInfo = common.NewResourceInfo(GROUP, VERSION, +var ScopeNodeResourceInfo = utils.NewResourceInfo(GROUP, VERSION, "scopenodes", "scopenode", "ScopeNode", func() runtime.Object { return &ScopeNode{} }, func() runtime.Object { return &ScopeNodeList{} }, diff --git a/pkg/apis/service/v0alpha1/register.go b/pkg/apis/service/v0alpha1/register.go index 9cc423d51ab..2bfb02c6e29 100644 --- a/pkg/apis/service/v0alpha1/register.go +++ b/pkg/apis/service/v0alpha1/register.go @@ -4,7 +4,6 @@ import ( "fmt" "time" - common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1" "github.com/grafana/grafana/pkg/apimachinery/utils" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -17,7 +16,7 @@ const ( APIVERSION = GROUP + "/" + VERSION ) -var ExternalNameResourceInfo = common.NewResourceInfo(GROUP, VERSION, +var ExternalNameResourceInfo = utils.NewResourceInfo(GROUP, VERSION, "externalnames", "externalname", "ExternalName", func() runtime.Object { return &ExternalName{} }, func() runtime.Object { return &ExternalNameList{} }, diff --git a/pkg/apiserver/go.mod b/pkg/apiserver/go.mod index 16b21f60555..bc09bb4050b 100644 --- a/pkg/apiserver/go.mod +++ b/pkg/apiserver/go.mod @@ -8,7 +8,7 @@ require ( github.com/grafana/grafana/pkg/apimachinery v0.0.0-20240701135906-559738ce6ae1 github.com/prometheus/client_golang v1.20.0 github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/otel/trace v1.28.0 + go.opentelemetry.io/otel/trace v1.29.0 k8s.io/apimachinery v0.31.0 k8s.io/apiserver v0.31.0 k8s.io/component-base v0.31.0 @@ -31,7 +31,7 @@ require ( 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.20.4 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect github.com/go-openapi/swag v0.23.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.4 // indirect @@ -63,11 +63,11 @@ require ( go.etcd.io/etcd/client/v3 v3.5.14 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect - go.opentelemetry.io/otel v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect + go.opentelemetry.io/otel v1.29.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 // indirect - go.opentelemetry.io/otel/metric v1.28.0 // indirect - go.opentelemetry.io/otel/sdk v1.28.0 // indirect + go.opentelemetry.io/otel/metric v1.29.0 // indirect + go.opentelemetry.io/otel/sdk v1.29.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect @@ -79,8 +79,8 @@ require ( golang.org/x/time v0.6.0 // indirect golang.org/x/tools v0.22.0 // indirect google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect google.golang.org/grpc v1.65.0 // indirect google.golang.org/protobuf v1.34.2 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/pkg/apiserver/go.sum b/pkg/apiserver/go.sum index 2df0f83d0b3..a82c3d5641a 100644 --- a/pkg/apiserver/go.sum +++ b/pkg/apiserver/go.sum @@ -42,8 +42,8 @@ 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.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= -github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= +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-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -192,18 +192,18 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.5 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0/go.mod h1:azvtTADFQJA8mX80jIH/akaE7h+dbm/sVuaHqN13w74= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg= -go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= -go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= +go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw= +go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 h1:dIIDULZJpgdiHz5tXrTgKIMLkus6jEFa7x5SOKcyR7E= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0/go.mod h1:jlRVBe7+Z1wyxFSUs48L6OBQZ5JwH2Hg/Vbl+t9rAgI= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 h1:R3X6ZXmNPRR8ul6i3WgFURCHzaXjHdm0karRG/+dj3s= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0/go.mod h1:QWFXnDavXWwMx2EEcZsf3yxgEKAqsxQ+Syjp+seyInw= -go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= -go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= -go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE= -go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= -go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= -go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= +go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc= +go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8= +go.opentelemetry.io/otel/sdk v1.29.0 h1:vkqKjk7gwhS8VaWb0POZKmIEDimRCMsopNYnriHyryo= +go.opentelemetry.io/otel/sdk v1.29.0/go.mod h1:pM8Dx5WKnvxLCb+8lG1PRNIDxu9g9b9g59Qr7hfAAok= +go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4= +go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ= go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -286,10 +286,10 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988 h1:CT2Thj5AuPV9phrYMtzX11k+XkzMGfRAet42PmoTATM= google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988/go.mod h1:7uvplUBj4RjHAxIZ//98LzOvrQ04JBkaixRmCMI29hc= -google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988 h1:+/tmTy5zAieooKIXfzDm9KiA3Bv6JBwriRN9LY+yayk= -google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988/go.mod h1:4+X6GvPs+25wZKbQq9qyAXrwIRExv7w0Ea6MgZLZiDM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 h1:V71AcdLZr2p8dC9dbOIMCpqi4EmRl8wUwnJzXXLmbmc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd h1:BBOTEWLuuEGQy9n1y9MhVJ9Qt0BDu21X8qZs71/uPZo= +google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd/go.mod h1:fO8wJzT2zbQbAjbIoos1285VfEIYKDDY+Dt+WpTkh6g= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/grpc v1.18.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= diff --git a/pkg/build/cmd/publishaws.go b/pkg/build/cmd/publishaws.go index 5fc98fbbc27..aa52ef6debc 100644 --- a/pkg/build/cmd/publishaws.go +++ b/pkg/build/cmd/publishaws.go @@ -16,6 +16,7 @@ import ( "github.com/aws/aws-sdk-go/service/ecr" "github.com/aws/aws-sdk-go/service/marketplacecatalog" "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/registry" "github.com/docker/docker/client" "github.com/urfave/cli/v2" @@ -163,7 +164,7 @@ func (s *AwsMarketplacePublishingService) Login(ctx context.Context) error { return err } authString := strings.Split(string(authData), ":") - authData, err = json.Marshal(types.AuthConfig{ + authData, err = json.Marshal(registry.AuthConfig{ Username: authString[0], Password: authString[1], }) diff --git a/pkg/build/go.mod b/pkg/build/go.mod index c547676f24c..2a429ee9fb7 100644 --- a/pkg/build/go.mod +++ b/pkg/build/go.mod @@ -5,7 +5,7 @@ go 1.23.0 // Override docker/docker to avoid: // go: github.com/drone-runners/drone-runner-docker@v1.8.2 requires // github.com/docker/docker@v0.0.0-00010101000000-000000000000: invalid version: unknown revision 000000000000 -replace github.com/docker/docker => github.com/moby/moby v23.0.4+incompatible +replace github.com/docker/docker => github.com/moby/moby v25.0.2+incompatible // contains openapi encoder fixes. remove ASAP replace cuelang.org/go => github.com/grafana/cue v0.0.0-20230926092038-971951014e3f // @grafana/grafana-as-code @@ -33,9 +33,9 @@ require ( github.com/urfave/cli v1.22.15 // @grafana/grafana-backend-group github.com/urfave/cli/v2 v2.27.1 // @grafana/grafana-backend-group go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // indirect; @grafana/plugins-platform-backend - go.opentelemetry.io/otel v1.28.0 // indirect; @grafana/grafana-backend-group - go.opentelemetry.io/otel/sdk v1.28.0 // indirect; @grafana/grafana-backend-group - go.opentelemetry.io/otel/trace v1.28.0 // indirect; @grafana/grafana-backend-group + go.opentelemetry.io/otel v1.29.0 // indirect; @grafana/grafana-backend-group + go.opentelemetry.io/otel/sdk v1.29.0 // indirect; @grafana/grafana-backend-group + go.opentelemetry.io/otel/trace v1.29.0 // indirect; @grafana/grafana-backend-group golang.org/x/crypto v0.26.0 // indirect; @grafana/grafana-backend-group golang.org/x/mod v0.18.0 // @grafana/grafana-backend-group golang.org/x/net v0.28.0 // indirect; @grafana/oss-big-tent @grafana/partner-datasources @@ -61,7 +61,6 @@ require ( github.com/buildkite/yaml v2.1.0+incompatible // indirect github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/docker/distribution v2.8.2+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.2 // indirect @@ -84,12 +83,12 @@ require ( github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect - go.opentelemetry.io/otel/metric v1.28.0 // indirect + go.opentelemetry.io/otel/metric v1.29.0 // indirect go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect golang.org/x/sys v0.24.0 // indirect google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988 // indirect; @grafana/grafana-backend-group - google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect ) @@ -102,6 +101,8 @@ require ( github.com/Khan/genqlient v0.7.0 // indirect github.com/adrg/xdg v0.4.0 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/containerd/log v0.1.0 // indirect + github.com/distribution/reference v0.6.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/moby/term v0.5.0 // indirect @@ -109,7 +110,7 @@ require ( github.com/vektah/gqlparser/v2 v2.5.11 // indirect go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240518090000-14441aefdf88 // indirect go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.2.0-alpha // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.26.0 // indirect go.opentelemetry.io/otel/log v0.2.0-alpha // indirect diff --git a/pkg/build/go.sum b/pkg/build/go.sum index 5eef149b39b..190f6a2a966 100644 --- a/pkg/build/go.sum +++ b/pkg/build/go.sum @@ -54,6 +54,8 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn 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/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= @@ -62,9 +64,9 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs 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/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= @@ -168,8 +170,8 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= 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/moby/moby v23.0.4+incompatible h1:A/pe8vi9KIKhNbzR0G3wW4ACKDsMgXILBveMqiJNa8M= -github.com/moby/moby v23.0.4+incompatible/go.mod h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc= +github.com/moby/moby v25.0.2+incompatible h1:g2oKRI7vgWkiPHZbBghaPbcV/SuKP1g/YLx0I2nxFT4= +github.com/moby/moby v25.0.2+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= @@ -195,6 +197,8 @@ github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD 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/sosodev/duration v1.2.0 h1:pqK/FLSjsAADWY74SyWDCjOcd5l7H8GSnnOGEB9A1Us= github.com/sosodev/duration v1.2.0/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -227,28 +231,28 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.5 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0/go.mod h1:azvtTADFQJA8mX80jIH/akaE7h+dbm/sVuaHqN13w74= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg= -go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= -go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= +go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw= +go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240518090000-14441aefdf88 h1:oM0GTNKGlc5qHctWeIGTVyda4iFFalOzMZ3Ehj5rwB4= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240518090000-14441aefdf88/go.mod h1:JGG8ebaMO5nXOPnvKEl+DiA4MGwFjCbjsxT1WHIEBPY= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.2.0-alpha h1:z2s6Zba+OUyayRv5m1AXWNUTGh57K1iMhy6emU5QT5Y= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.2.0-alpha/go.mod h1:paOXXyUgPW6jYxYkP0pB47H2zHE1fPvMJ4E4G9LHOi0= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 h1:dIIDULZJpgdiHz5tXrTgKIMLkus6jEFa7x5SOKcyR7E= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0/go.mod h1:jlRVBe7+Z1wyxFSUs48L6OBQZ5JwH2Hg/Vbl+t9rAgI= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 h1:R3X6ZXmNPRR8ul6i3WgFURCHzaXjHdm0karRG/+dj3s= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0/go.mod h1:QWFXnDavXWwMx2EEcZsf3yxgEKAqsxQ+Syjp+seyInw= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.26.0 h1:1wp/gyxsuYtuE/JFxsQRtcCDtMrO2qMvlfXALU5wkzI= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.26.0/go.mod h1:gbTHmghkGgqxMomVQQMur1Nba4M0MQ8AYThXDUjsJ38= go.opentelemetry.io/otel/log v0.2.0-alpha h1:ixOPvMzserpqA07SENHvRzkZOsnG0XbPr74hv1AQ+n0= go.opentelemetry.io/otel/log v0.2.0-alpha/go.mod h1:vbFZc65yq4c4ssvXY43y/nIqkNJLxORrqw0L85P59LA= -go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= -go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= -go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE= -go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= +go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc= +go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8= +go.opentelemetry.io/otel/sdk v1.29.0 h1:vkqKjk7gwhS8VaWb0POZKmIEDimRCMsopNYnriHyryo= +go.opentelemetry.io/otel/sdk v1.29.0/go.mod h1:pM8Dx5WKnvxLCb+8lG1PRNIDxu9g9b9g59Qr7hfAAok= go.opentelemetry.io/otel/sdk/log v0.2.0-alpha h1:jGTkL/jroJ31jnP6jDl34N/mDOfRGGYZHcHsCM+5kWA= go.opentelemetry.io/otel/sdk/log v0.2.0-alpha/go.mod h1:Hd8Lw9FPGUM3pfY7iGMRvFaC2Nyau4Ajb5WnQ9OdIho= -go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= -go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= +go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4= +go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ= go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= @@ -335,10 +339,10 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988 h1:CT2Thj5AuPV9phrYMtzX11k+XkzMGfRAet42PmoTATM= google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988/go.mod h1:7uvplUBj4RjHAxIZ//98LzOvrQ04JBkaixRmCMI29hc= -google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988 h1:+/tmTy5zAieooKIXfzDm9KiA3Bv6JBwriRN9LY+yayk= -google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988/go.mod h1:4+X6GvPs+25wZKbQq9qyAXrwIRExv7w0Ea6MgZLZiDM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 h1:V71AcdLZr2p8dC9dbOIMCpqi4EmRl8wUwnJzXXLmbmc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd h1:BBOTEWLuuEGQy9n1y9MhVJ9Qt0BDu21X8qZs71/uPZo= +google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd/go.mod h1:fO8wJzT2zbQbAjbIoos1285VfEIYKDDY+Dt+WpTkh6g= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= 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= diff --git a/pkg/promlib/go.mod b/pkg/promlib/go.mod index 5e5138d42e3..d4b27ad285a 100644 --- a/pkg/promlib/go.mod +++ b/pkg/promlib/go.mod @@ -4,15 +4,15 @@ go 1.23.0 require ( github.com/grafana/dskit v0.0.0-20240805174438-dfa83b4ed2d3 - github.com/grafana/grafana-plugin-sdk-go v0.245.0 + github.com/grafana/grafana-plugin-sdk-go v0.246.0 github.com/json-iterator/go v1.1.12 github.com/patrickmn/go-cache v2.1.0+incompatible github.com/prometheus/client_golang v1.20.0 github.com/prometheus/common v0.55.0 github.com/prometheus/prometheus v1.8.2-0.20221021121301-51a44e6657c3 github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/otel v1.28.0 - go.opentelemetry.io/otel/trace v1.28.0 + go.opentelemetry.io/otel v1.29.0 + go.opentelemetry.io/otel/trace v1.29.0 golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f k8s.io/apimachinery v0.31.0 ) @@ -44,7 +44,7 @@ require ( 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.20.4 // 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.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect @@ -103,12 +103,12 @@ require ( github.com/zeebo/xxh3 v1.0.2 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.53.0 // indirect - go.opentelemetry.io/contrib/propagators/jaeger v1.28.0 // indirect - go.opentelemetry.io/contrib/samplers/jaegerremote v0.22.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect + go.opentelemetry.io/contrib/propagators/jaeger v1.29.0 // indirect + go.opentelemetry.io/contrib/samplers/jaegerremote v0.23.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 // indirect - go.opentelemetry.io/otel/metric v1.28.0 // indirect - go.opentelemetry.io/otel/sdk v1.28.0 // indirect + go.opentelemetry.io/otel/metric v1.29.0 // indirect + go.opentelemetry.io/otel/sdk v1.29.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/goleak v1.3.0 // indirect @@ -120,8 +120,8 @@ require ( golang.org/x/tools v0.22.0 // indirect golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 // indirect gonum.org/v1/gonum v0.14.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect google.golang.org/grpc v1.65.0 // indirect google.golang.org/protobuf v1.34.2 // indirect gopkg.in/fsnotify/fsnotify.v1 v1.4.7 // indirect diff --git a/pkg/promlib/go.sum b/pkg/promlib/go.sum index 64276dab7e0..45d28a05258 100644 --- a/pkg/promlib/go.sum +++ b/pkg/promlib/go.sum @@ -65,8 +65,8 @@ 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.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= -github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= +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= @@ -98,8 +98,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-20240805174438-dfa83b4ed2d3 h1:as4PmrFoYI1byS5JjsgPC7uSGTMh+SgS0ePv6hOyDGU= github.com/grafana/dskit v0.0.0-20240805174438-dfa83b4ed2d3/go.mod h1:lcjGB6SuaZ2o44A9nD6p/tR4QXSPbzViRY520Gy6pTQ= -github.com/grafana/grafana-plugin-sdk-go v0.245.0 h1:2KCKA86//O20ffL6WKzHGx5scBbdV7GyEFGnH8Hdv7M= -github.com/grafana/grafana-plugin-sdk-go v0.245.0/go.mod h1:1X8Kgo/SK91Qo1WBCKjPSKrfgjpQys1OkQsHhA78TLg= +github.com/grafana/grafana-plugin-sdk-go v0.246.0 h1:id7MPpONfZhSlhE5K4LU1rBqaVcpe2EDqqPdyb7UTfw= +github.com/grafana/grafana-plugin-sdk-go v0.246.0/go.mod h1:bK7/yelc8cANvNzXPbXk64I4qkqeyQfnyIx4U9y/ItY= 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= @@ -269,26 +269,26 @@ go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0. go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.53.0/go.mod h1:ImRBLMJv177/pwiLZ7tU7HDGNdBv7rS0HQ99eN/zBl8= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg= -go.opentelemetry.io/contrib/propagators/jaeger v1.28.0 h1:xQ3ktSVS128JWIaN1DiPGIjcH+GsvkibIAVRWFjS9eM= -go.opentelemetry.io/contrib/propagators/jaeger v1.28.0/go.mod h1:O9HIyI2kVBrFoEwQZ0IN6PHXykGoit4mZV2aEjkTRH4= -go.opentelemetry.io/contrib/samplers/jaegerremote v0.22.0 h1:OYxqumWcd1yaV/qvCt1B7Sru9OeUNGjeXq/oldx3AGk= -go.opentelemetry.io/contrib/samplers/jaegerremote v0.22.0/go.mod h1:2tZTRqCbvx7nG57wUwd5NQpNVujOWnR84iPLllIH0Ok= +go.opentelemetry.io/contrib/propagators/jaeger v1.29.0 h1:+YPiqF5rR6PqHBlmEFLPumbSP0gY0WmCGFayXRcCLvs= +go.opentelemetry.io/contrib/propagators/jaeger v1.29.0/go.mod h1:6PD7q7qquWSp3Z4HeM3e/2ipRubaY1rXZO8NIHVDZjs= +go.opentelemetry.io/contrib/samplers/jaegerremote v0.23.0 h1:qKi9ntCcronqWqfuKxqrxZlZd82jXJEgGiAWH1+phxo= +go.opentelemetry.io/contrib/samplers/jaegerremote v0.23.0/go.mod h1:1kbAgQa5lgYC3rC6cE3jSxQ/Q13l33wv/WI8U+htwag= go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= -go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= -go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= +go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw= +go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 h1:dIIDULZJpgdiHz5tXrTgKIMLkus6jEFa7x5SOKcyR7E= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0/go.mod h1:jlRVBe7+Z1wyxFSUs48L6OBQZ5JwH2Hg/Vbl+t9rAgI= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 h1:R3X6ZXmNPRR8ul6i3WgFURCHzaXjHdm0karRG/+dj3s= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0/go.mod h1:QWFXnDavXWwMx2EEcZsf3yxgEKAqsxQ+Syjp+seyInw= go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= -go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= -go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= +go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc= +go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8= go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= -go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE= -go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= +go.opentelemetry.io/otel/sdk v1.29.0 h1:vkqKjk7gwhS8VaWb0POZKmIEDimRCMsopNYnriHyryo= +go.opentelemetry.io/otel/sdk v1.29.0/go.mod h1:pM8Dx5WKnvxLCb+8lG1PRNIDxu9g9b9g59Qr7hfAAok= go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= -go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= -go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= +go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4= +go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ= go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= @@ -352,10 +352,10 @@ golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 h1:LLhsEBxRTBLuKlQxFBYUO golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gonum.org/v1/gonum v0.14.0 h1:2NiG67LD1tEH0D7kM+ps2V+fXmsAnpUeec7n8tcr4S0= gonum.org/v1/gonum v0.14.0/go.mod h1:AoWeoz0becf9QMWtE8iWXNXc27fK4fNeHNf/oMejGfU= -google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988 h1:+/tmTy5zAieooKIXfzDm9KiA3Bv6JBwriRN9LY+yayk= -google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988/go.mod h1:4+X6GvPs+25wZKbQq9qyAXrwIRExv7w0Ea6MgZLZiDM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 h1:V71AcdLZr2p8dC9dbOIMCpqi4EmRl8wUwnJzXXLmbmc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd h1:BBOTEWLuuEGQy9n1y9MhVJ9Qt0BDu21X8qZs71/uPZo= +google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd/go.mod h1:fO8wJzT2zbQbAjbIoos1285VfEIYKDDY+Dt+WpTkh6g= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= diff --git a/pkg/promlib/models/query.go b/pkg/promlib/models/query.go index 02031d4cb16..8acd496a264 100644 --- a/pkg/promlib/models/query.go +++ b/pkg/promlib/models/query.go @@ -238,9 +238,11 @@ func Parse(span trace.Span, query backend.DataQuery, dsScrapeInterval string, in }())) } - expr, err = ApplyFiltersAndGroupBy(expr, scopeFilters, model.AdhocFilters, model.GroupByKeys) - if err != nil { - return nil, err + if len(scopeFilters) > 0 || len(model.AdhocFilters) > 0 || len(model.GroupByKeys) > 0 { + expr, err = ApplyFiltersAndGroupBy(expr, scopeFilters, model.AdhocFilters, model.GroupByKeys) + if err != nil { + return nil, err + } } } diff --git a/pkg/registry/apis/apis.go b/pkg/registry/apis/apis.go index 9a50a7a844c..1702c9c338e 100644 --- a/pkg/registry/apis/apis.go +++ b/pkg/registry/apis/apis.go @@ -10,7 +10,7 @@ import ( "github.com/grafana/grafana/pkg/registry/apis/datasource" "github.com/grafana/grafana/pkg/registry/apis/featuretoggle" "github.com/grafana/grafana/pkg/registry/apis/folders" - "github.com/grafana/grafana/pkg/registry/apis/identity" + "github.com/grafana/grafana/pkg/registry/apis/iam" "github.com/grafana/grafana/pkg/registry/apis/peakq" "github.com/grafana/grafana/pkg/registry/apis/playlist" "github.com/grafana/grafana/pkg/registry/apis/query" @@ -33,7 +33,7 @@ func ProvideRegistryServiceSink( _ *datasource.DataSourceAPIBuilder, _ *folders.FolderAPIBuilder, _ *peakq.PeakQAPIBuilder, - _ *identity.IdentityAPIBuilder, + _ *iam.IdentityAccessManagementAPIBuilder, _ *scope.ScopeAPIBuilder, _ *query.QueryAPIBuilder, _ *notifications.NotificationsAPIBuilder, diff --git a/pkg/registry/apis/dashboard/legacy_storage.go b/pkg/registry/apis/dashboard/legacy_storage.go index 411fb53df66..6d3c29eb876 100644 --- a/pkg/registry/apis/dashboard/legacy_storage.go +++ b/pkg/registry/apis/dashboard/legacy_storage.go @@ -1,21 +1,20 @@ package dashboard import ( - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apiserver/pkg/registry/generic" - genericregistry "k8s.io/apiserver/pkg/registry/generic/registry" - "k8s.io/apiserver/pkg/registry/rest" - - common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1" + "github.com/grafana/grafana/pkg/apimachinery/utils" grafanaregistry "github.com/grafana/grafana/pkg/apiserver/registry/generic" grafanarest "github.com/grafana/grafana/pkg/apiserver/rest" "github.com/grafana/grafana/pkg/registry/apis/dashboard/legacy" "github.com/grafana/grafana/pkg/storage/unified/apistore" "github.com/grafana/grafana/pkg/storage/unified/resource" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apiserver/pkg/registry/generic" + genericregistry "k8s.io/apiserver/pkg/registry/generic/registry" + "k8s.io/apiserver/pkg/registry/rest" ) type dashboardStorage struct { - resource common.ResourceInfo + resource utils.ResourceInfo access legacy.DashboardAccess tableConverter rest.TableConvertor @@ -42,7 +41,7 @@ func (s *dashboardStorage) newStore(scheme *runtime.Scheme, defaultOptsGetter ge if err != nil { return nil, err } - client := resource.NewLocalResourceStoreClient(server) + client := resource.NewLocalResourceClient(server) optsGetter := apistore.NewRESTOptionsGetterForClient(client, defaultOpts.StorageConfig.Config, ) diff --git a/pkg/registry/apis/datasource/connections.go b/pkg/registry/apis/datasource/connections.go index cd880596328..ec79393095d 100644 --- a/pkg/registry/apis/datasource/connections.go +++ b/pkg/registry/apis/datasource/connections.go @@ -3,12 +3,11 @@ package datasource import ( "context" + "github.com/grafana/grafana/pkg/apimachinery/utils" "k8s.io/apimachinery/pkg/apis/meta/internalversion" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apiserver/pkg/registry/rest" - - common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1" ) var ( @@ -20,7 +19,7 @@ var ( ) type connectionAccess struct { - resourceInfo common.ResourceInfo + resourceInfo utils.ResourceInfo tableConverter rest.TableConvertor datasources PluginDatasourceProvider } diff --git a/pkg/registry/apis/datasource/querier.go b/pkg/registry/apis/datasource/querier.go index 0a5806a4616..c18e3ec1b57 100644 --- a/pkg/registry/apis/datasource/querier.go +++ b/pkg/registry/apis/datasource/querier.go @@ -4,20 +4,19 @@ import ( "context" "github.com/grafana/grafana-plugin-sdk-go/backend" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1" "github.com/grafana/grafana/pkg/apimachinery/identity" + "github.com/grafana/grafana/pkg/apimachinery/utils" "github.com/grafana/grafana/pkg/apis/datasource/v0alpha1" "github.com/grafana/grafana/pkg/plugins" "github.com/grafana/grafana/pkg/services/apiserver/endpoints/request" "github.com/grafana/grafana/pkg/services/datasources" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) -type QuerierFactoryFunc func(ctx context.Context, ri common.ResourceInfo, pj plugins.JSONData) (Querier, error) +type QuerierFactoryFunc func(ctx context.Context, ri utils.ResourceInfo, pj plugins.JSONData) (Querier, error) type QuerierProvider interface { - Querier(ctx context.Context, ri common.ResourceInfo, pj plugins.JSONData) (Querier, error) + Querier(ctx context.Context, ri utils.ResourceInfo, pj plugins.JSONData) (Querier, error) } type DefaultQuerierProvider struct { @@ -26,7 +25,7 @@ type DefaultQuerierProvider struct { func ProvideDefaultQuerierProvider(pluginClient plugins.Client, dsService datasources.DataSourceService, dsCache datasources.CacheService) *DefaultQuerierProvider { - return NewQuerierProvider(func(ctx context.Context, ri common.ResourceInfo, pj plugins.JSONData) (Querier, error) { + return NewQuerierProvider(func(ctx context.Context, ri utils.ResourceInfo, pj plugins.JSONData) (Querier, error) { return NewDefaultQuerier(ri, pj, pluginClient, dsService, dsCache), nil }) } @@ -37,7 +36,7 @@ func NewQuerierProvider(factory QuerierFactoryFunc) *DefaultQuerierProvider { } } -func (p *DefaultQuerierProvider) Querier(ctx context.Context, ri common.ResourceInfo, pj plugins.JSONData) (Querier, error) { +func (p *DefaultQuerierProvider) Querier(ctx context.Context, ri utils.ResourceInfo, pj plugins.JSONData) (Querier, error) { return p.factory(ctx, ri, pj) } @@ -56,7 +55,7 @@ type Querier interface { } type DefaultQuerier struct { - connectionResourceInfo common.ResourceInfo + connectionResourceInfo utils.ResourceInfo pluginJSON plugins.JSONData pluginClient plugins.Client dsService datasources.DataSourceService @@ -64,7 +63,7 @@ type DefaultQuerier struct { } func NewDefaultQuerier( - connectionResourceInfo common.ResourceInfo, + connectionResourceInfo utils.ResourceInfo, pluginJSON plugins.JSONData, pluginClient plugins.Client, dsService datasources.DataSourceService, diff --git a/pkg/registry/apis/datasource/register.go b/pkg/registry/apis/datasource/register.go index 8507d0cbe52..9ed9a72b839 100644 --- a/pkg/registry/apis/datasource/register.go +++ b/pkg/registry/apis/datasource/register.go @@ -6,7 +6,19 @@ import ( "fmt" "github.com/grafana/grafana-plugin-sdk-go/backend" + "github.com/grafana/grafana/pkg/apimachinery/utils" + datasource "github.com/grafana/grafana/pkg/apis/datasource/v0alpha1" + query "github.com/grafana/grafana/pkg/apis/query/v0alpha1" + grafanarest "github.com/grafana/grafana/pkg/apiserver/rest" "github.com/grafana/grafana/pkg/infra/log" + "github.com/grafana/grafana/pkg/plugins" + "github.com/grafana/grafana/pkg/promlib/models" + "github.com/grafana/grafana/pkg/registry/apis/query/queryschema" + "github.com/grafana/grafana/pkg/services/accesscontrol" + "github.com/grafana/grafana/pkg/services/apiserver/builder" + "github.com/grafana/grafana/pkg/services/featuremgmt" + "github.com/grafana/grafana/pkg/services/pluginsintegration/pluginstore" + "github.com/grafana/grafana/pkg/tsdb/grafana-testdata-datasource/kinds" "github.com/prometheus/client_golang/prometheus" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" @@ -19,26 +31,13 @@ import ( openapi "k8s.io/kube-openapi/pkg/common" "k8s.io/kube-openapi/pkg/spec3" "k8s.io/utils/strings/slices" - - common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1" - datasource "github.com/grafana/grafana/pkg/apis/datasource/v0alpha1" - query "github.com/grafana/grafana/pkg/apis/query/v0alpha1" - grafanarest "github.com/grafana/grafana/pkg/apiserver/rest" - "github.com/grafana/grafana/pkg/plugins" - "github.com/grafana/grafana/pkg/promlib/models" - "github.com/grafana/grafana/pkg/registry/apis/query/queryschema" - "github.com/grafana/grafana/pkg/services/accesscontrol" - "github.com/grafana/grafana/pkg/services/apiserver/builder" - "github.com/grafana/grafana/pkg/services/featuremgmt" - "github.com/grafana/grafana/pkg/services/pluginsintegration/pluginstore" - "github.com/grafana/grafana/pkg/tsdb/grafana-testdata-datasource/kinds" ) var _ builder.APIGroupBuilder = (*DataSourceAPIBuilder)(nil) // DataSourceAPIBuilder is used just so wire has something unique to return type DataSourceAPIBuilder struct { - connectionResourceInfo common.ResourceInfo + connectionResourceInfo utils.ResourceInfo pluginJSON plugins.JSONData client PluginClient // will only ever be called with the same pluginid! @@ -192,10 +191,10 @@ func (b *DataSourceAPIBuilder) InstallSchema(scheme *runtime.Scheme) error { return scheme.SetVersionPriority(gv) } -func resourceFromPluginID(pluginID string) (common.ResourceInfo, error) { +func resourceFromPluginID(pluginID string) (utils.ResourceInfo, error) { group, err := plugins.GetDatasourceGroupNameFromPluginID(pluginID) if err != nil { - return common.ResourceInfo{}, err + return utils.ResourceInfo{}, err } return datasource.GenericConnectionResourceInfo.WithGroupAndShortName(group, pluginID+"-connection"), nil } diff --git a/pkg/registry/apis/datasource/sub_query.go b/pkg/registry/apis/datasource/sub_query.go index 12747da51c4..6ab00ac5c78 100644 --- a/pkg/registry/apis/datasource/sub_query.go +++ b/pkg/registry/apis/datasource/sub_query.go @@ -4,14 +4,14 @@ import ( "context" "fmt" "net/http" - "strings" "github.com/grafana/grafana-plugin-sdk-go/backend" data "github.com/grafana/grafana-plugin-sdk-go/experimental/apis/data/v0alpha1" + query "github.com/grafana/grafana/pkg/apis/query/v0alpha1" + query_headers "github.com/grafana/grafana/pkg/registry/apis/query" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apiserver/pkg/registry/rest" - query "github.com/grafana/grafana/pkg/apis/query/v0alpha1" "github.com/grafana/grafana/pkg/web" ) @@ -74,29 +74,10 @@ func (r *subQueryREST) Connect(ctx context.Context, name string, opts runtime.Ob ctx = backend.WithGrafanaConfig(ctx, pluginCtx.GrafanaConfig) ctx = contextualMiddlewares(ctx) - // only forward expected headers, log unexpected ones - headers := make(map[string]string) - // headers are case insensitive, however some datasources still check for camel casing so we have to send them camel cased - expectedHeaders := map[string]string{ - "fromalert": "FromAlert", - "content-type": "Content-Type", - "content-length": "Content-Length", - "user-agent": "User-Agent", - "accept": "Accept", - } - for k, v := range req.Header { - headerToSend, ok := expectedHeaders[strings.ToLower(k)] - if ok { - headers[headerToSend] = v[0] - } else { - r.builder.log.Warn("datasource received an unexpected header, ignoring it", "header", k) - } - } - rsp, err := r.builder.client.QueryData(ctx, &backend.QueryDataRequest{ Queries: queries, PluginContext: pluginCtx, - Headers: headers, + Headers: query_headers.ExtractKnownHeaders(req.Header), }) if err != nil { responder.Error(err) diff --git a/pkg/registry/apis/datasource/sub_query_test.go b/pkg/registry/apis/datasource/sub_query_test.go index 22a683e1828..dc08c74afe4 100644 --- a/pkg/registry/apis/datasource/sub_query_test.go +++ b/pkg/registry/apis/datasource/sub_query_test.go @@ -10,6 +10,7 @@ import ( "github.com/grafana/grafana-plugin-sdk-go/backend" "github.com/grafana/grafana/pkg/apis/datasource/v0alpha1" "github.com/grafana/grafana/pkg/infra/log" + "github.com/grafana/grafana/pkg/services/ngalert/models" "github.com/stretchr/testify/require" "k8s.io/apimachinery/pkg/runtime" ) @@ -32,14 +33,24 @@ func TestSubQueryConnect(t *testing.T) { rr := httptest.NewRecorder() req := httptest.NewRequest(http.MethodGet, "/some-path", nil) - req.Header.Set("fromAlert", "true") + req.Header.Set(models.FromAlertHeaderName, "true") + req.Header.Set(models.CacheSkipHeaderName, "true") + req.Header.Set("X-Rule-Uid", "abc") + req.Header.Set("X-Rule-Folder", "folder-1") + req.Header.Set("X-Rule-Source", "grafana-ruler") + req.Header.Set("X-Grafana-Org-Id", "1") req.Header.Set("Content-Type", "application/json") + req.Header.Set("some-unexpected-header", "some-value") handler.ServeHTTP(rr, req) // test that headers are forwarded and cased appropriately require.Equal(t, map[string]string{ - "FromAlert": "true", - "Content-Type": "application/json", + models.FromAlertHeaderName: "true", + models.CacheSkipHeaderName: "true", + "X-Rule-Uid": "abc", + "X-Rule-Folder": "folder-1", + "X-Rule-Source": "grafana-ruler", + "X-Grafana-Org-Id": "1", }, *sqr.builder.client.(mockClient).lastCalledWithHeaders) } diff --git a/pkg/registry/apis/featuretoggle/features.go b/pkg/registry/apis/featuretoggle/features.go index e50cf2658e0..fa7cf10a7fb 100644 --- a/pkg/registry/apis/featuretoggle/features.go +++ b/pkg/registry/apis/featuretoggle/features.go @@ -5,14 +5,13 @@ import ( "fmt" "sync" + "github.com/grafana/grafana/pkg/apimachinery/utils" + "github.com/grafana/grafana/pkg/apis/featuretoggle/v0alpha1" + "github.com/grafana/grafana/pkg/services/featuremgmt" "k8s.io/apimachinery/pkg/apis/meta/internalversion" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apiserver/pkg/registry/rest" - - common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1" - "github.com/grafana/grafana/pkg/apis/featuretoggle/v0alpha1" - "github.com/grafana/grafana/pkg/services/featuremgmt" ) var ( @@ -24,7 +23,7 @@ var ( ) type featuresStorage struct { - resource *common.ResourceInfo + resource *utils.ResourceInfo tableConverter rest.TableConvertor features *v0alpha1.FeatureList featuresOnce sync.Once diff --git a/pkg/registry/apis/featuretoggle/toggles.go b/pkg/registry/apis/featuretoggle/toggles.go index 9c920c5a0ba..5d84bcc7843 100644 --- a/pkg/registry/apis/featuretoggle/toggles.go +++ b/pkg/registry/apis/featuretoggle/toggles.go @@ -4,15 +4,14 @@ import ( "context" "fmt" + "github.com/grafana/grafana/pkg/apimachinery/utils" + "github.com/grafana/grafana/pkg/apis/featuretoggle/v0alpha1" + "github.com/grafana/grafana/pkg/services/apiserver/endpoints/request" + "github.com/grafana/grafana/pkg/services/featuremgmt" "k8s.io/apimachinery/pkg/apis/meta/internalversion" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apiserver/pkg/registry/rest" - - common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1" - "github.com/grafana/grafana/pkg/apis/featuretoggle/v0alpha1" - "github.com/grafana/grafana/pkg/services/apiserver/endpoints/request" - "github.com/grafana/grafana/pkg/services/featuremgmt" ) var ( @@ -24,7 +23,7 @@ var ( ) type togglesStorage struct { - resource *common.ResourceInfo + resource *utils.ResourceInfo tableConverter rest.TableConvertor // The startup toggles diff --git a/pkg/registry/apis/identity/common/common.go b/pkg/registry/apis/iam/common/common.go similarity index 61% rename from pkg/registry/apis/identity/common/common.go rename to pkg/registry/apis/iam/common/common.go index c696350570a..1e3533f3b73 100644 --- a/pkg/registry/apis/identity/common/common.go +++ b/pkg/registry/apis/iam/common/common.go @@ -3,7 +3,7 @@ package common import ( "strconv" - identityv0 "github.com/grafana/grafana/pkg/apis/identity/v0alpha1" + iamv0 "github.com/grafana/grafana/pkg/apis/iam/v0alpha1" "github.com/grafana/grafana/pkg/services/team" ) @@ -16,10 +16,10 @@ func OptionalFormatInt(num int64) string { return "" } -func MapTeamPermission(p team.PermissionType) identityv0.TeamPermission { +func MapTeamPermission(p team.PermissionType) iamv0.TeamPermission { if p == team.PermissionTypeAdmin { - return identityv0.TeamPermissionAdmin + return iamv0.TeamPermissionAdmin } else { - return identityv0.TeamPermissionMember + return iamv0.TeamPermissionMember } } diff --git a/pkg/registry/apis/identity/common/pagination.go b/pkg/registry/apis/iam/common/pagination.go similarity index 100% rename from pkg/registry/apis/identity/common/pagination.go rename to pkg/registry/apis/iam/common/pagination.go diff --git a/pkg/registry/apis/identity/legacy/display.go b/pkg/registry/apis/iam/legacy/display.go similarity index 100% rename from pkg/registry/apis/identity/legacy/display.go rename to pkg/registry/apis/iam/legacy/display.go diff --git a/pkg/registry/apis/identity/legacy/display_query.sql b/pkg/registry/apis/iam/legacy/display_query.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/display_query.sql rename to pkg/registry/apis/iam/legacy/display_query.sql diff --git a/pkg/registry/apis/iam/legacy/service_account.go b/pkg/registry/apis/iam/legacy/service_account.go new file mode 100644 index 00000000000..03610e2a3f2 --- /dev/null +++ b/pkg/registry/apis/iam/legacy/service_account.go @@ -0,0 +1,205 @@ +package legacy + +import ( + "context" + "fmt" + "time" + + "github.com/grafana/authlib/claims" + "github.com/grafana/grafana/pkg/registry/apis/iam/common" + "github.com/grafana/grafana/pkg/storage/legacysql" + "github.com/grafana/grafana/pkg/storage/unified/sql/sqltemplate" +) + +type ListServiceAccountsQuery struct { + UID string + OrgID int64 + Pagination common.Pagination +} + +type ListServiceAccountResult struct { + Items []ServiceAccount + Continue int64 + RV int64 +} + +type ServiceAccount struct { + ID int64 + UID string + Name string + Disabled bool + Created time.Time + Updated time.Time +} + +var sqlQueryServiceAccountsTemplate = mustTemplate("service_accounts_query.sql") + +func newListServiceAccounts(sql *legacysql.LegacyDatabaseHelper, q *ListServiceAccountsQuery) listServiceAccountsQuery { + return listServiceAccountsQuery{ + SQLTemplate: sqltemplate.New(sql.DialectForDriver()), + UserTable: sql.Table("user"), + OrgUserTable: sql.Table("org_user"), + Query: q, + } +} + +type listServiceAccountsQuery struct { + sqltemplate.SQLTemplate + Query *ListServiceAccountsQuery + UserTable string + OrgUserTable string +} + +func (r listServiceAccountsQuery) Validate() error { + return nil // TODO +} + +func (s *legacySQLStore) ListServiceAccounts(ctx context.Context, ns claims.NamespaceInfo, query ListServiceAccountsQuery) (*ListServiceAccountResult, error) { + // for continue + query.Pagination.Limit += 1 + query.OrgID = ns.OrgID + if ns.OrgID == 0 { + return nil, fmt.Errorf("expected non zero orgID") + } + + sql, err := s.sql(ctx) + if err != nil { + return nil, err + } + + req := newListServiceAccounts(sql, &query) + q, err := sqltemplate.Execute(sqlQueryServiceAccountsTemplate, req) + if err != nil { + return nil, fmt.Errorf("execute template %q: %w", sqlQueryServiceAccountsTemplate.Name(), err) + } + + rows, err := sql.DB.GetSqlxSession().Query(ctx, q, req.GetArgs()...) + defer func() { + if rows != nil { + _ = rows.Close() + } + }() + + res := &ListServiceAccountResult{} + if err != nil { + return nil, err + } + + var lastID int64 + for rows.Next() { + var s ServiceAccount + err := rows.Scan(&s.ID, &s.UID, &s.Name, &s.Disabled, &s.Created, &s.Updated) + if err != nil { + return res, err + } + + lastID = s.ID + res.Items = append(res.Items, s) + if len(res.Items) > int(query.Pagination.Limit)-1 { + res.Items = res.Items[0 : len(res.Items)-1] + res.Continue = lastID + break + } + } + + if query.UID == "" { + // FIXME: we need to filer for service accounts here.. + res.RV, err = sql.GetResourceVersion(ctx, "user", "updated") + } + + return res, err +} + +type ListServiceAccountTokenQuery struct { + // UID is the service account uid. + UID string + OrgID int64 + Pagination common.Pagination +} + +type ListServiceAccountTokenResult struct { + Items []ServiceAccountToken + Continue int64 + RV int64 +} + +type ServiceAccountToken struct { + ID int64 + Name string + Revoked bool + Expires *int64 + LastUsed *time.Time + Created time.Time + Updated time.Time +} + +var sqlQueryServiceAccountTokensTemplate = mustTemplate("service_account_tokens_query.sql") + +func newListServiceAccountTokens(sql *legacysql.LegacyDatabaseHelper, q *ListServiceAccountTokenQuery) listServiceAccountTokensQuery { + return listServiceAccountTokensQuery{ + SQLTemplate: sqltemplate.New(sql.DialectForDriver()), + UserTable: sql.Table("user"), + OrgUserTable: sql.Table("org_user"), + TokenTable: sql.Table("api_key"), + Query: q, + } +} + +type listServiceAccountTokensQuery struct { + sqltemplate.SQLTemplate + Query *ListServiceAccountTokenQuery + UserTable string + TokenTable string + OrgUserTable string +} + +func (s *legacySQLStore) ListServiceAccountTokens(ctx context.Context, ns claims.NamespaceInfo, query ListServiceAccountTokenQuery) (*ListServiceAccountTokenResult, error) { + // for continue + query.Pagination.Limit += 1 + query.OrgID = ns.OrgID + if ns.OrgID == 0 { + return nil, fmt.Errorf("expected non zero orgID") + } + + sql, err := s.sql(ctx) + if err != nil { + return nil, err + } + + req := newListServiceAccountTokens(sql, &query) + q, err := sqltemplate.Execute(sqlQueryServiceAccountTokensTemplate, req) + if err != nil { + return nil, fmt.Errorf("execute template %q: %w", sqlQueryServiceAccountTokensTemplate.Name(), err) + } + + rows, err := sql.DB.GetSqlxSession().Query(ctx, q, req.GetArgs()...) + defer func() { + if rows != nil { + _ = rows.Close() + } + }() + + res := &ListServiceAccountTokenResult{} + if err != nil { + return nil, err + } + + var lastID int64 + for rows.Next() { + var t ServiceAccountToken + err := rows.Scan(&t.ID, &t.Name, &t.Revoked, &t.LastUsed, &t.Expires, &t.Created, &t.Updated) + if err != nil { + return res, err + } + + lastID = t.ID + res.Items = append(res.Items, t) + if len(res.Items) > int(query.Pagination.Limit)-1 { + res.Items = res.Items[0 : len(res.Items)-1] + res.Continue = lastID + break + } + } + + return res, err +} diff --git a/pkg/registry/apis/iam/legacy/service_account_tokens_query.sql b/pkg/registry/apis/iam/legacy/service_account_tokens_query.sql new file mode 100644 index 00000000000..021d17d9d5e --- /dev/null +++ b/pkg/registry/apis/iam/legacy/service_account_tokens_query.sql @@ -0,0 +1,19 @@ +SELECT + t.id, + t.name, + t.is_revoked, + t.last_used_at, + t.expires, + t.created, + t.updated + FROM {{ .Ident .TokenTable }} as t + INNER JOIN {{ .Ident .UserTable }} as u ON t.service_account_id = u.id + INNER JOIN {{ .Ident .OrgUserTable }} as o ON u.id = o.user_id +WHERE o.org_id = {{ .Arg .Query.OrgID }} + AND u.is_service_account + AND u.uid = {{ .Arg .Query.UID }} +{{ if .Query.Pagination.Continue }} + AND t.id >= {{ .Arg .Query.Pagination.Continue }} +{{ end }} + ORDER BY t.id asc + LIMIT {{ .Arg .Query.Pagination.Limit }} diff --git a/pkg/registry/apis/iam/legacy/service_accounts_query.sql b/pkg/registry/apis/iam/legacy/service_accounts_query.sql new file mode 100644 index 00000000000..ca700c1c064 --- /dev/null +++ b/pkg/registry/apis/iam/legacy/service_accounts_query.sql @@ -0,0 +1,18 @@ +SELECT + u.id, + u.uid, + u.name, + u.is_disabled, + u.created, + u.updated + FROM {{ .Ident .UserTable }} as u JOIN {{ .Ident .OrgUserTable }} as o ON u.id = o.user_id + WHERE o.org_id = {{ .Arg .Query.OrgID }} + AND u.is_service_account +{{ if .Query.UID }} + AND u.uid = {{ .Arg .Query.UID }} +{{ end }} +{{ if .Query.Pagination.Continue }} + AND u.id >= {{ .Arg .Query.Pagination.Continue }} +{{ end }} + ORDER BY u.id asc + LIMIT {{ .Arg .Query.Pagination.Limit }} diff --git a/pkg/registry/apis/identity/legacy/sql.go b/pkg/registry/apis/iam/legacy/sql.go similarity index 84% rename from pkg/registry/apis/identity/legacy/sql.go rename to pkg/registry/apis/iam/legacy/sql.go index 1957f0636c0..554bd114412 100644 --- a/pkg/registry/apis/identity/legacy/sql.go +++ b/pkg/registry/apis/iam/legacy/sql.go @@ -17,6 +17,9 @@ type LegacyIdentityStore interface { ListUsers(ctx context.Context, ns claims.NamespaceInfo, query ListUserQuery) (*ListUserResult, error) ListUserTeams(ctx context.Context, ns claims.NamespaceInfo, query ListUserTeamsQuery) (*ListUserTeamsResult, error) + ListServiceAccounts(ctx context.Context, ns claims.NamespaceInfo, query ListServiceAccountsQuery) (*ListServiceAccountResult, error) + ListServiceAccountTokens(ctx context.Context, ns claims.NamespaceInfo, query ListServiceAccountTokenQuery) (*ListServiceAccountTokenResult, error) + ListTeams(ctx context.Context, ns claims.NamespaceInfo, query ListTeamQuery) (*ListTeamResult, error) ListTeamBindings(ctx context.Context, ns claims.NamespaceInfo, query ListTeamBindingsQuery) (*ListTeamBindingsResult, error) ListTeamMembers(ctx context.Context, ns claims.NamespaceInfo, query ListTeamMembersQuery) (*ListTeamMembersResult, error) diff --git a/pkg/registry/apis/identity/legacy/sql_test.go b/pkg/registry/apis/iam/legacy/sql_test.go similarity index 98% rename from pkg/registry/apis/identity/legacy/sql_test.go rename to pkg/registry/apis/iam/legacy/sql_test.go index dc9812e1c45..612262ccf99 100644 --- a/pkg/registry/apis/identity/legacy/sql_test.go +++ b/pkg/registry/apis/iam/legacy/sql_test.go @@ -4,7 +4,7 @@ import ( "testing" "text/template" - "github.com/grafana/grafana/pkg/registry/apis/identity/common" + "github.com/grafana/grafana/pkg/registry/apis/iam/common" "github.com/grafana/grafana/pkg/storage/legacysql" "github.com/grafana/grafana/pkg/storage/unified/sql/sqltemplate" "github.com/grafana/grafana/pkg/storage/unified/sql/sqltemplate/mocks" diff --git a/pkg/registry/apis/identity/legacy/team.go b/pkg/registry/apis/iam/legacy/team.go similarity index 99% rename from pkg/registry/apis/identity/legacy/team.go rename to pkg/registry/apis/iam/legacy/team.go index 27f12dd6c6a..b5e1e5d0e12 100644 --- a/pkg/registry/apis/identity/legacy/team.go +++ b/pkg/registry/apis/iam/legacy/team.go @@ -8,7 +8,7 @@ import ( "github.com/grafana/authlib/claims" "github.com/grafana/grafana/pkg/apimachinery/identity" - "github.com/grafana/grafana/pkg/registry/apis/identity/common" + "github.com/grafana/grafana/pkg/registry/apis/iam/common" "github.com/grafana/grafana/pkg/services/team" "github.com/grafana/grafana/pkg/storage/legacysql" "github.com/grafana/grafana/pkg/storage/unified/sql/sqltemplate" diff --git a/pkg/registry/apis/identity/legacy/team_bindings_query.sql b/pkg/registry/apis/iam/legacy/team_bindings_query.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/team_bindings_query.sql rename to pkg/registry/apis/iam/legacy/team_bindings_query.sql diff --git a/pkg/registry/apis/identity/legacy/team_members_query.sql b/pkg/registry/apis/iam/legacy/team_members_query.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/team_members_query.sql rename to pkg/registry/apis/iam/legacy/team_members_query.sql diff --git a/pkg/registry/apis/identity/legacy/teams_query.sql b/pkg/registry/apis/iam/legacy/teams_query.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/teams_query.sql rename to pkg/registry/apis/iam/legacy/teams_query.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/mysql--display_query-display_ids.sql b/pkg/registry/apis/iam/legacy/testdata/mysql--display_query-display_ids.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/mysql--display_query-display_ids.sql rename to pkg/registry/apis/iam/legacy/testdata/mysql--display_query-display_ids.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/mysql--display_query-display_ids_uids.sql b/pkg/registry/apis/iam/legacy/testdata/mysql--display_query-display_ids_uids.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/mysql--display_query-display_ids_uids.sql rename to pkg/registry/apis/iam/legacy/testdata/mysql--display_query-display_ids_uids.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/mysql--display_query-display_uids.sql b/pkg/registry/apis/iam/legacy/testdata/mysql--display_query-display_uids.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/mysql--display_query-display_uids.sql rename to pkg/registry/apis/iam/legacy/testdata/mysql--display_query-display_uids.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/mysql--team_bindings_query-team_1_bindings.sql b/pkg/registry/apis/iam/legacy/testdata/mysql--team_bindings_query-team_1_bindings.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/mysql--team_bindings_query-team_1_bindings.sql rename to pkg/registry/apis/iam/legacy/testdata/mysql--team_bindings_query-team_1_bindings.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/mysql--team_bindings_query-team_bindings_page_1.sql b/pkg/registry/apis/iam/legacy/testdata/mysql--team_bindings_query-team_bindings_page_1.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/mysql--team_bindings_query-team_bindings_page_1.sql rename to pkg/registry/apis/iam/legacy/testdata/mysql--team_bindings_query-team_bindings_page_1.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/mysql--team_bindings_query-team_bindings_page_2.sql b/pkg/registry/apis/iam/legacy/testdata/mysql--team_bindings_query-team_bindings_page_2.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/mysql--team_bindings_query-team_bindings_page_2.sql rename to pkg/registry/apis/iam/legacy/testdata/mysql--team_bindings_query-team_bindings_page_2.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/mysql--team_members_query-team_1_members_page_1.sql b/pkg/registry/apis/iam/legacy/testdata/mysql--team_members_query-team_1_members_page_1.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/mysql--team_members_query-team_1_members_page_1.sql rename to pkg/registry/apis/iam/legacy/testdata/mysql--team_members_query-team_1_members_page_1.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/mysql--team_members_query-team_1_members_page_2.sql b/pkg/registry/apis/iam/legacy/testdata/mysql--team_members_query-team_1_members_page_2.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/mysql--team_members_query-team_1_members_page_2.sql rename to pkg/registry/apis/iam/legacy/testdata/mysql--team_members_query-team_1_members_page_2.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/mysql--teams_query-teams_page_1.sql b/pkg/registry/apis/iam/legacy/testdata/mysql--teams_query-teams_page_1.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/mysql--teams_query-teams_page_1.sql rename to pkg/registry/apis/iam/legacy/testdata/mysql--teams_query-teams_page_1.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/mysql--teams_query-teams_page_2.sql b/pkg/registry/apis/iam/legacy/testdata/mysql--teams_query-teams_page_2.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/mysql--teams_query-teams_page_2.sql rename to pkg/registry/apis/iam/legacy/testdata/mysql--teams_query-teams_page_2.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/mysql--teams_query-teams_uid.sql b/pkg/registry/apis/iam/legacy/testdata/mysql--teams_query-teams_uid.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/mysql--teams_query-teams_uid.sql rename to pkg/registry/apis/iam/legacy/testdata/mysql--teams_query-teams_uid.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/mysql--user_teams_query-team_1_members_page_1.sql b/pkg/registry/apis/iam/legacy/testdata/mysql--user_teams_query-team_1_members_page_1.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/mysql--user_teams_query-team_1_members_page_1.sql rename to pkg/registry/apis/iam/legacy/testdata/mysql--user_teams_query-team_1_members_page_1.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/mysql--user_teams_query-team_1_members_page_2.sql b/pkg/registry/apis/iam/legacy/testdata/mysql--user_teams_query-team_1_members_page_2.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/mysql--user_teams_query-team_1_members_page_2.sql rename to pkg/registry/apis/iam/legacy/testdata/mysql--user_teams_query-team_1_members_page_2.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/mysql--users_query-users_page_1.sql b/pkg/registry/apis/iam/legacy/testdata/mysql--users_query-users_page_1.sql similarity index 87% rename from pkg/registry/apis/identity/legacy/testdata/mysql--users_query-users_page_1.sql rename to pkg/registry/apis/iam/legacy/testdata/mysql--users_query-users_page_1.sql index d35831279af..4ac1c74d87f 100755 --- a/pkg/registry/apis/identity/legacy/testdata/mysql--users_query-users_page_1.sql +++ b/pkg/registry/apis/iam/legacy/testdata/mysql--users_query-users_page_1.sql @@ -2,6 +2,6 @@ SELECT o.org_id, u.id, u.uid, u.login, u.email, u.name, u.created, u.updated, u.is_service_account, u.is_disabled, u.is_admin FROM `grafana`.`user` as u JOIN `grafana`.`org_user` as o ON u.id = o.user_id WHERE o.org_id = 0 - AND u.is_service_account = FALSE + AND NOT u.is_service_account ORDER BY u.id asc LIMIT 5 diff --git a/pkg/registry/apis/identity/legacy/testdata/mysql--users_query-users_page_2.sql b/pkg/registry/apis/iam/legacy/testdata/mysql--users_query-users_page_2.sql similarity index 88% rename from pkg/registry/apis/identity/legacy/testdata/mysql--users_query-users_page_2.sql rename to pkg/registry/apis/iam/legacy/testdata/mysql--users_query-users_page_2.sql index c32659b6c3d..5bcc865f1d9 100755 --- a/pkg/registry/apis/identity/legacy/testdata/mysql--users_query-users_page_2.sql +++ b/pkg/registry/apis/iam/legacy/testdata/mysql--users_query-users_page_2.sql @@ -2,7 +2,7 @@ SELECT o.org_id, u.id, u.uid, u.login, u.email, u.name, u.created, u.updated, u.is_service_account, u.is_disabled, u.is_admin FROM `grafana`.`user` as u JOIN `grafana`.`org_user` as o ON u.id = o.user_id WHERE o.org_id = 0 - AND u.is_service_account = FALSE + AND NOT u.is_service_account AND u.id >= 2 ORDER BY u.id asc LIMIT 1 diff --git a/pkg/registry/apis/identity/legacy/testdata/mysql--users_query-users_uid.sql b/pkg/registry/apis/iam/legacy/testdata/mysql--users_query-users_uid.sql similarity index 88% rename from pkg/registry/apis/identity/legacy/testdata/mysql--users_query-users_uid.sql rename to pkg/registry/apis/iam/legacy/testdata/mysql--users_query-users_uid.sql index 5944036d745..2c36c9f9fbb 100755 --- a/pkg/registry/apis/identity/legacy/testdata/mysql--users_query-users_uid.sql +++ b/pkg/registry/apis/iam/legacy/testdata/mysql--users_query-users_uid.sql @@ -2,7 +2,7 @@ SELECT o.org_id, u.id, u.uid, u.login, u.email, u.name, u.created, u.updated, u.is_service_account, u.is_disabled, u.is_admin FROM `grafana`.`user` as u JOIN `grafana`.`org_user` as o ON u.id = o.user_id WHERE o.org_id = 0 - AND u.is_service_account = FALSE + AND NOT u.is_service_account AND u.uid = 'abc' ORDER BY u.id asc LIMIT 1 diff --git a/pkg/registry/apis/identity/legacy/testdata/postgres--display_query-display_ids.sql b/pkg/registry/apis/iam/legacy/testdata/postgres--display_query-display_ids.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/postgres--display_query-display_ids.sql rename to pkg/registry/apis/iam/legacy/testdata/postgres--display_query-display_ids.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/postgres--display_query-display_ids_uids.sql b/pkg/registry/apis/iam/legacy/testdata/postgres--display_query-display_ids_uids.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/postgres--display_query-display_ids_uids.sql rename to pkg/registry/apis/iam/legacy/testdata/postgres--display_query-display_ids_uids.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/postgres--display_query-display_uids.sql b/pkg/registry/apis/iam/legacy/testdata/postgres--display_query-display_uids.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/postgres--display_query-display_uids.sql rename to pkg/registry/apis/iam/legacy/testdata/postgres--display_query-display_uids.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/postgres--team_bindings_query-team_1_bindings.sql b/pkg/registry/apis/iam/legacy/testdata/postgres--team_bindings_query-team_1_bindings.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/postgres--team_bindings_query-team_1_bindings.sql rename to pkg/registry/apis/iam/legacy/testdata/postgres--team_bindings_query-team_1_bindings.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/postgres--team_bindings_query-team_bindings_page_1.sql b/pkg/registry/apis/iam/legacy/testdata/postgres--team_bindings_query-team_bindings_page_1.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/postgres--team_bindings_query-team_bindings_page_1.sql rename to pkg/registry/apis/iam/legacy/testdata/postgres--team_bindings_query-team_bindings_page_1.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/postgres--team_bindings_query-team_bindings_page_2.sql b/pkg/registry/apis/iam/legacy/testdata/postgres--team_bindings_query-team_bindings_page_2.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/postgres--team_bindings_query-team_bindings_page_2.sql rename to pkg/registry/apis/iam/legacy/testdata/postgres--team_bindings_query-team_bindings_page_2.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/postgres--team_members_query-team_1_members_page_1.sql b/pkg/registry/apis/iam/legacy/testdata/postgres--team_members_query-team_1_members_page_1.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/postgres--team_members_query-team_1_members_page_1.sql rename to pkg/registry/apis/iam/legacy/testdata/postgres--team_members_query-team_1_members_page_1.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/postgres--team_members_query-team_1_members_page_2.sql b/pkg/registry/apis/iam/legacy/testdata/postgres--team_members_query-team_1_members_page_2.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/postgres--team_members_query-team_1_members_page_2.sql rename to pkg/registry/apis/iam/legacy/testdata/postgres--team_members_query-team_1_members_page_2.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/postgres--teams_query-teams_page_1.sql b/pkg/registry/apis/iam/legacy/testdata/postgres--teams_query-teams_page_1.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/postgres--teams_query-teams_page_1.sql rename to pkg/registry/apis/iam/legacy/testdata/postgres--teams_query-teams_page_1.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/postgres--teams_query-teams_page_2.sql b/pkg/registry/apis/iam/legacy/testdata/postgres--teams_query-teams_page_2.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/postgres--teams_query-teams_page_2.sql rename to pkg/registry/apis/iam/legacy/testdata/postgres--teams_query-teams_page_2.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/postgres--teams_query-teams_uid.sql b/pkg/registry/apis/iam/legacy/testdata/postgres--teams_query-teams_uid.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/postgres--teams_query-teams_uid.sql rename to pkg/registry/apis/iam/legacy/testdata/postgres--teams_query-teams_uid.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/postgres--user_teams_query-team_1_members_page_1.sql b/pkg/registry/apis/iam/legacy/testdata/postgres--user_teams_query-team_1_members_page_1.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/postgres--user_teams_query-team_1_members_page_1.sql rename to pkg/registry/apis/iam/legacy/testdata/postgres--user_teams_query-team_1_members_page_1.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/postgres--user_teams_query-team_1_members_page_2.sql b/pkg/registry/apis/iam/legacy/testdata/postgres--user_teams_query-team_1_members_page_2.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/postgres--user_teams_query-team_1_members_page_2.sql rename to pkg/registry/apis/iam/legacy/testdata/postgres--user_teams_query-team_1_members_page_2.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/postgres--users_query-users_page_1.sql b/pkg/registry/apis/iam/legacy/testdata/postgres--users_query-users_page_1.sql similarity index 87% rename from pkg/registry/apis/identity/legacy/testdata/postgres--users_query-users_page_1.sql rename to pkg/registry/apis/iam/legacy/testdata/postgres--users_query-users_page_1.sql index 5d4f1b771fc..7de4914aa8d 100755 --- a/pkg/registry/apis/identity/legacy/testdata/postgres--users_query-users_page_1.sql +++ b/pkg/registry/apis/iam/legacy/testdata/postgres--users_query-users_page_1.sql @@ -2,6 +2,6 @@ SELECT o.org_id, u.id, u.uid, u.login, u.email, u.name, u.created, u.updated, u.is_service_account, u.is_disabled, u.is_admin FROM "grafana"."user" as u JOIN "grafana"."org_user" as o ON u.id = o.user_id WHERE o.org_id = 0 - AND u.is_service_account = FALSE + AND NOT u.is_service_account ORDER BY u.id asc LIMIT 5 diff --git a/pkg/registry/apis/identity/legacy/testdata/postgres--users_query-users_page_2.sql b/pkg/registry/apis/iam/legacy/testdata/postgres--users_query-users_page_2.sql similarity index 88% rename from pkg/registry/apis/identity/legacy/testdata/postgres--users_query-users_page_2.sql rename to pkg/registry/apis/iam/legacy/testdata/postgres--users_query-users_page_2.sql index ed97b2c25d2..e938a14392b 100755 --- a/pkg/registry/apis/identity/legacy/testdata/postgres--users_query-users_page_2.sql +++ b/pkg/registry/apis/iam/legacy/testdata/postgres--users_query-users_page_2.sql @@ -2,7 +2,7 @@ SELECT o.org_id, u.id, u.uid, u.login, u.email, u.name, u.created, u.updated, u.is_service_account, u.is_disabled, u.is_admin FROM "grafana"."user" as u JOIN "grafana"."org_user" as o ON u.id = o.user_id WHERE o.org_id = 0 - AND u.is_service_account = FALSE + AND NOT u.is_service_account AND u.id >= 2 ORDER BY u.id asc LIMIT 1 diff --git a/pkg/registry/apis/identity/legacy/testdata/postgres--users_query-users_uid.sql b/pkg/registry/apis/iam/legacy/testdata/postgres--users_query-users_uid.sql similarity index 88% rename from pkg/registry/apis/identity/legacy/testdata/postgres--users_query-users_uid.sql rename to pkg/registry/apis/iam/legacy/testdata/postgres--users_query-users_uid.sql index bab837475af..5c8f1f2ec66 100755 --- a/pkg/registry/apis/identity/legacy/testdata/postgres--users_query-users_uid.sql +++ b/pkg/registry/apis/iam/legacy/testdata/postgres--users_query-users_uid.sql @@ -2,7 +2,7 @@ SELECT o.org_id, u.id, u.uid, u.login, u.email, u.name, u.created, u.updated, u.is_service_account, u.is_disabled, u.is_admin FROM "grafana"."user" as u JOIN "grafana"."org_user" as o ON u.id = o.user_id WHERE o.org_id = 0 - AND u.is_service_account = FALSE + AND NOT u.is_service_account AND u.uid = 'abc' ORDER BY u.id asc LIMIT 1 diff --git a/pkg/registry/apis/identity/legacy/testdata/sqlite--display_query-display_ids.sql b/pkg/registry/apis/iam/legacy/testdata/sqlite--display_query-display_ids.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/sqlite--display_query-display_ids.sql rename to pkg/registry/apis/iam/legacy/testdata/sqlite--display_query-display_ids.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/sqlite--display_query-display_ids_uids.sql b/pkg/registry/apis/iam/legacy/testdata/sqlite--display_query-display_ids_uids.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/sqlite--display_query-display_ids_uids.sql rename to pkg/registry/apis/iam/legacy/testdata/sqlite--display_query-display_ids_uids.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/sqlite--display_query-display_uids.sql b/pkg/registry/apis/iam/legacy/testdata/sqlite--display_query-display_uids.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/sqlite--display_query-display_uids.sql rename to pkg/registry/apis/iam/legacy/testdata/sqlite--display_query-display_uids.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/sqlite--team_bindings_query-team_1_bindings.sql b/pkg/registry/apis/iam/legacy/testdata/sqlite--team_bindings_query-team_1_bindings.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/sqlite--team_bindings_query-team_1_bindings.sql rename to pkg/registry/apis/iam/legacy/testdata/sqlite--team_bindings_query-team_1_bindings.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/sqlite--team_bindings_query-team_bindings_page_1.sql b/pkg/registry/apis/iam/legacy/testdata/sqlite--team_bindings_query-team_bindings_page_1.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/sqlite--team_bindings_query-team_bindings_page_1.sql rename to pkg/registry/apis/iam/legacy/testdata/sqlite--team_bindings_query-team_bindings_page_1.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/sqlite--team_bindings_query-team_bindings_page_2.sql b/pkg/registry/apis/iam/legacy/testdata/sqlite--team_bindings_query-team_bindings_page_2.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/sqlite--team_bindings_query-team_bindings_page_2.sql rename to pkg/registry/apis/iam/legacy/testdata/sqlite--team_bindings_query-team_bindings_page_2.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/sqlite--team_members_query-team_1_members_page_1.sql b/pkg/registry/apis/iam/legacy/testdata/sqlite--team_members_query-team_1_members_page_1.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/sqlite--team_members_query-team_1_members_page_1.sql rename to pkg/registry/apis/iam/legacy/testdata/sqlite--team_members_query-team_1_members_page_1.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/sqlite--team_members_query-team_1_members_page_2.sql b/pkg/registry/apis/iam/legacy/testdata/sqlite--team_members_query-team_1_members_page_2.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/sqlite--team_members_query-team_1_members_page_2.sql rename to pkg/registry/apis/iam/legacy/testdata/sqlite--team_members_query-team_1_members_page_2.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/sqlite--teams_query-teams_page_1.sql b/pkg/registry/apis/iam/legacy/testdata/sqlite--teams_query-teams_page_1.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/sqlite--teams_query-teams_page_1.sql rename to pkg/registry/apis/iam/legacy/testdata/sqlite--teams_query-teams_page_1.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/sqlite--teams_query-teams_page_2.sql b/pkg/registry/apis/iam/legacy/testdata/sqlite--teams_query-teams_page_2.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/sqlite--teams_query-teams_page_2.sql rename to pkg/registry/apis/iam/legacy/testdata/sqlite--teams_query-teams_page_2.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/sqlite--teams_query-teams_uid.sql b/pkg/registry/apis/iam/legacy/testdata/sqlite--teams_query-teams_uid.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/sqlite--teams_query-teams_uid.sql rename to pkg/registry/apis/iam/legacy/testdata/sqlite--teams_query-teams_uid.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/sqlite--user_teams_query-team_1_members_page_1.sql b/pkg/registry/apis/iam/legacy/testdata/sqlite--user_teams_query-team_1_members_page_1.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/sqlite--user_teams_query-team_1_members_page_1.sql rename to pkg/registry/apis/iam/legacy/testdata/sqlite--user_teams_query-team_1_members_page_1.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/sqlite--user_teams_query-team_1_members_page_2.sql b/pkg/registry/apis/iam/legacy/testdata/sqlite--user_teams_query-team_1_members_page_2.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/testdata/sqlite--user_teams_query-team_1_members_page_2.sql rename to pkg/registry/apis/iam/legacy/testdata/sqlite--user_teams_query-team_1_members_page_2.sql diff --git a/pkg/registry/apis/identity/legacy/testdata/sqlite--users_query-users_page_1.sql b/pkg/registry/apis/iam/legacy/testdata/sqlite--users_query-users_page_1.sql similarity index 87% rename from pkg/registry/apis/identity/legacy/testdata/sqlite--users_query-users_page_1.sql rename to pkg/registry/apis/iam/legacy/testdata/sqlite--users_query-users_page_1.sql index 5d4f1b771fc..7de4914aa8d 100755 --- a/pkg/registry/apis/identity/legacy/testdata/sqlite--users_query-users_page_1.sql +++ b/pkg/registry/apis/iam/legacy/testdata/sqlite--users_query-users_page_1.sql @@ -2,6 +2,6 @@ SELECT o.org_id, u.id, u.uid, u.login, u.email, u.name, u.created, u.updated, u.is_service_account, u.is_disabled, u.is_admin FROM "grafana"."user" as u JOIN "grafana"."org_user" as o ON u.id = o.user_id WHERE o.org_id = 0 - AND u.is_service_account = FALSE + AND NOT u.is_service_account ORDER BY u.id asc LIMIT 5 diff --git a/pkg/registry/apis/identity/legacy/testdata/sqlite--users_query-users_page_2.sql b/pkg/registry/apis/iam/legacy/testdata/sqlite--users_query-users_page_2.sql similarity index 88% rename from pkg/registry/apis/identity/legacy/testdata/sqlite--users_query-users_page_2.sql rename to pkg/registry/apis/iam/legacy/testdata/sqlite--users_query-users_page_2.sql index ed97b2c25d2..e938a14392b 100755 --- a/pkg/registry/apis/identity/legacy/testdata/sqlite--users_query-users_page_2.sql +++ b/pkg/registry/apis/iam/legacy/testdata/sqlite--users_query-users_page_2.sql @@ -2,7 +2,7 @@ SELECT o.org_id, u.id, u.uid, u.login, u.email, u.name, u.created, u.updated, u.is_service_account, u.is_disabled, u.is_admin FROM "grafana"."user" as u JOIN "grafana"."org_user" as o ON u.id = o.user_id WHERE o.org_id = 0 - AND u.is_service_account = FALSE + AND NOT u.is_service_account AND u.id >= 2 ORDER BY u.id asc LIMIT 1 diff --git a/pkg/registry/apis/identity/legacy/testdata/sqlite--users_query-users_uid.sql b/pkg/registry/apis/iam/legacy/testdata/sqlite--users_query-users_uid.sql similarity index 88% rename from pkg/registry/apis/identity/legacy/testdata/sqlite--users_query-users_uid.sql rename to pkg/registry/apis/iam/legacy/testdata/sqlite--users_query-users_uid.sql index bab837475af..5c8f1f2ec66 100755 --- a/pkg/registry/apis/identity/legacy/testdata/sqlite--users_query-users_uid.sql +++ b/pkg/registry/apis/iam/legacy/testdata/sqlite--users_query-users_uid.sql @@ -2,7 +2,7 @@ SELECT o.org_id, u.id, u.uid, u.login, u.email, u.name, u.created, u.updated, u.is_service_account, u.is_disabled, u.is_admin FROM "grafana"."user" as u JOIN "grafana"."org_user" as o ON u.id = o.user_id WHERE o.org_id = 0 - AND u.is_service_account = FALSE + AND NOT u.is_service_account AND u.uid = 'abc' ORDER BY u.id asc LIMIT 1 diff --git a/pkg/registry/apis/identity/legacy/user.go b/pkg/registry/apis/iam/legacy/user.go similarity index 97% rename from pkg/registry/apis/identity/legacy/user.go rename to pkg/registry/apis/iam/legacy/user.go index ba5f71312fe..f1f51c43481 100644 --- a/pkg/registry/apis/identity/legacy/user.go +++ b/pkg/registry/apis/iam/legacy/user.go @@ -6,7 +6,7 @@ import ( "text/template" "github.com/grafana/authlib/claims" - "github.com/grafana/grafana/pkg/registry/apis/identity/common" + "github.com/grafana/grafana/pkg/registry/apis/iam/common" "github.com/grafana/grafana/pkg/services/team" "github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/storage/legacysql" @@ -14,9 +14,8 @@ import ( ) type ListUserQuery struct { - OrgID int64 - UID string - IsServiceAccount bool + OrgID int64 + UID string Pagination common.Pagination } diff --git a/pkg/registry/apis/identity/legacy/user_teams_query.sql b/pkg/registry/apis/iam/legacy/user_teams_query.sql similarity index 100% rename from pkg/registry/apis/identity/legacy/user_teams_query.sql rename to pkg/registry/apis/iam/legacy/user_teams_query.sql diff --git a/pkg/registry/apis/identity/legacy/users_query.sql b/pkg/registry/apis/iam/legacy/users_query.sql similarity index 88% rename from pkg/registry/apis/identity/legacy/users_query.sql rename to pkg/registry/apis/iam/legacy/users_query.sql index c7863b0fba5..59d46d39400 100644 --- a/pkg/registry/apis/identity/legacy/users_query.sql +++ b/pkg/registry/apis/iam/legacy/users_query.sql @@ -2,7 +2,7 @@ SELECT o.org_id, u.id, u.uid, u.login, u.email, u.name, u.created, u.updated, u.is_service_account, u.is_disabled, u.is_admin FROM {{ .Ident .UserTable }} as u JOIN {{ .Ident .OrgUserTable }} as o ON u.id = o.user_id WHERE o.org_id = {{ .Arg .Query.OrgID }} - AND u.is_service_account = {{ .Arg .Query.IsServiceAccount }} + AND NOT u.is_service_account {{ if .Query.UID }} AND u.uid = {{ .Arg .Query.UID }} {{ end }} diff --git a/pkg/registry/apis/identity/register.go b/pkg/registry/apis/iam/register.go similarity index 62% rename from pkg/registry/apis/identity/register.go rename to pkg/registry/apis/iam/register.go index 94287ecc6fb..c1536f08aec 100644 --- a/pkg/registry/apis/identity/register.go +++ b/pkg/registry/apis/iam/register.go @@ -1,8 +1,21 @@ -package identity +package iam import ( "context" + "github.com/grafana/grafana/pkg/apimachinery/identity" + iamv0 "github.com/grafana/grafana/pkg/apis/iam/v0alpha1" + grafanarest "github.com/grafana/grafana/pkg/apiserver/rest" + "github.com/grafana/grafana/pkg/infra/db" + "github.com/grafana/grafana/pkg/registry/apis/iam/legacy" + "github.com/grafana/grafana/pkg/registry/apis/iam/serviceaccount" + "github.com/grafana/grafana/pkg/registry/apis/iam/sso" + "github.com/grafana/grafana/pkg/registry/apis/iam/team" + "github.com/grafana/grafana/pkg/registry/apis/iam/user" + "github.com/grafana/grafana/pkg/services/apiserver/builder" + "github.com/grafana/grafana/pkg/services/featuremgmt" + "github.com/grafana/grafana/pkg/services/ssosettings" + "github.com/grafana/grafana/pkg/storage/legacysql" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" @@ -12,26 +25,12 @@ import ( "k8s.io/apiserver/pkg/registry/rest" genericapiserver "k8s.io/apiserver/pkg/server" common "k8s.io/kube-openapi/pkg/common" - - "github.com/grafana/grafana/pkg/apimachinery/identity" - identityv0 "github.com/grafana/grafana/pkg/apis/identity/v0alpha1" - grafanarest "github.com/grafana/grafana/pkg/apiserver/rest" - "github.com/grafana/grafana/pkg/infra/db" - "github.com/grafana/grafana/pkg/registry/apis/identity/legacy" - "github.com/grafana/grafana/pkg/registry/apis/identity/serviceaccount" - "github.com/grafana/grafana/pkg/registry/apis/identity/sso" - "github.com/grafana/grafana/pkg/registry/apis/identity/team" - "github.com/grafana/grafana/pkg/registry/apis/identity/user" - "github.com/grafana/grafana/pkg/services/apiserver/builder" - "github.com/grafana/grafana/pkg/services/featuremgmt" - "github.com/grafana/grafana/pkg/services/ssosettings" - "github.com/grafana/grafana/pkg/storage/legacysql" ) -var _ builder.APIGroupBuilder = (*IdentityAPIBuilder)(nil) +var _ builder.APIGroupBuilder = (*IdentityAccessManagementAPIBuilder)(nil) // This is used just so wire has something unique to return -type IdentityAPIBuilder struct { +type IdentityAccessManagementAPIBuilder struct { Store legacy.LegacyIdentityStore SSOService ssosettings.Service } @@ -41,12 +40,12 @@ func RegisterAPIService( apiregistration builder.APIRegistrar, ssoService ssosettings.Service, sql db.DB, -) (*IdentityAPIBuilder, error) { +) (*IdentityAccessManagementAPIBuilder, error) { if !features.IsEnabledGlobally(featuremgmt.FlagGrafanaAPIServerWithExperimentalAPIs) { return nil, nil // skip registration unless opting into experimental apis } - builder := &IdentityAPIBuilder{ + builder := &IdentityAccessManagementAPIBuilder{ Store: legacy.NewLegacySQLStores(legacysql.NewDatabaseProvider(sql)), SSOService: ssoService, } @@ -55,67 +54,68 @@ func RegisterAPIService( return builder, nil } -func (b *IdentityAPIBuilder) GetGroupVersion() schema.GroupVersion { - return identityv0.SchemeGroupVersion +func (b *IdentityAccessManagementAPIBuilder) GetGroupVersion() schema.GroupVersion { + return iamv0.SchemeGroupVersion } -func (b *IdentityAPIBuilder) InstallSchema(scheme *runtime.Scheme) error { - identityv0.AddKnownTypes(scheme, identityv0.VERSION) +func (b *IdentityAccessManagementAPIBuilder) InstallSchema(scheme *runtime.Scheme) error { + iamv0.AddKnownTypes(scheme, iamv0.VERSION) // Link this version to the internal representation. // This is used for server-side-apply (PATCH), and avoids the error: // "no kind is registered for the type" - identityv0.AddKnownTypes(scheme, runtime.APIVersionInternal) + iamv0.AddKnownTypes(scheme, runtime.APIVersionInternal) - metav1.AddToGroupVersion(scheme, identityv0.SchemeGroupVersion) - return scheme.SetVersionPriority(identityv0.SchemeGroupVersion) + metav1.AddToGroupVersion(scheme, iamv0.SchemeGroupVersion) + return scheme.SetVersionPriority(iamv0.SchemeGroupVersion) } -func (b *IdentityAPIBuilder) GetAPIGroupInfo( +func (b *IdentityAccessManagementAPIBuilder) GetAPIGroupInfo( scheme *runtime.Scheme, codecs serializer.CodecFactory, // pointer? optsGetter generic.RESTOptionsGetter, dualWriteBuilder grafanarest.DualWriteBuilder, ) (*genericapiserver.APIGroupInfo, error) { - apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(identityv0.GROUP, scheme, metav1.ParameterCodec, codecs) + apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(iamv0.GROUP, scheme, metav1.ParameterCodec, codecs) storage := map[string]rest.Storage{} - teamResource := identityv0.TeamResourceInfo + teamResource := iamv0.TeamResourceInfo storage[teamResource.StoragePath()] = team.NewLegacyStore(b.Store) storage[teamResource.StoragePath("members")] = team.NewLegacyTeamMemberREST(b.Store) - teamBindingResource := identityv0.TeamBindingResourceInfo + teamBindingResource := iamv0.TeamBindingResourceInfo storage[teamBindingResource.StoragePath()] = team.NewLegacyBindingStore(b.Store) - userResource := identityv0.UserResourceInfo + userResource := iamv0.UserResourceInfo storage[userResource.StoragePath()] = user.NewLegacyStore(b.Store) storage[userResource.StoragePath("teams")] = user.NewLegacyTeamMemberREST(b.Store) - serviceaccountResource := identityv0.ServiceAccountResourceInfo + serviceaccountResource := iamv0.ServiceAccountResourceInfo storage[serviceaccountResource.StoragePath()] = serviceaccount.NewLegacyStore(b.Store) + storage[serviceaccountResource.StoragePath("tokens")] = serviceaccount.NewLegacyTokenREST(b.Store) if b.SSOService != nil { - ssoResource := identityv0.SSOSettingResourceInfo + ssoResource := iamv0.SSOSettingResourceInfo storage[ssoResource.StoragePath()] = sso.NewLegacyStore(b.SSOService) } // The display endpoint -- NOTE, this uses a rewrite hack to allow requests without a name parameter storage["display"] = user.NewLegacyDisplayREST(b.Store) - apiGroupInfo.VersionedResourcesStorageMap[identityv0.VERSION] = storage + apiGroupInfo.VersionedResourcesStorageMap[iamv0.VERSION] = storage return &apiGroupInfo, nil } -func (b *IdentityAPIBuilder) GetOpenAPIDefinitions() common.GetOpenAPIDefinitions { - return identityv0.GetOpenAPIDefinitions +func (b *IdentityAccessManagementAPIBuilder) GetOpenAPIDefinitions() common.GetOpenAPIDefinitions { + return iamv0.GetOpenAPIDefinitions } -func (b *IdentityAPIBuilder) GetAPIRoutes() *builder.APIRoutes { +func (b *IdentityAccessManagementAPIBuilder) GetAPIRoutes() *builder.APIRoutes { // no custom API routes return nil } -func (b *IdentityAPIBuilder) GetAuthorizer() authorizer.Authorizer { +func (b *IdentityAccessManagementAPIBuilder) GetAuthorizer() authorizer.Authorizer { // TODO: handle authorization based in entity. return authorizer.AuthorizerFunc( func(ctx context.Context, a authorizer.Attributes) (authorizer.Decision, string, error) { diff --git a/pkg/registry/apis/iam/serviceaccount/rest_token.go b/pkg/registry/apis/iam/serviceaccount/rest_token.go new file mode 100644 index 00000000000..b66f790f381 --- /dev/null +++ b/pkg/registry/apis/iam/serviceaccount/rest_token.go @@ -0,0 +1,115 @@ +package serviceaccount + +import ( + "context" + "net/http" + "time" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apiserver/pkg/registry/rest" + + iamv0 "github.com/grafana/grafana/pkg/apis/iam/v0alpha1" + "github.com/grafana/grafana/pkg/registry/apis/iam/common" + "github.com/grafana/grafana/pkg/registry/apis/iam/legacy" + "github.com/grafana/grafana/pkg/services/apiserver/endpoints/request" +) + +var ( + _ rest.Storage = (*LegacyTokenRest)(nil) + _ rest.Scoper = (*LegacyTokenRest)(nil) + _ rest.StorageMetadata = (*LegacyTokenRest)(nil) + _ rest.Connecter = (*LegacyTokenRest)(nil) +) + +func NewLegacyTokenREST(store legacy.LegacyIdentityStore) *LegacyTokenRest { + return &LegacyTokenRest{store} +} + +type LegacyTokenRest struct { + store legacy.LegacyIdentityStore +} + +// New implements rest.Storage. +func (s *LegacyTokenRest) New() runtime.Object { + return &iamv0.UserTeamList{} +} + +// Destroy implements rest.Storage. +func (s *LegacyTokenRest) Destroy() {} + +// NamespaceScoped implements rest.Scoper. +func (s *LegacyTokenRest) NamespaceScoped() bool { + return true +} + +// ProducesMIMETypes implements rest.StorageMetadata. +func (s *LegacyTokenRest) ProducesMIMETypes(verb string) []string { + return []string{"application/json"} +} + +// ProducesObject implements rest.StorageMetadata. +func (s *LegacyTokenRest) ProducesObject(verb string) interface{} { + return s.New() +} + +// Connect implements rest.Connecter. +func (s *LegacyTokenRest) Connect(ctx context.Context, name string, options runtime.Object, responder rest.Responder) (http.Handler, error) { + ns, err := request.NamespaceInfoFrom(ctx, true) + if err != nil { + return nil, err + } + + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + res, err := s.store.ListServiceAccountTokens(ctx, ns, legacy.ListServiceAccountTokenQuery{ + UID: name, + Pagination: common.PaginationFromListQuery(r.URL.Query()), + }) + if err != nil { + responder.Error(err) + return + } + + list := &iamv0.ServiceAccountTokenList{Items: make([]iamv0.ServiceAccountToken, 0, len(res.Items))} + + for _, t := range res.Items { + list.Items = append(list.Items, mapToToken(t)) + } + + list.ListMeta.Continue = common.OptionalFormatInt(res.Continue) + + responder.Object(http.StatusOK, list) + }), nil +} + +// NewConnectOptions implements rest.Connecter. +func (s *LegacyTokenRest) NewConnectOptions() (runtime.Object, bool, string) { + return nil, false, "" +} + +// ConnectMethods implements rest.Connecter. +func (s *LegacyTokenRest) ConnectMethods() []string { + return []string{http.MethodGet} +} + +func mapToToken(t legacy.ServiceAccountToken) iamv0.ServiceAccountToken { + var expires, lastUsed *metav1.Time + + if t.Expires != nil { + ts := metav1.NewTime(time.Unix(*t.Expires, 0)) + expires = &ts + } + + if t.LastUsed != nil { + ts := metav1.NewTime(*t.LastUsed) + lastUsed = &ts + } + + return iamv0.ServiceAccountToken{ + Name: t.Name, + Expires: expires, + LastUsed: lastUsed, + Revoked: t.Revoked, + Created: metav1.NewTime(t.Created), + } +} diff --git a/pkg/registry/apis/identity/serviceaccount/store.go b/pkg/registry/apis/iam/serviceaccount/store.go similarity index 61% rename from pkg/registry/apis/identity/serviceaccount/store.go rename to pkg/registry/apis/iam/serviceaccount/store.go index 2f6a87540a7..618f2089793 100644 --- a/pkg/registry/apis/identity/serviceaccount/store.go +++ b/pkg/registry/apis/iam/serviceaccount/store.go @@ -11,11 +11,10 @@ import ( "k8s.io/apiserver/pkg/registry/rest" "github.com/grafana/grafana/pkg/apimachinery/utils" - identityv0 "github.com/grafana/grafana/pkg/apis/identity/v0alpha1" - "github.com/grafana/grafana/pkg/registry/apis/identity/common" - "github.com/grafana/grafana/pkg/registry/apis/identity/legacy" + iamv0 "github.com/grafana/grafana/pkg/apis/iam/v0alpha1" + "github.com/grafana/grafana/pkg/registry/apis/iam/common" + "github.com/grafana/grafana/pkg/registry/apis/iam/legacy" "github.com/grafana/grafana/pkg/services/apiserver/endpoints/request" - "github.com/grafana/grafana/pkg/services/user" ) var ( @@ -26,7 +25,7 @@ var ( _ rest.Storage = (*LegacyStore)(nil) ) -var resource = identityv0.ServiceAccountResourceInfo +var resource = iamv0.ServiceAccountResourceInfo func NewLegacyStore(store legacy.LegacyIdentityStore) *LegacyStore { return &LegacyStore{store} @@ -63,20 +62,18 @@ func (s *LegacyStore) List(ctx context.Context, options *internalversion.ListOpt if err != nil { return nil, err } - query := legacy.ListUserQuery{ - OrgID: ns.OrgID, - IsServiceAccount: true, - Pagination: common.PaginationFromListOptions(options), - } - found, err := s.store.ListUsers(ctx, ns, query) + found, err := s.store.ListServiceAccounts(ctx, ns, legacy.ListServiceAccountsQuery{ + OrgID: ns.OrgID, + Pagination: common.PaginationFromListOptions(options), + }) if err != nil { return nil, err } - list := &identityv0.ServiceAccountList{} - for _, item := range found.Users { - list.Items = append(list.Items, *toSAItem(&item, ns.Value)) + list := &iamv0.ServiceAccountList{} + for _, item := range found.Items { + list.Items = append(list.Items, toSAItem(item, ns.Value)) } list.ListMeta.Continue = common.OptionalFormatInt(found.Continue) @@ -85,26 +82,24 @@ func (s *LegacyStore) List(ctx context.Context, options *internalversion.ListOpt return list, err } -func toSAItem(u *user.User, ns string) *identityv0.ServiceAccount { - item := &identityv0.ServiceAccount{ +func toSAItem(sa legacy.ServiceAccount, ns string) iamv0.ServiceAccount { + item := iamv0.ServiceAccount{ ObjectMeta: metav1.ObjectMeta{ - Name: u.UID, + Name: sa.UID, Namespace: ns, - ResourceVersion: fmt.Sprintf("%d", u.Updated.UnixMilli()), - CreationTimestamp: metav1.NewTime(u.Created), + ResourceVersion: fmt.Sprintf("%d", sa.Updated.UnixMilli()), + CreationTimestamp: metav1.NewTime(sa.Created), }, - Spec: identityv0.ServiceAccountSpec{ - Name: u.Name, - Email: u.Email, - EmailVerified: u.EmailVerified, - Disabled: u.IsDisabled, + Spec: iamv0.ServiceAccountSpec{ + Title: sa.Name, + Disabled: sa.Disabled, }, } - obj, _ := utils.MetaAccessor(item) - obj.SetUpdatedTimestamp(&u.Updated) + obj, _ := utils.MetaAccessor(&item) + obj.SetUpdatedTimestamp(&sa.Updated) obj.SetOriginInfo(&utils.ResourceOriginInfo{ Name: "SQL", - Path: strconv.FormatInt(u.ID, 10), + Path: strconv.FormatInt(sa.ID, 10), }) return item } @@ -114,18 +109,19 @@ func (s *LegacyStore) Get(ctx context.Context, name string, options *metav1.GetO if err != nil { return nil, err } - query := legacy.ListUserQuery{ - OrgID: ns.OrgID, - IsServiceAccount: true, - Pagination: common.Pagination{Limit: 1}, - } - found, err := s.store.ListUsers(ctx, ns, query) + found, err := s.store.ListServiceAccounts(ctx, ns, legacy.ListServiceAccountsQuery{ + UID: name, + OrgID: ns.OrgID, + Pagination: common.Pagination{Limit: 1}, + }) if found == nil || err != nil { return nil, resource.NewNotFound(name) } - if len(found.Users) < 1 { + if len(found.Items) < 1 { return nil, resource.NewNotFound(name) } - return toSAItem(&found.Users[0], ns.Value), nil + + res := toSAItem(found.Items[0], ns.Value) + return &res, nil } diff --git a/pkg/registry/apis/identity/sso/store.go b/pkg/registry/apis/iam/sso/store.go similarity index 91% rename from pkg/registry/apis/identity/sso/store.go rename to pkg/registry/apis/iam/sso/store.go index 0e1fdf5f277..c9965adc152 100644 --- a/pkg/registry/apis/identity/sso/store.go +++ b/pkg/registry/apis/iam/sso/store.go @@ -14,7 +14,7 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/apiserver/pkg/registry/rest" - identityv0 "github.com/grafana/grafana/pkg/apis/identity/v0alpha1" + iamv0 "github.com/grafana/grafana/pkg/apis/iam/v0alpha1" "github.com/grafana/grafana/pkg/services/apiserver/endpoints/request" "github.com/grafana/grafana/pkg/services/ssosettings" ssomodels "github.com/grafana/grafana/pkg/services/ssosettings/models" @@ -30,7 +30,7 @@ var ( _ rest.GracefulDeleter = (*LegacyStore)(nil) ) -var resource = identityv0.SSOSettingResourceInfo +var resource = iamv0.SSOSettingResourceInfo func NewLegacyStore(service ssosettings.Service) *LegacyStore { return &LegacyStore{service} @@ -78,7 +78,7 @@ func (s *LegacyStore) List(ctx context.Context, options *internalversion.ListOpt return nil, fmt.Errorf("failed to list sso settings: %w", err) } - list := &identityv0.SSOSettingList{} + list := &iamv0.SSOSettingList{} for _, s := range settings { list.Items = append(list.Items, mapToObject(ns.Value, s)) } @@ -128,7 +128,7 @@ func (s *LegacyStore) Update( return old, created, err } - setting, ok := obj.(*identityv0.SSOSetting) + setting, ok := obj.(*iamv0.SSOSetting) if !ok { return old, created, errors.New("expected ssosetting after update") } @@ -153,7 +153,7 @@ func (s *LegacyStore) Delete( return obj, false, err } - old, ok := obj.(*identityv0.SSOSetting) + old, ok := obj.(*iamv0.SSOSetting) if !ok { return obj, false, errors.New("expected ssosetting") } @@ -182,10 +182,10 @@ func (s *LegacyStore) Delete( return afterDelete, false, err } -func mapToObject(ns string, s *ssomodels.SSOSettings) identityv0.SSOSetting { - source := identityv0.SourceDB +func mapToObject(ns string, s *ssomodels.SSOSettings) iamv0.SSOSetting { + source := iamv0.SourceDB if s.Source == ssomodels.System { - source = identityv0.SourceSystem + source = iamv0.SourceSystem } version := "0" @@ -193,7 +193,7 @@ func mapToObject(ns string, s *ssomodels.SSOSettings) identityv0.SSOSetting { version = fmt.Sprintf("%d", s.Updated.UnixMilli()) } - object := identityv0.SSOSetting{ + object := iamv0.SSOSetting{ ObjectMeta: metav1.ObjectMeta{ Name: s.Provider, Namespace: ns, @@ -201,7 +201,7 @@ func mapToObject(ns string, s *ssomodels.SSOSettings) identityv0.SSOSetting { ResourceVersion: version, CreationTimestamp: metav1.NewTime(s.Updated), }, - Spec: identityv0.SSOSettingSpec{ + Spec: iamv0.SSOSettingSpec{ Source: source, Settings: commonv1.Unstructured{Object: s.Settings}, }, @@ -210,7 +210,7 @@ func mapToObject(ns string, s *ssomodels.SSOSettings) identityv0.SSOSetting { return object } -func mapToModel(obj *identityv0.SSOSetting) *ssomodels.SSOSettings { +func mapToModel(obj *iamv0.SSOSetting) *ssomodels.SSOSettings { return &ssomodels.SSOSettings{ Provider: obj.Name, Settings: obj.Spec.Settings.Object, diff --git a/pkg/registry/apis/identity/team/rest_members.go b/pkg/registry/apis/iam/team/rest_members.go similarity index 85% rename from pkg/registry/apis/identity/team/rest_members.go rename to pkg/registry/apis/iam/team/rest_members.go index e18eaa20146..1bab3a9f2a5 100644 --- a/pkg/registry/apis/identity/team/rest_members.go +++ b/pkg/registry/apis/iam/team/rest_members.go @@ -9,9 +9,9 @@ import ( "github.com/grafana/authlib/claims" "github.com/grafana/grafana/pkg/api/dtos" - identityv0 "github.com/grafana/grafana/pkg/apis/identity/v0alpha1" - "github.com/grafana/grafana/pkg/registry/apis/identity/common" - "github.com/grafana/grafana/pkg/registry/apis/identity/legacy" + iamv0 "github.com/grafana/grafana/pkg/apis/iam/v0alpha1" + "github.com/grafana/grafana/pkg/registry/apis/iam/common" + "github.com/grafana/grafana/pkg/registry/apis/iam/legacy" "github.com/grafana/grafana/pkg/services/apiserver/endpoints/request" "github.com/grafana/grafana/pkg/setting" ) @@ -33,7 +33,7 @@ type LegacyTeamMemberREST struct { // New implements rest.Storage. func (s *LegacyTeamMemberREST) New() runtime.Object { - return &identityv0.TeamMemberList{} + return &iamv0.TeamMemberList{} } // Destroy implements rest.Storage. @@ -71,7 +71,7 @@ func (s *LegacyTeamMemberREST) Connect(ctx context.Context, name string, options return } - list := &identityv0.TeamMemberList{Items: make([]identityv0.TeamMember, 0, len(res.Members))} + list := &iamv0.TeamMemberList{Items: make([]iamv0.TeamMember, 0, len(res.Members))} for _, m := range res.Members { list.Items = append(list.Items, mapToTeamMember(m)) @@ -95,9 +95,9 @@ func (s *LegacyTeamMemberREST) ConnectMethods() []string { var cfg = &setting.Cfg{} -func mapToTeamMember(m legacy.TeamMember) identityv0.TeamMember { - return identityv0.TeamMember{ - IdentityDisplay: identityv0.IdentityDisplay{ +func mapToTeamMember(m legacy.TeamMember) iamv0.TeamMember { + return iamv0.TeamMember{ + IdentityDisplay: iamv0.IdentityDisplay{ IdentityType: claims.TypeUser, UID: m.UserUID, Display: m.Name, diff --git a/pkg/registry/apis/identity/team/store.go b/pkg/registry/apis/iam/team/store.go similarity index 88% rename from pkg/registry/apis/identity/team/store.go rename to pkg/registry/apis/iam/team/store.go index a18b4a9c082..ae6f78291fd 100644 --- a/pkg/registry/apis/identity/team/store.go +++ b/pkg/registry/apis/iam/team/store.go @@ -11,9 +11,9 @@ import ( "github.com/grafana/authlib/claims" "github.com/grafana/grafana/pkg/apimachinery/utils" - identityv0 "github.com/grafana/grafana/pkg/apis/identity/v0alpha1" - "github.com/grafana/grafana/pkg/registry/apis/identity/common" - "github.com/grafana/grafana/pkg/registry/apis/identity/legacy" + iamv0 "github.com/grafana/grafana/pkg/apis/iam/v0alpha1" + "github.com/grafana/grafana/pkg/registry/apis/iam/common" + "github.com/grafana/grafana/pkg/registry/apis/iam/legacy" "github.com/grafana/grafana/pkg/services/apiserver/endpoints/request" ) @@ -25,7 +25,7 @@ var ( _ rest.Storage = (*LegacyStore)(nil) ) -var resource = identityv0.TeamResourceInfo +var resource = iamv0.TeamResourceInfo func NewLegacyStore(store legacy.LegacyIdentityStore) *LegacyStore { return &LegacyStore{store} @@ -58,25 +58,25 @@ func (s *LegacyStore) ConvertToTable(ctx context.Context, object runtime.Object, return resource.TableConverter().ConvertToTable(ctx, object, tableOptions) } -func (s *LegacyStore) doList(ctx context.Context, ns claims.NamespaceInfo, query legacy.ListTeamQuery) (*identityv0.TeamList, error) { +func (s *LegacyStore) doList(ctx context.Context, ns claims.NamespaceInfo, query legacy.ListTeamQuery) (*iamv0.TeamList, error) { rsp, err := s.store.ListTeams(ctx, ns, query) if err != nil { return nil, err } - list := &identityv0.TeamList{ + list := &iamv0.TeamList{ ListMeta: metav1.ListMeta{ ResourceVersion: strconv.FormatInt(rsp.RV, 10), }, } for _, team := range rsp.Teams { - item := identityv0.Team{ + item := iamv0.Team{ ObjectMeta: metav1.ObjectMeta{ Name: team.UID, Namespace: ns.Value, CreationTimestamp: metav1.NewTime(team.Created), ResourceVersion: strconv.FormatInt(team.Updated.UnixMilli(), 10), }, - Spec: identityv0.TeamSpec{ + Spec: iamv0.TeamSpec{ Title: team.Name, Email: team.Email, }, diff --git a/pkg/registry/apis/identity/team/store_binding.go b/pkg/registry/apis/iam/team/store_binding.go similarity index 82% rename from pkg/registry/apis/identity/team/store_binding.go rename to pkg/registry/apis/iam/team/store_binding.go index f3499ff82a3..7251c70fd31 100644 --- a/pkg/registry/apis/identity/team/store_binding.go +++ b/pkg/registry/apis/iam/team/store_binding.go @@ -11,14 +11,14 @@ import ( "k8s.io/apiserver/pkg/registry/rest" "github.com/grafana/authlib/claims" - identityv0 "github.com/grafana/grafana/pkg/apis/identity/v0alpha1" - "github.com/grafana/grafana/pkg/registry/apis/identity/common" - "github.com/grafana/grafana/pkg/registry/apis/identity/legacy" + iamv0 "github.com/grafana/grafana/pkg/apis/iam/v0alpha1" + "github.com/grafana/grafana/pkg/registry/apis/iam/common" + "github.com/grafana/grafana/pkg/registry/apis/iam/legacy" "github.com/grafana/grafana/pkg/services/apiserver/endpoints/request" "github.com/grafana/grafana/pkg/services/team" ) -var bindingResource = identityv0.TeamBindingResourceInfo +var bindingResource = iamv0.TeamBindingResourceInfo var ( _ rest.Storage = (*LegacyBindingStore)(nil) @@ -102,8 +102,8 @@ func (l *LegacyBindingStore) List(ctx context.Context, options *internalversion. return nil, err } - list := identityv0.TeamBindingList{ - Items: make([]identityv0.TeamBinding, 0, len(res.Bindings)), + list := iamv0.TeamBindingList{ + Items: make([]iamv0.TeamBinding, 0, len(res.Bindings)), } for _, b := range res.Bindings { @@ -116,7 +116,7 @@ func (l *LegacyBindingStore) List(ctx context.Context, options *internalversion. return &list, nil } -func mapToBindingObject(ns claims.NamespaceInfo, b legacy.TeamBinding) identityv0.TeamBinding { +func mapToBindingObject(ns claims.NamespaceInfo, b legacy.TeamBinding) iamv0.TeamBinding { rv := time.Time{} ct := time.Now() @@ -129,15 +129,15 @@ func mapToBindingObject(ns claims.NamespaceInfo, b legacy.TeamBinding) identityv } } - return identityv0.TeamBinding{ + return iamv0.TeamBinding{ ObjectMeta: metav1.ObjectMeta{ Name: b.TeamUID, Namespace: ns.Value, ResourceVersion: strconv.FormatInt(rv.UnixMilli(), 10), CreationTimestamp: metav1.NewTime(ct), }, - Spec: identityv0.TeamBindingSpec{ - TeamRef: identityv0.TeamRef{ + Spec: iamv0.TeamBindingSpec{ + TeamRef: iamv0.TeamRef{ Name: b.TeamUID, }, Subjects: mapToSubjects(b.Members), @@ -145,10 +145,10 @@ func mapToBindingObject(ns claims.NamespaceInfo, b legacy.TeamBinding) identityv } } -func mapToSubjects(members []legacy.TeamMember) []identityv0.TeamSubject { - out := make([]identityv0.TeamSubject, 0, len(members)) +func mapToSubjects(members []legacy.TeamMember) []iamv0.TeamSubject { + out := make([]iamv0.TeamSubject, 0, len(members)) for _, m := range members { - out = append(out, identityv0.TeamSubject{ + out = append(out, iamv0.TeamSubject{ Name: m.MemberID(), Permission: common.MapTeamPermission(m.Permission), }) @@ -156,10 +156,10 @@ func mapToSubjects(members []legacy.TeamMember) []identityv0.TeamSubject { return out } -func mapPermisson(p team.PermissionType) identityv0.TeamPermission { +func mapPermisson(p team.PermissionType) iamv0.TeamPermission { if p == team.PermissionTypeAdmin { - return identityv0.TeamPermissionAdmin + return iamv0.TeamPermissionAdmin } else { - return identityv0.TeamPermissionMember + return iamv0.TeamPermissionMember } } diff --git a/pkg/registry/apis/identity/user/rest_display.go b/pkg/registry/apis/iam/user/rest_display.go similarity index 87% rename from pkg/registry/apis/identity/user/rest_display.go rename to pkg/registry/apis/iam/user/rest_display.go index c5d5ecf0202..e0f316d1ec3 100644 --- a/pkg/registry/apis/identity/user/rest_display.go +++ b/pkg/registry/apis/iam/user/rest_display.go @@ -8,8 +8,8 @@ import ( "github.com/grafana/authlib/claims" "github.com/grafana/grafana/pkg/api/dtos" - identity "github.com/grafana/grafana/pkg/apis/identity/v0alpha1" - "github.com/grafana/grafana/pkg/registry/apis/identity/legacy" + iamv0 "github.com/grafana/grafana/pkg/apis/iam/v0alpha1" + "github.com/grafana/grafana/pkg/registry/apis/iam/legacy" "github.com/grafana/grafana/pkg/services/apiserver/endpoints/request" "github.com/grafana/grafana/pkg/setting" errorsK8s "k8s.io/apimachinery/pkg/api/errors" @@ -35,7 +35,7 @@ func NewLegacyDisplayREST(store legacy.LegacyIdentityStore) *LegacyDisplayREST { } func (r *LegacyDisplayREST) New() runtime.Object { - return &identity.IdentityDisplayResults{} + return &iamv0.IdentityDisplayResults{} } func (r *LegacyDisplayREST) Destroy() {} @@ -54,7 +54,7 @@ func (r *LegacyDisplayREST) ProducesMIMETypes(verb string) []string { } func (r *LegacyDisplayREST) ProducesObject(verb string) any { - return &identity.IdentityDisplayResults{} + return &iamv0.IdentityDisplayResults{} } func (r *LegacyDisplayREST) ConnectMethods() []string { @@ -91,13 +91,13 @@ func (r *LegacyDisplayREST) Connect(ctx context.Context, name string, _ runtime. return } - rsp := &identity.IdentityDisplayResults{ + rsp := &iamv0.IdentityDisplayResults{ Keys: keys.keys, InvalidKeys: keys.invalid, - Display: make([]identity.IdentityDisplay, 0, len(users.Users)+len(keys.disp)+1), + Display: make([]iamv0.IdentityDisplay, 0, len(users.Users)+len(keys.disp)+1), } for _, user := range users.Users { - disp := identity.IdentityDisplay{ + disp := iamv0.IdentityDisplay{ IdentityType: claims.TypeUser, Display: user.NameOrFallback(), UID: user.UID, @@ -124,7 +124,7 @@ type dispKeys struct { invalid []string // For terminal keys, this is a constant - disp []identity.IdentityDisplay + disp []iamv0.IdentityDisplay } func parseKeys(req []string) dispKeys { @@ -145,14 +145,14 @@ func parseKeys(req []string) dispKeys { switch t { case claims.TypeAnonymous: - keys.disp = append(keys.disp, identity.IdentityDisplay{ + keys.disp = append(keys.disp, iamv0.IdentityDisplay{ IdentityType: t, Display: "Anonymous", AvatarURL: dtos.GetGravatarUrl(fakeCfgForGravatar, string(t)), }) continue case claims.TypeAPIKey: - keys.disp = append(keys.disp, identity.IdentityDisplay{ + keys.disp = append(keys.disp, iamv0.IdentityDisplay{ IdentityType: t, UID: key, Display: "API Key", @@ -160,7 +160,7 @@ func parseKeys(req []string) dispKeys { }) continue case claims.TypeProvisioning: - keys.disp = append(keys.disp, identity.IdentityDisplay{ + keys.disp = append(keys.disp, iamv0.IdentityDisplay{ IdentityType: t, UID: "Provisioning", Display: "Provisioning", @@ -176,7 +176,7 @@ func parseKeys(req []string) dispKeys { id, err := strconv.ParseInt(key, 10, 64) if err == nil { if id == 0 { - keys.disp = append(keys.disp, identity.IdentityDisplay{ + keys.disp = append(keys.disp, iamv0.IdentityDisplay{ IdentityType: claims.TypeUser, UID: key, Display: "System admin", diff --git a/pkg/registry/apis/identity/user/rest_user_team.go b/pkg/registry/apis/iam/user/rest_user_team.go similarity index 84% rename from pkg/registry/apis/identity/user/rest_user_team.go rename to pkg/registry/apis/iam/user/rest_user_team.go index 5235dcc3592..d9d0c22d2ca 100644 --- a/pkg/registry/apis/identity/user/rest_user_team.go +++ b/pkg/registry/apis/iam/user/rest_user_team.go @@ -7,9 +7,9 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apiserver/pkg/registry/rest" - identityv0 "github.com/grafana/grafana/pkg/apis/identity/v0alpha1" - "github.com/grafana/grafana/pkg/registry/apis/identity/common" - "github.com/grafana/grafana/pkg/registry/apis/identity/legacy" + iamv0 "github.com/grafana/grafana/pkg/apis/iam/v0alpha1" + "github.com/grafana/grafana/pkg/registry/apis/iam/common" + "github.com/grafana/grafana/pkg/registry/apis/iam/legacy" "github.com/grafana/grafana/pkg/services/apiserver/endpoints/request" ) @@ -30,7 +30,7 @@ type LegacyUserTeamREST struct { // New implements rest.Storage. func (s *LegacyUserTeamREST) New() runtime.Object { - return &identityv0.UserTeamList{} + return &iamv0.UserTeamList{} } // Destroy implements rest.Storage. @@ -68,7 +68,7 @@ func (s *LegacyUserTeamREST) Connect(ctx context.Context, name string, options r return } - list := &identityv0.UserTeamList{Items: make([]identityv0.UserTeam, 0, len(res.Items))} + list := &iamv0.UserTeamList{Items: make([]iamv0.UserTeam, 0, len(res.Items))} for _, m := range res.Items { list.Items = append(list.Items, mapToUserTeam(m)) @@ -90,10 +90,10 @@ func (s *LegacyUserTeamREST) ConnectMethods() []string { return []string{http.MethodGet} } -func mapToUserTeam(t legacy.UserTeam) identityv0.UserTeam { - return identityv0.UserTeam{ +func mapToUserTeam(t legacy.UserTeam) iamv0.UserTeam { + return iamv0.UserTeam{ Title: t.Name, - TeamRef: identityv0.TeamRef{ + TeamRef: iamv0.TeamRef{ Name: t.UID, }, Permission: common.MapTeamPermission(t.Permission), diff --git a/pkg/registry/apis/identity/user/store.go b/pkg/registry/apis/iam/user/store.go similarity index 83% rename from pkg/registry/apis/identity/user/store.go rename to pkg/registry/apis/iam/user/store.go index 9130638717f..b67ce7cf22a 100644 --- a/pkg/registry/apis/identity/user/store.go +++ b/pkg/registry/apis/iam/user/store.go @@ -11,9 +11,9 @@ import ( "k8s.io/apiserver/pkg/registry/rest" "github.com/grafana/grafana/pkg/apimachinery/utils" - identityv0 "github.com/grafana/grafana/pkg/apis/identity/v0alpha1" - "github.com/grafana/grafana/pkg/registry/apis/identity/common" - "github.com/grafana/grafana/pkg/registry/apis/identity/legacy" + iamv0 "github.com/grafana/grafana/pkg/apis/iam/v0alpha1" + "github.com/grafana/grafana/pkg/registry/apis/iam/common" + "github.com/grafana/grafana/pkg/registry/apis/iam/legacy" "github.com/grafana/grafana/pkg/services/apiserver/endpoints/request" "github.com/grafana/grafana/pkg/services/user" ) @@ -26,7 +26,7 @@ var ( _ rest.Storage = (*LegacyStore)(nil) ) -var resource = identityv0.UserResourceInfo +var resource = iamv0.UserResourceInfo func NewLegacyStore(store legacy.LegacyIdentityStore) *LegacyStore { return &LegacyStore{store} @@ -65,15 +65,14 @@ func (s *LegacyStore) List(ctx context.Context, options *internalversion.ListOpt } found, err := s.store.ListUsers(ctx, ns, legacy.ListUserQuery{ - OrgID: ns.OrgID, - IsServiceAccount: false, - Pagination: common.PaginationFromListOptions(options), + OrgID: ns.OrgID, + Pagination: common.PaginationFromListOptions(options), }) if err != nil { return nil, err } - list := &identityv0.UserList{} + list := &iamv0.UserList{} for _, item := range found.Users { list.Items = append(list.Items, *toUserItem(&item, ns.Value)) } @@ -90,9 +89,8 @@ func (s *LegacyStore) Get(ctx context.Context, name string, options *metav1.GetO return nil, err } query := legacy.ListUserQuery{ - OrgID: ns.OrgID, - IsServiceAccount: false, - Pagination: common.Pagination{Limit: 1}, + OrgID: ns.OrgID, + Pagination: common.Pagination{Limit: 1}, } found, err := s.store.ListUsers(ctx, ns, query) @@ -105,15 +103,15 @@ func (s *LegacyStore) Get(ctx context.Context, name string, options *metav1.GetO return toUserItem(&found.Users[0], ns.Value), nil } -func toUserItem(u *user.User, ns string) *identityv0.User { - item := &identityv0.User{ +func toUserItem(u *user.User, ns string) *iamv0.User { + item := &iamv0.User{ ObjectMeta: metav1.ObjectMeta{ Name: u.UID, Namespace: ns, ResourceVersion: fmt.Sprintf("%d", u.Updated.UnixMilli()), CreationTimestamp: metav1.NewTime(u.Created), }, - Spec: identityv0.UserSpec{ + Spec: iamv0.UserSpec{ Name: u.Name, Login: u.Login, Email: u.Email, diff --git a/pkg/registry/apis/query/header_utils.go b/pkg/registry/apis/query/header_utils.go new file mode 100644 index 00000000000..51389e04b3f --- /dev/null +++ b/pkg/registry/apis/query/header_utils.go @@ -0,0 +1,35 @@ +package query + +import ( + "net/http" + "strings" + + "github.com/grafana/grafana/pkg/services/ngalert/models" +) + +// Set of headers that we want to forward to the datasource api servers. Those are used i.e. for +// cache control or identifying the source of the request. +// +// The headers related to grafana alerting can be found here: +// https://github.com/grafana/grafana-ruler/blob/96e6d4b25c0d973a7615b92b35739511a6fbd72f/pkg/ruler/rulesmanager/ds_query_rule_evaluator.go#L313-L328 +// +// The usage of strings.ToLower is because the server would convert `FromAlert` to `Fromalert`. So the make matching +// easier, we just match all headers in lower case. +var expectedHeaders = map[string]string{ + strings.ToLower(models.FromAlertHeaderName): models.FromAlertHeaderName, + strings.ToLower(models.CacheSkipHeaderName): models.CacheSkipHeaderName, + strings.ToLower("X-Rule-Uid"): "X-Rule-Uid", + strings.ToLower("X-Rule-Folder"): "X-Rule-Folder", + strings.ToLower("X-Rule-Source"): "X-Rule-Source", + strings.ToLower("X-Grafana-Org-Id"): "X-Grafana-Org-Id", +} + +func ExtractKnownHeaders(header http.Header) map[string]string { + extractedHeaders := make(map[string]string) + for k, v := range header { + if headerName, exists := expectedHeaders[strings.ToLower(k)]; exists { + extractedHeaders[headerName] = v[0] + } + } + return extractedHeaders +} diff --git a/pkg/registry/apis/query/plugins.go b/pkg/registry/apis/query/plugins.go index 6c4a4861df9..23a904f1144 100644 --- a/pkg/registry/apis/query/plugins.go +++ b/pkg/registry/apis/query/plugins.go @@ -3,13 +3,12 @@ package query import ( "context" + "github.com/grafana/grafana/pkg/apimachinery/utils" + query "github.com/grafana/grafana/pkg/apis/query/v0alpha1" "k8s.io/apimachinery/pkg/apis/meta/internalversion" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apiserver/pkg/registry/rest" - - common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1" - query "github.com/grafana/grafana/pkg/apis/query/v0alpha1" ) var ( @@ -20,7 +19,7 @@ var ( ) type pluginsStorage struct { - resourceInfo *common.ResourceInfo + resourceInfo *utils.ResourceInfo tableConverter rest.TableConvertor registry query.DataSourceApiServerRegistry diff --git a/pkg/registry/apis/query/query.go b/pkg/registry/apis/query/query.go index f17943bee50..24482d1b889 100644 --- a/pkg/registry/apis/query/query.go +++ b/pkg/registry/apis/query/query.go @@ -6,7 +6,6 @@ import ( "fmt" "net/http" "strconv" - "strings" "time" "github.com/grafana/grafana-plugin-sdk-go/backend" @@ -135,26 +134,8 @@ func (r *queryREST) Connect(connectCtx context.Context, name string, _ runtime.O return } - // get headers from the original http req and add them to each sub request - // headers are case insensitive, however some datasources still check for camel casing so we have to send them camel cased - expectedHeaders := map[string]string{ - "fromalert": "FromAlert", - "content-type": "Content-Type", - "content-length": "Content-Length", - "user-agent": "User-Agent", - "accept": "Accept", - } - for i := range req.Requests { - req.Requests[i].Headers = make(map[string]string) - for k, v := range httpreq.Header { - headerToSend, ok := expectedHeaders[strings.ToLower(k)] - if ok { - req.Requests[i].Headers[headerToSend] = v[0] - } else { - b.log.Warn(fmt.Sprintf("query service received an unexpected header, ignoring it: %s", k)) - } - } + req.Requests[i].Headers = ExtractKnownHeaders(httpreq.Header) } // Actually run the query diff --git a/pkg/registry/apis/query/query_test.go b/pkg/registry/apis/query/query_test.go index f1bdde43fe3..35b45f9f210 100644 --- a/pkg/registry/apis/query/query_test.go +++ b/pkg/registry/apis/query/query_test.go @@ -14,6 +14,7 @@ import ( "github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/infra/tracing" "github.com/grafana/grafana/pkg/services/featuremgmt" + "github.com/grafana/grafana/pkg/services/ngalert/models" "github.com/stretchr/testify/require" "k8s.io/apimachinery/pkg/runtime" ) @@ -37,7 +38,7 @@ func TestQueryRestConnectHandler(t *testing.T) { rr := httptest.NewRecorder() body := runtime.RawExtension{ - Raw: []byte(`{ + Raw: []byte(`{ "queries": [ { "datasource": { @@ -53,14 +54,23 @@ func TestQueryRestConnectHandler(t *testing.T) { "to": "now"}`), } req := httptest.NewRequest(http.MethodGet, "/some-path", bytes.NewReader(body.Raw)) - req.Header.Set("fromAlert", "true") + req.Header.Set(models.FromAlertHeaderName, "true") + req.Header.Set(models.CacheSkipHeaderName, "true") + req.Header.Set("X-Rule-Uid", "abc") + req.Header.Set("X-Rule-Folder", "folder-1") + req.Header.Set("X-Rule-Source", "grafana-ruler") + req.Header.Set("X-Grafana-Org-Id", "1") req.Header.Set("Content-Type", "application/json") req.Header.Set("some-unexpected-header", "some-value") handler.ServeHTTP(rr, req) require.Equal(t, map[string]string{ - "FromAlert": "true", - "Content-Type": "application/json", + models.FromAlertHeaderName: "true", + models.CacheSkipHeaderName: "true", + "X-Rule-Uid": "abc", + "X-Rule-Folder": "folder-1", + "X-Rule-Source": "grafana-ruler", + "X-Grafana-Org-Id": "1", }, *b.client.(mockClient).lastCalledWithHeaders) } diff --git a/pkg/registry/apis/query/queryschema/query_type_storage.go b/pkg/registry/apis/query/queryschema/query_type_storage.go index 4018161b4b8..781b2104178 100644 --- a/pkg/registry/apis/query/queryschema/query_type_storage.go +++ b/pkg/registry/apis/query/queryschema/query_type_storage.go @@ -4,15 +4,13 @@ import ( "context" "net/http" + "github.com/grafana/grafana-plugin-sdk-go/experimental/apis/data/v0alpha1" + "github.com/grafana/grafana/pkg/apimachinery/utils" + query "github.com/grafana/grafana/pkg/apis/query/v0alpha1" "k8s.io/apimachinery/pkg/apis/meta/internalversion" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apiserver/pkg/registry/rest" - - "github.com/grafana/grafana-plugin-sdk-go/experimental/apis/data/v0alpha1" - - common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1" - query "github.com/grafana/grafana/pkg/apis/query/v0alpha1" ) var ( @@ -27,7 +25,7 @@ var ( ) type queryTypeStorage struct { - resourceInfo *common.ResourceInfo + resourceInfo *utils.ResourceInfo tableConverter rest.TableConvertor registry query.QueryTypeDefinitionList } diff --git a/pkg/registry/apis/wireset.go b/pkg/registry/apis/wireset.go index f6ceafac35e..e9d3ac6adbf 100644 --- a/pkg/registry/apis/wireset.go +++ b/pkg/registry/apis/wireset.go @@ -9,7 +9,7 @@ import ( "github.com/grafana/grafana/pkg/registry/apis/datasource" "github.com/grafana/grafana/pkg/registry/apis/featuretoggle" "github.com/grafana/grafana/pkg/registry/apis/folders" - "github.com/grafana/grafana/pkg/registry/apis/identity" + "github.com/grafana/grafana/pkg/registry/apis/iam" "github.com/grafana/grafana/pkg/registry/apis/peakq" "github.com/grafana/grafana/pkg/registry/apis/playlist" "github.com/grafana/grafana/pkg/registry/apis/query" @@ -33,7 +33,7 @@ var WireSet = wire.NewSet( featuretoggle.RegisterAPIService, datasource.RegisterAPIService, folders.RegisterAPIService, - identity.RegisterAPIService, + iam.RegisterAPIService, peakq.RegisterAPIService, service.RegisterAPIService, query.RegisterAPIService, diff --git a/pkg/semconv/go.mod b/pkg/semconv/go.mod index 1217b154a55..81429a73acc 100644 --- a/pkg/semconv/go.mod +++ b/pkg/semconv/go.mod @@ -2,7 +2,7 @@ module github.com/grafana/grafana/pkg/semconv go 1.23.0 -require go.opentelemetry.io/otel v1.28.0 +require go.opentelemetry.io/otel v1.29.0 require ( github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect diff --git a/pkg/semconv/go.sum b/pkg/semconv/go.sum index 6601c18dd25..bf61a1563d6 100644 --- a/pkg/semconv/go.sum +++ b/pkg/semconv/go.sum @@ -6,7 +6,7 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 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= -go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= -go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= +go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw= +go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8= 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/pkg/services/accesscontrol/acimpl/service.go b/pkg/services/accesscontrol/acimpl/service.go index d4961a95e77..b9e1d2a1fc5 100644 --- a/pkg/services/accesscontrol/acimpl/service.go +++ b/pkg/services/accesscontrol/acimpl/service.go @@ -244,32 +244,40 @@ func (s *Service) getCachedUserPermissions(ctx context.Context, user identity.Re ctx, span := tracer.Start(ctx, "accesscontrol.acimpl.getCachedUserPermissions") defer span.End() - permissions := []accesscontrol.Permission{} - permissions, err := s.getCachedBasicRolesPermissions(ctx, user, options, permissions) + cacheKey := accesscontrol.GetUserPermissionCacheKey(user) + if cachedPermissions, ok := s.cache.Get(cacheKey); ok { + return cachedPermissions.([]accesscontrol.Permission), nil + } + + permissions, err := s.getCachedBasicRolesPermissions(ctx, user, options) if err != nil { return nil, err } - permissions, err = s.getCachedTeamsPermissions(ctx, user, options, permissions) + teamsPermissions, err := s.getCachedTeamsPermissions(ctx, user, options) + if err != nil { + return nil, err + } + permissions = append(permissions, teamsPermissions...) + + userManagedPermissions, err := s.getCachedUserDirectPermissions(ctx, user, options) if err != nil { return nil, err } - userPermissions, err := s.getCachedUserDirectPermissions(ctx, user, options) - if err != nil { - return nil, err - } - - permissions = append(permissions, userPermissions...) + permissions = append(permissions, userManagedPermissions...) + s.cache.Set(cacheKey, permissions, cacheTTL) span.SetAttributes(attribute.Int("num_permissions", len(permissions))) return permissions, nil } -func (s *Service) getCachedBasicRolesPermissions(ctx context.Context, user identity.Requester, options accesscontrol.Options, permissions []accesscontrol.Permission) ([]accesscontrol.Permission, error) { +func (s *Service) getCachedBasicRolesPermissions(ctx context.Context, user identity.Requester, options accesscontrol.Options) ([]accesscontrol.Permission, error) { ctx, span := tracer.Start(ctx, "accesscontrol.acimpl.getCachedBasicRolesPermissions") defer span.End() + // Viewer role has ~30 permissions, so we can pre-allocate memory + permissions := make([]accesscontrol.Permission, 0, 50) basicRoles := accesscontrol.GetOrgRoles(user) span.SetAttributes(attribute.Int("roles", len(basicRoles))) for _, role := range basicRoles { @@ -333,16 +341,20 @@ func (s *Service) getCachedPermissions(ctx context.Context, key string, getPermi return permissions, nil } -func (s *Service) getCachedTeamsPermissions(ctx context.Context, user identity.Requester, options accesscontrol.Options, permissions []accesscontrol.Permission) ([]accesscontrol.Permission, error) { +func (s *Service) getCachedTeamsPermissions(ctx context.Context, user identity.Requester, options accesscontrol.Options) ([]accesscontrol.Permission, error) { ctx, span := tracer.Start(ctx, "accesscontrol.acimpl.getCachedTeamsPermissions") defer span.End() teams := user.GetTeams() orgID := user.GetOrgID() - miss := teams + if len(teams) == 0 { + return []accesscontrol.Permission{}, nil + } + + miss := make([]int64, 0) + permissions := make([]accesscontrol.Permission, 0) if !options.ReloadCache { - miss = make([]int64, 0) for _, teamID := range teams { key := accesscontrol.GetTeamPermissionCacheKey(teamID, orgID) teamPermissions, ok := s.cache.Get(key) @@ -354,6 +366,9 @@ func (s *Service) getCachedTeamsPermissions(ctx context.Context, user identity.R miss = append(miss, teamID) } } + } else { + // reload cache and fetch all teams permissions + miss = teams } if len(miss) > 0 { @@ -376,7 +391,7 @@ func (s *Service) getCachedTeamsPermissions(ctx context.Context, user identity.R } func (s *Service) ClearUserPermissionCache(user identity.Requester) { - s.cache.Delete(accesscontrol.GetPermissionCacheKey(user)) + s.cache.Delete(accesscontrol.GetUserPermissionCacheKey(user)) s.cache.Delete(accesscontrol.GetUserDirectPermissionCacheKey(user)) } diff --git a/pkg/services/accesscontrol/cacheutils.go b/pkg/services/accesscontrol/cacheutils.go index 9326d9d88c8..39d1d1a45f8 100644 --- a/pkg/services/accesscontrol/cacheutils.go +++ b/pkg/services/accesscontrol/cacheutils.go @@ -7,7 +7,7 @@ import ( "github.com/grafana/grafana/pkg/apimachinery/identity" ) -func GetPermissionCacheKey(user identity.Requester) string { +func GetUserPermissionCacheKey(user identity.Requester) string { return fmt.Sprintf("rbac-permissions-%s", user.GetCacheKey()) } diff --git a/pkg/services/accesscontrol/cacheutils_test.go b/pkg/services/accesscontrol/cacheutils_test.go index 7aff7941586..c5bf747b60b 100644 --- a/pkg/services/accesscontrol/cacheutils_test.go +++ b/pkg/services/accesscontrol/cacheutils_test.go @@ -6,6 +6,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/grafana/authlib/claims" + "github.com/grafana/grafana/pkg/services/org" "github.com/grafana/grafana/pkg/services/user" ) @@ -68,7 +69,7 @@ func TestPermissionCacheKey(t *testing.T) { for _, tc := range testcases { t.Run(tc.name, func(t *testing.T) { - assert.Equal(t, tc.expected, GetPermissionCacheKey(tc.signedInUser)) + assert.Equal(t, tc.expected, GetUserPermissionCacheKey(tc.signedInUser)) }) } } diff --git a/pkg/services/accesscontrol/resourcepermissions/store.go b/pkg/services/accesscontrol/resourcepermissions/store.go index 9ded47f4ab0..5e42f7b2784 100644 --- a/pkg/services/accesscontrol/resourcepermissions/store.go +++ b/pkg/services/accesscontrol/resourcepermissions/store.go @@ -725,7 +725,7 @@ func (s *store) createPermissions(sess *db.Session, roleID int64, cmd SetResourc } func (s *store) shouldStoreActionSet(resource, permission string) bool { - if !(s.features.IsEnabled(context.TODO(), featuremgmt.FlagAccessActionSets) && permission != "") { + if permission == "" { return false } actionSetName := GetActionSetName(resource, permission) diff --git a/pkg/services/apiserver/builder/helper.go b/pkg/services/apiserver/builder/helper.go index afbb81680fe..7b14570c538 100644 --- a/pkg/services/apiserver/builder/helper.go +++ b/pkg/services/apiserver/builder/helper.go @@ -46,7 +46,7 @@ var pathRewriters = []filters.PathRewriter{ }, }, { - Pattern: regexp.MustCompile(`(/apis/identity.grafana.app/v0alpha1/namespaces/.*/display$)`), + Pattern: regexp.MustCompile(`(/apis/iam.grafana.app/v0alpha1/namespaces/.*/display$)`), ReplaceFunc: func(matches []string) string { return matches[1] + "/name" // connector requires a name }, diff --git a/pkg/services/apiserver/service.go b/pkg/services/apiserver/service.go index 9c6844268e8..baedfe29c58 100644 --- a/pkg/services/apiserver/service.go +++ b/pkg/services/apiserver/service.go @@ -298,7 +298,7 @@ func (s *service) start(ctx context.Context) error { if err != nil { return err } - client := resource.NewLocalResourceStoreClient(server) + client := resource.NewLocalResourceClient(server) serverConfig.Config.RESTOptionsGetter = apistore.NewRESTOptionsGetterForClient(client, o.RecommendedOptions.Etcd.StorageConfig) @@ -314,7 +314,7 @@ func (s *service) start(ctx context.Context) error { } // Create a client instance - client := resource.NewResourceStoreClientGRPC(conn) + client := resource.NewResourceClient(conn) serverConfig.Config.RESTOptionsGetter = apistore.NewRESTOptionsGetterForClient(client, o.RecommendedOptions.Etcd.StorageConfig) case grafanaapiserveroptions.StorageTypeLegacy: diff --git a/pkg/services/featuremgmt/registry.go b/pkg/services/featuremgmt/registry.go index a0c513ccc49..324314592d2 100644 --- a/pkg/services/featuremgmt/registry.go +++ b/pkg/services/featuremgmt/registry.go @@ -1039,8 +1039,9 @@ var ( { Name: "promQLScope", Description: "In-development feature that will allow injection of labels into prometheus queries.", - Stage: FeatureStageExperimental, + Stage: FeatureStageGeneralAvailability, Owner: grafanaObservabilityMetricsSquad, + Expression: "true", }, { Name: "sqlExpressions", @@ -1385,12 +1386,6 @@ var ( Owner: grafanaAppPlatformSquad, RequiresRestart: true, }, - { - Name: "adhocFilterOneOf", - Description: "Exposes a new 'one of' operator for ad-hoc filters. This operator allows users to filter by multiple values in a single filter.", - Stage: FeatureStageExperimental, - Owner: grafanaDashboardsSquad, - }, { Name: "newFiltersUI", Description: "Enables new combobox style UI for the Ad hoc filters variable in scenes architecture", diff --git a/pkg/services/featuremgmt/toggles_gen.csv b/pkg/services/featuremgmt/toggles_gen.csv index dab6db0193c..a2d2c4ded60 100644 --- a/pkg/services/featuremgmt/toggles_gen.csv +++ b/pkg/services/featuremgmt/toggles_gen.csv @@ -136,7 +136,7 @@ newFolderPicker,experimental,@grafana/grafana-frontend-platform,false,false,true jitterAlertRulesWithinGroups,preview,@grafana/alerting-squad,false,true,false onPremToCloudMigrations,preview,@grafana/grafana-operator-experience-squad,false,false,false alertingSaveStatePeriodic,privatePreview,@grafana/alerting-squad,false,false,false -promQLScope,experimental,@grafana/observability-metrics,false,false,false +promQLScope,GA,@grafana/observability-metrics,false,false,false sqlExpressions,experimental,@grafana/grafana-app-platform-squad,false,false,false nodeGraphDotLayout,experimental,@grafana/observability-traces-and-profiling,false,false,true groupToNestedTableTransformation,GA,@grafana/dataviz-squad,false,false,true @@ -182,7 +182,6 @@ cloudwatchMetricInsightsCrossAccount,preview,@grafana/aws-datasources,false,fals prometheusAzureOverrideAudience,deprecated,@grafana/partner-datasources,false,false,false backgroundPluginInstaller,experimental,@grafana/plugins-platform-backend,false,true,false dataplaneAggregator,experimental,@grafana/grafana-app-platform-squad,false,true,false -adhocFilterOneOf,experimental,@grafana/dashboards-squad,false,false,false newFiltersUI,experimental,@grafana/dashboards-squad,false,false,false lokiSendDashboardPanelNames,experimental,@grafana/observability-logs,false,false,false singleTopNav,experimental,@grafana/grafana-frontend-platform,false,false,true diff --git a/pkg/services/featuremgmt/toggles_gen.go b/pkg/services/featuremgmt/toggles_gen.go index 09a5c150cc6..e88b4c283d8 100644 --- a/pkg/services/featuremgmt/toggles_gen.go +++ b/pkg/services/featuremgmt/toggles_gen.go @@ -739,10 +739,6 @@ const ( // Enable grafana dataplane aggregator FlagDataplaneAggregator = "dataplaneAggregator" - // FlagAdhocFilterOneOf - // Exposes a new 'one of' operator for ad-hoc filters. This operator allows users to filter by multiple values in a single filter. - FlagAdhocFilterOneOf = "adhocFilterOneOf" - // FlagNewFiltersUI // Enables new combobox style UI for the Ad hoc filters variable in scenes architecture FlagNewFiltersUI = "newFiltersUI" diff --git a/pkg/services/featuremgmt/toggles_gen.json b/pkg/services/featuremgmt/toggles_gen.json index 3a724d7c90b..a665ad72492 100644 --- a/pkg/services/featuremgmt/toggles_gen.json +++ b/pkg/services/featuremgmt/toggles_gen.json @@ -52,7 +52,8 @@ "metadata": { "name": "adhocFilterOneOf", "resourceVersion": "1723119716623", - "creationTimestamp": "2024-08-08T12:21:56Z" + "creationTimestamp": "2024-08-08T12:21:56Z", + "deletionTimestamp": "2024-09-05T12:30:12Z" }, "spec": { "description": "Exposes a new 'one of' operator for ad-hoc filters. This operator allows users to filter by multiple values in a single filter.", @@ -2188,13 +2189,17 @@ { "metadata": { "name": "promQLScope", - "resourceVersion": "1718727528075", - "creationTimestamp": "2024-01-29T20:22:17Z" + "resourceVersion": "1724076197892", + "creationTimestamp": "2024-01-29T20:22:17Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-08-19 14:03:17.892558375 +0000 UTC" + } }, "spec": { "description": "In-development feature that will allow injection of labels into prometheus queries.", - "stage": "experimental", - "codeowner": "@grafana/observability-metrics" + "stage": "GA", + "codeowner": "@grafana/observability-metrics", + "expression": "true" } }, { diff --git a/pkg/services/notifications/smtp_test.go b/pkg/services/notifications/smtp_test.go index 7b7fb04165d..e55bcd50639 100644 --- a/pkg/services/notifications/smtp_test.go +++ b/pkg/services/notifications/smtp_test.go @@ -294,16 +294,16 @@ func TestSmtpSend(t *testing.T) { count, err := client.Send(ctx, msgs...) require.NoError(t, err) - require.Equal(t, 3, count) + assert.Equal(t, 3, count) // workaround for https://github.com/mocktools/go-smtp-mock/issues/181 time.Sleep(1 * time.Millisecond) messages := srv.MessagesAndPurge() - require.Len(t, messages, 3) + assert.Len(t, messages, 3) for i, sentMsg := range messages { rcpts := sentMsg.RcpttoRequestResponse() - require.EqualValues(t, [][]string{ + assert.EqualValues(t, [][]string{ {fmt.Sprintf("RCPT TO:", i+1), "250 Received"}, }, rcpts) @@ -316,7 +316,7 @@ func TestSmtpSend(t *testing.T) { // make sure the trace is propagated traceId := span.SpanContext().TraceID().String() hasPrefix := strings.HasPrefix(hdr.Get("traceparent"), "00-"+traceId+"-") - require.True(t, hasPrefix) + assert.True(t, hasPrefix) // one of the lines should be the body we expect! found := false @@ -334,7 +334,7 @@ func TestSmtpSend(t *testing.T) { } } - require.True(t, found) + assert.True(t, found) } }) } diff --git a/pkg/services/serviceaccounts/manager/service_test.go b/pkg/services/serviceaccounts/manager/service_test.go index c7175f480c8..9345235039e 100644 --- a/pkg/services/serviceaccounts/manager/service_test.go +++ b/pkg/services/serviceaccounts/manager/service_test.go @@ -14,7 +14,7 @@ import ( ) type FakeServiceAccountStore struct { - ExpectedServiceAccountID *serviceaccounts.ServiceAccount + ExpectedServiceAccountID int64 ExpectedServiceAccountDTO *serviceaccounts.ServiceAccountDTO ExpectedServiceAccountProfileDTO *serviceaccounts.ServiceAccountProfileDTO ExpectedSearchServiceAccountQueryResult *serviceaccounts.SearchOrgServiceAccountsResult @@ -39,7 +39,7 @@ func (f *FakeServiceAccountStore) RetrieveServiceAccount(ctx context.Context, or // RetrieveServiceAccountIdByName is a fake retrieving a service account id by name. func (f *FakeServiceAccountStore) RetrieveServiceAccountIdByName(ctx context.Context, orgID int64, name string) (int64, error) { - return f.ExpectedServiceAccountID.Id, f.ExpectedError + return f.ExpectedServiceAccountID, f.ExpectedError } // CreateServiceAccount is a fake creating a service account. diff --git a/pkg/services/serviceaccounts/models.go b/pkg/services/serviceaccounts/models.go index 777d9de6170..7756e0657f5 100644 --- a/pkg/services/serviceaccounts/models.go +++ b/pkg/services/serviceaccounts/models.go @@ -52,10 +52,6 @@ type MigrationResult struct { FailedDetails []string `json:"failedDetails"` } -type ServiceAccount struct { - Id int64 -} - // swagger:model type CreateServiceAccountForm struct { // example: grafana diff --git a/pkg/services/signingkeys/signingkeysimpl/service.go b/pkg/services/signingkeys/signingkeysimpl/service.go index 7c7d0f718f4..af574d99426 100644 --- a/pkg/services/signingkeys/signingkeysimpl/service.go +++ b/pkg/services/signingkeys/signingkeysimpl/service.go @@ -155,13 +155,13 @@ func (s *Service) getPrivateKey(ctx context.Context, keyID string) (crypto.Signe return nil, err } - singer, err := s.decodePrivateKey(ctx, key.PrivateKey) + signer, err := s.decodePrivateKey(ctx, key.PrivateKey) if err != nil { return nil, err } - s.localCache.Set(keyID, singer, privateKeyTTL) - return singer, nil + s.localCache.Set(keyID, signer, privateKeyTTL) + return signer, nil } func (s *Service) addPrivateKey(ctx context.Context, keyID string, alg jose.SignatureAlgorithm, force bool) (crypto.Signer, error) { diff --git a/pkg/services/signingkeys/signingkeystest/fake.go b/pkg/services/signingkeys/signingkeystest/fake.go index 3f7e23634a4..30ca3453082 100644 --- a/pkg/services/signingkeys/signingkeystest/fake.go +++ b/pkg/services/signingkeys/signingkeystest/fake.go @@ -10,7 +10,7 @@ import ( type FakeSigningKeysService struct { ExpectedJSONWebKeySet jose.JSONWebKeySet ExpectedKeyID string - ExpectedSinger crypto.Signer + ExpectedSigner crypto.Signer ExpectedError error } @@ -19,5 +19,5 @@ func (s *FakeSigningKeysService) GetJWKS(ctx context.Context) (jose.JSONWebKeySe } func (s *FakeSigningKeysService) GetOrCreatePrivateKey(ctx context.Context, keyPrefix string, alg jose.SignatureAlgorithm) (string, crypto.Signer, error) { - return s.ExpectedKeyID, s.ExpectedSinger, s.ExpectedError + return s.ExpectedKeyID, s.ExpectedSigner, s.ExpectedError } diff --git a/pkg/services/store/kind/dashboard/dashboard.go b/pkg/services/store/kind/dashboard/dashboard.go index b325acd8c57..6c50b68bf42 100644 --- a/pkg/services/store/kind/dashboard/dashboard.go +++ b/pkg/services/store/kind/dashboard/dashboard.go @@ -396,9 +396,13 @@ func readpanelInfo(iter *jsoniter.Iterator, lookup DatasourceLookup) panelInfo { panel.PluginVersion = iter.ReadString() // since 7x (the saved version for the plugin model) case "libraryPanel": - var v map[string]string + var v map[string]interface{} iter.ReadVal(&v) - panel.LibraryPanel = v["uid"] + if uid, ok := v["uid"]; ok { + if u, isString := uid.(string); isString { + panel.LibraryPanel = u + } + } case "datasource": targets.addDatasource(iter) diff --git a/pkg/services/store/kind/dashboard/dashboard_test.go b/pkg/services/store/kind/dashboard/dashboard_test.go index 94287ad69e0..5be34abbbca 100644 --- a/pkg/services/store/kind/dashboard/dashboard_test.go +++ b/pkg/services/store/kind/dashboard/dashboard_test.go @@ -70,6 +70,7 @@ func TestReadDashboard(t *testing.T) { "mixed-datasource-with-variable", "special-datasource-types", "panels-without-datasources", + "panel-with-library-panel-field", } devdash := "../../../../../devenv/dev-dashboards/" diff --git a/pkg/services/store/kind/dashboard/testdata/panel-with-library-panel-field-info.json b/pkg/services/store/kind/dashboard/testdata/panel-with-library-panel-field-info.json new file mode 100644 index 00000000000..1ffaecb605b --- /dev/null +++ b/pkg/services/store/kind/dashboard/testdata/panel-with-library-panel-field-info.json @@ -0,0 +1,30 @@ +{ + "id": 345, + "title": "The libraryPanel field should get read properly despite the version being an integer", + "tags": null, + "datasource": [ + { + "uid": "default.uid", + "type": "default.type" + } + ], + "panels": [ + { + "id": 454, + "title": "Example title", + "type": "timeseries", + "libraryPanel": "dfkljg98345dkf", + "datasource": [ + { + "uid": "default.uid", + "type": "default.type" + } + ] + } + ], + "schemaVersion": 39, + "linkCount": 0, + "timeFrom": "now-6h", + "timeTo": "now", + "timezone": "" +} \ No newline at end of file diff --git a/pkg/services/store/kind/dashboard/testdata/panel-with-library-panel-field.json b/pkg/services/store/kind/dashboard/testdata/panel-with-library-panel-field.json new file mode 100644 index 00000000000..06e9195c90d --- /dev/null +++ b/pkg/services/store/kind/dashboard/testdata/panel-with-library-panel-field.json @@ -0,0 +1,83 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "The libraryPanel field should get read properly despite the version being an integer", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 345, + "links": [], + "panels": [ + { + "description": "", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 15 + }, + "id": 454, + "libraryPanel": { + "name": "example name", + "uid": "dfkljg98345dkf", + "version": 2001 + }, + "options": { + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "bottom" + }, + "tooltip": { + "mode": "single" + } + }, + "targets": [ + { + "datasource": { + "type": "graphite", + "uid": "000000001" + }, + "refId": "A" + } + ], + "title": "Example title", + "transparent": true, + "type": "timeseries" + } + ], + "preload": false, + "refresh": "", + "schemaVersion": 39, + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "The libraryPanel field should get read properly despite the version being an integer", + "uid": "sdjf03945834sdkf", + "version": 33, + "weekStart": "" +} diff --git a/pkg/storage/unified/apistore/go.mod b/pkg/storage/unified/apistore/go.mod index 2d22aaa9544..67db766cf91 100644 --- a/pkg/storage/unified/apistore/go.mod +++ b/pkg/storage/unified/apistore/go.mod @@ -33,7 +33,7 @@ require ( 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.20.4 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect github.com/go-openapi/swag v0.23.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect @@ -70,12 +70,12 @@ require ( go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect - go.opentelemetry.io/otel v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect + go.opentelemetry.io/otel v1.29.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 // indirect - go.opentelemetry.io/otel/metric v1.28.0 // indirect - go.opentelemetry.io/otel/sdk v1.28.0 // indirect - go.opentelemetry.io/otel/trace v1.28.0 // indirect + go.opentelemetry.io/otel/metric v1.29.0 // indirect + go.opentelemetry.io/otel/sdk v1.29.0 // indirect + go.opentelemetry.io/otel/trace v1.29.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect @@ -89,8 +89,8 @@ require ( golang.org/x/time v0.6.0 // indirect golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 // indirect google.golang.org/api v0.191.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect google.golang.org/protobuf v1.34.2 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/pkg/storage/unified/apistore/go.sum b/pkg/storage/unified/apistore/go.sum index c5276e79cb7..6f02d5d5ae3 100644 --- a/pkg/storage/unified/apistore/go.sum +++ b/pkg/storage/unified/apistore/go.sum @@ -100,8 +100,8 @@ 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.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= -github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= +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-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= @@ -293,18 +293,18 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.5 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0/go.mod h1:azvtTADFQJA8mX80jIH/akaE7h+dbm/sVuaHqN13w74= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg= -go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= -go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= +go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw= +go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 h1:dIIDULZJpgdiHz5tXrTgKIMLkus6jEFa7x5SOKcyR7E= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0/go.mod h1:jlRVBe7+Z1wyxFSUs48L6OBQZ5JwH2Hg/Vbl+t9rAgI= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 h1:R3X6ZXmNPRR8ul6i3WgFURCHzaXjHdm0karRG/+dj3s= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0/go.mod h1:QWFXnDavXWwMx2EEcZsf3yxgEKAqsxQ+Syjp+seyInw= -go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= -go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= -go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE= -go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= -go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= -go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= +go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc= +go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8= +go.opentelemetry.io/otel/sdk v1.29.0 h1:vkqKjk7gwhS8VaWb0POZKmIEDimRCMsopNYnriHyryo= +go.opentelemetry.io/otel/sdk v1.29.0/go.mod h1:pM8Dx5WKnvxLCb+8lG1PRNIDxu9g9b9g59Qr7hfAAok= +go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4= +go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ= go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -419,10 +419,10 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988 h1:CT2Thj5AuPV9phrYMtzX11k+XkzMGfRAet42PmoTATM= google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988/go.mod h1:7uvplUBj4RjHAxIZ//98LzOvrQ04JBkaixRmCMI29hc= -google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988 h1:+/tmTy5zAieooKIXfzDm9KiA3Bv6JBwriRN9LY+yayk= -google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988/go.mod h1:4+X6GvPs+25wZKbQq9qyAXrwIRExv7w0Ea6MgZLZiDM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 h1:V71AcdLZr2p8dC9dbOIMCpqi4EmRl8wUwnJzXXLmbmc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd h1:BBOTEWLuuEGQy9n1y9MhVJ9Qt0BDu21X8qZs71/uPZo= +google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd/go.mod h1:fO8wJzT2zbQbAjbIoos1285VfEIYKDDY+Dt+WpTkh6g= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/grpc v1.18.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= diff --git a/pkg/storage/unified/apistore/restoptions.go b/pkg/storage/unified/apistore/restoptions.go index 2c8e80c24d4..6c1a4dbc039 100644 --- a/pkg/storage/unified/apistore/restoptions.go +++ b/pkg/storage/unified/apistore/restoptions.go @@ -50,7 +50,7 @@ func NewRESTOptionsGetterMemory(originalStorageConfig storagebackend.Config) (*R return nil, err } return NewRESTOptionsGetterForClient( - resource.NewLocalResourceStoreClient(server), + resource.NewLocalResourceClient(server), originalStorageConfig, ), nil } @@ -84,7 +84,7 @@ func NewRESTOptionsGetterForFile(path string, return nil, err } return NewRESTOptionsGetterForClient( - resource.NewLocalResourceStoreClient(server), + resource.NewLocalResourceClient(server), originalStorageConfig, ), nil } diff --git a/pkg/storage/unified/apistore/watcher_test.go b/pkg/storage/unified/apistore/watcher_test.go index 38510a088b3..fb4deb11811 100644 --- a/pkg/storage/unified/apistore/watcher_test.go +++ b/pkg/storage/unified/apistore/watcher_test.go @@ -97,7 +97,7 @@ func testSetup(t testing.TB, opts ...setupOption) (context.Context, storage.Inte Backend: backend, }) require.NoError(t, err) - client := resource.NewLocalResourceStoreClient(server) + client := resource.NewLocalResourceClient(server) config := storagebackend.NewDefaultConfig(setupOpts.prefix, setupOpts.codec) store, destroyFunc, err := NewStorage( diff --git a/pkg/storage/unified/resource/client.go b/pkg/storage/unified/resource/client.go new file mode 100644 index 00000000000..92ea7686bf8 --- /dev/null +++ b/pkg/storage/unified/resource/client.go @@ -0,0 +1,54 @@ +package resource + +import ( + "github.com/fullstorydev/grpchan" + "github.com/fullstorydev/grpchan/inprocgrpc" + grpcAuth "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/auth" + "google.golang.org/grpc" + + grpcUtils "github.com/grafana/grafana/pkg/storage/unified/resource/grpc" +) + +type ResourceClient interface { + ResourceStoreClient + ResourceIndexClient + DiagnosticsClient +} + +// Internal implementation +type resourceClient struct { + ResourceStoreClient + ResourceIndexClient + DiagnosticsClient +} + +func NewResourceClient(channel *grpc.ClientConn) ResourceClient { + cc := grpchan.InterceptClientConn(channel, grpcUtils.UnaryClientInterceptor, grpcUtils.StreamClientInterceptor) + return &resourceClient{ + ResourceStoreClient: NewResourceStoreClient(cc), + ResourceIndexClient: NewResourceIndexClient(cc), + DiagnosticsClient: NewDiagnosticsClient(cc), + } +} + +func NewLocalResourceClient(server ResourceServer) ResourceClient { + channel := &inprocgrpc.Channel{} + + auth := &grpcUtils.Authenticator{} + + channel.RegisterService( + grpchan.InterceptServer( + &ResourceStore_ServiceDesc, + grpcAuth.UnaryServerInterceptor(auth.Authenticate), + grpcAuth.StreamServerInterceptor(auth.Authenticate), + ), + server, // Implements all the things + ) + + cc := grpchan.InterceptClientConn(channel, grpcUtils.UnaryClientInterceptor, grpcUtils.StreamClientInterceptor) + return &resourceClient{ + ResourceStoreClient: NewResourceStoreClient(cc), + ResourceIndexClient: NewResourceIndexClient(cc), + DiagnosticsClient: NewDiagnosticsClient(cc), + } +} diff --git a/pkg/storage/unified/resource/client_wrapper.go b/pkg/storage/unified/resource/client_wrapper.go deleted file mode 100644 index 7ad67e937d8..00000000000 --- a/pkg/storage/unified/resource/client_wrapper.go +++ /dev/null @@ -1,30 +0,0 @@ -package resource - -import ( - "github.com/fullstorydev/grpchan" - "github.com/fullstorydev/grpchan/inprocgrpc" - grpcAuth "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/auth" - "google.golang.org/grpc" - - grpcUtils "github.com/grafana/grafana/pkg/storage/unified/resource/grpc" -) - -func NewLocalResourceStoreClient(server ResourceStoreServer) ResourceStoreClient { - channel := &inprocgrpc.Channel{} - - auth := &grpcUtils.Authenticator{} - - channel.RegisterService( - grpchan.InterceptServer( - &ResourceStore_ServiceDesc, - grpcAuth.UnaryServerInterceptor(auth.Authenticate), - grpcAuth.StreamServerInterceptor(auth.Authenticate), - ), - server, - ) - return NewResourceStoreClient(grpchan.InterceptClientConn(channel, grpcUtils.UnaryClientInterceptor, grpcUtils.StreamClientInterceptor)) -} - -func NewResourceStoreClientGRPC(channel *grpc.ClientConn) ResourceStoreClient { - return NewResourceStoreClient(grpchan.InterceptClientConn(channel, grpcUtils.UnaryClientInterceptor, grpcUtils.StreamClientInterceptor)) -} diff --git a/pkg/storage/unified/resource/go.mod b/pkg/storage/unified/resource/go.mod index db6eaa1bbde..a31529c8014 100644 --- a/pkg/storage/unified/resource/go.mod +++ b/pkg/storage/unified/resource/go.mod @@ -10,7 +10,7 @@ require ( github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 github.com/prometheus/client_golang v1.20.0 github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/otel/trace v1.28.0 + go.opentelemetry.io/otel/trace v1.29.0 gocloud.dev v0.39.0 google.golang.org/grpc v1.65.0 google.golang.org/protobuf v1.34.2 @@ -42,7 +42,7 @@ require ( github.com/prometheus/procfs v0.15.1 // indirect github.com/x448/float16 v0.8.4 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/otel v1.28.0 // indirect + go.opentelemetry.io/otel v1.29.0 // indirect golang.org/x/crypto v0.26.0 // indirect golang.org/x/net v0.28.0 // indirect golang.org/x/sync v0.8.0 // indirect @@ -50,7 +50,8 @@ require ( golang.org/x/text v0.17.0 // indirect golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 // indirect google.golang.org/api v0.191.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/pkg/storage/unified/resource/go.sum b/pkg/storage/unified/resource/go.sum index 631072b38e6..71005b4b8b5 100644 --- a/pkg/storage/unified/resource/go.sum +++ b/pkg/storage/unified/resource/go.sum @@ -204,12 +204,12 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.5 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0/go.mod h1:azvtTADFQJA8mX80jIH/akaE7h+dbm/sVuaHqN13w74= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg= -go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= -go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= -go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= -go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= -go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= -go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= +go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw= +go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8= +go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc= +go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8= +go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4= +go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ= gocloud.dev v0.39.0 h1:EYABYGhAalPUaMrbSKOr5lejxoxvXj99nE8XFtsDgds= gocloud.dev v0.39.0/go.mod h1:drz+VyYNBvrMTW0KZiBAYEdl8lbNZx+OQ7oQvdrFmSQ= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -310,10 +310,10 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988 h1:CT2Thj5AuPV9phrYMtzX11k+XkzMGfRAet42PmoTATM= google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988/go.mod h1:7uvplUBj4RjHAxIZ//98LzOvrQ04JBkaixRmCMI29hc= -google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988 h1:+/tmTy5zAieooKIXfzDm9KiA3Bv6JBwriRN9LY+yayk= -google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988/go.mod h1:4+X6GvPs+25wZKbQq9qyAXrwIRExv7w0Ea6MgZLZiDM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 h1:V71AcdLZr2p8dC9dbOIMCpqi4EmRl8wUwnJzXXLmbmc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd h1:BBOTEWLuuEGQy9n1y9MhVJ9Qt0BDu21X8qZs71/uPZo= +google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd/go.mod h1:fO8wJzT2zbQbAjbIoos1285VfEIYKDDY+Dt+WpTkh6g= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= 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= diff --git a/pkg/storage/unified/resource/resource.pb.go b/pkg/storage/unified/resource/resource.pb.go index 3ca099325ab..7fa31ba23b1 100644 --- a/pkg/storage/unified/resource/resource.pb.go +++ b/pkg/storage/unified/resource/resource.pb.go @@ -1951,7 +1951,7 @@ type OriginResponse struct { // ResourceVersion of the list response ResourceVersion int64 `protobuf:"varint,3,opt,name=resource_version,json=resourceVersion,proto3" json:"resource_version,omitempty"` // Error details - Error *ErrorResult `protobuf:"bytes,8,opt,name=error,proto3" json:"error,omitempty"` + Error *ErrorResult `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` } func (x *OriginResponse) Reset() { @@ -2403,7 +2403,7 @@ var file_resource_proto_rawDesc = []byte{ 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x2b, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2b, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2e, 0x0a, 0x12, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, @@ -2446,29 +2446,25 @@ var file_resource_proto_rawDesc = []byte{ 0x12, 0x16, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, - 0x32, 0xc3, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x12, 0x35, 0x0a, 0x04, 0x52, 0x65, 0x61, 0x64, 0x12, 0x15, 0x2e, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x61, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x48, 0x69, 0x73, - 0x74, 0x6f, 0x72, 0x79, 0x12, 0x18, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, - 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, - 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x06, 0x4f, 0x72, 0x69, - 0x67, 0x69, 0x6e, 0x12, 0x17, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x4f, - 0x72, 0x69, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, + 0x32, 0x8c, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x12, 0x3e, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x18, 0x2e, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x06, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x12, 0x17, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x57, 0x0a, 0x0b, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, - 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x48, 0x0a, 0x09, 0x49, 0x73, 0x48, 0x65, 0x61, 0x6c, 0x74, - 0x68, 0x79, 0x12, 0x1c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x48, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1d, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x48, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, - 0x39, 0x5a, 0x37, 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, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2f, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, - 0x64, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x2e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, + 0x57, 0x0a, 0x0b, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x48, + 0x0a, 0x09, 0x49, 0x73, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x12, 0x1c, 0x2e, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x39, 0x5a, 0x37, 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, 0x73, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x2f, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2554,22 +2550,20 @@ var file_resource_proto_depIdxs = []int32{ 13, // 32: resource.ResourceStore.Delete:input_type -> resource.DeleteRequest 19, // 33: resource.ResourceStore.List:input_type -> resource.ListRequest 21, // 34: resource.ResourceStore.Watch:input_type -> resource.WatchRequest - 15, // 35: resource.ResourceIndex.Read:input_type -> resource.ReadRequest - 23, // 36: resource.ResourceIndex.History:input_type -> resource.HistoryRequest - 25, // 37: resource.ResourceIndex.Origin:input_type -> resource.OriginRequest - 28, // 38: resource.Diagnostics.IsHealthy:input_type -> resource.HealthCheckRequest - 16, // 39: resource.ResourceStore.Read:output_type -> resource.ReadResponse - 10, // 40: resource.ResourceStore.Create:output_type -> resource.CreateResponse - 12, // 41: resource.ResourceStore.Update:output_type -> resource.UpdateResponse - 14, // 42: resource.ResourceStore.Delete:output_type -> resource.DeleteResponse - 20, // 43: resource.ResourceStore.List:output_type -> resource.ListResponse - 22, // 44: resource.ResourceStore.Watch:output_type -> resource.WatchEvent - 16, // 45: resource.ResourceIndex.Read:output_type -> resource.ReadResponse - 24, // 46: resource.ResourceIndex.History:output_type -> resource.HistoryResponse - 27, // 47: resource.ResourceIndex.Origin:output_type -> resource.OriginResponse - 29, // 48: resource.Diagnostics.IsHealthy:output_type -> resource.HealthCheckResponse - 39, // [39:49] is the sub-list for method output_type - 29, // [29:39] is the sub-list for method input_type + 23, // 35: resource.ResourceIndex.History:input_type -> resource.HistoryRequest + 25, // 36: resource.ResourceIndex.Origin:input_type -> resource.OriginRequest + 28, // 37: resource.Diagnostics.IsHealthy:input_type -> resource.HealthCheckRequest + 16, // 38: resource.ResourceStore.Read:output_type -> resource.ReadResponse + 10, // 39: resource.ResourceStore.Create:output_type -> resource.CreateResponse + 12, // 40: resource.ResourceStore.Update:output_type -> resource.UpdateResponse + 14, // 41: resource.ResourceStore.Delete:output_type -> resource.DeleteResponse + 20, // 42: resource.ResourceStore.List:output_type -> resource.ListResponse + 22, // 43: resource.ResourceStore.Watch:output_type -> resource.WatchEvent + 24, // 44: resource.ResourceIndex.History:output_type -> resource.HistoryResponse + 27, // 45: resource.ResourceIndex.Origin:output_type -> resource.OriginResponse + 29, // 46: resource.Diagnostics.IsHealthy:output_type -> resource.HealthCheckResponse + 38, // [38:47] is the sub-list for method output_type + 29, // [29:38] is the sub-list for method input_type 29, // [29:29] is the sub-list for extension type_name 29, // [29:29] is the sub-list for extension extendee 0, // [0:29] is the sub-list for field type_name diff --git a/pkg/storage/unified/resource/resource.proto b/pkg/storage/unified/resource/resource.proto index a8d95fca989..e298ff77aa9 100644 --- a/pkg/storage/unified/resource/resource.proto +++ b/pkg/storage/unified/resource/resource.proto @@ -442,8 +442,6 @@ service ResourceStore { service ResourceIndex { // TODO: rpc Search(...) ... eventually a typed response - rpc Read(ReadRequest) returns (ReadResponse); // Duplicated -- for client read only usage - // Show resource history (and trash) rpc History(HistoryRequest) returns (HistoryResponse); diff --git a/pkg/storage/unified/resource/resource_grpc.pb.go b/pkg/storage/unified/resource/resource_grpc.pb.go index bfd2fa2d52a..9e1db6eb635 100644 --- a/pkg/storage/unified/resource/resource_grpc.pb.go +++ b/pkg/storage/unified/resource/resource_grpc.pb.go @@ -348,7 +348,6 @@ var ResourceStore_ServiceDesc = grpc.ServiceDesc{ } const ( - ResourceIndex_Read_FullMethodName = "/resource.ResourceIndex/Read" ResourceIndex_History_FullMethodName = "/resource.ResourceIndex/History" ResourceIndex_Origin_FullMethodName = "/resource.ResourceIndex/Origin" ) @@ -360,7 +359,6 @@ const ( // Unlike the ResourceStore, this service can be exposed to clients directly // It should be implemented with efficient indexes and does not need read-after-write semantics type ResourceIndexClient interface { - Read(ctx context.Context, in *ReadRequest, opts ...grpc.CallOption) (*ReadResponse, error) // Show resource history (and trash) History(ctx context.Context, in *HistoryRequest, opts ...grpc.CallOption) (*HistoryResponse, error) // Used for efficient provisioning @@ -375,16 +373,6 @@ func NewResourceIndexClient(cc grpc.ClientConnInterface) ResourceIndexClient { return &resourceIndexClient{cc} } -func (c *resourceIndexClient) Read(ctx context.Context, in *ReadRequest, opts ...grpc.CallOption) (*ReadResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(ReadResponse) - err := c.cc.Invoke(ctx, ResourceIndex_Read_FullMethodName, in, out, cOpts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *resourceIndexClient) History(ctx context.Context, in *HistoryRequest, opts ...grpc.CallOption) (*HistoryResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(HistoryResponse) @@ -412,7 +400,6 @@ func (c *resourceIndexClient) Origin(ctx context.Context, in *OriginRequest, opt // Unlike the ResourceStore, this service can be exposed to clients directly // It should be implemented with efficient indexes and does not need read-after-write semantics type ResourceIndexServer interface { - Read(context.Context, *ReadRequest) (*ReadResponse, error) // Show resource history (and trash) History(context.Context, *HistoryRequest) (*HistoryResponse, error) // Used for efficient provisioning @@ -423,9 +410,6 @@ type ResourceIndexServer interface { type UnimplementedResourceIndexServer struct { } -func (UnimplementedResourceIndexServer) Read(context.Context, *ReadRequest) (*ReadResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Read not implemented") -} func (UnimplementedResourceIndexServer) History(context.Context, *HistoryRequest) (*HistoryResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method History not implemented") } @@ -444,24 +428,6 @@ func RegisterResourceIndexServer(s grpc.ServiceRegistrar, srv ResourceIndexServe s.RegisterService(&ResourceIndex_ServiceDesc, srv) } -func _ResourceIndex_Read_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ReadRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ResourceIndexServer).Read(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: ResourceIndex_Read_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ResourceIndexServer).Read(ctx, req.(*ReadRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _ResourceIndex_History_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(HistoryRequest) if err := dec(in); err != nil { @@ -505,10 +471,6 @@ var ResourceIndex_ServiceDesc = grpc.ServiceDesc{ ServiceName: "resource.ResourceIndex", HandlerType: (*ResourceIndexServer)(nil), Methods: []grpc.MethodDesc{ - { - MethodName: "Read", - Handler: _ResourceIndex_Read_Handler, - }, { MethodName: "History", Handler: _ResourceIndex_History_Handler, diff --git a/pkg/storage/unified/resource/server.go b/pkg/storage/unified/resource/server.go index 3b401bb1b5f..a31ca6fe37b 100644 --- a/pkg/storage/unified/resource/server.go +++ b/pkg/storage/unified/resource/server.go @@ -25,7 +25,6 @@ type ResourceServer interface { ResourceStoreServer ResourceIndexServer DiagnosticsServer - LifecycleHooks } type ListIterator interface { diff --git a/pkg/storage/unified/sql/test/integration_test.go b/pkg/storage/unified/sql/test/integration_test.go index 7d618d2aab1..e673b79a8ef 100644 --- a/pkg/storage/unified/sql/test/integration_test.go +++ b/pkg/storage/unified/sql/test/integration_test.go @@ -356,7 +356,7 @@ func TestClientServer(t *testing.T) { t.Run("Create a client", func(t *testing.T) { conn, err := grpc.NewClient(svc.GetAddress(), grpc.WithTransportCredentials(insecure.NewCredentials())) require.NoError(t, err) - client = resource.NewResourceStoreClientGRPC(conn) + client = resource.NewResourceClient(conn) }) t.Run("Create a resource", func(t *testing.T) { diff --git a/pkg/tests/apis/identity/identity_test.go b/pkg/tests/apis/iam/iam_test.go similarity index 95% rename from pkg/tests/apis/identity/identity_test.go rename to pkg/tests/apis/iam/iam_test.go index d945c27f8d5..8703a02bb2e 100644 --- a/pkg/tests/apis/identity/identity_test.go +++ b/pkg/tests/apis/iam/iam_test.go @@ -15,13 +15,13 @@ import ( ) var gvrTeams = schema.GroupVersionResource{ - Group: "identity.grafana.app", + Group: "iam.grafana.app", Version: "v0alpha1", Resource: "teams", } var gvrUsers = schema.GroupVersionResource{ - Group: "identity.grafana.app", + Group: "iam.grafana.app", Version: "v0alpha1", Resource: "users", } @@ -42,7 +42,7 @@ func TestIntegrationRequiresDevMode(t *testing.T) { }, }) - _, err := helper.NewDiscoveryClient().ServerResourcesForGroupVersion("identity.grafana.app/v0alpha1") + _, err := helper.NewDiscoveryClient().ServerResourcesForGroupVersion("iam.grafana.app/v0alpha1") require.Error(t, err) } @@ -57,7 +57,7 @@ func TestIntegrationIdentity(t *testing.T) { featuremgmt.FlagGrafanaAPIServerWithExperimentalAPIs, // Required to start the example service }, }) - _, err := helper.NewDiscoveryClient().ServerResourcesForGroupVersion("identity.grafana.app/v0alpha1") + _, err := helper.NewDiscoveryClient().ServerResourcesForGroupVersion("iam.grafana.app/v0alpha1") require.NoError(t, err) t.Run("read only views", func(t *testing.T) { @@ -72,7 +72,7 @@ func TestIntegrationIdentity(t *testing.T) { require.JSONEq(t, `{ "items": [ { - "apiVersion": "identity.grafana.app/v0alpha1", + "apiVersion": "iam.grafana.app/v0alpha1", "kind": "Team", "metadata": { "annotations": { diff --git a/pkg/tests/apis/playlist/playlist_test.go b/pkg/tests/apis/playlist/playlist_test.go index a362e99433e..d9153363f04 100644 --- a/pkg/tests/apis/playlist/playlist_test.go +++ b/pkg/tests/apis/playlist/playlist_test.go @@ -94,7 +94,7 @@ func TestIntegrationPlaylist(t *testing.T) { DisableAnonymous: true, APIServerStorageType: "file", // write the files to disk UnifiedStorageConfig: map[string]setting.UnifiedStorageConfig{ - playlistv0alpha1.GROUPRESOURCE: { + playlistv0alpha1.RESOURCEGROUP: { DualWriterMode: grafanarest.Mode0, }, }, @@ -110,7 +110,7 @@ func TestIntegrationPlaylist(t *testing.T) { DisableAnonymous: true, APIServerStorageType: "file", // write the files to disk UnifiedStorageConfig: map[string]setting.UnifiedStorageConfig{ - playlistv0alpha1.GROUPRESOURCE: { + playlistv0alpha1.RESOURCEGROUP: { DualWriterMode: grafanarest.Mode1, }, }, @@ -126,7 +126,7 @@ func TestIntegrationPlaylist(t *testing.T) { DisableAnonymous: true, APIServerStorageType: "file", // write the files to disk UnifiedStorageConfig: map[string]setting.UnifiedStorageConfig{ - playlistv0alpha1.GROUPRESOURCE: { + playlistv0alpha1.RESOURCEGROUP: { DualWriterMode: grafanarest.Mode2, }, }, @@ -142,7 +142,7 @@ func TestIntegrationPlaylist(t *testing.T) { DisableAnonymous: true, APIServerStorageType: "file", // write the files to disk UnifiedStorageConfig: map[string]setting.UnifiedStorageConfig{ - playlistv0alpha1.GROUPRESOURCE: { + playlistv0alpha1.RESOURCEGROUP: { DualWriterMode: grafanarest.Mode3, }, }, @@ -161,7 +161,7 @@ func TestIntegrationPlaylist(t *testing.T) { featuremgmt.FlagKubernetesPlaylists, // Required so that legacy calls are also written }, UnifiedStorageConfig: map[string]setting.UnifiedStorageConfig{ - playlistv0alpha1.GROUPRESOURCE: { + playlistv0alpha1.RESOURCEGROUP: { DualWriterMode: grafanarest.Mode0, }, }, @@ -186,7 +186,7 @@ func TestIntegrationPlaylist(t *testing.T) { featuremgmt.FlagKubernetesPlaylists, // Required so that legacy calls are also written }, UnifiedStorageConfig: map[string]setting.UnifiedStorageConfig{ - playlistv0alpha1.GROUPRESOURCE: { + playlistv0alpha1.RESOURCEGROUP: { DualWriterMode: grafanarest.Mode2, }, }, @@ -202,7 +202,7 @@ func TestIntegrationPlaylist(t *testing.T) { featuremgmt.FlagKubernetesPlaylists, // Required so that legacy calls are also written }, UnifiedStorageConfig: map[string]setting.UnifiedStorageConfig{ - playlistv0alpha1.GROUPRESOURCE: { + playlistv0alpha1.RESOURCEGROUP: { DualWriterMode: grafanarest.Mode3, }, }, @@ -218,7 +218,7 @@ func TestIntegrationPlaylist(t *testing.T) { DisableAnonymous: true, APIServerStorageType: "etcd", // requires etcd running on localhost:2379 UnifiedStorageConfig: map[string]setting.UnifiedStorageConfig{ - playlistv0alpha1.GROUPRESOURCE: { + playlistv0alpha1.RESOURCEGROUP: { DualWriterMode: grafanarest.Mode0, }, }, @@ -250,7 +250,7 @@ func TestIntegrationPlaylist(t *testing.T) { featuremgmt.FlagKubernetesPlaylists, // Required so that legacy calls are also written }, UnifiedStorageConfig: map[string]setting.UnifiedStorageConfig{ - playlistv0alpha1.GROUPRESOURCE: { + playlistv0alpha1.RESOURCEGROUP: { DualWriterMode: grafanarest.Mode1, }, }, @@ -279,7 +279,7 @@ func TestIntegrationPlaylist(t *testing.T) { featuremgmt.FlagKubernetesPlaylists, // Required so that legacy calls are also written }, UnifiedStorageConfig: map[string]setting.UnifiedStorageConfig{ - playlistv0alpha1.GROUPRESOURCE: { + playlistv0alpha1.RESOURCEGROUP: { DualWriterMode: grafanarest.Mode2, }, }, @@ -308,7 +308,7 @@ func TestIntegrationPlaylist(t *testing.T) { featuremgmt.FlagKubernetesPlaylists, // Required so that legacy calls are also written }, UnifiedStorageConfig: map[string]setting.UnifiedStorageConfig{ - playlistv0alpha1.GROUPRESOURCE: { + playlistv0alpha1.RESOURCEGROUP: { DualWriterMode: grafanarest.Mode3, }, }, diff --git a/pkg/tsdb/tempo/trace_transform.go b/pkg/tsdb/tempo/trace_transform.go index 0c3bf0321c2..a7d0f3c2dea 100644 --- a/pkg/tsdb/tempo/trace_transform.go +++ b/pkg/tsdb/tempo/trace_transform.go @@ -22,6 +22,7 @@ type TraceLog struct { // Millisecond epoch time Timestamp float64 `json:"timestamp"` Fields []*KeyValue `json:"fields"` + Name string `json:"name,omitempty"` } type TraceReference struct { @@ -260,12 +261,6 @@ func spanEventsToLogs(events ptrace.SpanEventSlice) []*TraceLog { for i := 0; i < events.Len(); i++ { event := events.At(i) fields := make([]*KeyValue, 0, event.Attributes().Len()+1) - if event.Name() != "" { - fields = append(fields, &KeyValue{ - Key: TagMessage, - Value: event.Name(), - }) - } event.Attributes().Range(func(key string, attr pcommon.Value) bool { fields = append(fields, &KeyValue{Key: key, Value: getAttributeVal(attr)}) return true @@ -273,6 +268,7 @@ func spanEventsToLogs(events ptrace.SpanEventSlice) []*TraceLog { logs = append(logs, &TraceLog{ Timestamp: float64(event.Timestamp()) / 1_000_000, Fields: fields, + Name: event.Name(), }) } diff --git a/pkg/tsdb/tempo/trace_transform_test.go b/pkg/tsdb/tempo/trace_transform_test.go index 8b901c6c41c..8253220655a 100644 --- a/pkg/tsdb/tempo/trace_transform_test.go +++ b/pkg/tsdb/tempo/trace_transform_test.go @@ -9,6 +9,7 @@ import ( "go.opentelemetry.io/collector/pdata/ptrace" "github.com/grafana/grafana-plugin-sdk-go/data" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -57,7 +58,30 @@ func TestTraceToFrame(t *testing.T) { require.Equal(t, json.RawMessage("[{\"value\":\"loki-all\",\"key\":\"service.name\"},{\"value\":\"Jaeger-Go-2.25.0\",\"key\":\"opencensus.exporterversion\"},{\"value\":\"4d019a031941\",\"key\":\"host.hostname\"},{\"value\":\"172.18.0.6\",\"key\":\"ip\"},{\"value\":\"4b19ace06df8e4de\",\"key\":\"client-uuid\"}]"), span["serviceTags"]) require.Equal(t, 1616072924072.852, span["startTime"]) require.Equal(t, 0.094, span["duration"]) - require.Equal(t, "[{\"timestamp\":1616072924072.856,\"fields\":[{\"value\":\"test event\",\"key\":\"message\"},{\"value\":1,\"key\":\"chunks requested\"}]},{\"timestamp\":1616072924072.9448,\"fields\":[{\"value\":1,\"key\":\"chunks fetched\"}]}]", string(span["logs"].(json.RawMessage))) + expectedLogs := ` + [ + { + "timestamp": 1616072924072.856, + "name": "test event", + "fields": [ + { + "value": 1, + "key": "chunks requested" + } + ] + }, + { + "timestamp": 1616072924072.9448, + "fields": [ + { + "value": 1, + "key": "chunks fetched" + } + ] + } + ] + ` + assert.JSONEq(t, expectedLogs, string(span["logs"].(json.RawMessage))) }) t.Run("should transform correct traceID", func(t *testing.T) { diff --git a/public/api-enterprise-spec.json b/public/api-enterprise-spec.json index 06396ffc779..cfcba3e9b58 100644 --- a/public/api-enterprise-spec.json +++ b/public/api-enterprise-spec.json @@ -9439,6 +9439,12 @@ } } }, + "goneError": { + "description": "GoneError is returned when the requested endpoint was removed.", + "schema": { + "$ref": "#/definitions/ErrorResponseBody" + } + }, "helpFlagResponse": { "description": "", "schema": { @@ -9623,12 +9629,6 @@ "$ref": "#/definitions/SuccessResponseBody" } }, - "postAPIkeyResponse": { - "description": "", - "schema": { - "$ref": "#/definitions/NewApiKeyResult" - } - }, "postAnnotationResponse": { "description": "", "schema": { diff --git a/public/api-merged.json b/public/api-merged.json index 8d6476bd4d8..2c9c7078edd 100644 --- a/public/api-merged.json +++ b/public/api-merged.json @@ -2226,8 +2226,8 @@ "operationId": "addAPIkey", "deprecated": true, "responses": { - "301": { - "$ref": "#/responses/statusMovedPermanently" + "410": { + "$ref": "#/responses/goneError" } } } @@ -23806,6 +23806,12 @@ } } }, + "goneError": { + "description": "GoneError is returned when the requested endpoint was removed.", + "schema": { + "$ref": "#/definitions/ErrorResponseBody" + } + }, "helpFlagResponse": { "description": "(empty)", "schema": { @@ -23990,12 +23996,6 @@ "$ref": "#/definitions/SuccessResponseBody" } }, - "postAPIkeyResponse": { - "description": "(empty)", - "schema": { - "$ref": "#/definitions/NewApiKeyResult" - } - }, "postAnnotationResponse": { "description": "(empty)", "schema": { diff --git a/public/app/app.ts b/public/app/app.ts index 6e6141e0d86..bc5dd608787 100644 --- a/public/app/app.ts +++ b/public/app/app.ts @@ -6,8 +6,6 @@ import 'file-saver'; import 'jquery'; import 'vendor/bootstrap/bootstrap'; -import 'app/features/all'; - import _ from 'lodash'; // eslint-disable-line lodash/import-scope import { createElement } from 'react'; import { createRoot } from 'react-dom/client'; diff --git a/public/app/features/admin/ldap/LdapDrawer.tsx b/public/app/features/admin/ldap/LdapDrawer.tsx index eec47a0100d..53e1eb6a96f 100644 --- a/public/app/features/admin/ldap/LdapDrawer.tsx +++ b/public/app/features/admin/ldap/LdapDrawer.tsx @@ -1,5 +1,5 @@ import { css } from '@emotion/css'; -import { useId } from 'react'; +import { Dispatch, SetStateAction, useEffect, useId, useState } from 'react'; import { useFormContext } from 'react-hook-form'; import { GrafanaTheme2, SelectableValue } from '@grafana/data'; @@ -12,25 +12,41 @@ import { Icon, Input, Label, + MultiSelect, Select, Stack, Switch, Text, TextLink, Tooltip, + RadioButtonGroup, + SecretInput, } from '@grafana/ui'; import { t, Trans } from 'app/core/internationalization'; -import { LdapPayload } from 'app/types'; +import { LdapPayload, MapKeyCertConfigured } from 'app/types'; interface Props { onClose: () => void; + mapKeyCertConfigured: MapKeyCertConfigured; + setMapKeyCertConfigured: Dispatch>; } +const serverConfig = 'settings.config.servers.0'; const tlsOptions: Array> = ['TLS1.2', 'TLS1.3'].map((v) => ({ label: v, value: v })); +enum EncryptionProvider { + Base64 = 'base64', + FilePath = 'path', +} + +export const LdapDrawerComponent = ({ + onClose, + mapKeyCertConfigured: mapCertConfigured, + setMapKeyCertConfigured: setMapCertConfigured, +}: Props) => { + const [encryptionProvider, setEncryptionProvider] = useState(EncryptionProvider.Base64); -export const LdapDrawerComponent = ({ onClose }: Props) => { const styles = useStyles2(getStyles); - const { register, setValue, watch } = useFormContext(); + const { getValues, register, setValue, watch } = useFormContext(); const nameId = useId(); const surnameId = useId(); @@ -38,6 +54,22 @@ export const LdapDrawerComponent = ({ onClose }: Props) => { const memberOfId = useId(); const emailId = useId(); + useEffect(() => { + const { client_cert, client_key, root_ca_cert } = getValues(serverConfig); + setEncryptionProvider( + !client_cert.length && !client_key.length && !root_ca_cert?.length + ? EncryptionProvider.Base64 + : EncryptionProvider.FilePath + ); + }, [getValues]); + + const renderMultiSelectLabel = (value: string) => { + if (value.length >= 5) { + return `${value.slice(0, 2)}...${value.slice(-2)}`; + } + return value; + }; + const groupMappingsLabel = (