Skip to content

Commit

Permalink
Merge pull request #8880 from afreen23/master
Browse files Browse the repository at this point in the history
Bug 1957756: Fix key value in replacement object
  • Loading branch information
openshift-merge-robot committed May 14, 2021
2 parents b787990 + 55f1202 commit 5d9b4b8
Show file tree
Hide file tree
Showing 6 changed files with 62 additions and 25 deletions.
Expand Up @@ -48,6 +48,7 @@ import {
OCSColumnStateAction,
Status,
OCSDiskStatus,
ReplacementMap,
} from './state-reducer';
import { CEPH_STORAGE_NAMESPACE, OSD_DOWN_ALERT, OSD_DOWN_AND_OUT_ALERT } from '../../constants';

Expand Down Expand Up @@ -99,12 +100,17 @@ const diskRow: RowFunction<DiskMetadata, OCSMetadata> = ({
customData,
}) => {
const { ocsState, nodeName, dispatch } = customData;
const diskName = obj.path;
return (
<TableRow id={obj.deviceID} index={index} trKey={key} style={style}>
<TableData className={tableColumnClasses[0]}>{obj.path}</TableData>
<TableData className={tableColumnClasses[1]}>{obj.status.state}</TableData>
<OCSStatus ocsState={ocsState} diskName={diskName} className={tableColumnClasses[1]} />
<OCSStatus
ocsState={ocsState}
diskName={obj.path}
diskID={obj.deviceID}
diskSerial={obj.serial}
className={tableColumnClasses[1]}
/>
<TableData className={tableColumnClasses[2]}>{obj.type || '-'}</TableData>
<TableData className={cx(tableColumnClasses[3], 'co-break-word')}>
{obj.model || '-'}
Expand All @@ -114,8 +120,8 @@ const diskRow: RowFunction<DiskMetadata, OCSMetadata> = ({
</TableData>
<TableData className={tableColumnClasses[5]}>{obj.fstype || '-'}</TableData>
<OCSKebabOptions
disk={obj}
nodeName={nodeName}
diskName={diskName}
alertsMap={ocsState.alertsMap}
replacementMap={ocsState.replacementMap}
isRebalancing={ocsState.isRebalancing}
Expand Down Expand Up @@ -183,11 +189,16 @@ const OCSDisksList: React.FC<TableProps> = React.memo((props) => {
}

if (tiLoaded && !tiLoadError && tiData.length) {
const newData: OCSDiskList = tiData.reduce((data, ti) => {
const { disk, node, osd } = getAnnotations(ti) || {};
if (osd && disk && node === nodeName && ocsState.metricsMap?.[disk]?.osd === osd) {
data[disk] = {
osd,
const newData: ReplacementMap = tiData.reduce((data: ReplacementMap, ti) => {
const { devicePath, deviceID, deviceOsd, deviceNode, deviceSerial } =
getAnnotations(ti) || {};
if (devicePath && deviceOsd && deviceNode === nodeName) {
data[devicePath] = {
osd: deviceOsd,
disk: {
id: deviceID,
serial: deviceSerial,
},
status: getTiBasedStatus(ti.status.conditions?.[0].type),
};
}
Expand Down
Expand Up @@ -2,11 +2,12 @@ import * as React from 'react';
import { useTranslation } from 'react-i18next';
import { TableData } from '@console/internal/components/factory';
import { KebabOption, Kebab } from '@console/internal/components/utils';
import { DiskMetadata } from 'packages/local-storage-operator-plugin/src/components/disks-list/types';
import { OCSDiskList, OCSColumnStateAction } from './state-reducer';
import { diskReplacementModal } from '../modals/disk-replacement-modal';

export const OCSKebabOptions: React.FC<OCSKebabOptionsProps> = React.memo(
({ nodeName, diskName, alertsMap, replacementMap, isRebalancing, dispatch }) => {
({ nodeName, disk, alertsMap, replacementMap, isRebalancing, dispatch }) => {
const { t } = useTranslation();

const kebabOptions: KebabOption[] = [
Expand All @@ -16,7 +17,7 @@ export const OCSKebabOptions: React.FC<OCSKebabOptionsProps> = React.memo(
callback: () =>
diskReplacementModal({
nodeName,
diskName,
disk,
alertsMap,
replacementMap,
isRebalancing,
Expand All @@ -28,15 +29,15 @@ export const OCSKebabOptions: React.FC<OCSKebabOptionsProps> = React.memo(
return (
<TableData className={Kebab.columnClass}>
{/* Enables the options for the disk with failures */}
<Kebab options={kebabOptions} isDisabled={!alertsMap[diskName]} />
<Kebab options={kebabOptions} isDisabled={!alertsMap[disk.path]} />
</TableData>
);
},
);

type OCSKebabOptionsProps = {
disk: DiskMetadata;
nodeName: string;
diskName: string;
alertsMap: OCSDiskList;
replacementMap: OCSDiskList;
isRebalancing: boolean;
Expand Down
Expand Up @@ -71,15 +71,24 @@ const getOCSStatusBody = (
export const OCSStatus: React.FC<{
ocsState: OCSColumnState;
diskName: string;
diskID: string;
diskSerial: string;
className: string;
}> = React.memo(({ ocsState, className, diskName }) => {
}> = React.memo(({ ocsState, className, diskName, diskID, diskSerial }) => {
const { t } = useTranslation();

const { replacementMap, alertsMap, metricsMap } = ocsState;
const { id, serial } = replacementMap?.[diskName]?.disk || {};
let status: OCSDiskStatus;
if (replacementMap[diskName]) status = replacementMap[diskName].status;

// If device is already replaced then show the replacement status
if (replacementMap[diskName] && id === diskID && serial === diskSerial)
status = replacementMap[diskName].status;
// If device is failed then show the failure status
else if (alertsMap[diskName]) status = alertsMap[diskName].status;
// If device is neither failed nor replaced then show underlying osd status
else if (metricsMap[diskName]) status = metricsMap[diskName].status;

return (
<TableData className={className}>
{status ? getOCSStatusBody(status, diskName, t) : '-'}
Expand Down
Expand Up @@ -87,7 +87,16 @@ export type OCSColumnState = {
metricsMap: OCSDiskList;
alertsMap: OCSDiskList;
isRebalancing: boolean;
replacementMap: OCSDiskList;
replacementMap: ReplacementMap;
};

export type ReplacementMap = OCSDiskList & {
[diskName: string]: OCSDiskMetadata & {
disk: {
id: string;
serial: string;
};
};
};

export type OCSDiskList = {
Expand Down
Expand Up @@ -18,6 +18,7 @@ import {
SecretKind,
} from '@console/internal/module/k8s';
import { TemplateModel, TemplateInstanceModel, SecretModel } from '@console/internal/models';
import { DiskMetadata } from '@console/local-storage-operator-plugin/src/components/disks-list/types';
import { CEPH_STORAGE_NAMESPACE, OSD_REMOVAL_TEMPLATE, DASHBOARD_LINK } from '../../constants';
import {
OCSDiskList,
Expand Down Expand Up @@ -45,19 +46,23 @@ const createTemplateInstance = async (
parametersSecret: SecretKind,
template: TemplateKind,
osd: string,
disk: string,
nodeName: string,
disk: DiskMetadata,
) => {
const { path, deviceID, serial } = disk;
const templateInstance: TemplateInstanceKind = {
apiVersion: apiVersionForModel(TemplateInstanceModel),
kind: TemplateInstanceModel.kind,
metadata: {
generateName: `${OSD_REMOVAL_TEMPLATE}-${osd}-`,
namespace: CEPH_STORAGE_NAMESPACE,
/* Adding annotations to uniquely identify a disk after replacement. */
annotations: {
disk,
osd,
nodeName,
devicePath: path,
deviceOsd: osd,
deviceNode: nodeName,
deviceID,
deviceSerial: serial,
},
},
spec: {
Expand All @@ -70,21 +75,21 @@ const createTemplateInstance = async (
return k8sCreate(TemplateInstanceModel, templateInstance);
};

const instantiateTemplate = async (osdId: string, diskName: string, nodeName: string) => {
const instantiateTemplate = async (osdId: string, nodeName: string, disk: DiskMetadata) => {
const osdRemovalTemplate = await k8sGet(
TemplateModel,
OSD_REMOVAL_TEMPLATE,
CEPH_STORAGE_NAMESPACE,
);
const templateSecret = await createTemplateSecret(osdRemovalTemplate, osdId);
await createTemplateInstance(templateSecret, osdRemovalTemplate, osdId, diskName, nodeName);
await createTemplateInstance(templateSecret, osdRemovalTemplate, osdId, nodeName, disk);
};

const DiskReplacementAction = (props: DiskReplacementActionProps) => {
const { t } = useTranslation();

const {
diskName,
disk,
alertsMap,
nodeName,
replacementMap,
Expand All @@ -94,6 +99,8 @@ const DiskReplacementAction = (props: DiskReplacementActionProps) => {
close,
} = props;

const { path: diskName } = disk;

const [inProgress, setProgress] = React.useState(false);
const [errorMessage, setError] = React.useState('');

Expand All @@ -114,7 +121,7 @@ const DiskReplacementAction = (props: DiskReplacementActionProps) => {
),
);
else {
instantiateTemplate(osd, diskName, nodeName);
instantiateTemplate(osd, nodeName, disk);
dispatch({
type: ActionType.SET_REPLACEMENT_MAP,
payload: { [diskName]: { osd, status: Status.PreparingToReplace } },
Expand Down Expand Up @@ -164,7 +171,7 @@ const DiskReplacementAction = (props: DiskReplacementActionProps) => {
export const diskReplacementModal = createModalLauncher(DiskReplacementAction);

export type DiskReplacementActionProps = {
diskName: string;
disk: DiskMetadata;
isRebalancing: boolean;
alertsMap: OCSDiskList;
replacementMap: OCSDiskList;
Expand Down
Expand Up @@ -18,7 +18,7 @@ export const OCS_DEVICE_SET_REPLICA = 3;
export const OCS_DEVICE_SET_ARBITER_REPLICA = 4;
export const OCS_DEVICE_SET_FLEXIBLE_REPLICA = 1;
export const ATTACHED_DEVICES_ANNOTATION = 'cluster.ocs.openshift.io/local-devices';
export const DASHBOARD_LINK = '/dashboards/persistent-storage';
export const DASHBOARD_LINK = '/ocs-dashboards';
export const AVAILABLE = 'Available';
export const OSD_REMOVAL_TEMPLATE = 'ocs-osd-removal';
export const PVC_PROVISIONER_ANNOTATION = 'volume.beta.kubernetes.io/storage-provisioner';
Expand Down

0 comments on commit 5d9b4b8

Please sign in to comment.