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')}
+ ))}
,