/*
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 cookie from 'js-cookie'
import Api from '../utils/ApiCaller'
import notificationStore from '../stores/NotificationStore'
import { OptionsSchemaPlugin } from '../plugins/endpoint'
import { servicesUrl } from '../config'
import type { WizardData } from '../types/WizardData'
import type { MainItem } from '../types/MainItem'
class WizardSource {
static create(type: string, data: WizardData): Promise {
return new Promise((resolve, reject) => {
let projectId = cookie.get('projectId')
const parser = 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: parser.getDestinationEnv(data),
instances: data.selectedInstances ? data.selectedInstances.map(i => i.instance_name) : 'null',
notes: '',
}
if (data.options && data.options.skip_os_morphing !== null && data.options.skip_os_morphing !== undefined) {
payload[type].skip_os_morphing = data.options.skip_os_morphing
}
Api.send({
url: `${servicesUrl.coriolis}/${projectId || 'null'}/${type}s`,
method: 'POST',
data: payload,
}).then(response => {
resolve(response.data[type])
}).catch(reject)
})
}
static createMultiple(type: string, data: WizardData): Promise {
return new Promise((resolve, reject) => {
let items = []
let count = 0
if (!data.selectedInstances) {
reject('No selected instances')
return
}
data.selectedInstances.forEach(instance => {
let newData = { ...data }
newData.selectedInstances = [instance]
WizardSource.create(type, newData).then(item => {
count += 1
items.push(item)
// $FlowIssue
if (count === data.selectedInstances.length) {
if (items.length > 0) {
resolve(items)
} else {
reject()
}
}
}, () => {
count += 1
notificationStore.notify(`Error while creating ${type} for instance ${instance.name}`, 'error', {
persist: true,
persistInfo: { title: `${type} creation error` },
})
})
})
})
}
static setPermalink(data: WizardData) {
let hashExp = /(#\/wizard\/.*?)(?:\?|$)/
if (!hashExp.test(window.location.hash)) {
return
}
let hash = hashExp.exec(window.location.hash)[1]
window.history.replaceState({}, null, `${hash}?d=${btoa(JSON.stringify(data))}`)
}
static getDataFromPermalink() {
let dataExp = /\?d=(.*)/
if (!dataExp.test(window.location.hash)) {
return null
}
return JSON.parse(atob(dataExp.exec(window.location.hash)[1]))
}
}
export default WizardSource