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 { useGetFrontendSettingsQuery } from 'app/api/clients/provisioning'; |
||||
|
||||
import { DashboardScene } from '../../dashboard-scene/scene/DashboardScene'; |
||||
|
||||
import { useGetResourceRepository } from './useGetResourceRepository'; |
||||
import { useGetResourceRepositoryView } from './useGetResourceRepositoryView'; |
||||
|
||||
export function useIsProvisionedNG(dashboard: DashboardScene): boolean { |
||||
const params = new URLSearchParams(window.location.search); |
||||
const folderUid = params.get('folderUid') || undefined; |
||||
const folderName = params.get('folderUid') || undefined; |
||||
|
||||
const folderRepository = useGetResourceRepository({ folderUid }); |
||||
const { data } = useGetFrontendSettingsQuery(); |
||||
const { repository, isInstanceManaged } = useGetResourceRepositoryView({ folderName }); |
||||
|
||||
if (!config.featureToggles.provisioning) { |
||||
return false; |
||||
} |
||||
return ( |
||||
dashboard.isManagedRepository() || |
||||
Boolean(folderRepository) || |
||||
Boolean(data?.items.some((item) => item.target === 'instance')) |
||||
); |
||||
return dashboard.isManagedRepository() || Boolean(repository) || isInstanceManaged; |
||||
} |
||||
|
Loading…
Reference in new issue