Skip to content

Commit

Permalink
Fixes #35649 - Add Details tab - Virtualization card
Browse files Browse the repository at this point in the history
  • Loading branch information
lfu authored and ekohl committed Jan 5, 2023
1 parent c080a56 commit 8cbb98b
Show file tree
Hide file tree
Showing 9 changed files with 460 additions and 0 deletions.
3 changes: 3 additions & 0 deletions .eslintrc
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
"cpu",
"csrf",
"csv",
"datacenter",
"datastore",
"datastores",
"datepicker",
Expand Down Expand Up @@ -61,6 +62,7 @@
"hostgroup",
"hostgroups",
"href",
"hypervisor",
"i386",
"internets",
"ip6",
Expand Down Expand Up @@ -162,6 +164,7 @@
"unprocessable",
"unselect",
"unstyled",
"virtualization",
"vms",
"vmware",
"vnc",
Expand Down
4 changes: 4 additions & 0 deletions app/views/api/v2/hosts/main.json.rabl
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ attributes :configuration_status => :puppet_status
# to avoid renaming model_name to match accessors
attributes :hardware_model_name => :model_name

node :compute_resource_provider do |host|
host.compute_resource&.provider&.downcase
end

HostStatus.status_registry.each do |status_class|
attributes "#{status_class.humanized_name}_status", "#{status_class.humanized_name}_status_label", :if => @object.get_status(status_class).relevant?
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@ import Bios from '../Details/Cards/Bios';
import NetworkingInterfaces from '../Details/Cards/NetworkingInterfaces';
import TemplatesCard from '../Details/Cards/TemplatesCard';
import ProvisioningCard from '../Details/Cards/Provisioning';
import VirtualizationCard from '../Details/Cards/Virtualization';

const cards = [
{ key: '[core] System properties', Component: Properties, weight: 4000 },
{ key: '[core] Operating systems', Component: OperatingSystem, weight: 3000 },
{ key: '[core] Provisioning', Component: ProvisioningCard, weight: 2900 },
{ key: '[core] BIOS', Component: Bios, weight: 2000 },
{ key: '[core] Virtualization', Component: VirtualizationCard, weight: 1000 },
{
key: '[core] Templates',
Component: TemplatesCard,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
import React from 'react';
import PropTypes from 'prop-types';
import {
DescriptionListTerm,
DescriptionListGroup,
DescriptionListDescription,
} from '@patternfly/react-core';
import { translate as __ } from '../../../../../../common/I18n';

const VirtEc2 = ({ vm }) => (
<>
<DescriptionListGroup>
<DescriptionListTerm>{__('Availability zone')}</DescriptionListTerm>
<DescriptionListDescription>
{vm.availability_zone}
</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>{__('Public IP address')}</DescriptionListTerm>
<DescriptionListDescription>
{vm.public_ip_address}
</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>{__('DNS name')}</DescriptionListTerm>
<DescriptionListDescription>{vm.dns_name}</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>{__('Private IP address')}</DescriptionListTerm>
<DescriptionListDescription>
{vm.private_ip_address}
</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>{__('Private DNS name')}</DescriptionListTerm>
<DescriptionListDescription>
{vm.private_dns_name}
</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>{__('Kernel ID')}</DescriptionListTerm>
<DescriptionListDescription>{vm.kernel_id}</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>{__('State')}</DescriptionListTerm>
<DescriptionListDescription>{vm.state}</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>{__('Created')}</DescriptionListTerm>
<DescriptionListDescription>{vm.created_at}</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>{__('Root device type')}</DescriptionListTerm>
<DescriptionListDescription>
{vm.root_device_type}
</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>{__('Image ID')}</DescriptionListTerm>
<DescriptionListDescription>{vm.image_id}</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>{__('Flavor ID')}</DescriptionListTerm>
<DescriptionListDescription>{vm.flavor_id}</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>{__('Security Groups')}</DescriptionListTerm>
<DescriptionListDescription>{vm.groups}</DescriptionListDescription>
</DescriptionListGroup>
</>
);

VirtEc2.propTypes = {
vm: PropTypes.object,
};

VirtEc2.defaultProps = {
vm: undefined,
};

export default VirtEc2;
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import React from 'react';
import PropTypes from 'prop-types';
import {
DescriptionListTerm,
DescriptionListGroup,
DescriptionListDescription,
} from '@patternfly/react-core';
import { number_to_human_size as NumberToHumanSize } from 'number_helpers';
import { translate as __ } from '../../../../../../common/I18n';

const VirtLibvirt = ({ vm }) => (
<>
<DescriptionListGroup>
<DescriptionListTerm>{__('Name')}</DescriptionListTerm>
<DescriptionListDescription>{vm.name}</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>{__('Machine type')}</DescriptionListTerm>
<DescriptionListDescription>{`${vm.domain_type}/${vm.arch}`}</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>{__('VCPU(s)')}</DescriptionListTerm>
<DescriptionListDescription>{vm.cpus}</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>{__('UUID')}</DescriptionListTerm>
<DescriptionListDescription>{vm.uuid}</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>{__('Memory')}</DescriptionListTerm>
<DescriptionListDescription>
{`${NumberToHumanSize(vm.memory_size)} (${__(
'Maximum'
)}: ${NumberToHumanSize(vm.max_memory_size)})`}
</DescriptionListDescription>
</DescriptionListGroup>
{vm.nics.map((nic, index) => (
<DescriptionListGroup key={`nic-${index}`}>
<DescriptionListTerm>{__('NIC')}</DescriptionListTerm>
<DescriptionListDescription>
{`${nic.bridge} - ${nic.mac} (${nic.model})`}
</DescriptionListDescription>
</DescriptionListGroup>
))}
{Object.values(vm.volumes_attributes).map((vol, index) => (
<DescriptionListGroup key={`volume-${index}`}>
<DescriptionListTerm>{__('Disk capacity')}</DescriptionListTerm>
<DescriptionListDescription>{`${vol.vol.capacity} GB`}</DescriptionListDescription>
<DescriptionListTerm>{__('Storage pool')}</DescriptionListTerm>
<DescriptionListDescription>{vol.pool_name}</DescriptionListDescription>
<DescriptionListTerm>{__('Disk allocation')}</DescriptionListTerm>
<DescriptionListDescription>{`${vol.allocation} GB`}</DescriptionListDescription>
<DescriptionListTerm>{__('Disk path')}</DescriptionListTerm>
<DescriptionListDescription>{vol.path}</DescriptionListDescription>
</DescriptionListGroup>
))}
</>
);

VirtLibvirt.propTypes = {
vm: PropTypes.object,
};

VirtLibvirt.defaultProps = {
vm: undefined,
};

export default VirtLibvirt;
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import React from 'react';
import PropTypes from 'prop-types';
import {
DescriptionListTerm,
DescriptionListGroup,
DescriptionListDescription,
} from '@patternfly/react-core';
import { translate as __ } from '../../../../../../common/I18n';

const VirtOpenstack = ({ vm }) => (
<>
<DescriptionListGroup>
<DescriptionListTerm>{__('Availability zone')}</DescriptionListTerm>
<DescriptionListDescription>
{vm.availability_zone}
</DescriptionListDescription>
</DescriptionListGroup>
{vm.all_addresses.map(address => (
<DescriptionListGroup>
<DescriptionListTerm>{__('Network')}</DescriptionListTerm>
<DescriptionListDescription>{address.pool}</DescriptionListDescription>
<DescriptionListTerm>{__('Floating IP')}</DescriptionListTerm>
<DescriptionListDescription>{address.ip}</DescriptionListDescription>
<DescriptionListTerm>{__('Fixed IP')}</DescriptionListTerm>
<DescriptionListDescription>
{address.fixed_ip}
</DescriptionListDescription>
</DescriptionListGroup>
))}
<DescriptionListGroup>
<DescriptionListTerm>{__('State')}</DescriptionListTerm>
<DescriptionListDescription>{vm.state}</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>{__('Created at')}</DescriptionListTerm>
<DescriptionListDescription>{vm.created_at}</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>{__('Tenant')}</DescriptionListTerm>
<DescriptionListDescription>{vm.tenant}</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>{__('Flavor')}</DescriptionListTerm>
<DescriptionListDescription>
{vm.flavor_with_object}
</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>{__('Security groups')}</DescriptionListTerm>
<DescriptionListDescription>
{vm.security_groups}
</DescriptionListDescription>
</DescriptionListGroup>
</>
);

VirtOpenstack.propTypes = {
vm: PropTypes.object,
};

VirtOpenstack.defaultProps = {
vm: undefined,
};

export default VirtOpenstack;
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import React from 'react';
import PropTypes from 'prop-types';
import {
DescriptionListTerm,
DescriptionListGroup,
DescriptionListDescription,
} from '@patternfly/react-core';
import { number_to_human_size as NumberToHumanSize } from 'number_helpers';
import { translate as __ } from '../../../../../../common/I18n';

const VirtOvirt = ({ vm }) => (
<>
<DescriptionListGroup>
<DescriptionListTerm>{__('Name')}</DescriptionListTerm>
<DescriptionListDescription>{vm.name}</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>{__('Cores per socket')}</DescriptionListTerm>
<DescriptionListDescription>{vm.cores}</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>{__('Sockets')}</DescriptionListTerm>
<DescriptionListDescription>{vm.sockets}</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>{__('Memory')}</DescriptionListTerm>
<DescriptionListDescription>
{NumberToHumanSize(vm.memory, { strip_insignificant_zeros: true })}
</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>{__('Display')}</DescriptionListTerm>
<DescriptionListDescription>{vm.display.type}</DescriptionListDescription>
</DescriptionListGroup>
{vm.display.type === 'vnc' && (
<DescriptionListGroup>
<DescriptionListTerm>{__('Keyboard')}</DescriptionListTerm>
<DescriptionListDescription>
{vm.display.keyboard_layout}
</DescriptionListDescription>
</DescriptionListGroup>
)}
{Object.values(vm.interfaces_attributes).map((nic, index) => (
<DescriptionListGroup key={`nic-${index}`}>
<DescriptionListTerm>{__('NIC name')}</DescriptionListTerm>
<DescriptionListDescription>
{nic.compute_attributes.name}
</DescriptionListDescription>
<DescriptionListTerm>{__('Network')}</DescriptionListTerm>
<DescriptionListDescription>
{nic.compute_attributes.network}
</DescriptionListDescription>
<DescriptionListTerm>{__('MAC address')}</DescriptionListTerm>
<DescriptionListDescription>{nic.mac}</DescriptionListDescription>
</DescriptionListGroup>
))}
{Object.values(vm.volumes_attributes).map((vol, index) => (
<DescriptionListGroup key={`volume-${index}`}>
<DescriptionListTerm>{__('Disk')}</DescriptionListTerm>
<DescriptionListDescription>
{NumberToHumanSize(vol.size_gb * 1024 ** 3, {
strip_insignificant_zeros: true,
})}
</DescriptionListDescription>
</DescriptionListGroup>
))}
</>
);

VirtOvirt.propTypes = {
vm: PropTypes.object,
};

VirtOvirt.defaultProps = {
vm: undefined,
};

export default VirtOvirt;
Loading

0 comments on commit 8cbb98b

Please sign in to comment.