/*
Copyright (C) 2017 Cloudbase Solutions SRL
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
// @flow
import Api from '../utils/ApiCaller'
import notificationStore from '../stores/NotificationStore'
import { OptionsSchemaPlugin } from '../plugins/endpoint'
import { servicesUrl } from '../constants'
import DomUtils from '../utils/DomUtils'
import type { WizardData } from '../types/WizardData'
import type { StorageMap } from '../types/Endpoint'
import type { MainItem } from '../types/MainItem'
import type { InstanceScript } from '../types/Instance'
class WizardSource {
async create(
type: string,
data: WizardData,
defaultStorage: ?string,
storageMap: StorageMap[],
uploadedUserScripts: InstanceScript[]
): Promise {
const sourceParser = data.source ? OptionsSchemaPlugin[data.source.type] || OptionsSchemaPlugin.default : OptionsSchemaPlugin.default
const destParser = data.target ? OptionsSchemaPlugin[data.target.type] || OptionsSchemaPlugin.default : OptionsSchemaPlugin.default
let payload = {}
payload[type] = {
origin_endpoint_id: data.source ? data.source.id : 'null',
destination_endpoint_id: data.target ? data.target.id : 'null',
destination_environment: destParser.getDestinationEnv(data.destOptions),
network_map: destParser.getNetworkMap(data.networks),
instances: data.selectedInstances ? data.selectedInstances.map(i => i.instance_name || i.name) : 'null',
storage_mappings: destParser.getStorageMap(defaultStorage, storageMap),
notes: data.destOptions ? data.destOptions.description || '' : '',
}
if (data.destOptions && data.destOptions.skip_os_morphing != null) {
payload[type].skip_os_morphing = data.destOptions.skip_os_morphing
}
if (data.sourceOptions) {
payload[type].source_environment = sourceParser.getDestinationEnv(data.sourceOptions)
}
if (type === 'migration') {
payload[type].shutdown_instances = Boolean(data.destOptions && data.destOptions.shutdown_instances)
payload[type].replication_count = (data.destOptions && data.destOptions.replication_count) || 2
if (uploadedUserScripts.length) {
payload[type].user_scripts = destParser.getUserScripts(uploadedUserScripts)
}
}
let response = await Api.send({
url: `${servicesUrl.coriolis}/${Api.projectId}/${type}s`,
method: 'POST',
data: payload,
})
return response.data[type]
}
async createMultiple(
type: string,
data: WizardData,
defaultStorage: ?string,
storageMap: StorageMap[],
uploadedUserScripts: InstanceScript[]
): Promise {
if (!data.selectedInstances) {
throw new Error('No selected instances')
}
let mainItems = await Promise.all(data.selectedInstances.map(async instance => {
let newData = { ...data }
newData.selectedInstances = [instance]
try {
let mainItem: MainItem = await this.create(type, newData, defaultStorage, storageMap, uploadedUserScripts)
return mainItem
} catch (err) {
notificationStore.alert(`Error while creating ${type} for instance ${instance.name}`, 'error')
return null
}
}))
return mainItems.filter(Boolean).map(i => i)
}
setUrlState(data: any) {
let locationExp = /.*?(?:\?|$)/.exec(window.location.href)
if (!locationExp || DomUtils.isSafari()) {
return
}
let location = locationExp[0].replace('?', '')
window.history.replaceState({}, null, `${location}?d=${btoa(JSON.stringify(data))}`)
}
getUrlState() {
let dataExpExec = /\?d=(.*)/.exec(window.location.href)
let result = null
try {
result = dataExpExec && JSON.parse(atob(dataExpExec[1]))
} catch (err) {
console.error(err)
}
return result
}
}
export default new WizardSource()