Skip to content

Commit

Permalink
Merge pull request #7070 from jeff-phillips-18/pods-load-pods-overview
Browse files Browse the repository at this point in the history
Fetch pods when displaying pods resources in overview pages
  • Loading branch information
openshift-merge-robot committed Nov 5, 2020
2 parents 1ae6aea + 1a492f0 commit 4388694
Show file tree
Hide file tree
Showing 20 changed files with 718 additions and 146 deletions.
1 change: 1 addition & 0 deletions frontend/packages/console-shared/src/hooks/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ export * from './scroll';
export * from './plugins-overview-tab-section';
export * from './debounce';
export * from './select-list';
export * from './usePodsWatcher';
export * from './useQueryParams';
export * from './version';
export * from './csv-watch-hook';
Expand Down
42 changes: 42 additions & 0 deletions frontend/packages/console-shared/src/hooks/usePodsWatcher.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import * as React from 'react';
import { K8sResourceKind } from '@console/internal/module/k8s';
import { useK8sWatchResources } from '@console/internal/components/utils/k8s-watch-hook';
import { getPodsDataForResource, getResourcesToWatchForPods } from '../utils';
import { PodRCData } from '../types';

export const usePodsWatcher = (
resource: K8sResourceKind,
kind?: string,
namespace?: string,
): { loaded: boolean; loadError: string; podData: PodRCData } => {
const [loaded, setLoaded] = React.useState<boolean>(false);
const [loadError, setLoadError] = React.useState<string>('');
const [podData, setPodData] = React.useState<PodRCData>();
const watchKind = kind || resource.kind;
const watchNS = namespace || resource.metadata.namespace;
const watchedResources = React.useMemo(() => getResourcesToWatchForPods(watchKind, watchNS), [
watchKind,
watchNS,
]);

const resources = useK8sWatchResources(watchedResources);

React.useEffect(() => {
const errorKey = Object.keys(resources).find((key) => resources[key].loadError);
if (errorKey) {
setLoadError(resources[errorKey].loadError);
return;
}
setLoadError('');
if (
Object.keys(resources).length > 0 &&
Object.keys(resources).every((key) => resources[key].loaded)
) {
const updatedPods = getPodsDataForResource(resource, watchKind, resources);
setPodData(updatedPods);
setLoaded(true);
}
}, [watchKind, resource, resources]);

return { loaded, loadError, podData };
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,273 @@
import * as _ from 'lodash';
import {
MockResources,
sampleCronJobs,
sampleDaemonSets,
sampleDeploymentConfigs,
sampleDeployments,
sampleStatefulSets,
} from '@console/dev-console/src/components/topology/__tests__/topology-test-data';
import {
getPodsForDeploymentConfig,
getPodsForDeployment,
getPodsForStatefulSet,
getPodsForDaemonSet,
getPodsForCronJob,
getPodsForDeploymentConfigs,
getPodsForDeployments,
getPodsForStatefulSets,
getPodsForDaemonSets,
getPodsForCronJobs,
} from '../pod-resource-utils';

let mockResources;

describe('getPodsFor...', () => {
beforeEach(() => {
mockResources = _.cloneDeep(MockResources);
});

it('should return pods and replication controllers for a given DeploymentConfig', () => {
let podRCData = getPodsForDeploymentConfig(sampleDeploymentConfigs.data[0], mockResources);
expect(podRCData.pods).toHaveLength(1);
expect(podRCData.current).not.toBeNull();
expect(podRCData.previous).toBeFalsy();
expect(podRCData.isRollingOut).toBeFalsy();

podRCData = getPodsForDeploymentConfig(null, mockResources);
expect(podRCData.pods).toHaveLength(0);

mockResources.replicationControllers = { loaded: false, loadError: 'error', data: [] };
podRCData = getPodsForDeploymentConfig(sampleDeploymentConfigs.data[0], mockResources);
expect(podRCData.pods).toHaveLength(0);

delete mockResources.replicationControllers;
podRCData = getPodsForDeploymentConfig(sampleDeploymentConfigs.data[0], mockResources);
expect(podRCData.pods).toHaveLength(0);
});

it('should return pods for a given Deployment', () => {
let podRCData = getPodsForDeployment(sampleDeployments.data[0], mockResources);
expect(podRCData.pods).toHaveLength(3);
expect(podRCData.current).not.toBeNull();
expect(podRCData.previous).toBeFalsy();
expect(podRCData.isRollingOut).toBeFalsy();

podRCData = getPodsForDeployment(null, mockResources);
expect(podRCData.pods).toHaveLength(0);

podRCData = getPodsForDeployment(null, mockResources);
expect(podRCData.pods).toHaveLength(0);

mockResources.replicaSets = { loaded: false, loadError: 'error', data: [] };
podRCData = getPodsForDeployment(sampleDeployments.data[0], mockResources);
expect(podRCData.pods).toHaveLength(0);

delete mockResources.replicaSets;
podRCData = getPodsForDeployment(sampleDeployments.data[0], mockResources);
expect(podRCData.pods).toHaveLength(0);
});

it('should return pods for a given StatefulSet', () => {
let podRCData = getPodsForStatefulSet(sampleStatefulSets.data[0], mockResources);
expect(podRCData.pods).toHaveLength(1);
expect(podRCData.current).not.toBeNull();
expect(podRCData.previous).toBeFalsy();
expect(podRCData.isRollingOut).toBeFalsy();

podRCData = getPodsForStatefulSet(null, mockResources);
expect(podRCData.pods).toHaveLength(0);

podRCData = getPodsForStatefulSet(null, mockResources);
expect(podRCData.pods).toHaveLength(0);

mockResources.statefulSets = { loaded: false, loadError: 'error', data: [] };
podRCData = getPodsForStatefulSet(sampleStatefulSets.data[0], mockResources);
expect(podRCData.pods).toHaveLength(0);

delete mockResources.statefulSets;
podRCData = getPodsForStatefulSet(sampleStatefulSets.data[0], mockResources);
expect(podRCData.pods).toHaveLength(0);
});

it('should return pods for a given DaemonSet', () => {
let podRCData = getPodsForDaemonSet(sampleDaemonSets.data[0], mockResources);
expect(podRCData.pods).toHaveLength(1);
expect(podRCData.current).not.toBeNull();
expect(podRCData.previous).toBeFalsy();
expect(podRCData.isRollingOut).toBeFalsy();

podRCData = getPodsForDaemonSet(null, mockResources);
expect(podRCData.pods).toHaveLength(0);

podRCData = getPodsForDaemonSet(null, mockResources);
expect(podRCData.pods).toHaveLength(0);

mockResources.pods = { loaded: false, loadError: 'error', data: [] };
podRCData = getPodsForDaemonSet(sampleDaemonSets.data[0], mockResources);
expect(podRCData.pods).toHaveLength(0);

delete mockResources.pods;
podRCData = getPodsForDaemonSet(sampleDaemonSets.data[0], mockResources);
expect(podRCData.pods).toHaveLength(0);
});

it('should return pods for a given CronJob', () => {
let podRCData = getPodsForCronJob(sampleCronJobs.data[0], mockResources);
expect(podRCData.pods).toHaveLength(2);
expect(podRCData.current).not.toBeNull();
expect(podRCData.previous).toBeFalsy();
expect(podRCData.isRollingOut).toBeFalsy();

podRCData = getPodsForCronJob(null, mockResources);
expect(podRCData.pods).toHaveLength(0);

podRCData = getPodsForCronJob(null, mockResources);
expect(podRCData.pods).toHaveLength(0);

mockResources.jobs = { loaded: false, loadError: 'error', data: [] };
podRCData = getPodsForCronJob(sampleCronJobs.data[0], mockResources);
expect(podRCData.pods).toHaveLength(0);

delete mockResources.jobs;
podRCData = getPodsForCronJob(sampleCronJobs.data[0], mockResources);
expect(podRCData.pods).toHaveLength(0);
});

it('should return pods and replication controllers for a set of DeploymentConfigs', () => {
let podRCDataArray = getPodsForDeploymentConfigs(sampleDeploymentConfigs.data, mockResources);
expect(podRCDataArray).toHaveLength(2);
expect(podRCDataArray[0].pods).toHaveLength(1);
expect(podRCDataArray[0].current).not.toBeNull();
expect(podRCDataArray[0].previous).toBeFalsy();
expect(podRCDataArray[0].isRollingOut).toBeFalsy();
expect(podRCDataArray[1].pods).toHaveLength(0);

podRCDataArray = getPodsForDeploymentConfigs([], mockResources);
expect(podRCDataArray).toHaveLength(0);

podRCDataArray = getPodsForDeploymentConfigs(null, mockResources);
expect(podRCDataArray).toHaveLength(0);

mockResources.replicationControllers = { loaded: false, loadError: 'error', data: [] };
podRCDataArray = getPodsForDeploymentConfigs(sampleDeploymentConfigs.data, mockResources);
expect(podRCDataArray).toHaveLength(2);
expect(podRCDataArray[0].pods).toHaveLength(0);
expect(podRCDataArray[1].pods).toHaveLength(0);

delete mockResources.replicationControllers;
podRCDataArray = getPodsForDeploymentConfigs(sampleDeploymentConfigs.data, mockResources);
expect(podRCDataArray).toHaveLength(2);
expect(podRCDataArray[0].pods).toHaveLength(0);
expect(podRCDataArray[1].pods).toHaveLength(0);
});

it('should return pods for a given Deployment', () => {
let podRCDataArray = getPodsForDeployments(sampleDeployments.data, mockResources);
expect(podRCDataArray).toHaveLength(3);
expect(podRCDataArray[0].pods).toHaveLength(3);
expect(podRCDataArray[0].current).not.toBeNull();
expect(podRCDataArray[0].previous).toBeFalsy();
expect(podRCDataArray[0].isRollingOut).toBeFalsy();
expect(podRCDataArray[1].pods).toHaveLength(3);
expect(podRCDataArray[1].current).not.toBeNull();
expect(podRCDataArray[1].previous).toBeFalsy();
expect(podRCDataArray[1].isRollingOut).toBeFalsy();
expect(podRCDataArray[2].pods).toHaveLength(0);

podRCDataArray = getPodsForDeployments([], mockResources);
expect(podRCDataArray).toHaveLength(0);

podRCDataArray = getPodsForDeployments(null, mockResources);
expect(podRCDataArray).toHaveLength(0);

mockResources.replicaSets = { loaded: false, loadError: 'error', data: [] };
podRCDataArray = getPodsForDeployments(sampleDeployments.data, mockResources);
expect(podRCDataArray).toHaveLength(3);
expect(podRCDataArray[0].pods).toHaveLength(0);
expect(podRCDataArray[1].pods).toHaveLength(0);
expect(podRCDataArray[2].pods).toHaveLength(0);

delete mockResources.replicaSets;
podRCDataArray = getPodsForDeployments(sampleDeployments.data, mockResources);
expect(podRCDataArray).toHaveLength(3);
expect(podRCDataArray[0].pods).toHaveLength(0);
expect(podRCDataArray[1].pods).toHaveLength(0);
expect(podRCDataArray[2].pods).toHaveLength(0);
});

it('should return pods for a set of StatefulSets', () => {
let podRCDataArray = getPodsForStatefulSets(sampleStatefulSets.data, mockResources);
expect(podRCDataArray).toHaveLength(1);
expect(podRCDataArray[0].pods).toHaveLength(1);
expect(podRCDataArray[0].current).not.toBeNull();
expect(podRCDataArray[0].previous).toBeFalsy();
expect(podRCDataArray[0].isRollingOut).toBeFalsy();

podRCDataArray = getPodsForStatefulSets([], mockResources);
expect(podRCDataArray).toHaveLength(0);

podRCDataArray = getPodsForStatefulSets(null, mockResources);
expect(podRCDataArray).toHaveLength(0);

mockResources.statefulSets = { loaded: false, loadError: 'error', data: [] };
podRCDataArray = getPodsForStatefulSets(sampleStatefulSets.data, mockResources);
expect(podRCDataArray).toHaveLength(1);
expect(podRCDataArray[0].pods).toHaveLength(0);

delete mockResources.statefulSets;
podRCDataArray = getPodsForStatefulSets(sampleStatefulSets.data, mockResources);
expect(podRCDataArray).toHaveLength(1);
expect(podRCDataArray[0].pods).toHaveLength(0);
});

it('should return pods for a set of DaemonSets', () => {
let podRCDataArray = getPodsForDaemonSets(sampleDaemonSets.data, mockResources);
expect(podRCDataArray).toHaveLength(1);
expect(podRCDataArray[0].pods).toHaveLength(1);
expect(podRCDataArray[0].current).not.toBeNull();
expect(podRCDataArray[0].previous).toBeFalsy();
expect(podRCDataArray[0].isRollingOut).toBeFalsy();

podRCDataArray = getPodsForDaemonSets([], mockResources);
expect(podRCDataArray).toHaveLength(0);

podRCDataArray = getPodsForDaemonSets(null, mockResources);
expect(podRCDataArray).toHaveLength(0);

mockResources.pods = { loaded: false, loadError: 'error', data: [] };
podRCDataArray = getPodsForDaemonSets(sampleDaemonSets.data, mockResources);
expect(podRCDataArray).toHaveLength(1);
expect(podRCDataArray[0].pods).toHaveLength(0);

delete mockResources.pods;
podRCDataArray = getPodsForDaemonSets(sampleDaemonSets.data, mockResources);
expect(podRCDataArray).toHaveLength(1);
expect(podRCDataArray[0].pods).toHaveLength(0);
});

it('should return pods for a set of CronJobs', () => {
let podRCDataArray = getPodsForCronJobs(sampleCronJobs.data, mockResources);
expect(podRCDataArray).toHaveLength(1);
expect(podRCDataArray[0].pods).toHaveLength(2);
expect(podRCDataArray[0].current).not.toBeNull();
expect(podRCDataArray[0].previous).toBeFalsy();
expect(podRCDataArray[0].isRollingOut).toBeFalsy();

podRCDataArray = getPodsForCronJobs([], mockResources);
expect(podRCDataArray).toHaveLength(0);

podRCDataArray = getPodsForCronJobs(null, mockResources);
expect(podRCDataArray).toHaveLength(0);

mockResources.jobs = { loaded: false, loadError: 'error', data: [] };
podRCDataArray = getPodsForCronJobs(sampleCronJobs.data, mockResources);
expect(podRCDataArray).toHaveLength(1);
expect(podRCDataArray[0].pods).toHaveLength(0);

delete mockResources.jobs;
podRCDataArray = getPodsForCronJobs(sampleCronJobs.data, mockResources);
expect(podRCDataArray).toHaveLength(1);
expect(podRCDataArray[0].pods).toHaveLength(0);
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,6 @@ import {
createOverviewItemsForType,
createPodItems,
createWorkloadItems,
getPodsForDeploymentConfigs,
getPodsForDeployments,
getWorkloadMonitoringAlerts,
} from '../resource-utils';
import { mockAlerts } from '../__mocks__/alerts-and-rules-data';
Expand Down Expand Up @@ -91,7 +89,6 @@ const podKeys = [Keys.ALERTS, Keys.OBJ, Keys.ROUTES, Keys.SERVICE, Keys.STATUS];
const dsAndSSKeys = [...podKeys, Keys.BC, Keys.PODS];
const dcKeys = [...dsAndSSKeys, Keys.CURRENT, Keys.ROLLINGOUT, Keys.PREVIOUS];
const knativeKeys = [...dcKeys, Keys.REVISIONS, Keys.KNATIVECONFIGS, Keys.KSROUTES];
const podRCKeys = [Keys.OBJ, Keys.CURRENT, Keys.PREVIOUS, Keys.PODS, Keys.ROLLINGOUT];

describe('TransformResourceData', () => {
it('should create Deployment config Items for a provided dc', () => {
Expand Down Expand Up @@ -195,22 +192,6 @@ describe('TransformResourceData', () => {
expect(transformedData[0][Keys.BC]).toHaveLength(0);
});

it('should return pods and replication controllers for a given DeploymentConfig', () => {
const transformedData = getPodsForDeploymentConfigs(
sampleDeploymentConfigs.data,
MockResources,
);
expect(transformedData).toHaveLength(2);
expect(transformedData[0]).toHaveProperties(podRCKeys);
});

it('should return pods and replication controllers for a given DeploymentConfig', () => {
const transformedData = getPodsForDeployments(sampleDeployments.data, MockResources);
expect(transformedData).toHaveLength(3);
expect(transformedData[0]).toHaveProperties(podRCKeys);
expect(transformedData[1]).toHaveProperties(podRCKeys);
});

it('should return only pods and not replication controllers for a given resource', () => {
const transformedData = createPodItems(MockResources.pods.data, MockResources);
transformedData.forEach((element) => {
Expand Down
1 change: 1 addition & 0 deletions frontend/packages/console-shared/src/utils/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ export * from './grammar';
export * from './utils';
export * from './pod-utils';
export * from './pod-ring-utils';
export * from './pod-resource-utils';
export * from './resource-utils';
export * from './validation';
export * from './table-utils';
Expand Down

0 comments on commit 4388694

Please sign in to comment.