mirror of https://github.com/grafana/grafana
Provisioning: Use repository view rather than raw config (#103449)
parent
8cd6f837a5
commit
8dbaeac9da
@ -1,7 +0,0 @@ |
|||||||
export { useCreateOrUpdateRepository } from './useCreateOrUpdateRepository'; |
|
||||||
export { useCreateOrUpdateRepositoryFile } from './useCreateOrUpdateRepositoryFile'; |
|
||||||
export { useGetResourceRepository } from './useGetResourceRepository'; |
|
||||||
export { useIsProvisionedNG } from './useIsProvisionedNG'; |
|
||||||
export { usePullRequestParam } from './usePullRequestParam'; |
|
||||||
export { useRepositoryJobs } from './useRepositoryJobs'; |
|
||||||
export { useRepositoryList } from './useRepositoryList'; |
|
@ -1,25 +0,0 @@ |
|||||||
import { skipToken } from '@reduxjs/toolkit/query/react'; |
|
||||||
|
|
||||||
import { useGetFolderQuery } from '../../../api/clients/folder'; |
|
||||||
import { AnnoKeyManagerIdentity } from '../../apiserver/types'; |
|
||||||
|
|
||||||
import { useRepositoryList } from './useRepositoryList'; |
|
||||||
|
|
||||||
interface GetResourceRepositoryArgs { |
|
||||||
name?: string; |
|
||||||
folderUid?: string; |
|
||||||
} |
|
||||||
|
|
||||||
export const useGetResourceRepository = ({ name, folderUid }: GetResourceRepositoryArgs) => { |
|
||||||
const [items, isLoading] = useRepositoryList(name || !folderUid ? skipToken : undefined); |
|
||||||
// Get the folder data from API to get the repository data for nested folders
|
|
||||||
const folderQuery = useGetFolderQuery(name || !folderUid ? skipToken : { name: folderUid }); |
|
||||||
|
|
||||||
const repoName = name || folderQuery.data?.metadata?.annotations?.[AnnoKeyManagerIdentity]; |
|
||||||
|
|
||||||
if (!items?.length || isLoading || !repoName) { |
|
||||||
return undefined; |
|
||||||
} |
|
||||||
|
|
||||||
return items.find((repo) => repo.metadata?.name === repoName); |
|
||||||
}; |
|
@ -0,0 +1,82 @@ |
|||||||
|
import { skipToken } from '@reduxjs/toolkit/query/react'; |
||||||
|
|
||||||
|
import { Folder, useGetFolderQuery } from 'app/api/clients/folder'; |
||||||
|
import { RepositoryView, useGetFrontendSettingsQuery } from 'app/api/clients/provisioning'; |
||||||
|
import { AnnoKeyManagerIdentity } from 'app/features/apiserver/types'; |
||||||
|
|
||||||
|
interface GetResourceRepositoryArgs { |
||||||
|
name?: string; // the repository name
|
||||||
|
folderName?: string; // folder we are targeting
|
||||||
|
} |
||||||
|
|
||||||
|
interface RepositoryViewData { |
||||||
|
repository?: RepositoryView; |
||||||
|
folder?: Folder; |
||||||
|
isLoading?: boolean; |
||||||
|
isInstanceManaged: boolean; |
||||||
|
} |
||||||
|
|
||||||
|
// This is safe to call as a viewer (you do not need full access to the Repository configs)
|
||||||
|
export const useGetResourceRepositoryView = ({ name, folderName }: GetResourceRepositoryArgs): RepositoryViewData => { |
||||||
|
const { data: settingsData, isLoading: isSettingsLoading } = useGetFrontendSettingsQuery(); |
||||||
|
const skipFolderQuery = name || !folderName; |
||||||
|
const { data: folder, isLoading: isFolderLoading } = useGetFolderQuery( |
||||||
|
skipFolderQuery ? skipToken : { name: folderName } |
||||||
|
); |
||||||
|
|
||||||
|
if (isSettingsLoading || isFolderLoading) { |
||||||
|
return { isLoading: true, isInstanceManaged: false }; |
||||||
|
} |
||||||
|
|
||||||
|
const items = settingsData?.items ?? []; |
||||||
|
|
||||||
|
if (!items.length) { |
||||||
|
return { folder, isInstanceManaged: false }; |
||||||
|
} |
||||||
|
|
||||||
|
const instanceRepo = items.find((repo) => repo.target === 'instance'); |
||||||
|
const isInstanceManaged = Boolean(instanceRepo); |
||||||
|
|
||||||
|
if (name) { |
||||||
|
const repository = items.find((repo) => repo.name === name); |
||||||
|
if (repository) { |
||||||
|
return { |
||||||
|
repository, |
||||||
|
folder, |
||||||
|
isInstanceManaged, |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Find the matching folder repository
|
||||||
|
if (folderName) { |
||||||
|
// For root values it will be the same
|
||||||
|
let repository = items.find((repo) => repo.name === folderName); |
||||||
|
if (repository) { |
||||||
|
return { |
||||||
|
repository, |
||||||
|
folder, |
||||||
|
isInstanceManaged, |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
// For nested folders we need to see what the folder thinks
|
||||||
|
const annotatedFolderName = folder?.metadata?.annotations?.[AnnoKeyManagerIdentity]; |
||||||
|
if (annotatedFolderName && name) { |
||||||
|
repository = items.find((repo) => repo.name === annotatedFolderName); |
||||||
|
if (repository) { |
||||||
|
return { |
||||||
|
repository, |
||||||
|
folder, |
||||||
|
isInstanceManaged, |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return { |
||||||
|
repository: instanceRepo, |
||||||
|
folder, |
||||||
|
isInstanceManaged, |
||||||
|
}; |
||||||
|
}; |
@ -1,23 +1,17 @@ |
|||||||
import { config } from '@grafana/runtime'; |
import { config } from '@grafana/runtime'; |
||||||
import { useGetFrontendSettingsQuery } from 'app/api/clients/provisioning'; |
|
||||||
|
|
||||||
import { DashboardScene } from '../../dashboard-scene/scene/DashboardScene'; |
import { DashboardScene } from '../../dashboard-scene/scene/DashboardScene'; |
||||||
|
|
||||||
import { useGetResourceRepository } from './useGetResourceRepository'; |
import { useGetResourceRepositoryView } from './useGetResourceRepositoryView'; |
||||||
|
|
||||||
export function useIsProvisionedNG(dashboard: DashboardScene): boolean { |
export function useIsProvisionedNG(dashboard: DashboardScene): boolean { |
||||||
const params = new URLSearchParams(window.location.search); |
const params = new URLSearchParams(window.location.search); |
||||||
const folderUid = params.get('folderUid') || undefined; |
const folderName = params.get('folderUid') || undefined; |
||||||
|
|
||||||
const folderRepository = useGetResourceRepository({ folderUid }); |
const { repository, isInstanceManaged } = useGetResourceRepositoryView({ folderName }); |
||||||
const { data } = useGetFrontendSettingsQuery(); |
|
||||||
|
|
||||||
if (!config.featureToggles.provisioning) { |
if (!config.featureToggles.provisioning) { |
||||||
return false; |
return false; |
||||||
} |
} |
||||||
return ( |
return dashboard.isManagedRepository() || Boolean(repository) || isInstanceManaged; |
||||||
dashboard.isManagedRepository() || |
|
||||||
Boolean(folderRepository) || |
|
||||||
Boolean(data?.items.some((item) => item.target === 'instance')) |
|
||||||
); |
|
||||||
} |
} |
||||||
|
Loading…
Reference in new issue