diff --git a/awx/ui_next/src/api/models/Hosts.js b/awx/ui_next/src/api/models/Hosts.js
index d36b5f15a3..3d938fe1f3 100644
--- a/awx/ui_next/src/api/models/Hosts.js
+++ b/awx/ui_next/src/api/models/Hosts.js
@@ -5,6 +5,10 @@ class Hosts extends Base {
super(http);
this.baseUrl = '/api/v2/hosts/';
}
+
+ readFacts(id) {
+ return this.http.get(`${this.baseUrl}${id}/ansible_facts/`);
+ }
}
export default Hosts;
diff --git a/awx/ui_next/src/components/CodeMirrorInput/CodeMirrorInput.jsx b/awx/ui_next/src/components/CodeMirrorInput/CodeMirrorInput.jsx
index c84ff0ba84..2ce36f9a7d 100644
--- a/awx/ui_next/src/components/CodeMirrorInput/CodeMirrorInput.jsx
+++ b/awx/ui_next/src/components/CodeMirrorInput/CodeMirrorInput.jsx
@@ -17,7 +17,8 @@ const CodeMirror = styled(ReactCodeMirror)`
}
& > .CodeMirror {
- height: ${props => props.rows * LINE_HEIGHT + PADDING}px;
+ height: ${props =>
+ props.fullHeight ? 'auto' : `${props.rows * LINE_HEIGHT + PADDING}px`};
font-family: var(--pf-global--FontFamily--monospace);
}
@@ -63,6 +64,7 @@ function CodeMirrorInput({
readOnly,
hasErrors,
rows,
+ fullHeight,
className,
}) {
return (
@@ -75,8 +77,10 @@ function CodeMirrorInput({
options={{
smartIndent: false,
lineNumbers: true,
+ lineWrapping: true,
readOnly,
}}
+ fullHeight={fullHeight}
rows={rows}
/>
);
@@ -87,12 +91,14 @@ CodeMirrorInput.propTypes = {
mode: oneOf(['javascript', 'yaml', 'jinja2']).isRequired,
readOnly: bool,
hasErrors: bool,
+ fullHeight: bool,
rows: number,
};
CodeMirrorInput.defaultProps = {
readOnly: false,
onChange: () => {},
rows: 6,
+ fullHeight: false,
hasErrors: false,
};
diff --git a/awx/ui_next/src/components/CodeMirrorInput/VariablesDetail.jsx b/awx/ui_next/src/components/CodeMirrorInput/VariablesDetail.jsx
index f561a6f74e..e7c2b00742 100644
--- a/awx/ui_next/src/components/CodeMirrorInput/VariablesDetail.jsx
+++ b/awx/ui_next/src/components/CodeMirrorInput/VariablesDetail.jsx
@@ -21,7 +21,7 @@ function getValueAsMode(value, mode) {
return mode === YAML_MODE ? jsonToYaml(value) : yamlToJson(value);
}
-function VariablesDetail({ value, label, rows }) {
+function VariablesDetail({ value, label, rows, fullHeight }) {
const [mode, setMode] = useState(isJson(value) ? JSON_MODE : YAML_MODE);
const [currentValue, setCurrentValue] = useState(value || '---');
const [error, setError] = useState(null);
@@ -75,6 +75,7 @@ function VariablesDetail({ value, label, rows }) {
value={currentValue}
readOnly
rows={rows}
+ fullHeight={fullHeight}
css="margin-top: 10px"
/>
{error && (
diff --git a/awx/ui_next/src/screens/Host/Host.jsx b/awx/ui_next/src/screens/Host/Host.jsx
index 173f3540e8..eccbc42d34 100644
--- a/awx/ui_next/src/screens/Host/Host.jsx
+++ b/awx/ui_next/src/screens/Host/Host.jsx
@@ -116,7 +116,7 @@ function Host({ i18n, setBreadcrumb }) {
,
-
+
,
diff --git a/awx/ui_next/src/screens/Host/HostFacts/HostFacts.jsx b/awx/ui_next/src/screens/Host/HostFacts/HostFacts.jsx
index 62499c4b40..ff336a4165 100644
--- a/awx/ui_next/src/screens/Host/HostFacts/HostFacts.jsx
+++ b/awx/ui_next/src/screens/Host/HostFacts/HostFacts.jsx
@@ -1,10 +1,49 @@
-import React, { Component } from 'react';
+import React, { useCallback, useEffect } from 'react';
+import { withI18n } from '@lingui/react';
+import { t } from '@lingui/macro';
+import { Host } from '@types';
import { CardBody } from '@components/Card';
+import { DetailList } from '@components/DetailList';
+import { VariablesDetail } from '@components/CodeMirrorInput';
+import ContentError from '@components/ContentError';
+import ContentLoading from '@components/ContentLoading';
+import useRequest from '@util/useRequest';
+import { HostsAPI } from '@api';
-class HostFacts extends Component {
- render() {
- return Coming soon :);
+function HostFacts({ i18n, host }) {
+ const { result: facts, isLoading, error, request: fetchFacts } = useRequest(
+ useCallback(async () => {
+ const [{ data: factsObj }] = await Promise.all([
+ HostsAPI.readFacts(host.id),
+ ]);
+ return JSON.stringify(factsObj, null, 4);
+ }, [host]),
+ '{}'
+ );
+
+ useEffect(() => {
+ fetchFacts();
+ }, [fetchFacts]);
+
+ if (isLoading) {
+ return ;
}
+
+ if (error) {
+ return ;
+ }
+
+ return (
+
+
+
+
+
+ );
}
-export default HostFacts;
+HostFacts.propTypes = {
+ host: Host.isRequired,
+};
+
+export default withI18n()(HostFacts);
diff --git a/awx/ui_next/src/screens/Host/HostFacts/HostFacts.test.jsx b/awx/ui_next/src/screens/Host/HostFacts/HostFacts.test.jsx
new file mode 100644
index 0000000000..3288c0cb93
--- /dev/null
+++ b/awx/ui_next/src/screens/Host/HostFacts/HostFacts.test.jsx
@@ -0,0 +1,56 @@
+import React from 'react';
+import { act } from 'react-dom/test-utils';
+import { mountWithContexts, waitForElement } from '@testUtils/enzymeHelpers';
+import HostFacts from './HostFacts';
+import { HostsAPI } from '@api';
+import mockHost from '../data.host.json';
+import mockHostFacts from '../data.hostFacts.json';
+
+jest.mock('@api/models/Hosts');
+jest.mock('react-router-dom', () => ({
+ ...jest.requireActual('react-router-dom'),
+ useParams: () => ({
+ id: 1,
+ hostId: 1,
+ }),
+}));
+
+describe('', () => {
+ let wrapper;
+
+ beforeEach(async () => {
+ HostsAPI.readFacts.mockResolvedValue({ data: mockHostFacts });
+ await act(async () => {
+ wrapper = mountWithContexts();
+ });
+ await waitForElement(wrapper, 'ContentLoading', el => el.length === 0);
+ });
+
+ afterEach(() => {
+ jest.clearAllMocks();
+ wrapper.unmount();
+ });
+
+ test('initially renders successfully ', () => {
+ expect(wrapper.find('HostFacts').length).toBe(1);
+ });
+
+ test('renders ContentError when facts GET fails', async () => {
+ HostsAPI.readFacts.mockRejectedValueOnce(
+ new Error({
+ response: {
+ config: {
+ method: 'get',
+ url: '/api/v2/hosts/1/ansible_facts',
+ },
+ data: 'An error occurred',
+ status: 500,
+ },
+ })
+ );
+ await act(async () => {
+ wrapper = mountWithContexts();
+ });
+ await waitForElement(wrapper, 'ContentError', el => el.length === 1);
+ });
+});
diff --git a/awx/ui_next/src/screens/Host/data.hostFacts.json b/awx/ui_next/src/screens/Host/data.hostFacts.json
new file mode 100644
index 0000000000..6d80a8f6f5
--- /dev/null
+++ b/awx/ui_next/src/screens/Host/data.hostFacts.json
@@ -0,0 +1,1249 @@
+{
+ "ansible_lo": {
+ "mtu": 65536,
+ "ipv4": {
+ "address": "127.0.0.1",
+ "netmask": "255.0.0.0",
+ "network": "127.0.0.0",
+ "broadcast": "host"
+ },
+ "type": "loopback",
+ "active": true,
+ "device": "lo",
+ "promisc": false,
+ "features": {
+ "rx_all": "off [fixed]",
+ "rx_fcs": "off [fixed]",
+ "highdma": "on [fixed]",
+ "fcoe_mtu": "off [fixed]",
+ "loopback": "on [fixed]",
+ "busy_poll": "off [fixed]",
+ "netns_local": "on [fixed]",
+ "tx_lockless": "on [fixed]",
+ "hw_tc_offload": "off [fixed]",
+ "tx_gso_robust": "off [fixed]",
+ "l2_fwd_offload": "off [fixed]",
+ "ntuple_filters": "off [fixed]",
+ "rx_vlan_filter": "off [fixed]",
+ "scatter_gather": "on",
+ "tx_gso_partial": "off [fixed]",
+ "receive_hashing": "off [fixed]",
+ "rx_checksumming": "on [fixed]",
+ "rx_vlan_offload": "off [fixed]",
+ "tx_checksumming": "on",
+ "tx_nocache_copy": "off [fixed]",
+ "tx_vlan_offload": "off [fixed]",
+ "vlan_challenged": "on [fixed]",
+ "tx_checksum_ipv4": "off [fixed]",
+ "tx_checksum_ipv6": "off [fixed]",
+ "tx_checksum_sctp": "on [fixed]",
+ "tx_scatter_gather": "on [fixed]",
+ "rx_vlan_stag_filter": "off [fixed]",
+ "tx_gre_segmentation": "off [fixed]",
+ "tx_tcp_segmentation": "on",
+ "tx_checksum_fcoe_crc": "off [fixed]",
+ "tx_fcoe_segmentation": "off [fixed]",
+ "tx_sctp_segmentation": "on",
+ "tx_tcp6_segmentation": "on",
+ "large_receive_offload": "off [fixed]",
+ "rx_vlan_stag_hw_parse": "off [fixed]",
+ "tx_checksum_ip_generic": "on [fixed]",
+ "tx_ipxip4_segmentation": "off [fixed]",
+ "tx_ipxip6_segmentation": "off [fixed]",
+ "tx_vlan_stag_hw_insert": "off [fixed]",
+ "generic_receive_offload": "on",
+ "tx_tcp_ecn_segmentation": "on",
+ "tx_udp_tnl_segmentation": "off [fixed]",
+ "tcp_segmentation_offload": "on",
+ "tx_gre_csum_segmentation": "off [fixed]",
+ "udp_fragmentation_offload": "on",
+ "tx_scatter_gather_fraglist": "on [fixed]",
+ "generic_segmentation_offload": "on",
+ "tx_tcp_mangleid_segmentation": "on",
+ "tx_udp_tnl_csum_segmentation": "off [fixed]"
+ },
+ "timestamping": [
+ "rx_software",
+ "software"
+ ],
+ "hw_timestamp_filters": []
+ },
+ "ansible_dns": {
+ "options": {
+ "ndots": "0"
+ },
+ "nameservers": [
+ "127.0.0.11"
+ ]
+ },
+ "ansible_env": {
+ "_": "/usr/libexec/platform-python",
+ "OS": " Operating System: Docker Desktop",
+ "TZ": "UTC",
+ "PWD": "/tmp/awx_13_r1ffeqze/project",
+ "HOME": "/var/lib/awx",
+ "LANG": "\"en-us\"",
+ "PATH": "/venv/ansible/bin:/venv/awx/bin:/venv/awx/bin:/usr/local/n/versions/node/10.15.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
+ "SHLVL": "4",
+ "JOB_ID": "13",
+ "LC_ALL": "en_US.UTF-8",
+ "MFLAGS": "-w",
+ "OLDPWD": "/awx_devel",
+ "AWX_HOST": "https://towerhost",
+ "HOSTNAME": "awx",
+ "LANGUAGE": "en_US:en",
+ "SDB_HOST": "0.0.0.0",
+ "SDB_PORT": "7899",
+ "MAKEFLAGS": "w",
+ "MAKELEVEL": "2",
+ "PYTHONPATH": "/venv/ansible/lib/python3.6/site-packages:/awx_devel/awx/lib:/venv/awx/lib/python3.6/site-packages/ansible_runner/callbacks",
+ "CURRENT_UID": "501",
+ "VIRTUAL_ENV": "/venv/ansible",
+ "INVENTORY_ID": "1",
+ "MAX_EVENT_RES": "700000",
+ "PROOT_TMP_DIR": "/tmp",
+ "RABBITMQ_HOST": "rabbitmq",
+ "RABBITMQ_PASS": "guest",
+ "RABBITMQ_USER": "guest",
+ "RABBITMQ_VHOST": "/",
+ "ANSIBLE_LIBRARY": "/awx_devel/awx/plugins/library",
+ "SDB_NOTIFY_HOST": "docker.for.mac.host.internal",
+ "AWX_GROUP_QUEUES": "tower",
+ "PROJECT_REVISION": "9e2cd25bfb26ba82f40cf31276e1942bf38b3a30",
+ "ANSIBLE_VENV_PATH": "/venv/ansible",
+ "ANSIBLE_ROLES_PATH": "/tmp/awx_13_r1ffeqze/requirements_roles:~/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles",
+ "RUNNER_OMIT_EVENTS": "False",
+ "SUPERVISOR_ENABLED": "1",
+ "ANSIBLE_FORCE_COLOR": "True",
+ "ANSIBLE_CACHE_PLUGIN": "jsonfile",
+ "AWX_PRIVATE_DATA_DIR": "/tmp/awx_13_r1ffeqze",
+ "AWX_ISOLATED_DATA_DIR": "/tmp/awx_13_r1ffeqze/artifacts/13",
+ "SUPERVISOR_GROUP_NAME": "tower-processes",
+ "SUPERVISOR_SERVER_URL": "unix:///tmp/supervisor.sock",
+ "DJANGO_SETTINGS_MODULE": "awx.settings.development",
+ "ANSIBLE_STDOUT_CALLBACK": "awx_display",
+ "SUPERVISOR_PROCESS_NAME": "awx-dispatcher",
+ "ANSIBLE_CALLBACK_PLUGINS": "/awx_devel/awx/plugins/callback:/venv/awx/lib/python3.6/site-packages/ansible_runner/callbacks",
+ "ANSIBLE_COLLECTIONS_PATHS": "/tmp/awx_13_r1ffeqze/requirements_collections:~/.ansible/collections:/usr/share/ansible/collections",
+ "ANSIBLE_HOST_KEY_CHECKING": "False",
+ "RUNNER_ONLY_FAILED_EVENTS": "False",
+ "ANSIBLE_RETRY_FILES_ENABLED": "False",
+ "ANSIBLE_SSH_CONTROL_PATH_DIR": "/tmp/awx_13_r1ffeqze/cp",
+ "ANSIBLE_CACHE_PLUGIN_CONNECTION": "/tmp/awx_13_r1ffeqze/artifacts/13/fact_cache",
+ "DJANGO_LIVE_TEST_SERVER_ADDRESS": "localhost:9013-9199",
+ "ANSIBLE_INVENTORY_UNPARSED_FAILED": "True",
+ "ANSIBLE_PARAMIKO_RECORD_HOST_KEYS": "False"
+ },
+ "ansible_lsb": {},
+ "ansible_eth0": {
+ "mtu": 1500,
+ "ipv4": {
+ "address": "172.18.0.5",
+ "netmask": "255.255.0.0",
+ "network": "172.18.0.0",
+ "broadcast": "172.18.255.255"
+ },
+ "type": "ether",
+ "speed": 10000,
+ "active": true,
+ "device": "eth0",
+ "promisc": false,
+ "features": {
+ "rx_all": "off [fixed]",
+ "rx_fcs": "off [fixed]",
+ "highdma": "on",
+ "fcoe_mtu": "off [fixed]",
+ "loopback": "off [fixed]",
+ "busy_poll": "off [fixed]",
+ "netns_local": "off [fixed]",
+ "tx_lockless": "on [fixed]",
+ "hw_tc_offload": "off [fixed]",
+ "tx_gso_robust": "off [fixed]",
+ "l2_fwd_offload": "off [fixed]",
+ "ntuple_filters": "off [fixed]",
+ "rx_vlan_filter": "off [fixed]",
+ "scatter_gather": "on",
+ "tx_gso_partial": "off [fixed]",
+ "receive_hashing": "off [fixed]",
+ "rx_checksumming": "on",
+ "rx_vlan_offload": "on",
+ "tx_checksumming": "on",
+ "tx_nocache_copy": "off",
+ "tx_vlan_offload": "on",
+ "vlan_challenged": "off [fixed]",
+ "tx_checksum_ipv4": "off [fixed]",
+ "tx_checksum_ipv6": "off [fixed]",
+ "tx_checksum_sctp": "on",
+ "tx_scatter_gather": "on",
+ "rx_vlan_stag_filter": "off [fixed]",
+ "tx_gre_segmentation": "on",
+ "tx_tcp_segmentation": "on",
+ "tx_checksum_fcoe_crc": "off [fixed]",
+ "tx_fcoe_segmentation": "off [fixed]",
+ "tx_sctp_segmentation": "on",
+ "tx_tcp6_segmentation": "on",
+ "large_receive_offload": "off [fixed]",
+ "rx_vlan_stag_hw_parse": "on",
+ "tx_checksum_ip_generic": "on",
+ "tx_ipxip4_segmentation": "on",
+ "tx_ipxip6_segmentation": "on",
+ "tx_vlan_stag_hw_insert": "on",
+ "generic_receive_offload": "on",
+ "tx_tcp_ecn_segmentation": "on",
+ "tx_udp_tnl_segmentation": "on",
+ "tcp_segmentation_offload": "on",
+ "tx_gre_csum_segmentation": "on",
+ "udp_fragmentation_offload": "on",
+ "tx_scatter_gather_fraglist": "on",
+ "generic_segmentation_offload": "on",
+ "tx_tcp_mangleid_segmentation": "on",
+ "tx_udp_tnl_csum_segmentation": "on"
+ },
+ "macaddress": "02:42:ac:12:00:05",
+ "timestamping": [
+ "rx_software",
+ "software"
+ ],
+ "hw_timestamp_filters": []
+ },
+ "ansible_fips": false,
+ "ansible_fqdn": "awx",
+ "module_setup": true,
+ "ansible_local": {},
+ "ansible_tunl0": {
+ "mtu": 1480,
+ "type": "unknown",
+ "active": false,
+ "device": "tunl0",
+ "promisc": false,
+ "features": {
+ "rx_all": "off [fixed]",
+ "rx_fcs": "off [fixed]",
+ "highdma": "on",
+ "fcoe_mtu": "off [fixed]",
+ "loopback": "off [fixed]",
+ "busy_poll": "off [fixed]",
+ "netns_local": "on [fixed]",
+ "tx_lockless": "on [fixed]",
+ "hw_tc_offload": "off [fixed]",
+ "tx_gso_robust": "off [fixed]",
+ "l2_fwd_offload": "off [fixed]",
+ "ntuple_filters": "off [fixed]",
+ "rx_vlan_filter": "off [fixed]",
+ "scatter_gather": "on",
+ "tx_gso_partial": "off [fixed]",
+ "receive_hashing": "off [fixed]",
+ "rx_checksumming": "off [fixed]",
+ "rx_vlan_offload": "off [fixed]",
+ "tx_checksumming": "on",
+ "tx_nocache_copy": "off",
+ "tx_vlan_offload": "off [fixed]",
+ "vlan_challenged": "off [fixed]",
+ "tx_checksum_ipv4": "off [fixed]",
+ "tx_checksum_ipv6": "off [fixed]",
+ "tx_checksum_sctp": "off [fixed]",
+ "tx_scatter_gather": "on",
+ "rx_vlan_stag_filter": "off [fixed]",
+ "tx_gre_segmentation": "off [fixed]",
+ "tx_tcp_segmentation": "on",
+ "tx_checksum_fcoe_crc": "off [fixed]",
+ "tx_fcoe_segmentation": "off [fixed]",
+ "tx_sctp_segmentation": "on",
+ "tx_tcp6_segmentation": "on",
+ "large_receive_offload": "off [fixed]",
+ "rx_vlan_stag_hw_parse": "off [fixed]",
+ "tx_checksum_ip_generic": "on",
+ "tx_ipxip4_segmentation": "off [fixed]",
+ "tx_ipxip6_segmentation": "off [fixed]",
+ "tx_vlan_stag_hw_insert": "off [fixed]",
+ "generic_receive_offload": "on",
+ "tx_tcp_ecn_segmentation": "on",
+ "tx_udp_tnl_segmentation": "off [fixed]",
+ "tcp_segmentation_offload": "on",
+ "tx_gre_csum_segmentation": "off [fixed]",
+ "udp_fragmentation_offload": "on",
+ "tx_scatter_gather_fraglist": "on",
+ "generic_segmentation_offload": "on",
+ "tx_tcp_mangleid_segmentation": "on",
+ "tx_udp_tnl_csum_segmentation": "off [fixed]"
+ },
+ "macaddress": "00:00:00:00",
+ "timestamping": [
+ "rx_software",
+ "software"
+ ],
+ "hw_timestamp_filters": []
+ },
+ "gather_subset": [
+ "all"
+ ],
+ "ansible_domain": "",
+ "ansible_kernel": "4.9.184-linuxkit",
+ "ansible_mounts": [
+ {
+ "uuid": "N/A",
+ "mount": "/etc/resolv.conf",
+ "device": "/dev/sda1",
+ "fstype": "ext4",
+ "options": "rw,nosuid,relatime,data=ordered,bind",
+ "block_size": 4096,
+ "block_used": 3938899,
+ "inode_used": 479010,
+ "size_total": 62725623808,
+ "block_total": 15313873,
+ "inode_total": 3907584,
+ "size_available": 46591893504,
+ "block_available": 11374974,
+ "inode_available": 3428574
+ },
+ {
+ "uuid": "N/A",
+ "mount": "/etc/hostname",
+ "device": "/dev/sda1",
+ "fstype": "ext4",
+ "options": "rw,nosuid,relatime,data=ordered,bind",
+ "block_size": 4096,
+ "block_used": 3938899,
+ "inode_used": 479010,
+ "size_total": 62725623808,
+ "block_total": 15313873,
+ "inode_total": 3907584,
+ "size_available": 46591893504,
+ "block_available": 11374974,
+ "inode_available": 3428574
+ },
+ {
+ "uuid": "N/A",
+ "mount": "/etc/hosts",
+ "device": "/dev/sda1",
+ "fstype": "ext4",
+ "options": "rw,nosuid,relatime,data=ordered,bind",
+ "block_size": 4096,
+ "block_used": 3938899,
+ "inode_used": 479010,
+ "size_total": 62725623808,
+ "block_total": 15313873,
+ "inode_total": 3907584,
+ "size_available": 46591893504,
+ "block_available": 11374974,
+ "inode_available": 3428574
+ }
+ ],
+ "ansible_python": {
+ "type": "cpython",
+ "version": {
+ "major": 3,
+ "micro": 8,
+ "minor": 6,
+ "serial": 0,
+ "releaselevel": "final"
+ },
+ "executable": "/usr/libexec/platform-python",
+ "version_info": [
+ 3,
+ 6,
+ 8,
+ "final",
+ 0
+ ],
+ "has_sslcontext": true
+ },
+ "ansible_system": "Linux",
+ "ansible_cmdline": {
+ "root": "/dev/sr0",
+ "text": true,
+ "panic": "1",
+ "console": "ttyS1",
+ "vsyscall": "emulate",
+ "BOOT_IMAGE": "/boot/kernel",
+ "page_poison": "1"
+ },
+ "ansible_devices": {
+ "sda": {
+ "host": "",
+ "size": "59.60 GB",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": "BHYVE SATA DISK",
+ "vendor": "ATA",
+ "holders": [],
+ "sectors": "124999680",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {
+ "sda1": {
+ "size": "59.60 GB",
+ "uuid": null,
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "start": "2048",
+ "holders": [],
+ "sectors": "124997632",
+ "sectorsize": 512
+ }
+ },
+ "rotational": "1",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "deadline",
+ "support_discard": "4096",
+ "sas_device_handle": null
+ },
+ "sr0": {
+ "host": "",
+ "size": "453.38 MB",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": "BHYVE DVD-ROM",
+ "vendor": "BHYVE",
+ "holders": [],
+ "sectors": "928528",
+ "virtual": 1,
+ "removable": "1",
+ "partitions": {},
+ "rotational": "1",
+ "sectorsize": "2048",
+ "sas_address": null,
+ "scheduler_mode": "deadline",
+ "support_discard": "0",
+ "sas_device_handle": null
+ },
+ "sr1": {
+ "host": "",
+ "size": "86.00 KB",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": "BHYVE DVD-ROM",
+ "vendor": "BHYVE",
+ "holders": [],
+ "sectors": "172",
+ "virtual": 1,
+ "removable": "1",
+ "partitions": {},
+ "rotational": "1",
+ "sectorsize": "2048",
+ "sas_address": null,
+ "scheduler_mode": "deadline",
+ "support_discard": "0",
+ "sas_device_handle": null
+ },
+ "sr2": {
+ "host": "",
+ "size": "832.02 MB",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": "BHYVE DVD-ROM",
+ "vendor": "BHYVE",
+ "holders": [],
+ "sectors": "1703968",
+ "virtual": 1,
+ "removable": "1",
+ "partitions": {},
+ "rotational": "1",
+ "sectorsize": "2048",
+ "sas_address": null,
+ "scheduler_mode": "deadline",
+ "support_discard": "0",
+ "sas_device_handle": null
+ },
+ "nbd0": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "0",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "512",
+ "sas_device_handle": null
+ },
+ "nbd1": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "0",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "512",
+ "sas_device_handle": null
+ },
+ "nbd2": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "0",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "512",
+ "sas_device_handle": null
+ },
+ "nbd3": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "0",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "512",
+ "sas_device_handle": null
+ },
+ "nbd4": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "0",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "512",
+ "sas_device_handle": null
+ },
+ "nbd5": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "0",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "512",
+ "sas_device_handle": null
+ },
+ "nbd6": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "0",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "512",
+ "sas_device_handle": null
+ },
+ "nbd7": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "0",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "512",
+ "sas_device_handle": null
+ },
+ "nbd8": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "0",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "512",
+ "sas_device_handle": null
+ },
+ "nbd9": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "0",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "512",
+ "sas_device_handle": null
+ },
+ "loop0": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "1",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "0",
+ "sas_device_handle": null
+ },
+ "loop1": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "1",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "0",
+ "sas_device_handle": null
+ },
+ "loop2": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "1",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "0",
+ "sas_device_handle": null
+ },
+ "loop3": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "1",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "0",
+ "sas_device_handle": null
+ },
+ "loop4": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "1",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "0",
+ "sas_device_handle": null
+ },
+ "loop5": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "1",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "0",
+ "sas_device_handle": null
+ },
+ "loop6": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "1",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "0",
+ "sas_device_handle": null
+ },
+ "loop7": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "1",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "0",
+ "sas_device_handle": null
+ },
+ "nbd10": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "0",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "512",
+ "sas_device_handle": null
+ },
+ "nbd11": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "0",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "512",
+ "sas_device_handle": null
+ },
+ "nbd12": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "0",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "512",
+ "sas_device_handle": null
+ },
+ "nbd13": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "0",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "512",
+ "sas_device_handle": null
+ },
+ "nbd14": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "0",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "512",
+ "sas_device_handle": null
+ },
+ "nbd15": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "0",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "512",
+ "sas_device_handle": null
+ }
+ },
+ "ansible_hostnqn": "",
+ "ansible_ip6tnl0": {
+ "mtu": 1452,
+ "type": "unknown",
+ "active": false,
+ "device": "ip6tnl0",
+ "promisc": false,
+ "features": {
+ "rx_all": "off [fixed]",
+ "rx_fcs": "off [fixed]",
+ "highdma": "on",
+ "fcoe_mtu": "off [fixed]",
+ "loopback": "off [fixed]",
+ "busy_poll": "off [fixed]",
+ "netns_local": "on [fixed]",
+ "tx_lockless": "on [fixed]",
+ "hw_tc_offload": "off [fixed]",
+ "tx_gso_robust": "off [fixed]",
+ "l2_fwd_offload": "off [fixed]",
+ "ntuple_filters": "off [fixed]",
+ "rx_vlan_filter": "off [fixed]",
+ "scatter_gather": "on",
+ "tx_gso_partial": "off [fixed]",
+ "receive_hashing": "off [fixed]",
+ "rx_checksumming": "off [fixed]",
+ "rx_vlan_offload": "off [fixed]",
+ "tx_checksumming": "on",
+ "tx_nocache_copy": "off",
+ "tx_vlan_offload": "off [fixed]",
+ "vlan_challenged": "off [fixed]",
+ "tx_checksum_ipv4": "off [fixed]",
+ "tx_checksum_ipv6": "off [fixed]",
+ "tx_checksum_sctp": "off [fixed]",
+ "tx_scatter_gather": "on",
+ "rx_vlan_stag_filter": "off [fixed]",
+ "tx_gre_segmentation": "off [fixed]",
+ "tx_tcp_segmentation": "on",
+ "tx_checksum_fcoe_crc": "off [fixed]",
+ "tx_fcoe_segmentation": "off [fixed]",
+ "tx_sctp_segmentation": "on",
+ "tx_tcp6_segmentation": "on",
+ "large_receive_offload": "off [fixed]",
+ "rx_vlan_stag_hw_parse": "off [fixed]",
+ "tx_checksum_ip_generic": "on",
+ "tx_ipxip4_segmentation": "off [fixed]",
+ "tx_ipxip6_segmentation": "off [fixed]",
+ "tx_vlan_stag_hw_insert": "off [fixed]",
+ "generic_receive_offload": "on",
+ "tx_tcp_ecn_segmentation": "on",
+ "tx_udp_tnl_segmentation": "off [fixed]",
+ "tcp_segmentation_offload": "on",
+ "tx_gre_csum_segmentation": "off [fixed]",
+ "udp_fragmentation_offload": "on",
+ "tx_scatter_gather_fraglist": "on",
+ "generic_segmentation_offload": "on",
+ "tx_tcp_mangleid_segmentation": "on",
+ "tx_udp_tnl_csum_segmentation": "off [fixed]"
+ },
+ "macaddress": "00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00",
+ "timestamping": [
+ "rx_software",
+ "software"
+ ],
+ "hw_timestamp_filters": []
+ },
+ "ansible_machine": "x86_64",
+ "ansible_pkg_mgr": "dnf",
+ "ansible_selinux": {
+ "status": "disabled"
+ },
+ "ansible_user_id": "awx",
+ "ansible_apparmor": {
+ "status": "disabled"
+ },
+ "ansible_hostname": "awx",
+ "ansible_nodename": "awx",
+ "ansible_user_dir": "/tmp",
+ "ansible_user_gid": 0,
+ "ansible_user_uid": 501,
+ "ansible_bios_date": "03/14/2014",
+ "ansible_date_time": {
+ "tz": "UTC",
+ "day": "11",
+ "date": "2020-03-11",
+ "hour": "18",
+ "time": "18:17:15",
+ "year": "2020",
+ "epoch": "1583950635",
+ "month": "03",
+ "minute": "17",
+ "second": "15",
+ "iso8601": "2020-03-11T18:17:15Z",
+ "weekday": "Wednesday",
+ "tz_offset": "+0000",
+ "weeknumber": "10",
+ "iso8601_basic": "20200311T181715335527",
+ "iso8601_micro": "2020-03-11T18:17:15.335587Z",
+ "weekday_number": "3",
+ "iso8601_basic_short": "20200311T181715"
+ },
+ "ansible_is_chroot": false,
+ "ansible_iscsi_iqn": "",
+ "ansible_memory_mb": {
+ "real": {
+ "free": 268,
+ "used": 7705,
+ "total": 7973
+ },
+ "swap": {
+ "free": 1023,
+ "used": 0,
+ "total": 1023,
+ "cached": 0
+ },
+ "nocache": {
+ "free": 4740,
+ "used": 3233
+ }
+ },
+ "ansible_os_family": "RedHat",
+ "ansible_processor": [
+ "0",
+ "GenuineIntel",
+ "Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz",
+ "1",
+ "GenuineIntel",
+ "Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz",
+ "2",
+ "GenuineIntel",
+ "Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz",
+ "3",
+ "GenuineIntel",
+ "Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz",
+ "4",
+ "GenuineIntel",
+ "Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz",
+ "5",
+ "GenuineIntel",
+ "Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz"
+ ],
+ "ansible_interfaces": [
+ "ip6tnl0",
+ "eth0",
+ "lo",
+ "tunl0"
+ ],
+ "ansible_machine_id": "a76ef18c33e144f09ee5370f751184fa",
+ "ansible_memfree_mb": 268,
+ "ansible_user_gecos": ",,,",
+ "ansible_user_shell": "/bin/bash",
+ "ansible_form_factor": "Unknown",
+ "ansible_memtotal_mb": 7973,
+ "ansible_service_mgr": "bwrap",
+ "ansible_swapfree_mb": 1023,
+ "ansible_architecture": "x86_64",
+ "ansible_bios_version": "1.00",
+ "ansible_default_ipv4": {
+ "mtu": 1500,
+ "type": "ether",
+ "alias": "eth0",
+ "address": "172.18.0.5",
+ "gateway": "172.18.0.1",
+ "netmask": "255.255.0.0",
+ "network": "172.18.0.0",
+ "broadcast": "172.18.255.255",
+ "interface": "eth0",
+ "macaddress": "02:42:ac:12:00:05"
+ },
+ "ansible_default_ipv6": {},
+ "ansible_device_links": {
+ "ids": {},
+ "uuids": {},
+ "labels": {},
+ "masters": {}
+ },
+ "ansible_distribution": "CentOS",
+ "ansible_proc_cmdline": {
+ "root": "/dev/sr0",
+ "text": true,
+ "panic": "1",
+ "console": [
+ "ttyS0",
+ "ttyS1"
+ ],
+ "vsyscall": "emulate",
+ "BOOT_IMAGE": "/boot/kernel",
+ "page_poison": "1"
+ },
+ "ansible_product_name": "BHYVE",
+ "ansible_product_uuid": "NA",
+ "ansible_real_user_id": 501,
+ "ansible_swaptotal_mb": 1023,
+ "ansible_real_group_id": 0,
+ "ansible_system_vendor": "NA",
+ "ansible_kernel_version": "#1 SMP Tue Jul 2 22:58:16 UTC 2019",
+ "ansible_product_serial": "NA",
+ "ansible_python_version": "3.6.8",
+ "ansible_uptime_seconds": 1867065,
+ "ansible_userspace_bits": "64",
+ "_ansible_facts_gathered": true,
+ "ansible_processor_cores": 1,
+ "ansible_processor_count": 6,
+ "ansible_processor_vcpus": 6,
+ "ansible_product_version": "1.0",
+ "ansible_effective_user_id": 501,
+ "ansible_fibre_channel_wwn": [],
+ "ansible_all_ipv4_addresses": [
+ "172.18.0.5"
+ ],
+ "ansible_all_ipv6_addresses": [],
+ "ansible_effective_group_id": 0,
+ "ansible_system_capabilities": [
+ ""
+ ],
+ "ansible_virtualization_role": "guest",
+ "ansible_virtualization_type": "docker",
+ "ansible_distribution_release": "Core",
+ "ansible_distribution_version": "8.1",
+ "discovered_interpreter_python": "/usr/libexec/platform-python",
+ "ansible_distribution_file_path": "/etc/redhat-release",
+ "ansible_selinux_python_present": true,
+ "ansible_userspace_architecture": "x86_64",
+ "ansible_distribution_file_parsed": true,
+ "ansible_distribution_file_variety": "RedHat",
+ "ansible_distribution_major_version": "8",
+ "ansible_processor_threads_per_core": 1,
+ "ansible_system_capabilities_enforced": "True"
+}
diff --git a/awx/ui_next/src/screens/Inventory/InventoryHost/InventoryHost.jsx b/awx/ui_next/src/screens/Inventory/InventoryHost/InventoryHost.jsx
index 3c07032096..f8db7e74cf 100644
--- a/awx/ui_next/src/screens/Inventory/InventoryHost/InventoryHost.jsx
+++ b/awx/ui_next/src/screens/Inventory/InventoryHost/InventoryHost.jsx
@@ -22,6 +22,7 @@ import RoutedTabs from '@components/RoutedTabs';
import JobList from '@components/JobList';
import InventoryHostDetail from '../InventoryHostDetail';
import InventoryHostEdit from '../InventoryHostEdit';
+import InventoryHostFacts from '../InventoryHostFacts';
function InventoryHost({ i18n, setBreadcrumb, inventory }) {
const location = useLocation();
@@ -140,6 +141,12 @@ function InventoryHost({ i18n, setBreadcrumb, inventory }) {
>
+
+
+
{
+ const [{ data: factsObj }] = await Promise.all([
+ HostsAPI.readFacts(host.id),
+ ]);
+ return JSON.stringify(factsObj, null, 4);
+ }, [host]),
+ '{}'
+ );
+
+ useEffect(() => {
+ fetchFacts();
+ }, [fetchFacts]);
+
+ if (isLoading) {
+ return ;
+ }
+
+ if (error) {
+ return ;
+ }
+
+ return (
+
+
+
+
+
+ );
+}
+
+InventoryHostFacts.propTypes = {
+ host: Host.isRequired,
+};
+
+export default withI18n()(InventoryHostFacts);
diff --git a/awx/ui_next/src/screens/Inventory/InventoryHostFacts/InventoryHostFacts.test.jsx b/awx/ui_next/src/screens/Inventory/InventoryHostFacts/InventoryHostFacts.test.jsx
new file mode 100644
index 0000000000..96b4c8ec27
--- /dev/null
+++ b/awx/ui_next/src/screens/Inventory/InventoryHostFacts/InventoryHostFacts.test.jsx
@@ -0,0 +1,56 @@
+import React from 'react';
+import { act } from 'react-dom/test-utils';
+import { mountWithContexts, waitForElement } from '@testUtils/enzymeHelpers';
+import InventoryHostFacts from './InventoryHostFacts';
+import { HostsAPI } from '@api';
+import mockHost from '../shared/data.host.json';
+import mockHostFacts from '../shared/data.hostFacts.json';
+
+jest.mock('@api/models/Hosts');
+jest.mock('react-router-dom', () => ({
+ ...jest.requireActual('react-router-dom'),
+ useParams: () => ({
+ id: 1,
+ hostId: 1,
+ }),
+}));
+
+describe('', () => {
+ let wrapper;
+
+ beforeEach(async () => {
+ HostsAPI.readFacts.mockResolvedValue({ data: mockHostFacts });
+ await act(async () => {
+ wrapper = mountWithContexts();
+ });
+ await waitForElement(wrapper, 'ContentLoading', el => el.length === 0);
+ });
+
+ afterEach(() => {
+ jest.clearAllMocks();
+ wrapper.unmount();
+ });
+
+ test('initially renders successfully ', () => {
+ expect(wrapper.find('InventoryHostFacts').length).toBe(1);
+ });
+
+ test('renders ContentError when facts GET fails', async () => {
+ HostsAPI.readFacts.mockRejectedValueOnce(
+ new Error({
+ response: {
+ config: {
+ method: 'get',
+ url: '/api/v2/hosts/1/ansible_facts',
+ },
+ data: 'An error occurred',
+ status: 500,
+ },
+ })
+ );
+ await act(async () => {
+ wrapper = mountWithContexts();
+ });
+ await waitForElement(wrapper, 'ContentError', el => el.length === 1);
+ });
+});
diff --git a/awx/ui_next/src/screens/Inventory/InventoryHostFacts/index.js b/awx/ui_next/src/screens/Inventory/InventoryHostFacts/index.js
new file mode 100644
index 0000000000..7d20ee2705
--- /dev/null
+++ b/awx/ui_next/src/screens/Inventory/InventoryHostFacts/index.js
@@ -0,0 +1 @@
+export { default } from './InventoryHostFacts';
diff --git a/awx/ui_next/src/screens/Inventory/shared/data.hostFacts.json b/awx/ui_next/src/screens/Inventory/shared/data.hostFacts.json
new file mode 100644
index 0000000000..6d80a8f6f5
--- /dev/null
+++ b/awx/ui_next/src/screens/Inventory/shared/data.hostFacts.json
@@ -0,0 +1,1249 @@
+{
+ "ansible_lo": {
+ "mtu": 65536,
+ "ipv4": {
+ "address": "127.0.0.1",
+ "netmask": "255.0.0.0",
+ "network": "127.0.0.0",
+ "broadcast": "host"
+ },
+ "type": "loopback",
+ "active": true,
+ "device": "lo",
+ "promisc": false,
+ "features": {
+ "rx_all": "off [fixed]",
+ "rx_fcs": "off [fixed]",
+ "highdma": "on [fixed]",
+ "fcoe_mtu": "off [fixed]",
+ "loopback": "on [fixed]",
+ "busy_poll": "off [fixed]",
+ "netns_local": "on [fixed]",
+ "tx_lockless": "on [fixed]",
+ "hw_tc_offload": "off [fixed]",
+ "tx_gso_robust": "off [fixed]",
+ "l2_fwd_offload": "off [fixed]",
+ "ntuple_filters": "off [fixed]",
+ "rx_vlan_filter": "off [fixed]",
+ "scatter_gather": "on",
+ "tx_gso_partial": "off [fixed]",
+ "receive_hashing": "off [fixed]",
+ "rx_checksumming": "on [fixed]",
+ "rx_vlan_offload": "off [fixed]",
+ "tx_checksumming": "on",
+ "tx_nocache_copy": "off [fixed]",
+ "tx_vlan_offload": "off [fixed]",
+ "vlan_challenged": "on [fixed]",
+ "tx_checksum_ipv4": "off [fixed]",
+ "tx_checksum_ipv6": "off [fixed]",
+ "tx_checksum_sctp": "on [fixed]",
+ "tx_scatter_gather": "on [fixed]",
+ "rx_vlan_stag_filter": "off [fixed]",
+ "tx_gre_segmentation": "off [fixed]",
+ "tx_tcp_segmentation": "on",
+ "tx_checksum_fcoe_crc": "off [fixed]",
+ "tx_fcoe_segmentation": "off [fixed]",
+ "tx_sctp_segmentation": "on",
+ "tx_tcp6_segmentation": "on",
+ "large_receive_offload": "off [fixed]",
+ "rx_vlan_stag_hw_parse": "off [fixed]",
+ "tx_checksum_ip_generic": "on [fixed]",
+ "tx_ipxip4_segmentation": "off [fixed]",
+ "tx_ipxip6_segmentation": "off [fixed]",
+ "tx_vlan_stag_hw_insert": "off [fixed]",
+ "generic_receive_offload": "on",
+ "tx_tcp_ecn_segmentation": "on",
+ "tx_udp_tnl_segmentation": "off [fixed]",
+ "tcp_segmentation_offload": "on",
+ "tx_gre_csum_segmentation": "off [fixed]",
+ "udp_fragmentation_offload": "on",
+ "tx_scatter_gather_fraglist": "on [fixed]",
+ "generic_segmentation_offload": "on",
+ "tx_tcp_mangleid_segmentation": "on",
+ "tx_udp_tnl_csum_segmentation": "off [fixed]"
+ },
+ "timestamping": [
+ "rx_software",
+ "software"
+ ],
+ "hw_timestamp_filters": []
+ },
+ "ansible_dns": {
+ "options": {
+ "ndots": "0"
+ },
+ "nameservers": [
+ "127.0.0.11"
+ ]
+ },
+ "ansible_env": {
+ "_": "/usr/libexec/platform-python",
+ "OS": " Operating System: Docker Desktop",
+ "TZ": "UTC",
+ "PWD": "/tmp/awx_13_r1ffeqze/project",
+ "HOME": "/var/lib/awx",
+ "LANG": "\"en-us\"",
+ "PATH": "/venv/ansible/bin:/venv/awx/bin:/venv/awx/bin:/usr/local/n/versions/node/10.15.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
+ "SHLVL": "4",
+ "JOB_ID": "13",
+ "LC_ALL": "en_US.UTF-8",
+ "MFLAGS": "-w",
+ "OLDPWD": "/awx_devel",
+ "AWX_HOST": "https://towerhost",
+ "HOSTNAME": "awx",
+ "LANGUAGE": "en_US:en",
+ "SDB_HOST": "0.0.0.0",
+ "SDB_PORT": "7899",
+ "MAKEFLAGS": "w",
+ "MAKELEVEL": "2",
+ "PYTHONPATH": "/venv/ansible/lib/python3.6/site-packages:/awx_devel/awx/lib:/venv/awx/lib/python3.6/site-packages/ansible_runner/callbacks",
+ "CURRENT_UID": "501",
+ "VIRTUAL_ENV": "/venv/ansible",
+ "INVENTORY_ID": "1",
+ "MAX_EVENT_RES": "700000",
+ "PROOT_TMP_DIR": "/tmp",
+ "RABBITMQ_HOST": "rabbitmq",
+ "RABBITMQ_PASS": "guest",
+ "RABBITMQ_USER": "guest",
+ "RABBITMQ_VHOST": "/",
+ "ANSIBLE_LIBRARY": "/awx_devel/awx/plugins/library",
+ "SDB_NOTIFY_HOST": "docker.for.mac.host.internal",
+ "AWX_GROUP_QUEUES": "tower",
+ "PROJECT_REVISION": "9e2cd25bfb26ba82f40cf31276e1942bf38b3a30",
+ "ANSIBLE_VENV_PATH": "/venv/ansible",
+ "ANSIBLE_ROLES_PATH": "/tmp/awx_13_r1ffeqze/requirements_roles:~/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles",
+ "RUNNER_OMIT_EVENTS": "False",
+ "SUPERVISOR_ENABLED": "1",
+ "ANSIBLE_FORCE_COLOR": "True",
+ "ANSIBLE_CACHE_PLUGIN": "jsonfile",
+ "AWX_PRIVATE_DATA_DIR": "/tmp/awx_13_r1ffeqze",
+ "AWX_ISOLATED_DATA_DIR": "/tmp/awx_13_r1ffeqze/artifacts/13",
+ "SUPERVISOR_GROUP_NAME": "tower-processes",
+ "SUPERVISOR_SERVER_URL": "unix:///tmp/supervisor.sock",
+ "DJANGO_SETTINGS_MODULE": "awx.settings.development",
+ "ANSIBLE_STDOUT_CALLBACK": "awx_display",
+ "SUPERVISOR_PROCESS_NAME": "awx-dispatcher",
+ "ANSIBLE_CALLBACK_PLUGINS": "/awx_devel/awx/plugins/callback:/venv/awx/lib/python3.6/site-packages/ansible_runner/callbacks",
+ "ANSIBLE_COLLECTIONS_PATHS": "/tmp/awx_13_r1ffeqze/requirements_collections:~/.ansible/collections:/usr/share/ansible/collections",
+ "ANSIBLE_HOST_KEY_CHECKING": "False",
+ "RUNNER_ONLY_FAILED_EVENTS": "False",
+ "ANSIBLE_RETRY_FILES_ENABLED": "False",
+ "ANSIBLE_SSH_CONTROL_PATH_DIR": "/tmp/awx_13_r1ffeqze/cp",
+ "ANSIBLE_CACHE_PLUGIN_CONNECTION": "/tmp/awx_13_r1ffeqze/artifacts/13/fact_cache",
+ "DJANGO_LIVE_TEST_SERVER_ADDRESS": "localhost:9013-9199",
+ "ANSIBLE_INVENTORY_UNPARSED_FAILED": "True",
+ "ANSIBLE_PARAMIKO_RECORD_HOST_KEYS": "False"
+ },
+ "ansible_lsb": {},
+ "ansible_eth0": {
+ "mtu": 1500,
+ "ipv4": {
+ "address": "172.18.0.5",
+ "netmask": "255.255.0.0",
+ "network": "172.18.0.0",
+ "broadcast": "172.18.255.255"
+ },
+ "type": "ether",
+ "speed": 10000,
+ "active": true,
+ "device": "eth0",
+ "promisc": false,
+ "features": {
+ "rx_all": "off [fixed]",
+ "rx_fcs": "off [fixed]",
+ "highdma": "on",
+ "fcoe_mtu": "off [fixed]",
+ "loopback": "off [fixed]",
+ "busy_poll": "off [fixed]",
+ "netns_local": "off [fixed]",
+ "tx_lockless": "on [fixed]",
+ "hw_tc_offload": "off [fixed]",
+ "tx_gso_robust": "off [fixed]",
+ "l2_fwd_offload": "off [fixed]",
+ "ntuple_filters": "off [fixed]",
+ "rx_vlan_filter": "off [fixed]",
+ "scatter_gather": "on",
+ "tx_gso_partial": "off [fixed]",
+ "receive_hashing": "off [fixed]",
+ "rx_checksumming": "on",
+ "rx_vlan_offload": "on",
+ "tx_checksumming": "on",
+ "tx_nocache_copy": "off",
+ "tx_vlan_offload": "on",
+ "vlan_challenged": "off [fixed]",
+ "tx_checksum_ipv4": "off [fixed]",
+ "tx_checksum_ipv6": "off [fixed]",
+ "tx_checksum_sctp": "on",
+ "tx_scatter_gather": "on",
+ "rx_vlan_stag_filter": "off [fixed]",
+ "tx_gre_segmentation": "on",
+ "tx_tcp_segmentation": "on",
+ "tx_checksum_fcoe_crc": "off [fixed]",
+ "tx_fcoe_segmentation": "off [fixed]",
+ "tx_sctp_segmentation": "on",
+ "tx_tcp6_segmentation": "on",
+ "large_receive_offload": "off [fixed]",
+ "rx_vlan_stag_hw_parse": "on",
+ "tx_checksum_ip_generic": "on",
+ "tx_ipxip4_segmentation": "on",
+ "tx_ipxip6_segmentation": "on",
+ "tx_vlan_stag_hw_insert": "on",
+ "generic_receive_offload": "on",
+ "tx_tcp_ecn_segmentation": "on",
+ "tx_udp_tnl_segmentation": "on",
+ "tcp_segmentation_offload": "on",
+ "tx_gre_csum_segmentation": "on",
+ "udp_fragmentation_offload": "on",
+ "tx_scatter_gather_fraglist": "on",
+ "generic_segmentation_offload": "on",
+ "tx_tcp_mangleid_segmentation": "on",
+ "tx_udp_tnl_csum_segmentation": "on"
+ },
+ "macaddress": "02:42:ac:12:00:05",
+ "timestamping": [
+ "rx_software",
+ "software"
+ ],
+ "hw_timestamp_filters": []
+ },
+ "ansible_fips": false,
+ "ansible_fqdn": "awx",
+ "module_setup": true,
+ "ansible_local": {},
+ "ansible_tunl0": {
+ "mtu": 1480,
+ "type": "unknown",
+ "active": false,
+ "device": "tunl0",
+ "promisc": false,
+ "features": {
+ "rx_all": "off [fixed]",
+ "rx_fcs": "off [fixed]",
+ "highdma": "on",
+ "fcoe_mtu": "off [fixed]",
+ "loopback": "off [fixed]",
+ "busy_poll": "off [fixed]",
+ "netns_local": "on [fixed]",
+ "tx_lockless": "on [fixed]",
+ "hw_tc_offload": "off [fixed]",
+ "tx_gso_robust": "off [fixed]",
+ "l2_fwd_offload": "off [fixed]",
+ "ntuple_filters": "off [fixed]",
+ "rx_vlan_filter": "off [fixed]",
+ "scatter_gather": "on",
+ "tx_gso_partial": "off [fixed]",
+ "receive_hashing": "off [fixed]",
+ "rx_checksumming": "off [fixed]",
+ "rx_vlan_offload": "off [fixed]",
+ "tx_checksumming": "on",
+ "tx_nocache_copy": "off",
+ "tx_vlan_offload": "off [fixed]",
+ "vlan_challenged": "off [fixed]",
+ "tx_checksum_ipv4": "off [fixed]",
+ "tx_checksum_ipv6": "off [fixed]",
+ "tx_checksum_sctp": "off [fixed]",
+ "tx_scatter_gather": "on",
+ "rx_vlan_stag_filter": "off [fixed]",
+ "tx_gre_segmentation": "off [fixed]",
+ "tx_tcp_segmentation": "on",
+ "tx_checksum_fcoe_crc": "off [fixed]",
+ "tx_fcoe_segmentation": "off [fixed]",
+ "tx_sctp_segmentation": "on",
+ "tx_tcp6_segmentation": "on",
+ "large_receive_offload": "off [fixed]",
+ "rx_vlan_stag_hw_parse": "off [fixed]",
+ "tx_checksum_ip_generic": "on",
+ "tx_ipxip4_segmentation": "off [fixed]",
+ "tx_ipxip6_segmentation": "off [fixed]",
+ "tx_vlan_stag_hw_insert": "off [fixed]",
+ "generic_receive_offload": "on",
+ "tx_tcp_ecn_segmentation": "on",
+ "tx_udp_tnl_segmentation": "off [fixed]",
+ "tcp_segmentation_offload": "on",
+ "tx_gre_csum_segmentation": "off [fixed]",
+ "udp_fragmentation_offload": "on",
+ "tx_scatter_gather_fraglist": "on",
+ "generic_segmentation_offload": "on",
+ "tx_tcp_mangleid_segmentation": "on",
+ "tx_udp_tnl_csum_segmentation": "off [fixed]"
+ },
+ "macaddress": "00:00:00:00",
+ "timestamping": [
+ "rx_software",
+ "software"
+ ],
+ "hw_timestamp_filters": []
+ },
+ "gather_subset": [
+ "all"
+ ],
+ "ansible_domain": "",
+ "ansible_kernel": "4.9.184-linuxkit",
+ "ansible_mounts": [
+ {
+ "uuid": "N/A",
+ "mount": "/etc/resolv.conf",
+ "device": "/dev/sda1",
+ "fstype": "ext4",
+ "options": "rw,nosuid,relatime,data=ordered,bind",
+ "block_size": 4096,
+ "block_used": 3938899,
+ "inode_used": 479010,
+ "size_total": 62725623808,
+ "block_total": 15313873,
+ "inode_total": 3907584,
+ "size_available": 46591893504,
+ "block_available": 11374974,
+ "inode_available": 3428574
+ },
+ {
+ "uuid": "N/A",
+ "mount": "/etc/hostname",
+ "device": "/dev/sda1",
+ "fstype": "ext4",
+ "options": "rw,nosuid,relatime,data=ordered,bind",
+ "block_size": 4096,
+ "block_used": 3938899,
+ "inode_used": 479010,
+ "size_total": 62725623808,
+ "block_total": 15313873,
+ "inode_total": 3907584,
+ "size_available": 46591893504,
+ "block_available": 11374974,
+ "inode_available": 3428574
+ },
+ {
+ "uuid": "N/A",
+ "mount": "/etc/hosts",
+ "device": "/dev/sda1",
+ "fstype": "ext4",
+ "options": "rw,nosuid,relatime,data=ordered,bind",
+ "block_size": 4096,
+ "block_used": 3938899,
+ "inode_used": 479010,
+ "size_total": 62725623808,
+ "block_total": 15313873,
+ "inode_total": 3907584,
+ "size_available": 46591893504,
+ "block_available": 11374974,
+ "inode_available": 3428574
+ }
+ ],
+ "ansible_python": {
+ "type": "cpython",
+ "version": {
+ "major": 3,
+ "micro": 8,
+ "minor": 6,
+ "serial": 0,
+ "releaselevel": "final"
+ },
+ "executable": "/usr/libexec/platform-python",
+ "version_info": [
+ 3,
+ 6,
+ 8,
+ "final",
+ 0
+ ],
+ "has_sslcontext": true
+ },
+ "ansible_system": "Linux",
+ "ansible_cmdline": {
+ "root": "/dev/sr0",
+ "text": true,
+ "panic": "1",
+ "console": "ttyS1",
+ "vsyscall": "emulate",
+ "BOOT_IMAGE": "/boot/kernel",
+ "page_poison": "1"
+ },
+ "ansible_devices": {
+ "sda": {
+ "host": "",
+ "size": "59.60 GB",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": "BHYVE SATA DISK",
+ "vendor": "ATA",
+ "holders": [],
+ "sectors": "124999680",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {
+ "sda1": {
+ "size": "59.60 GB",
+ "uuid": null,
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "start": "2048",
+ "holders": [],
+ "sectors": "124997632",
+ "sectorsize": 512
+ }
+ },
+ "rotational": "1",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "deadline",
+ "support_discard": "4096",
+ "sas_device_handle": null
+ },
+ "sr0": {
+ "host": "",
+ "size": "453.38 MB",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": "BHYVE DVD-ROM",
+ "vendor": "BHYVE",
+ "holders": [],
+ "sectors": "928528",
+ "virtual": 1,
+ "removable": "1",
+ "partitions": {},
+ "rotational": "1",
+ "sectorsize": "2048",
+ "sas_address": null,
+ "scheduler_mode": "deadline",
+ "support_discard": "0",
+ "sas_device_handle": null
+ },
+ "sr1": {
+ "host": "",
+ "size": "86.00 KB",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": "BHYVE DVD-ROM",
+ "vendor": "BHYVE",
+ "holders": [],
+ "sectors": "172",
+ "virtual": 1,
+ "removable": "1",
+ "partitions": {},
+ "rotational": "1",
+ "sectorsize": "2048",
+ "sas_address": null,
+ "scheduler_mode": "deadline",
+ "support_discard": "0",
+ "sas_device_handle": null
+ },
+ "sr2": {
+ "host": "",
+ "size": "832.02 MB",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": "BHYVE DVD-ROM",
+ "vendor": "BHYVE",
+ "holders": [],
+ "sectors": "1703968",
+ "virtual": 1,
+ "removable": "1",
+ "partitions": {},
+ "rotational": "1",
+ "sectorsize": "2048",
+ "sas_address": null,
+ "scheduler_mode": "deadline",
+ "support_discard": "0",
+ "sas_device_handle": null
+ },
+ "nbd0": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "0",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "512",
+ "sas_device_handle": null
+ },
+ "nbd1": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "0",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "512",
+ "sas_device_handle": null
+ },
+ "nbd2": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "0",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "512",
+ "sas_device_handle": null
+ },
+ "nbd3": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "0",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "512",
+ "sas_device_handle": null
+ },
+ "nbd4": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "0",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "512",
+ "sas_device_handle": null
+ },
+ "nbd5": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "0",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "512",
+ "sas_device_handle": null
+ },
+ "nbd6": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "0",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "512",
+ "sas_device_handle": null
+ },
+ "nbd7": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "0",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "512",
+ "sas_device_handle": null
+ },
+ "nbd8": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "0",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "512",
+ "sas_device_handle": null
+ },
+ "nbd9": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "0",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "512",
+ "sas_device_handle": null
+ },
+ "loop0": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "1",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "0",
+ "sas_device_handle": null
+ },
+ "loop1": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "1",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "0",
+ "sas_device_handle": null
+ },
+ "loop2": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "1",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "0",
+ "sas_device_handle": null
+ },
+ "loop3": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "1",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "0",
+ "sas_device_handle": null
+ },
+ "loop4": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "1",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "0",
+ "sas_device_handle": null
+ },
+ "loop5": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "1",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "0",
+ "sas_device_handle": null
+ },
+ "loop6": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "1",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "0",
+ "sas_device_handle": null
+ },
+ "loop7": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "1",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "0",
+ "sas_device_handle": null
+ },
+ "nbd10": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "0",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "512",
+ "sas_device_handle": null
+ },
+ "nbd11": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "0",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "512",
+ "sas_device_handle": null
+ },
+ "nbd12": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "0",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "512",
+ "sas_device_handle": null
+ },
+ "nbd13": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "0",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "512",
+ "sas_device_handle": null
+ },
+ "nbd14": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "0",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "512",
+ "sas_device_handle": null
+ },
+ "nbd15": {
+ "host": "",
+ "size": "0.00 Bytes",
+ "links": {
+ "ids": [],
+ "uuids": [],
+ "labels": [],
+ "masters": []
+ },
+ "model": null,
+ "vendor": null,
+ "holders": [],
+ "sectors": "0",
+ "virtual": 1,
+ "removable": "0",
+ "partitions": {},
+ "rotational": "0",
+ "sectorsize": "512",
+ "sas_address": null,
+ "scheduler_mode": "",
+ "support_discard": "512",
+ "sas_device_handle": null
+ }
+ },
+ "ansible_hostnqn": "",
+ "ansible_ip6tnl0": {
+ "mtu": 1452,
+ "type": "unknown",
+ "active": false,
+ "device": "ip6tnl0",
+ "promisc": false,
+ "features": {
+ "rx_all": "off [fixed]",
+ "rx_fcs": "off [fixed]",
+ "highdma": "on",
+ "fcoe_mtu": "off [fixed]",
+ "loopback": "off [fixed]",
+ "busy_poll": "off [fixed]",
+ "netns_local": "on [fixed]",
+ "tx_lockless": "on [fixed]",
+ "hw_tc_offload": "off [fixed]",
+ "tx_gso_robust": "off [fixed]",
+ "l2_fwd_offload": "off [fixed]",
+ "ntuple_filters": "off [fixed]",
+ "rx_vlan_filter": "off [fixed]",
+ "scatter_gather": "on",
+ "tx_gso_partial": "off [fixed]",
+ "receive_hashing": "off [fixed]",
+ "rx_checksumming": "off [fixed]",
+ "rx_vlan_offload": "off [fixed]",
+ "tx_checksumming": "on",
+ "tx_nocache_copy": "off",
+ "tx_vlan_offload": "off [fixed]",
+ "vlan_challenged": "off [fixed]",
+ "tx_checksum_ipv4": "off [fixed]",
+ "tx_checksum_ipv6": "off [fixed]",
+ "tx_checksum_sctp": "off [fixed]",
+ "tx_scatter_gather": "on",
+ "rx_vlan_stag_filter": "off [fixed]",
+ "tx_gre_segmentation": "off [fixed]",
+ "tx_tcp_segmentation": "on",
+ "tx_checksum_fcoe_crc": "off [fixed]",
+ "tx_fcoe_segmentation": "off [fixed]",
+ "tx_sctp_segmentation": "on",
+ "tx_tcp6_segmentation": "on",
+ "large_receive_offload": "off [fixed]",
+ "rx_vlan_stag_hw_parse": "off [fixed]",
+ "tx_checksum_ip_generic": "on",
+ "tx_ipxip4_segmentation": "off [fixed]",
+ "tx_ipxip6_segmentation": "off [fixed]",
+ "tx_vlan_stag_hw_insert": "off [fixed]",
+ "generic_receive_offload": "on",
+ "tx_tcp_ecn_segmentation": "on",
+ "tx_udp_tnl_segmentation": "off [fixed]",
+ "tcp_segmentation_offload": "on",
+ "tx_gre_csum_segmentation": "off [fixed]",
+ "udp_fragmentation_offload": "on",
+ "tx_scatter_gather_fraglist": "on",
+ "generic_segmentation_offload": "on",
+ "tx_tcp_mangleid_segmentation": "on",
+ "tx_udp_tnl_csum_segmentation": "off [fixed]"
+ },
+ "macaddress": "00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00",
+ "timestamping": [
+ "rx_software",
+ "software"
+ ],
+ "hw_timestamp_filters": []
+ },
+ "ansible_machine": "x86_64",
+ "ansible_pkg_mgr": "dnf",
+ "ansible_selinux": {
+ "status": "disabled"
+ },
+ "ansible_user_id": "awx",
+ "ansible_apparmor": {
+ "status": "disabled"
+ },
+ "ansible_hostname": "awx",
+ "ansible_nodename": "awx",
+ "ansible_user_dir": "/tmp",
+ "ansible_user_gid": 0,
+ "ansible_user_uid": 501,
+ "ansible_bios_date": "03/14/2014",
+ "ansible_date_time": {
+ "tz": "UTC",
+ "day": "11",
+ "date": "2020-03-11",
+ "hour": "18",
+ "time": "18:17:15",
+ "year": "2020",
+ "epoch": "1583950635",
+ "month": "03",
+ "minute": "17",
+ "second": "15",
+ "iso8601": "2020-03-11T18:17:15Z",
+ "weekday": "Wednesday",
+ "tz_offset": "+0000",
+ "weeknumber": "10",
+ "iso8601_basic": "20200311T181715335527",
+ "iso8601_micro": "2020-03-11T18:17:15.335587Z",
+ "weekday_number": "3",
+ "iso8601_basic_short": "20200311T181715"
+ },
+ "ansible_is_chroot": false,
+ "ansible_iscsi_iqn": "",
+ "ansible_memory_mb": {
+ "real": {
+ "free": 268,
+ "used": 7705,
+ "total": 7973
+ },
+ "swap": {
+ "free": 1023,
+ "used": 0,
+ "total": 1023,
+ "cached": 0
+ },
+ "nocache": {
+ "free": 4740,
+ "used": 3233
+ }
+ },
+ "ansible_os_family": "RedHat",
+ "ansible_processor": [
+ "0",
+ "GenuineIntel",
+ "Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz",
+ "1",
+ "GenuineIntel",
+ "Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz",
+ "2",
+ "GenuineIntel",
+ "Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz",
+ "3",
+ "GenuineIntel",
+ "Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz",
+ "4",
+ "GenuineIntel",
+ "Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz",
+ "5",
+ "GenuineIntel",
+ "Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz"
+ ],
+ "ansible_interfaces": [
+ "ip6tnl0",
+ "eth0",
+ "lo",
+ "tunl0"
+ ],
+ "ansible_machine_id": "a76ef18c33e144f09ee5370f751184fa",
+ "ansible_memfree_mb": 268,
+ "ansible_user_gecos": ",,,",
+ "ansible_user_shell": "/bin/bash",
+ "ansible_form_factor": "Unknown",
+ "ansible_memtotal_mb": 7973,
+ "ansible_service_mgr": "bwrap",
+ "ansible_swapfree_mb": 1023,
+ "ansible_architecture": "x86_64",
+ "ansible_bios_version": "1.00",
+ "ansible_default_ipv4": {
+ "mtu": 1500,
+ "type": "ether",
+ "alias": "eth0",
+ "address": "172.18.0.5",
+ "gateway": "172.18.0.1",
+ "netmask": "255.255.0.0",
+ "network": "172.18.0.0",
+ "broadcast": "172.18.255.255",
+ "interface": "eth0",
+ "macaddress": "02:42:ac:12:00:05"
+ },
+ "ansible_default_ipv6": {},
+ "ansible_device_links": {
+ "ids": {},
+ "uuids": {},
+ "labels": {},
+ "masters": {}
+ },
+ "ansible_distribution": "CentOS",
+ "ansible_proc_cmdline": {
+ "root": "/dev/sr0",
+ "text": true,
+ "panic": "1",
+ "console": [
+ "ttyS0",
+ "ttyS1"
+ ],
+ "vsyscall": "emulate",
+ "BOOT_IMAGE": "/boot/kernel",
+ "page_poison": "1"
+ },
+ "ansible_product_name": "BHYVE",
+ "ansible_product_uuid": "NA",
+ "ansible_real_user_id": 501,
+ "ansible_swaptotal_mb": 1023,
+ "ansible_real_group_id": 0,
+ "ansible_system_vendor": "NA",
+ "ansible_kernel_version": "#1 SMP Tue Jul 2 22:58:16 UTC 2019",
+ "ansible_product_serial": "NA",
+ "ansible_python_version": "3.6.8",
+ "ansible_uptime_seconds": 1867065,
+ "ansible_userspace_bits": "64",
+ "_ansible_facts_gathered": true,
+ "ansible_processor_cores": 1,
+ "ansible_processor_count": 6,
+ "ansible_processor_vcpus": 6,
+ "ansible_product_version": "1.0",
+ "ansible_effective_user_id": 501,
+ "ansible_fibre_channel_wwn": [],
+ "ansible_all_ipv4_addresses": [
+ "172.18.0.5"
+ ],
+ "ansible_all_ipv6_addresses": [],
+ "ansible_effective_group_id": 0,
+ "ansible_system_capabilities": [
+ ""
+ ],
+ "ansible_virtualization_role": "guest",
+ "ansible_virtualization_type": "docker",
+ "ansible_distribution_release": "Core",
+ "ansible_distribution_version": "8.1",
+ "discovered_interpreter_python": "/usr/libexec/platform-python",
+ "ansible_distribution_file_path": "/etc/redhat-release",
+ "ansible_selinux_python_present": true,
+ "ansible_userspace_architecture": "x86_64",
+ "ansible_distribution_file_parsed": true,
+ "ansible_distribution_file_variety": "RedHat",
+ "ansible_distribution_major_version": "8",
+ "ansible_processor_threads_per_core": 1,
+ "ansible_system_capabilities_enforced": "True"
+}
diff --git a/awx/ui_next/src/screens/Template/JobTemplateDetail/JobTemplateDetail.jsx b/awx/ui_next/src/screens/Template/JobTemplateDetail/JobTemplateDetail.jsx
index d5a14bce6f..627dacb9d7 100644
--- a/awx/ui_next/src/screens/Template/JobTemplateDetail/JobTemplateDetail.jsx
+++ b/awx/ui_next/src/screens/Template/JobTemplateDetail/JobTemplateDetail.jsx
@@ -127,7 +127,7 @@ function JobTemplateDetail({ i18n, template }) {
)}
{use_fact_cache && (
- {i18n._(t`Use Fact Cache`)}
+ {i18n._(t`Use Fact Storage`)}
)}
diff --git a/awx/ui_next/src/screens/Template/shared/JobTemplateForm.jsx b/awx/ui_next/src/screens/Template/shared/JobTemplateForm.jsx
index 0640dab906..1e114811a4 100644
--- a/awx/ui_next/src/screens/Template/shared/JobTemplateForm.jsx
+++ b/awx/ui_next/src/screens/Template/shared/JobTemplateForm.jsx
@@ -561,9 +561,10 @@ function JobTemplateForm({