From 18a39137821928ed8c1afe4a7a1bd48c732a8765 Mon Sep 17 00:00:00 2001 From: Ryan McKinley Date: Tue, 8 Apr 2025 12:51:31 +0300 Subject: [PATCH] Provisioning: Fix updating a PR from the UI (#103571) Co-authored-by: Clarity-89 --- pkg/apis/provisioning/v0alpha1/jobs.go | 6 +++-- .../v0alpha1/zz_generated.openapi.go | 5 ++-- .../provisioning.grafana.app-v0alpha1.json | 1 + .../api/clients/provisioning/endpoints.gen.ts | 1 + .../provisioned/SaveProvisionedDashboard.tsx | 2 +- .../SaveProvisionedDashboardForm.tsx | 4 +++- .../saving/provisioned/defaults.ts | 23 +++++++++++-------- .../saving/provisioned/hooks.ts | 5 ++-- .../dashboard-scene/scene/DashboardScene.tsx | 2 +- .../provisioning/Wizard/WizardContent.tsx | 7 ++++-- 10 files changed, 36 insertions(+), 20 deletions(-) diff --git a/pkg/apis/provisioning/v0alpha1/jobs.go b/pkg/apis/provisioning/v0alpha1/jobs.go index 6e26014b38e..fd8c9b41993 100644 --- a/pkg/apis/provisioning/v0alpha1/jobs.go +++ b/pkg/apis/provisioning/v0alpha1/jobs.go @@ -105,8 +105,10 @@ type PullRequestJobOptions struct { Ref string `json:"ref,omitempty"` // Pull request number (when appropriate) - PR int `json:"pr,omitempty"` - Hash string `json:"hash,omitempty"` // used in PR code... not sure it is necessary + PR int `json:"pr,omitempty"` + + // The specific commit hash that triggered this notice + Hash string `json:"hash,omitempty"` // URL to the originator (eg, PR URL) URL string `json:"url,omitempty"` diff --git a/pkg/apis/provisioning/v0alpha1/zz_generated.openapi.go b/pkg/apis/provisioning/v0alpha1/zz_generated.openapi.go index 6ba43e4c752..5ac42032f63 100644 --- a/pkg/apis/provisioning/v0alpha1/zz_generated.openapi.go +++ b/pkg/apis/provisioning/v0alpha1/zz_generated.openapi.go @@ -937,8 +937,9 @@ func schema_pkg_apis_provisioning_v0alpha1_PullRequestJobOptions(ref common.Refe }, "hash": { SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", + Description: "The specific commit hash that triggered this notice", + Type: []string{"string"}, + Format: "", }, }, "url": { diff --git a/pkg/tests/apis/openapi_snapshots/provisioning.grafana.app-v0alpha1.json b/pkg/tests/apis/openapi_snapshots/provisioning.grafana.app-v0alpha1.json index 72fe571b23d..12bbee8bd6f 100644 --- a/pkg/tests/apis/openapi_snapshots/provisioning.grafana.app-v0alpha1.json +++ b/pkg/tests/apis/openapi_snapshots/provisioning.grafana.app-v0alpha1.json @@ -2989,6 +2989,7 @@ "type": "object", "properties": { "hash": { + "description": "The specific commit hash that triggered this notice", "type": "string" }, "pr": { diff --git a/public/app/api/clients/provisioning/endpoints.gen.ts b/public/app/api/clients/provisioning/endpoints.gen.ts index 90e9114c0cf..58fa48fb9f1 100644 --- a/public/app/api/clients/provisioning/endpoints.gen.ts +++ b/public/app/api/clients/provisioning/endpoints.gen.ts @@ -729,6 +729,7 @@ export type MigrateJobOptions = { history?: boolean; }; export type PullRequestJobOptions = { + /** The specific commit hash that triggered this notice */ hash?: string; /** Pull request number (when appropriate) */ pr?: number; diff --git a/public/app/features/dashboard-scene/saving/provisioned/SaveProvisionedDashboard.tsx b/public/app/features/dashboard-scene/saving/provisioned/SaveProvisionedDashboard.tsx index 4f475c6f3cf..7b117977207 100644 --- a/public/app/features/dashboard-scene/saving/provisioned/SaveProvisionedDashboard.tsx +++ b/public/app/features/dashboard-scene/saving/provisioned/SaveProvisionedDashboard.tsx @@ -19,7 +19,7 @@ export function SaveProvisionedDashboard({ drawer, changeInfo, dashboard }: Save const [params] = useUrlParams(); const loadedFromRef = params.get('ref') ?? undefined; - const defaultValues = useDefaultValues({ meta, defaultTitle, defaultDescription }); + const defaultValues = useDefaultValues({ meta, defaultTitle, defaultDescription, loadedFromRef }); if (!defaultValues) { return null; diff --git a/public/app/features/dashboard-scene/saving/provisioned/SaveProvisionedDashboardForm.tsx b/public/app/features/dashboard-scene/saving/provisioned/SaveProvisionedDashboardForm.tsx index 23c881b0204..0445c2162bb 100644 --- a/public/app/features/dashboard-scene/saving/provisioned/SaveProvisionedDashboardForm.tsx +++ b/public/app/features/dashboard-scene/saving/provisioned/SaveProvisionedDashboardForm.tsx @@ -82,7 +82,9 @@ export function SaveProvisionedDashboardForm({ if (request.isSuccess) { dashboard.setState({ isDirty: false }); - if (workflow === 'branch' && ref !== '' && path !== '') { + const { ref, path } = request.data; + + if (workflow === 'branch' && ref && path) { dashboard.closeModal(); panelEditor?.onDiscard(); // Redirect to the provisioning preview pages diff --git a/public/app/features/dashboard-scene/saving/provisioned/defaults.ts b/public/app/features/dashboard-scene/saving/provisioned/defaults.ts index 48afbfa0c07..6318ef49551 100644 --- a/public/app/features/dashboard-scene/saving/provisioned/defaults.ts +++ b/public/app/features/dashboard-scene/saving/provisioned/defaults.ts @@ -1,7 +1,9 @@ import { RepositoryView } from 'app/api/clients/provisioning'; -import { WorkflowOption } from 'app/features/provisioning/types'; -export function getDefaultWorkflow(config?: RepositoryView) { +export function getDefaultWorkflow(config?: RepositoryView, loadedFromRef?: string) { + if (loadedFromRef && loadedFromRef !== config?.branch) { + return 'write'; // use write when the value targets an explicit ref + } return config?.workflows?.[0]; } @@ -19,11 +21,14 @@ export function getWorkflowOptions(config?: RepositoryView, ref?: string) { ref = config.branch; } - const availableOptions: Array<{ label: string; value: WorkflowOption }> = [ - { label: ref ? `Push to ${ref}` : 'Save', value: 'write' }, - { label: 'Push to different branch', value: 'branch' }, - ]; - - // Filter options based on the workflows in the config - return availableOptions.filter((option) => config.workflows?.includes(option.value)); + // Return the workflows in the configured order + return config.workflows.map((value) => { + switch (value) { + case 'write': + return { label: ref ? `Push to ${ref}` : 'Save', value }; + case 'branch': + return { label: 'Push to a new branch', value }; + } + return { label: value, value }; + }); } diff --git a/public/app/features/dashboard-scene/saving/provisioned/hooks.ts b/public/app/features/dashboard-scene/saving/provisioned/hooks.ts index 61a2beea247..d5f249c045a 100644 --- a/public/app/features/dashboard-scene/saving/provisioned/hooks.ts +++ b/public/app/features/dashboard-scene/saving/provisioned/hooks.ts @@ -10,9 +10,10 @@ interface UseDefaultValuesParams { meta: DashboardMeta; defaultTitle: string; defaultDescription?: string; + loadedFromRef?: string; } -export function useDefaultValues({ meta, defaultTitle, defaultDescription }: UseDefaultValuesParams) { +export function useDefaultValues({ meta, defaultTitle, defaultDescription, loadedFromRef }: UseDefaultValuesParams) { const annotations = meta.k8s?.annotations; const managerKind = annotations?.[AnnoKeyManagerKind]; const managerIdentity = annotations?.[AnnoKeyManagerIdentity]; @@ -48,7 +49,7 @@ export function useDefaultValues({ meta, defaultTitle, defaultDescription }: Use }, title: defaultTitle, description: defaultDescription ?? '', - workflow: getDefaultWorkflow(repository), + workflow: getDefaultWorkflow(repository, loadedFromRef), }, isNew: !meta.k8s?.name, isGitHub: repository?.type === 'github', diff --git a/public/app/features/dashboard-scene/scene/DashboardScene.tsx b/public/app/features/dashboard-scene/scene/DashboardScene.tsx index b2e91341c82..4249beea712 100644 --- a/public/app/features/dashboard-scene/scene/DashboardScene.tsx +++ b/public/app/features/dashboard-scene/scene/DashboardScene.tsx @@ -772,7 +772,7 @@ export class DashboardScene extends SceneObjectBase impleme kind: 'Dashboard', metadata: { ...meta.k8s, - name: meta.uid, // ideally the name is preserved + name: meta.uid ?? meta.k8s?.name, generateName: options.isNew ? 'd' : undefined, }, spec, diff --git a/public/app/features/provisioning/Wizard/WizardContent.tsx b/public/app/features/provisioning/Wizard/WizardContent.tsx index f79f7a58def..79773d721e0 100644 --- a/public/app/features/provisioning/Wizard/WizardContent.tsx +++ b/public/app/features/provisioning/Wizard/WizardContent.tsx @@ -94,8 +94,11 @@ export function WizardContent({ const handleRepositoryDeletion = async (name: string) => { try { await deleteRepository({ name }); - // Wait before redirecting to ensure deletion is indexed - setTimeout(() => navigate(PROVISIONING_URL), 1500); + // Wait before redirecting to ensure deletion is processed + setTimeout(() => { + settingsQuery.refetch(); + navigate(PROVISIONING_URL); + }, 1500); } catch (error) { setIsCancelling(false); }