Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 862a80c69b | |||
| 5b5956574f |
@@ -9,6 +9,8 @@ import { withUserProvider } from '@/react/test-utils/withUserProvider';
|
|||||||
import { http, server } from '@/setup-tests/server';
|
import { http, server } from '@/setup-tests/server';
|
||||||
import { createMockEnvironment } from '@/react-tools/test-mocks';
|
import { createMockEnvironment } from '@/react-tools/test-mocks';
|
||||||
import { usePersistentVolumeClaims } from '@/react/kubernetes/volumes/queries/usePersistentVolumeClaims';
|
import { usePersistentVolumeClaims } from '@/react/kubernetes/volumes/queries/usePersistentVolumeClaims';
|
||||||
|
import { useNamespacesQuery } from '@/react/kubernetes/namespaces/queries/useNamespacesQuery';
|
||||||
|
import type { PortainerNamespace } from '@/react/kubernetes/namespaces/types';
|
||||||
|
|
||||||
import { PersistentVolumeClaimsDatatable } from './PersistentVolumeClaimsDatatable';
|
import { PersistentVolumeClaimsDatatable } from './PersistentVolumeClaimsDatatable';
|
||||||
import type { PersistentVolumeClaim } from './types';
|
import type { PersistentVolumeClaim } from './types';
|
||||||
@@ -33,6 +35,10 @@ vi.mock(
|
|||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
|
vi.mock('@/react/kubernetes/namespaces/queries/useNamespacesQuery', () => ({
|
||||||
|
useNamespacesQuery: vi.fn(),
|
||||||
|
}));
|
||||||
|
|
||||||
vi.mock('@/react/kubernetes/volumes/ListView/ResizeClaimEditForm', () => ({
|
vi.mock('@/react/kubernetes/volumes/ListView/ResizeClaimEditForm', () => ({
|
||||||
ResizeClaimEditForm: ({ claim }: { claim: PersistentVolumeClaim }) => (
|
ResizeClaimEditForm: ({ claim }: { claim: PersistentVolumeClaim }) => (
|
||||||
<div data-cy="resize-form">Resize form for {claim.name}</div>
|
<div data-cy="resize-form">Resize form for {claim.name}</div>
|
||||||
@@ -84,6 +90,11 @@ const mockPVCs: PersistentVolumeClaim[] = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const mockNamespaces = [
|
||||||
|
{ Name: 'default', IsSystem: false },
|
||||||
|
{ Name: 'kube-system', IsSystem: true },
|
||||||
|
] as PortainerNamespace[];
|
||||||
|
|
||||||
function renderComponent() {
|
function renderComponent() {
|
||||||
server.use(
|
server.use(
|
||||||
http.get('/api/endpoints/:endpointId', () =>
|
http.get('/api/endpoints/:endpointId', () =>
|
||||||
@@ -100,11 +111,19 @@ function renderComponent() {
|
|||||||
|
|
||||||
describe('PersistentVolumeClaimsDatatable', () => {
|
describe('PersistentVolumeClaimsDatatable', () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
|
localStorage.clear();
|
||||||
mockUseEnvironmentId.mockReturnValue(3);
|
mockUseEnvironmentId.mockReturnValue(3);
|
||||||
vi.mocked(usePersistentVolumeClaims).mockReturnValue({
|
vi.mocked(usePersistentVolumeClaims).mockImplementation(
|
||||||
data: mockPVCs,
|
(_envId, options) =>
|
||||||
|
({
|
||||||
|
data: options?.select ? options.select(mockPVCs) : mockPVCs,
|
||||||
|
isLoading: false,
|
||||||
|
}) as ReturnType<typeof usePersistentVolumeClaims>
|
||||||
|
);
|
||||||
|
vi.mocked(useNamespacesQuery).mockReturnValue({
|
||||||
|
data: [],
|
||||||
isLoading: false,
|
isLoading: false,
|
||||||
} as ReturnType<typeof usePersistentVolumeClaims>);
|
} as ReturnType<typeof useNamespacesQuery>);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('renders the datatable with PVC names and title', async () => {
|
it('renders the datatable with PVC names and title', async () => {
|
||||||
@@ -116,10 +135,15 @@ describe('PersistentVolumeClaimsDatatable', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('shows an empty table when there are no PVCs', async () => {
|
it('shows an empty table when there are no PVCs', async () => {
|
||||||
vi.mocked(usePersistentVolumeClaims).mockReturnValue({
|
vi.mocked(usePersistentVolumeClaims).mockImplementation(
|
||||||
data: [] as PersistentVolumeClaim[],
|
(_envId, options) =>
|
||||||
isLoading: false,
|
({
|
||||||
} as ReturnType<typeof usePersistentVolumeClaims>);
|
data: options?.select
|
||||||
|
? options.select([] as PersistentVolumeClaim[])
|
||||||
|
: [],
|
||||||
|
isLoading: false,
|
||||||
|
}) as ReturnType<typeof usePersistentVolumeClaims>
|
||||||
|
);
|
||||||
|
|
||||||
renderComponent();
|
renderComponent();
|
||||||
|
|
||||||
@@ -163,4 +187,32 @@ describe('PersistentVolumeClaimsDatatable', () => {
|
|||||||
|
|
||||||
expect(screen.queryByTestId('resize-form')).not.toBeInTheDocument();
|
expect(screen.queryByTestId('resize-form')).not.toBeInTheDocument();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('hides system namespace PVCs by default', async () => {
|
||||||
|
vi.mocked(useNamespacesQuery).mockReturnValue({
|
||||||
|
data: mockNamespaces,
|
||||||
|
isLoading: false,
|
||||||
|
} as ReturnType<typeof useNamespacesQuery>);
|
||||||
|
|
||||||
|
renderComponent();
|
||||||
|
|
||||||
|
expect(await screen.findByText('test-pvc-1')).toBeVisible();
|
||||||
|
expect(screen.queryByText('test-pvc-2')).not.toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('shows system namespace PVCs when showSystemResources is enabled', async () => {
|
||||||
|
localStorage.setItem(
|
||||||
|
'portainer.datatable_settings_kube-volumes-pvc',
|
||||||
|
JSON.stringify({ state: { showSystemResources: true }, version: 1 })
|
||||||
|
);
|
||||||
|
vi.mocked(useNamespacesQuery).mockReturnValue({
|
||||||
|
data: mockNamespaces,
|
||||||
|
isLoading: false,
|
||||||
|
} as ReturnType<typeof useNamespacesQuery>);
|
||||||
|
|
||||||
|
renderComponent();
|
||||||
|
|
||||||
|
expect(await screen.findByText('test-pvc-1')).toBeVisible();
|
||||||
|
expect(screen.getByText('test-pvc-2')).toBeVisible();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ import { useEnvironmentId } from '@/react/hooks/useEnvironmentId';
|
|||||||
import { usePersistentVolumeClaims } from '@/react/kubernetes/volumes/queries/usePersistentVolumeClaims';
|
import { usePersistentVolumeClaims } from '@/react/kubernetes/volumes/queries/usePersistentVolumeClaims';
|
||||||
import { useDeletePersistentVolumeClaims } from '@/react/kubernetes/volumes/queries/useDeletePersistentVolumeClaims';
|
import { useDeletePersistentVolumeClaims } from '@/react/kubernetes/volumes/queries/useDeletePersistentVolumeClaims';
|
||||||
import { ResizeClaimEditForm } from '@/react/kubernetes/volumes/ListView/ResizeClaimEditForm';
|
import { ResizeClaimEditForm } from '@/react/kubernetes/volumes/ListView/ResizeClaimEditForm';
|
||||||
|
import { isSystemNamespace } from '@/react/kubernetes/namespaces/queries/useIsSystemNamespace';
|
||||||
|
import { useNamespacesQuery } from '@/react/kubernetes/namespaces/queries/useNamespacesQuery';
|
||||||
|
|
||||||
import { refreshableSettings } from '@@/datatables/types';
|
import { refreshableSettings } from '@@/datatables/types';
|
||||||
import { Datatable, TableSettingsMenu } from '@@/datatables';
|
import { Datatable, TableSettingsMenu } from '@@/datatables';
|
||||||
@@ -43,9 +45,12 @@ export function PersistentVolumeClaimsDatatable() {
|
|||||||
);
|
);
|
||||||
|
|
||||||
const envId = useEnvironmentId();
|
const envId = useEnvironmentId();
|
||||||
|
const namespacesQuery = useNamespacesQuery(envId);
|
||||||
|
const namespaces = namespacesQuery.data ?? [];
|
||||||
const deleteClaimsMutation = useDeletePersistentVolumeClaims(envId);
|
const deleteClaimsMutation = useDeletePersistentVolumeClaims(envId);
|
||||||
const claimsQuery = usePersistentVolumeClaims(envId, {
|
const claimsQuery = usePersistentVolumeClaims(envId, {
|
||||||
refetchInterval: tableState.autoRefreshRate * 1000,
|
refetchInterval: tableState.autoRefreshRate * 1000,
|
||||||
|
select: filterVolumeClaims,
|
||||||
});
|
});
|
||||||
const claims = claimsQuery.data ?? [];
|
const claims = claimsQuery.data ?? [];
|
||||||
const columns = createPersistentVolumeClaimsColumns((claim) =>
|
const columns = createPersistentVolumeClaimsColumns((claim) =>
|
||||||
@@ -98,4 +103,14 @@ export function PersistentVolumeClaimsDatatable() {
|
|||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
function filterVolumeClaims(
|
||||||
|
claims: PersistentVolumeClaim[]
|
||||||
|
): PersistentVolumeClaim[] {
|
||||||
|
return claims.filter(
|
||||||
|
(claim) =>
|
||||||
|
tableState.showSystemResources ||
|
||||||
|
!isSystemNamespace(claim.namespace, namespaces)
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,8 +20,6 @@ const (
|
|||||||
ClusterEtcdHealthyMetric = "portainer_edge_agent_etcd_healthy"
|
ClusterEtcdHealthyMetric = "portainer_edge_agent_etcd_healthy"
|
||||||
ClusterEtcdHealthValidMetric = "portainer_edge_agent_etcd_health_valid"
|
ClusterEtcdHealthValidMetric = "portainer_edge_agent_etcd_health_valid"
|
||||||
ClusterAPIServerTLSCertExpirySecondsMetric = "portainer_edge_agent_apiserver_tls_cert_expiry_seconds"
|
ClusterAPIServerTLSCertExpirySecondsMetric = "portainer_edge_agent_apiserver_tls_cert_expiry_seconds"
|
||||||
ClusterControlPlaneHealthyMetric = "portainer_edge_agent_control_plane_healthy"
|
|
||||||
ClusterControlPlaneHealthValidMetric = "portainer_edge_agent_control_plane_health_valid"
|
|
||||||
ClusterAPIServerHealthyMetric = "portainer_edge_agent_apiserver_healthy"
|
ClusterAPIServerHealthyMetric = "portainer_edge_agent_apiserver_healthy"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user