diff --git a/src/routes/backingImage/BackingImageActions.js b/src/routes/backingImage/BackingImageActions.js index 25a3430d5..04f5c92e8 100644 --- a/src/routes/backingImage/BackingImageActions.js +++ b/src/routes/backingImage/BackingImageActions.js @@ -52,10 +52,28 @@ function actions({ } const availableActions = [ - { key: 'updateMinCopies', name: 'Update Minimum Copies Count', disabled: disableAction, tooltip: disableAction ? 'Missing disk with ready state' : '' }, - { key: 'backup', name: ' Back Up', disabled: disableAction || backupTargetAvailable === false, tooltip: getBackupActionTooltip() }, - { key: 'download', name: 'Download', disabled: disableAction, tooltip: disableAction ? 'Missing disk with ready state' : '' }, - { key: 'delete', name: 'Delete' }, + { + key: 'updateMinCopies', + name: 'Update Minimum Copies Count', + disabled: disableAction, + tooltip: disableAction ? 'Missing disk with ready state' : '' + }, + { + key: 'backup', + name: ' Back Up', + disabled: disableAction || backupTargetAvailable === false, + tooltip: getBackupActionTooltip() + }, + { + key: 'download', + name: 'Download', + disabled: disableAction || selected.dataEngine === 'v2', + tooltip: disableAction ? 'Missing disk with ready state' : '' + }, + { + key: 'delete', + name: 'Delete' + }, ] return ( diff --git a/src/routes/backingImage/BackingImageBulkActions.js b/src/routes/backingImage/BackingImageBulkActions.js index 36fe0141a..d6837de1f 100644 --- a/src/routes/backingImage/BackingImageBulkActions.js +++ b/src/routes/backingImage/BackingImageBulkActions.js @@ -90,9 +90,29 @@ function bulkActions({ selectedRows, backupProps, deleteBackingImages, downloadS } const allActions = [ - { key: 'delete', name: 'Delete', disabled() { return selectedRows.length === 0 } }, - { key: 'download', name: 'Download', disabled() { return (selectedRows.length === 0 || selectedRows.every(row => !hasReadyBackingDisk(row))) } }, - { key: 'backup', name: 'Back Up', disabled() { return selectedRows.length === 0 || backupTargetAvailable === false || selectedRows.every(row => !hasReadyBackingDisk(row)) } }, + { + key: 'delete', + name: 'Delete', + disabled() { return selectedRows.length === 0 } + }, + { + key: 'download', + name: 'Download', + disabled() { + return selectedRows.length === 0 + || selectedRows.every(row => !hasReadyBackingDisk(row)) + || selectedRows.some(row => row.dataEngine === 'v2') + } + }, + { + key: 'backup', + name: 'Back Up', + disabled() { + return selectedRows.length === 0 + || backupTargetAvailable === false + || selectedRows.every(row => !hasReadyBackingDisk(row)) + } + }, ] return ( diff --git a/src/routes/backingImage/BackingImageList.js b/src/routes/backingImage/BackingImageList.js index 4e92355ea..85044bd1a 100644 --- a/src/routes/backingImage/BackingImageList.js +++ b/src/routes/backingImage/BackingImageList.js @@ -126,6 +126,19 @@ function list({ ) }, + }, { + title: 'Data Engine', + dataIndex: 'dataEngine', + key: 'dataEngine', + width: 130, + sorter: (a, b) => (a.dataEngine || '').toString().localeCompare((b.dataEngine || '').toString()), + render: (text) => { + return ( +
+ {text} +
+ ) + }, }, { title: 'Node Tags', key: 'nodeSelector', diff --git a/src/routes/backingImage/BackupBackingImageList.js b/src/routes/backingImage/BackupBackingImageList.js index c8892736f..1f9dd17d6 100644 --- a/src/routes/backingImage/BackupBackingImageList.js +++ b/src/routes/backingImage/BackupBackingImageList.js @@ -47,7 +47,7 @@ function BackupBackingImageList({ loading, dataSource, deleteBackupBackingImage, title: 'State', dataIndex: 'state', key: 'state', - width: 80, + width: 120, sorter: (a, b) => a.state.localeCompare(b.state), render: (text) => { return ( @@ -58,7 +58,7 @@ function BackupBackingImageList({ loading, dataSource, deleteBackupBackingImage, title: 'Backup Target', dataIndex: 'backupTargetName', key: 'backupTargetName', - width: 100, + width: 180, sorter: (a, b) => sortTable(a, b, 'backupTargetName'), render: (text) => { return ( @@ -71,7 +71,7 @@ function BackupBackingImageList({ loading, dataSource, deleteBackupBackingImage, title: 'Size', dataIndex: 'size', key: 'size', - width: 80, + width: 120, sorter: (a, b) => parseInt(a.size, 10) - parseInt(b.size, 10), render: (text) => { return ( @@ -100,7 +100,7 @@ function BackupBackingImageList({ loading, dataSource, deleteBackupBackingImage, title: 'Created Time', dataIndex: 'created', key: 'created', - width: 120, + width: 180, sorter: (a, b) => a.created.localeCompare(b.created), render: (text) => { return ( diff --git a/src/routes/backingImage/CreateBackingImage.js b/src/routes/backingImage/CreateBackingImage.js index 10f0a295a..4786c88d1 100644 --- a/src/routes/backingImage/CreateBackingImage.js +++ b/src/routes/backingImage/CreateBackingImage.js @@ -24,6 +24,7 @@ const genDataFromType = (type, getFieldValue) => { name: getFieldValue('name'), sourceType: getFieldValue('sourceType'), minNumberOfCopies: getFieldValue('minNumberOfCopies'), + dataEngine: getFieldValue('dataEngine'), diskSelector: getFieldValue('diskSelector'), nodeSelector: getFieldValue('nodeSelector'), } @@ -85,6 +86,8 @@ const modal = ({ getFieldValue, setFieldsValue, }, + v1DataEngineEnabled = true, + v2DataEngineEnabled = false }) => { function handleOk() { validateFields((errors) => { @@ -309,6 +312,27 @@ const modal = ({ ], })()} + + {getFieldDecorator('dataEngine', { + initialValue: v2DataEngineEnabled ? 'v2' : 'v1', + rules: [ + { + validator: (_rule, value, callback) => { + if ((value === 'v1' && !v1DataEngineEnabled) || (value === 'v2' && !v2DataEngineEnabled)) { + callback(`${value} data engine is not enabled`) + } else { + callback() + } + }, + }, + ], + })( + + )} + {getFieldDecorator('nodeSelector', { @@ -344,6 +368,8 @@ modal.propTypes = { nodeTags: PropTypes.array, diskTags: PropTypes.array, backingImageOptions: PropTypes.array, + v1DataEngineEnabled: PropTypes.bool, + v2DataEngineEnabled: PropTypes.bool, } export default Form.create()(modal) diff --git a/src/routes/backingImage/index.js b/src/routes/backingImage/index.js index 192aa2231..2afdf85a0 100644 --- a/src/routes/backingImage/index.js +++ b/src/routes/backingImage/index.js @@ -117,8 +117,11 @@ class BackingImage extends React.Component { } = this.props.backingImage const { backingImageUploadPercent, backingImageUploadStarted } = this.props.app - const defaultReplicaCount = settingData.find(s => s.id === 'default-replica-count') - const defaultNumberOfReplicas = defaultReplicaCount ? parseInt(defaultReplicaCount.value, 10) : 3 + const settingsMap = Object.fromEntries(settingData.map(setting => [setting.id, setting.value])) + const v1DataEngineEnabled = settingsMap['v1-data-engine'] === 'true' + const v2DataEngineEnabled = settingsMap['v2-data-engine'] === 'true' + const defaultReplicaCount = settingsMap['default-replica-count'] + const defaultNumberOfReplicas = defaultReplicaCount ? parseInt(defaultReplicaCount, 10) : 3 const backingImages = filterBackingImage(data, biSearchField, biSearchValue) const volumeNameOptions = volumeData.map((volume) => volume.name) @@ -209,6 +212,8 @@ class BackingImage extends React.Component { nodeTags, diskTags, tagsLoading, + v1DataEngineEnabled, + v2DataEngineEnabled, onOk(newBackingImage) { const payload = { ...newBackingImage } if (newBackingImage.sourceType === 'upload') {