diff --git a/packages/xo-server/src/api/resource.js b/packages/xo-server/src/api/resource.js index aae455e3f..888857908 100644 --- a/packages/xo-server/src/api/resource.js +++ b/packages/xo-server/src/api/resource.js @@ -1,5 +1,3 @@ -import xapiObjectToXo from '../xapi-object-to-xo' - export async function downloadAndInstallResource({ namespace, id, @@ -11,13 +9,11 @@ export async function downloadAndInstallResource({ } const xapi = this.getXapi(sr.$poolId) const stream = await this.requestFreeResource(namespace, id, version) - const vm = await xapi.importVm(stream, { + await xapi.importVm(stream, { data: undefined, srId: sr.id, type: 'xva', }) - await vm.update_other_config('xva_id', id) - return xapiObjectToXo(vm).id } downloadAndInstallResource.description = diff --git a/packages/xo-web/src/common/intl/messages.js b/packages/xo-web/src/common/intl/messages.js index 4c19cbffe..db9279b27 100644 --- a/packages/xo-web/src/common/intl/messages.js +++ b/packages/xo-web/src/common/intl/messages.js @@ -2156,10 +2156,9 @@ const messages = { hubXvaVersion: 'VERSION', hubXvaSize: 'SIZE', hubTotalDiskSize: 'TOTAL DISK SIZE', - hubXvaProgressMessage: 'Click here to see progress', + hubXvaProgressMessage: 'see progress', hubHideInstalledPoolMsg: 'We are hiding pools with already installed template', - hubHideExceedSizeSrMsg: 'We are hiding SRs that exceed template size', // Licenses xosanUnregisteredDisclaimer: diff --git a/packages/xo-web/src/xo-app/hub/import-progress.js b/packages/xo-web/src/xo-app/hub/import-progress.js deleted file mode 100644 index 13d328ec7..000000000 --- a/packages/xo-web/src/xo-app/hub/import-progress.js +++ /dev/null @@ -1,12 +0,0 @@ -import React from 'react' -import { Col, Row } from 'grid' - -const ImportProgress = () => ( - - - - - -) - -export default ImportProgress diff --git a/packages/xo-web/src/xo-app/hub/resource-form.js b/packages/xo-web/src/xo-app/hub/resource-form.js index dcb57d971..0159c325b 100644 --- a/packages/xo-web/src/xo-app/hub/resource-form.js +++ b/packages/xo-web/src/xo-app/hub/resource-form.js @@ -6,51 +6,45 @@ import React from 'react' import Tooltip from 'tooltip' import { Container } from 'grid' import { SelectPool } from 'select-objects' -import { isSrWritable } from 'xo' import { injectState, provideState } from 'reaclette' export default decorate([ provideState({ - initialState: ({ installPoolPredicate }) => ({ - selectedInstallPools: [], - installPoolPredicate, + initialState: ({ multi }) => ({ + pools: multi ? [] : undefined, }), effects: { - initialize() { - // return { - // // hide pools with already installed template - // poolPredicate: pool => pool.uuid !== this.props.uuid, - // } - }, - updateSelectedInstallPools(_, selectedInstallPools) { + handlePools(_, pools) { this.props.onChange({ - selectedInstallPools, + pools, + pool: pools, }) return { - selectedInstallPools, + pools, } }, }, }), injectState, - ({ effects, state }) => ( + ({ effects, state, poolPredicate, multi }) => ( diff --git a/packages/xo-web/src/xo-app/hub/resource.js b/packages/xo-web/src/xo-app/hub/resource.js index b857a3e78..a6f89ffd1 100644 --- a/packages/xo-web/src/xo-app/hub/resource.js +++ b/packages/xo-web/src/xo-app/hub/resource.js @@ -1,11 +1,8 @@ import _ from 'intl' import ActionButton from 'action-button' -import Button from 'button' import decorate from 'apply-decorators' import Icon from 'icon' -import ImportProgress from './import-progress' import React from 'react' -import Tooltip from 'tooltip' import { Card, CardBlock, CardHeader } from 'card' import { Col, Row } from 'grid' import { alert, form } from 'modal' @@ -13,12 +10,9 @@ import { downloadAndInstallResource } from 'xo' import { error, success } from 'notification' import { connectStore, formatSize } from 'utils' import { injectState, provideState } from 'reaclette' -import { generateId } from 'reaclette-utils' import { withRouter } from 'react-router' import { createGetObjectsOfType } from 'selectors' -import { SelectPool } from 'select-objects' -import * as FormGrid from 'form-grid' -import { forEach, find } from 'lodash' +import { find } from 'lodash' import ResourceForm from './resource-form' @@ -48,17 +42,11 @@ export default decorate([ initialState: () => ({ loading: false, selectedInstallPools: [], - selectedCreatePool: undefined, }), effects: { initialize: () => {}, async install(__, { name, namespace, id, size, version }) { - const { - isFromSources, - selectedInstallPools, - installPoolPredicate, - isTemplateInstalledOnAllPools, - } = this.state + const { isFromSources, installPoolPredicate } = this.state if (isFromSources) { subscribeAlert() } else { @@ -66,8 +54,8 @@ export default decorate([ render: props => ( ), header: ( @@ -81,33 +69,46 @@ export default decorate([ }, }) - // this.state.loading = true - // for (const pool of selectedInstallPools) { - // try { - // const templateId = await downloadAndInstallResource({ - // namespace, - // id, - // version, - // sr: pool.default_SR, - // }) - // success('XVA import', 'XVA installed successfuly') - // this.state.selectedInstallPools = [] - // } catch (_error) { - // error('Error', _error.message) - // } - // } - // this.state.loading = false + this.state.loading = true + for (const pool of resourceParams.pools) { + try { + await downloadAndInstallResource({ + namespace, + id, + version, + sr: pool.default_SR, + }) + success('XVA import', 'XVA installed successfuly') + } catch (_error) { + error('Error', _error.message) + } + } + this.state.loading = false } }, - async create() { - const { isFromSources, selectedCreatePool, template } = this.state + async create(__, { name }) { + const { isFromSources, createPoolPredicate, template } = this.state if (isFromSources) { subscribeAlert() } else { + const resourceParams = await form({ + render: props => ( + + ), + header: ( + + {name} + + ), + size: 'medium', + handler: value => { + return value + }, + }) + const { $pool } = resourceParams.pool this.props.router.push( - `/vms/new?pool=${selectedCreatePool.$pool}&template=${template.id}` + `/vms/new?pool=${$pool}&template=${template.id}` ) - this.state.selectedCreatePool = undefined } }, updateSelectedInstallPools(_, selectedInstallPools) { @@ -125,8 +126,6 @@ export default decorate([ }, }, computed: { - idInstallForm: generateId, - idCreateForm: generateId, isFromSources: () => +process.env.XOA_PLAN > 4, poolName: ({ pool }) => pool && pool.name_label, template: (_, { id, templates }) => { @@ -198,63 +197,46 @@ export default decorate([ {formatSize(totalDiskSize)}
- {state.loading ? ( -
- - {_('hubXvaProgressMessage')} - - -
- ) : ( -
- - + + {state.loading ? ( + + ) : ( + - + form={state.idInstallForm} + handler={effects.install} + icon={'add'} + size='meduim' + > + {_('hubInstallXva')} + + )} + + - {_('hubInstallXva')} + {_('hubCreateXva')} -
- )} -
-
- - - {_('hubCreateXva')} - - + + ),