/* 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 moment from 'moment' import Api from '../utils/ApiCaller' import type { MainItem } from '../types/MainItem' import type { Field } from '../types/Field' import { servicesUrl } from '../config' class MigrationSourceUtils { static sortTaskUpdates(migration) { if (migration && migration.tasks) { migration.tasks.forEach(task => { if (task && task.progress_updates) { task.progress_updates.sort((a, b) => { let sortNull = !a && b ? 1 : a && !b ? -1 : !a && !b ? 0 : false if (sortNull !== false) { return sortNull } return moment(b.created_at).isBefore(moment(a.created_at)) }) } }) } } static sortMigrations(migrations) { migrations.sort((a, b) => moment(b.created_at).diff(moment(a.created_at))) migrations.forEach(migration => { MigrationSourceUtils.sortTaskUpdates(migration) }) } } class MigrationSource { static getMigrations(): Promise { return new Promise((resolve, reject) => { let projectId = cookie.get('projectId') || 'null' Api.get(`${servicesUrl.coriolis}/${projectId}/migrations/detail`).then(response => { let migrations = response.data.migrations MigrationSourceUtils.sortMigrations(migrations) resolve(migrations) }).catch(reject) }) } static getMigration(migrationId: string): Promise { return new Promise((resolve, reject) => { let projectId = cookie.get('projectId') || 'null' Api.get(`${servicesUrl.coriolis}/${projectId}/migrations/${migrationId}`).then(response => { let migration = response.data.migration MigrationSourceUtils.sortTaskUpdates(migration) resolve(migration) }).catch(reject) }) } static cancel(migrationId: string): Promise { return new Promise((resolve, reject) => { let projectId = cookie.get('projectId') || 'null' Api.send({ url: `${servicesUrl.coriolis}/${projectId}/migrations/${migrationId}/actions`, method: 'POST', data: { cancel: null }, }).then(() => { resolve(migrationId) }).catch(reject) }) } static delete(migrationId: string): Promise { return new Promise((resolve, reject) => { let projectId = cookie.get('projectId') Api.send({ url: `${servicesUrl.coriolis}/${projectId || 'null'}/migrations/${migrationId}`, method: 'DELETE', }).then(() => { resolve(migrationId) }, reject).catch(reject) }) } static migrateReplica(replicaId: string, options: Field[]): Promise { return new Promise((resolve, reject) => { let projectId = cookie.get('projectId') let payload = { migration: { replica_id: replicaId, }, } options.forEach(o => { payload.migration[o.name] = o.value || false }) Api.send({ url: `${servicesUrl.coriolis}/${projectId || 'null'}/migrations`, method: 'POST', data: payload, }).then(response => { let migration = response.data.migration resolve(migration) }).catch(reject) }) } } export default MigrationSource