1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-20 10:50:08 +03:00

F #5974: FireEdge Sunstone Schedule Actions improvements (#2431)

(cherry picked from commit d6b89b6fe23d416d006040dbc9a9388c0af6c83c)
This commit is contained in:
Frederick Borges 2023-01-05 14:24:46 +01:00 committed by Tino Vázquez
parent 6b3a80eb28
commit 14c11d6850
No known key found for this signature in database
GPG Key ID: 14201E424D02047E
4 changed files with 70 additions and 43 deletions

View File

@ -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,
}),

View File

@ -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),

View File

@ -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',

View File

@ -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 = [