From 14c11d68509e398cb4a1e9ac5dc2e60225606b52 Mon Sep 17 00:00:00 2001 From: Frederick Borges Date: Thu, 5 Jan 2023 14:24:46 +0100 Subject: [PATCH] F #5974: FireEdge Sunstone Schedule Actions improvements (#2431) (cherry picked from commit d6b89b6fe23d416d006040dbc9a9388c0af6c83c) --- .../Forms/Vm/CreateSchedActionForm/fields.js | 44 +++++++++++----- .../Forms/Vm/CreateSchedActionForm/schema.js | 12 ++--- .../src/client/constants/translates.js | 6 +++ src/fireedge/src/client/constants/vm.js | 51 ++++++++++--------- 4 files changed, 70 insertions(+), 43 deletions(-) diff --git a/src/fireedge/src/client/components/Forms/Vm/CreateSchedActionForm/fields.js b/src/fireedge/src/client/components/Forms/Vm/CreateSchedActionForm/fields.js index fc3a81db43..4cded356d0 100644 --- a/src/fireedge/src/client/components/Forms/Vm/CreateSchedActionForm/fields.js +++ b/src/fireedge/src/client/components/Forms/Vm/CreateSchedActionForm/fields.js @@ -21,12 +21,13 @@ import { INPUT_TYPES, VM_ACTIONS_IN_CHARTER, VM_ACTIONS_WITH_SCHEDULE, + VM_ACTIONS_WITH_SCHEDULE_INTANTIATED, END_TYPE_VALUES, REPEAT_VALUES, ARGS_TYPES, PERIOD_TYPES, } from 'client/constants' -import { Field, sentenceCase, arrayToOptions } from 'client/utils' +import { Field, sentenceCase, arrayToOptions, prettyBytes } from 'client/utils' import { isRelative, getRequiredArgsByAction, @@ -84,30 +85,42 @@ const parseDateString = (_, originalValue) => { // -------------------------------------------------------- // Fields // -------------------------------------------------------- +export const ACTION_FIELD_NAME = 'ACTION' +export const ACTION_FIELD_VALIDATION = string().trim().required() const createArgField = (argName) => ({ name: `ARGS.${argName}`, - dependOf: ACTION_FIELD.name, + dependOf: ACTION_FIELD_NAME, htmlType: (action) => !getRequiredArgsByAction(action)?.includes(argName) && INPUT_TYPES.HIDDEN, }) -/** @type {Field} Action name field */ -const ACTION_FIELD = { - name: 'ACTION', +/** + * @param {object} vm - Vm resource + * @returns {Field} Action name field + */ +const ACTION_FIELD = (vm) => ({ + name: ACTION_FIELD_NAME, label: T.Action, type: INPUT_TYPES.SELECT, - values: arrayToOptions(VM_ACTIONS_WITH_SCHEDULE, { - addEmpty: false, - getText: (action) => sentenceCase(action), - }), - validation: string().trim().required(), + values: arrayToOptions( + Object.entries({ + ...VM_ACTIONS_WITH_SCHEDULE, + ...(vm?.ID && VM_ACTIONS_WITH_SCHEDULE_INTANTIATED), + }), + { + addEmpty: false, + getText: ([, text]) => text, + getValue: ([value]) => value, + } + ), + validation: ACTION_FIELD_VALIDATION, grid: { xs: 12 }, -} +}) /** @type {Field} Action name field */ const ACTION_FIELD_FOR_CHARTERS = { - ...ACTION_FIELD, + ...ACTION_FIELD(), values: arrayToOptions(VM_ACTIONS_IN_CHARTER, { addEmpty: false, getText: (action) => sentenceCase(action), @@ -143,10 +156,13 @@ const ARGS_DISK_ID_FIELD = (vm) => ({ label: T.Disk, type: INPUT_TYPES.SELECT, values: arrayToOptions(getDisks(vm), { - getText: ({ IMAGE_ID, IMAGE, NAME } = {}) => { + getText: ({ IMAGE_ID, IMAGE, TARGET, SIZE } = {}) => { const isVolatile = !IMAGE && !IMAGE_ID + const diskImage = isVolatile + ? `${T.Volatile} (${prettyBytes(SIZE, 'MB')})` + : IMAGE - return isVolatile ? NAME : `${NAME}: ${IMAGE}` + return `${diskImage}: ${TARGET}` }, getValue: ({ DISK_ID } = {}) => DISK_ID, }), diff --git a/src/fireedge/src/client/components/Forms/Vm/CreateSchedActionForm/schema.js b/src/fireedge/src/client/components/Forms/Vm/CreateSchedActionForm/schema.js index 6cf5dda5e2..3c62266f47 100644 --- a/src/fireedge/src/client/components/Forms/Vm/CreateSchedActionForm/schema.js +++ b/src/fireedge/src/client/components/Forms/Vm/CreateSchedActionForm/schema.js @@ -20,11 +20,11 @@ import { Field, getObjectSchemaFromFields } from 'client/utils' import { PUNCTUAL_FIELDS, RELATIVE_FIELDS, + ACTION_FIELD_NAME, + ACTION_FIELD_VALIDATION, } from 'client/components/Forms/Vm/CreateSchedActionForm/fields' import { ARGS_TYPES } from 'client/constants' -const { ACTION_FIELD } = PUNCTUAL_FIELDS - const ARG_SCHEMA = string() .trim() .required() @@ -56,8 +56,8 @@ const COMMON_FIELDS = (vm) => [ /** @type {ObjectSchema} Common schema with relative */ const COMMON_SCHEMA = object({ - [ACTION_FIELD.name]: ACTION_FIELD.validation, - ARGS: object().when(ACTION_FIELD.name, (action) => + [ACTION_FIELD_NAME]: ACTION_FIELD_VALIDATION, + ARGS: object().when(ACTION_FIELD_NAME, (action) => getRequiredArgsByAction(action) .map((arg) => object({ [arg]: ARG_SCHEMAS[arg] })) .reduce((result, argSchema) => result.concat(argSchema), object()) @@ -69,7 +69,7 @@ const COMMON_SCHEMA = object({ * @returns {Field[]} Fields */ export const SCHED_FIELDS = (vm) => [ - PUNCTUAL_FIELDS.ACTION_FIELD, + PUNCTUAL_FIELDS.ACTION_FIELD(vm), PUNCTUAL_FIELDS.TIME_FIELD, ...COMMON_FIELDS(vm), PUNCTUAL_FIELDS.END_TYPE_FIELD, @@ -78,7 +78,7 @@ export const SCHED_FIELDS = (vm) => [ /** @type {Field[]} Fields for relative actions */ export const RELATIVE_SCHED_FIELDS = (vm) => [ - PUNCTUAL_FIELDS.ACTION_FIELD, + PUNCTUAL_FIELDS.ACTION_FIELD(vm), RELATIVE_FIELDS.RELATIVE_TIME_FIELD, RELATIVE_FIELDS.PERIOD_FIELD, ...COMMON_FIELDS(vm), diff --git a/src/fireedge/src/client/constants/translates.js b/src/fireedge/src/client/constants/translates.js index 47d8712c16..cf348a9509 100644 --- a/src/fireedge/src/client/constants/translates.js +++ b/src/fireedge/src/client/constants/translates.js @@ -99,6 +99,9 @@ module.exports = { DetachSomething: 'Detach: %s', Disable: 'Disable', Dismiss: 'Dismiss', + DiskSnapshotCreate: 'Disk snapshot create', + DiskSnapshotRevert: 'Disk snapshot revert', + DiskSnapshotDelete: 'Disk snapshot delete', Done: 'Done', Edit: 'Edit', EditSomething: 'Edit: %s', @@ -170,6 +173,9 @@ module.exports = { ShowAll: 'Show all', SignIn: 'Sign In', SignOut: 'Sign Out', + SnapshotCreate: 'Snapshot create', + SnapshotRevert: 'Snapshot revert', + SnapshotDelete: 'Snapshot delete', Stop: 'Stop', Submit: 'Submit', Success: 'Success', diff --git a/src/fireedge/src/client/constants/vm.js b/src/fireedge/src/client/constants/vm.js index 4aa1a69f7a..688ab4c998 100644 --- a/src/fireedge/src/client/constants/vm.js +++ b/src/fireedge/src/client/constants/vm.js @@ -20,6 +20,7 @@ import COLOR from 'client/constants/color' import { Permissions, LockInfo } from 'client/constants/common' // eslint-disable-next-line no-unused-vars import { ScheduleAction } from 'client/constants/scheduler' +import { T } from 'client/constants' /** * @typedef {object} Disk @@ -1851,29 +1852,33 @@ export const VM_ACTIONS_BY_STATE = { [HYPERVISORS.lxc]: LXC_VM_ACTIONS_BY_STATE, } -/** @type {string[]} Actions that can be scheduled */ -export const VM_ACTIONS_WITH_SCHEDULE = [ - VM_ACTIONS.BACKUP, - VM_ACTIONS.TERMINATE, - VM_ACTIONS.TERMINATE_HARD, - VM_ACTIONS.UNDEPLOY, - VM_ACTIONS.UNDEPLOY_HARD, - VM_ACTIONS.HOLD, - VM_ACTIONS.RELEASE, - VM_ACTIONS.STOP, - VM_ACTIONS.SUSPEND, - VM_ACTIONS.RESUME, - VM_ACTIONS.REBOOT, - VM_ACTIONS.REBOOT_HARD, - VM_ACTIONS.POWEROFF, - VM_ACTIONS.POWEROFF_HARD, - VM_ACTIONS.SNAPSHOT_DISK_CREATE, - VM_ACTIONS.SNAPSHOT_DISK_REVERT, - VM_ACTIONS.SNAPSHOT_DISK_DELETE, - VM_ACTIONS.SNAPSHOT_CREATE, - VM_ACTIONS.SNAPSHOT_REVERT, - VM_ACTIONS.SNAPSHOT_DELETE, -] +/** @type {object} Actions that can be scheduled */ +export const VM_ACTIONS_WITH_SCHEDULE = { + [VM_ACTIONS.BACKUP]: T.Backup, + [VM_ACTIONS.TERMINATE]: T.Terminate, + [VM_ACTIONS.TERMINATE_HARD]: T.TerminateHard, + [VM_ACTIONS.UNDEPLOY]: T.Undeploy, + [VM_ACTIONS.UNDEPLOY_HARD]: T.UndeployHard, + [VM_ACTIONS.HOLD]: T.Hold, + [VM_ACTIONS.RELEASE]: T.Release, + [VM_ACTIONS.STOP]: T.Stop, + [VM_ACTIONS.SUSPEND]: T.Suspend, + [VM_ACTIONS.RESUME]: T.Resume, + [VM_ACTIONS.REBOOT]: T.Reboot, + [VM_ACTIONS.REBOOT_HARD]: T.RebootHard, + [VM_ACTIONS.POWEROFF]: T.Poweroff, + [VM_ACTIONS.POWEROFF_HARD]: T.PoweroffHard, + [VM_ACTIONS.SNAPSHOT_CREATE]: T.SnapshotCreate, + [VM_ACTIONS.SNAPSHOT_REVERT]: T.SnapshotRevert, + [VM_ACTIONS.SNAPSHOT_DELETE]: T.SnapshotDelete, +} + +/** @type {object} Actions that can be scheduled */ +export const VM_ACTIONS_WITH_SCHEDULE_INTANTIATED = { + [VM_ACTIONS.SNAPSHOT_DISK_CREATE]: T.DiskSnapshotCreate, + [VM_ACTIONS.SNAPSHOT_DISK_REVERT]: T.DiskSnapshotRevert, + [VM_ACTIONS.SNAPSHOT_DISK_DELETE]: T.DiskSnapshotDelete, +} /** @type {string[]} Actions that can be used in charter */ export const VM_ACTIONS_IN_CHARTER = [