Katello/katello

View on GitHub
webpack/components/extensions/HostDetails/DetailsTabCards/HwPropertiesCard.js

Summary

Maintainability
B
4 hrs
Test Coverage
import React from 'react';
import PropTypes from 'prop-types';
import { translate as __ } from 'foremanReact/common/I18n';
import {
  DescriptionList,
  DescriptionListTerm,
  DescriptionListGroup,
  DescriptionListDescription,
  Text,
  TextVariants,
} from '@patternfly/react-core';
import CardTemplate from 'foremanReact/components/HostDetails/Templates/CardItem/CardTemplate';
import { TranslatedPlural } from '../../../Table/components/TranslatedPlural';
import { hostIsNotRegistered } from '../hostDetailsHelpers';

const HostDisks = ({ blockDevices }) => {
  if (!blockDevices) return null;
  // blockDevices fact will look like this by default 'sr0,sda' and increment like sdb etc
  const disks = blockDevices.split(',');
  // We are filtering out the CDROM drive that gets added by default a lot of the time
  const totalDisks = disks.filter(e => !e.startsWith('sr')).length;
  if (!totalDisks) return null;
  return (
    <>
      <DescriptionListTerm>{__('Storage')}</DescriptionListTerm>
      <Text component={TextVariants.h4} ouiaId="storage-text">
        <TranslatedPlural count={totalDisks} singular={__('disk')} id="total-disks" />
      </Text>
    </>
  );
};

HostDisks.propTypes = {
  blockDevices: PropTypes.string,
};

HostDisks.defaultProps = {
  blockDevices: '',
};

const HwPropertiesCard = ({ isExpandedGlobal, hostDetails }) => {
  if (hostIsNotRegistered({ hostDetails })) return null;
  const { facts } = hostDetails || {};
  const model = facts?.['virt::host_type'];
  const cpuCount = facts?.['cpu::cpu(s)'];
  const cpuSockets = facts?.['cpu::cpu_socket(s)'];
  const coreSocket = facts?.['cpu::core(s)_per_socket'];
  const blockDevices = facts?.blockdevices;
  const memory = facts?.['dmi::memory::maximum_capacity'];

  return (
    <CardTemplate
      header={__('HW properties')}
      expandable
      isExpandedGlobal={isExpandedGlobal}
      masonryLayout
    >
      <DescriptionList isHorizontal>
        <DescriptionListGroup>
          <DescriptionListTerm>{__('Model')}</DescriptionListTerm>
          <DescriptionListDescription>{model}</DescriptionListDescription>
        </DescriptionListGroup>
        <DescriptionListGroup>
          <DescriptionListTerm>{__('Number of CPU(s)')}</DescriptionListTerm>
          <DescriptionListDescription>{cpuCount}</DescriptionListDescription>
        </DescriptionListGroup>
        <DescriptionListGroup>
          <DescriptionListTerm>{__('Sockets')}</DescriptionListTerm>
          <DescriptionListDescription>{cpuSockets}</DescriptionListDescription>
        </DescriptionListGroup>
        <DescriptionListGroup>
          <DescriptionListTerm>{__('Cores per socket')}</DescriptionListTerm>
          <DescriptionListDescription>{coreSocket}</DescriptionListDescription>
        </DescriptionListGroup>
        <DescriptionListGroup>
          <DescriptionListTerm>{__('RAM')}</DescriptionListTerm>
          <DescriptionListDescription>{memory}</DescriptionListDescription>
        </DescriptionListGroup>
        <DescriptionListGroup>
          <HostDisks blockDevices={blockDevices} />
        </DescriptionListGroup>
      </DescriptionList>
    </CardTemplate>
  );
};

HwPropertiesCard.propTypes = {
  isExpandedGlobal: PropTypes.bool,
  hostDetails: PropTypes.shape({
    facts: PropTypes.shape({
      model: PropTypes.string,
      cpuCount: PropTypes.number,
      cpuSockets: PropTypes.number,
      coreSocket: PropTypes.number,
      memory: PropTypes.string,
      blockdevices: PropTypes.string,
    }),
  }),
};

HwPropertiesCard.defaultProps = {
  isExpandedGlobal: false,
  hostDetails: {},
};

export default HwPropertiesCard;