From 1e62c5e0377131d2d0471e0ae06e9df83e348ab6 Mon Sep 17 00:00:00 2001 From: Jeffrey Bonson <87487049+jeffibm@users.noreply.github.com> Date: Mon, 6 May 2024 19:23:16 +0530 Subject: [PATCH] Merge pull request #9173 from GilbertCherrie/fix_vm_reconfigure_form_privelages Fix vm reconfigure form privelages (cherry picked from commit 3e0cd0322ac43268a2f7db1ddf45227bd9a24781) --- .../reconfigure-form-fields.js | 24 +- .../reconfigure-table/index.jsx | 8 +- .../reconfigure-vm-form.spec.js.snap | 5445 +++++++++++++++-- .../spec/reconfigure-vm-form/data.js | 50 + .../reconfigure-table.spec.js | 8 +- .../reconfigure-vm-form.spec.js | 18 + 6 files changed, 5034 insertions(+), 519 deletions(-) diff --git a/app/javascript/components/reconfigure-vm-form/reconfigure-form-fields.js b/app/javascript/components/reconfigure-vm-form/reconfigure-form-fields.js index 5cc178c6dac..141728cfb3e 100644 --- a/app/javascript/components/reconfigure-vm-form/reconfigure-form-fields.js +++ b/app/javascript/components/reconfigure-vm-form/reconfigure-form-fields.js @@ -5,13 +5,12 @@ import { setNetworkData } from './helpers/network'; import { setDrivesData } from './helpers/drive'; import { TYPES } from './helpers/general'; -const memoryField = (roles) => ({ +const memoryField = () => ({ component: 'switch', name: 'cb_memory', label: __('Memory'), onText: __('Yes'), offText: __('No'), - isDisabled: roles.allowMemoryChange === false, }); const memoryValueField = () => ({ @@ -56,13 +55,12 @@ const memoryFormFields = (memory) => ({ ], }); -const processorField = (roles) => ({ +const processorField = () => ({ component: 'switch', name: 'processor', label: __('Processor'), onText: __('Yes'), offText: __('No'), - isDisabled: roles.allowCpuChange === false, }); const socketField = (data, setData, options) => ({ @@ -123,6 +121,7 @@ const diskTable = (data, roles, setData, onCellClick, buttonClick) => ({ formType: TYPES.DISK, addButtonLabel: __('Add Disk'), buttonClick, + roleAllowed: roles.allowDiskChange, }); const networkTable = (data, roles, setData, onCellClick, buttonClick) => ({ @@ -135,6 +134,7 @@ const networkTable = (data, roles, setData, onCellClick, buttonClick) => ({ formType: TYPES.NETWORK, addButtonLabel: __('Add Network Adapter'), buttonClick, + roleAllowed: roles.allowNetworkChange, }); const driveTable = (data, roles, setData, onCellClick) => ({ @@ -147,6 +147,7 @@ const driveTable = (data, roles, setData, onCellClick) => ({ addButton: false, formType: TYPES.DRIVE, hideField: !data.dataTable.drives || data.dataTable.drives.length === 0, + roleAllowed: roles.allowCdromsChange, }); const renderDatatables = (recordId, data, roles, setData, onCellClick, buttonClick) => [diskTable(data, roles, setData, onCellClick, buttonClick), @@ -154,12 +155,15 @@ const renderDatatables = (recordId, data, roles, setData, onCellClick, buttonCli driveTable(data, roles, setData, onCellClick)]; export const reconfigureFormFields = (recordId, roles, memory, data, setData, options, onCellClick, buttonClick) => { - const formFields = [ - memoryField(roles), - memoryFormFields(memory), - processorField(roles), - processorFormFields(data, setData, options, memory.max_cpu), - ]; + const formFields = []; + if (roles.allowMemoryChange) { + formFields.push(memoryField()); + formFields.push(memoryFormFields(roles)); + } + if (roles.allowCpuChange) { + formFields.push(processorField()); + formFields.push(processorFormFields(data, setData, options, memory.max_cpu)); + } if (recordId.length === 1) { formFields.push(renderDatatables(recordId, data, roles, setData, onCellClick, buttonClick)); } diff --git a/app/javascript/components/reconfigure-vm-form/reconfigure-table/index.jsx b/app/javascript/components/reconfigure-vm-form/reconfigure-table/index.jsx index ddfd01e0c43..553db6e3fe4 100644 --- a/app/javascript/components/reconfigure-vm-form/reconfigure-table/index.jsx +++ b/app/javascript/components/reconfigure-vm-form/reconfigure-table/index.jsx @@ -5,7 +5,7 @@ import classNames from 'classnames'; import MiqDataTable from '../../miq-data-table'; const ReconfigureTable = ({ - label, headers, rows, addButtonLabel, buttonClick, onCellClick, formType, + label, headers, rows, addButtonLabel, buttonClick, onCellClick, formType, roleAllowed, }) => { const renderAddButton = () => addButtonLabel && ( + + + + + + + + + + + + +`; + +exports[`Reconfigure VM form component should render reconfigure form and click cd-rom disconnect button 1`] = ` + + + +
- Between 1024MB and 0.009765625GB + Between undefinedMB and NaNGB
@@ -42387,7 +46827,6 @@ exports[`Reconfigure VM form component should render reconfigure form without da
{ it('should render disk table with headers and rows', () => { - const wrapper = shallow(); + const wrapper = shallow(); expect(wrapper.find('MiqDataTable')).toHaveLength(1); expect(wrapper.find('MiqDataTable').prop('headers')).toEqual(diskHeaders); expect(wrapper.find('MiqDataTable').prop('rows')).toEqual(diskRows); }); it('should render network table with headers and rows', () => { - const wrapper = shallow(); + const wrapper = shallow(); expect(wrapper.find('MiqDataTable')).toHaveLength(1); expect(wrapper.find('MiqDataTable').prop('headers')).toEqual(networkHeaders); expect(wrapper.find('MiqDataTable').prop('rows')).toEqual(networkRows); }); it('should render drive table with headers and rows', () => { - const wrapper = shallow(); + const wrapper = shallow(); expect(wrapper.find('MiqDataTable')).toHaveLength(1); expect(wrapper.find('MiqDataTable').prop('headers')).toEqual(driveHeaders); expect(wrapper.find('MiqDataTable').prop('rows')).toEqual(driveRows); @@ -29,7 +29,7 @@ describe('ReconfigureTable', () => { it('should call onCellClick when a cell is clicked', () => { const onCellClick = jest.fn(); - const wrapper = shallow(); + const wrapper = shallow(); wrapper.find('MiqDataTable').prop('onCellClick')(diskRows[0], 'name'); expect(onCellClick).toHaveBeenCalledWith(diskRows[0], 'name'); }); diff --git a/app/javascript/spec/reconfigure-vm-form/reconfigure-vm-form.spec.js b/app/javascript/spec/reconfigure-vm-form/reconfigure-vm-form.spec.js index 44223d6051c..70f465800bb 100644 --- a/app/javascript/spec/reconfigure-vm-form/reconfigure-vm-form.spec.js +++ b/app/javascript/spec/reconfigure-vm-form/reconfigure-vm-form.spec.js @@ -5,6 +5,7 @@ import { act } from 'react-dom/test-utils'; import ReconfigureVmForm from '../../components/reconfigure-vm-form/index'; import { valueFromHelpers, valueFromHelpersTwo, responseDataOne, responseDataThree, responseDataTwo, + valueFromHelpersThree, } from './data'; import { mount } from '../helpers/mountForm'; @@ -170,4 +171,21 @@ describe('Reconfigure VM form component', () => { expect(toJson(wrapper)).toMatchSnapshot(); done(); }); + + it('should render form with only fields it has permission for', async(done) => { + fetchMock.get('vm_infra/reconfigure_form_fields/new,12', responseDataOne); + let wrapper; + await act(async() => { + wrapper = mount(); + }); + wrapper.update(); + expect(fetchMock.calls()).toHaveLength(1); + expect(wrapper.contains('Memory')).toBe(true); + expect(wrapper.contains('Processor')).toBe(false); + expect(wrapper.contains('Disks')).toBe(false); + expect(wrapper.contains('Network Adapters')).toBe(false); + expect(wrapper.contains('CD/DVD Drives')).toBe(true); + expect(toJson(wrapper)).toMatchSnapshot(); + done(); + }); });