Skip to content

Commit

Permalink
Add replicas info on StatefulSet Overview
Browse files Browse the repository at this point in the history
  • Loading branch information
cyril-ui-developer committed Mar 2, 2020
1 parent 3babb1f commit e81ef19
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,13 @@ const PodRingController: React.FC<PodRingDataControllerProps> = ({ namespace, ki
namespace,
prop: 'deploymentConfigs',
});
} else if (kind === 'StatefulSet') {
resources.push({
isList: true,
kind: 'StatefulSet',
namespace,
prop: 'statefulSets',
});
}

return (
Expand Down
31 changes: 20 additions & 11 deletions frontend/packages/console-shared/src/utils/pod-ring-utils.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import * as React from 'react';
import * as _ from 'lodash';
import { DeploymentConfigModel, DeploymentModel } from '@console/internal/models';
import { DeploymentConfigModel, DeploymentModel, StatefulSetModel } from '@console/internal/models';
import { ChartLabel } from '@patternfly/react-charts';
import {
K8sResourceKind,
Expand Down Expand Up @@ -48,16 +48,20 @@ export const podRingLabel = (
status,
kind,
} = obj;
const { availableReplicas } = status || {};
const { availableReplicas, updatedReplicas } = status || {};

const isPending = (pods?.length === 1 && pods[0].status?.phase === 'Pending') || replicas;
const pluralize = replicas > 1 || replicas === 0 ? 'pods' : 'pod';
const knativeSubtitle = canScale ? '' : 'to 0';
const scalingSubtitle = !replicas ? knativeSubtitle : `scaling to ${replicas}`;
const title = availableReplicas || (isPending ? '0' : canScale ? 'Scaled to 0' : 'Autoscaled');
const subTitle = replicas !== availableReplicas ? scalingSubtitle : pluralize;
const title =
availableReplicas ||
updatedReplicas ||
(isPending ? '0' : canScale ? 'Scaled to 0' : 'Autoscaled');
const subTitle =
replicas !== (availableReplicas || updatedReplicas) ? scalingSubtitle : pluralize;
const titleComponent =
!availableReplicas && !isPending
(!availableReplicas || !updatedReplicas) && !isPending
? React.createElement(ChartLabel, { style: { fontSize: '14px' } })
: undefined;
const subTitleComponent =
Expand Down Expand Up @@ -100,23 +104,24 @@ export const usePodScalingAccessStatus = (
};

export const transformPodRingData = (resources: PodRingResources, kind: string): PodRingData => {
const deploymentKinds = {
const resourceKinds = {
[DeploymentModel.kind]: 'deployments',
[DeploymentConfigModel.kind]: 'deploymentConfigs',
[StatefulSetModel.kind]: 'statefulSets',
};

const targetDeployment = deploymentKinds[kind];
const targetResource = resourceKinds[kind];
const transformResourceData = new TransformResourceData(resources);

if (!targetDeployment) {
throw new Error(`Invalid target deployment resource: (${targetDeployment})`);
if (!targetResource) {
throw new Error(`Invalid target deployment resource: (${targetResource})`);
}
if (_.isEmpty(resources[targetDeployment].data)) {
if (_.isEmpty(resources[targetResource].data)) {
return {};
}

const podsData: PodRingData = {};
const resourceData = resources[targetDeployment].data;
const resourceData = resources[targetResource].data;

if (kind === DeploymentConfigModel.kind) {
return transformResourceData
Expand All @@ -127,5 +132,9 @@ export const transformPodRingData = (resources: PodRingResources, kind: string):
if (kind === DeploymentModel.kind) {
return transformResourceData.getPodsForDeployments(resourceData).reduce(applyPods, podsData);
}

if (kind === StatefulSetModel.kind) {
return transformResourceData.getPodsForStatefuls(resourceData).reduce(applyPods, podsData);
}
return podsData;
};
43 changes: 39 additions & 4 deletions frontend/packages/console-shared/src/utils/resource-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
RouteKind,
apiVersionForModel,
referenceForModel,
K8sKind,
} from '@console/internal/module/k8s';
import {
DeploymentConfigModel,
Expand Down Expand Up @@ -527,11 +528,11 @@ export class TransformResourceData {
};
};

toReplicaSetItem = (rs: K8sResourceKind): PodControllerOverviewItem => {
toResourceItem = (rs: K8sResourceKind, model: K8sKind): PodControllerOverviewItem => {
const obj = {
...rs,
apiVersion: apiVersionForModel(ReplicaSetModel),
kind: ReplicaSetModel.kind,
apiVersion: apiVersionForModel(model),
kind: `${model.kind}`,
};
const isKnative = isKnativeServing(rs, 'metadata.labels');
const podData = this.getPodsForResource(rs);
Expand All @@ -555,10 +556,23 @@ export class TransformResourceData {
);
};

getActiveStatefulSets = (ss: K8sResourceKind): K8sResourceKind[] => {
const { statefulSets } = this.resources;
const ownedRS = _.filter(statefulSets?.data, (f) => f.metadata.name === ss.metadata.name);
return _.filter(ownedRS, (rs) => _.get(rs, 'status.replicas'));
};

public getReplicaSetsForResource = (deployment: K8sResourceKind): PodControllerOverviewItem[] => {
const replicaSets = this.getActiveReplicaSets(deployment);
return sortReplicaSetsByRevision(replicaSets).map((rs) =>
getIdledStatus(this.toReplicaSetItem(rs), deployment),
getIdledStatus(this.toResourceItem(rs, ReplicaSetModel), deployment),
);
};

public getStatefulSetsForResource = (ss: K8sResourceKind): PodControllerOverviewItem[] => {
const podStatefulSets = this.getActiveStatefulSets(ss);
return podStatefulSets.map((pss) =>
getIdledStatus(this.toResourceItem(pss, StatefulSetModel), ss),
);
};

Expand Down Expand Up @@ -898,4 +912,25 @@ export class TransformResourceData {
};
});
};

public getPodsForStatefuls = (ss: K8sResourceKind[]): PodRCData[] => {
return _.map(ss, (s) => {
const obj: K8sResourceKind = {
...s,
apiVersion: apiVersionForModel(StatefulSetModel),
kind: StatefulSetModel.kind,
};
const statefulSets = this.getStatefulSetsForResource(obj);
const [current, previous] = statefulSets;
const isRollingOut = !!current && !!previous;

return {
obj,
current,
previous,
isRollingOut,
pods: [..._.get(current, 'pods', []), ..._.get(previous, 'pods', [])],
};
});
};
}
20 changes: 20 additions & 0 deletions frontend/public/components/stateful-set.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,12 @@ import {
ResourceSummary,
SectionHeading,
navFactory,
LoadingInline,
} from './utils';
import { VolumesTable } from './volumes-table';
import { StatefulSetModel } from '../models';
import PodRingSet from '@console/shared/src/components/pod/PodRingSet';
import { PodRingController } from '@console/shared';

const { AddStorage, common } = Kebab.factory;
export const menuActions: KebabAction[] = [
Expand Down Expand Up @@ -60,6 +63,23 @@ const StatefulSetDetails: React.FC<StatefulSetDetailsProps> = ({ obj: ss }) => (
<>
<div className="co-m-pane__body">
<SectionHeading text="StatefulSet Details" />
<PodRingController
namespace={ss.metadata.namespace}
kind={ss.kind}
render={(d) => {
return d.loaded ? (
<PodRingSet
key={ss.metadata.uid}
podData={d.data[ss.metadata.uid]}
obj={ss}
resourceKind={StatefulSetModel}
path="/spec/replicas"
/>
) : (
<LoadingInline />
);
}}
/>
<ResourceSummary resource={ss} showPodSelector showNodeSelector showTolerations />
</div>
<div className="co-m-pane__body">
Expand Down

0 comments on commit e81ef19

Please sign in to comment.