diff --git a/packages/xo-server-cloud/src/index.js b/packages/xo-server-cloud/src/index.js index 85c62bf53..46bc8459b 100644 --- a/packages/xo-server-cloud/src/index.js +++ b/packages/xo-server-cloud/src/index.js @@ -94,8 +94,12 @@ class XoServerCloud { async _registerResource (namespace) { const _namespace = (await this._getNamespaces())[namespace] + if (_namespace === undefined) { + throw new Error(`${namespace} is not available`) + } + if (_namespace.registered || _namespace.pending) { - return new Error(`already registered for ${namespace}`) + throw new Error(`already registered for ${namespace}`) } return this._updater.call('registerResource', { namespace }) diff --git a/packages/xo-web/src/common/intl/messages.js b/packages/xo-web/src/common/intl/messages.js index 724ed6a15..da95666ca 100644 --- a/packages/xo-web/src/common/intl/messages.js +++ b/packages/xo-web/src/common/intl/messages.js @@ -1749,8 +1749,6 @@ const messages = { contactUs: 'Contact us!', xosanNoLicense: 'No license.', xosanUnlockNow: 'Unlock now!', - xosanBetaOverMessage: - 'XOSAN Beta is over. You may now delete and recreate previous existing XOSAN SRs.', selectLicense: 'Select a license', bindLicense: 'Bind license', expiresOn: 'expires on {date}', diff --git a/packages/xo-web/src/common/xo/index.js b/packages/xo-web/src/common/xo/index.js index 4cd9b37ac..345b1704a 100644 --- a/packages/xo-web/src/common/xo/index.js +++ b/packages/xo-web/src/common/xo/index.js @@ -2179,6 +2179,11 @@ export const downloadAndInstallXosanPack = pool => }) ) +export const registerXosan = () => + _call('cloud.registerResource', { namespace: 'xosan' })::tap( + subscribeResourceCatalog.forceRefresh + ) + export const fixHostNotInXosanNetwork = (xosanSr, host) => _call('xosan.fixHostNotInNetwork', { xosanSr, host }) diff --git a/packages/xo-web/src/xo-app/xosan/index.js b/packages/xo-web/src/xo-app/xosan/index.js index fe505c03f..0bb80f080 100644 --- a/packages/xo-web/src/xo-app/xosan/index.js +++ b/packages/xo-web/src/xo-app/xosan/index.js @@ -9,6 +9,7 @@ import SortedTable from 'sorted-table' import Tooltip from 'tooltip' import { Container, Col, Row } from 'grid' import { get } from 'xo-defined' +import { ignoreErrors } from 'promise-toolbox' import { every, filter, @@ -32,6 +33,7 @@ import { import { deleteSr, getLicenses, + registerXosan, subscribePlugins, subscribeResourceCatalog, subscribeVolumeInfo, @@ -395,20 +397,24 @@ export default class Xosan extends Component { } ) - _showBetaIsOver = createSelector( - () => this.props.catalog, - () => this.state.xosanLicenses, - () => this.state.xosanTrialLicenses, - () => this.state.licenseError, - (catalog, xosanLicenses, xosanTrialLicenses, licenseError) => - licenseError === undefined && - get(() => catalog._namespaces.xosan) !== undefined && - isEmpty(xosanLicenses) && - isEmpty(xosanTrialLicenses) - ) - _onSrCreationStarted = () => this.setState({ showNewXosanForm: false }) + _isXosanRegistered = () => + get(() => this.props.catalog._namespaces.xosan.registered) + + _toggleShowNewXosanForm = () => { + if (this.state.showNewXosanForm) { + this.setState({ showNewXosanForm: false }) + return + } + + if (!this._isXosanRegistered()) { + ;registerXosan()::ignoreErrors() + } + + this.setState({ showNewXosanForm: true }) + } + render () { const { hostsNeedRestartByPool, @@ -433,18 +439,11 @@ export default class Xosan extends Component { ) : ( [ - this._showBetaIsOver() && ( - - - {_('xosanBetaOverMessage')} - - - ), {_('xosanNew')} @@ -453,18 +452,21 @@ export default class Xosan extends Component { , - {this.state.showNewXosanForm && ( - xoaRegistration.state) !== 'registered' - } - /> - )} + {this.state.showNewXosanForm && + (this._isXosanRegistered() ? ( + xoaRegistration.state) !== 'registered' + } + /> + ) : ( + {_('statusLoading')} + ))} ,