/* 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 { observable, action, runInAction } from 'mobx' import type { MainItem, UpdateData } from '../types/MainItem' import type { Field } from '../types/Field' import type { Endpoint } from '../types/Endpoint' import type { InstanceScript } from '../types/Instance' import MigrationSource from '../sources/MigrationSource' class MigrationStore { @observable migrations: MainItem[] = [] @observable migrationDetails: ?MainItem = null @observable loading: boolean = true @observable detailsLoading: boolean = true migrationsLoaded: boolean = false @action async getMigrations(options?: { showLoading?: boolean, skipLog?: boolean }) { if ((options && options.showLoading) || !this.migrationsLoaded) { this.loading = true } try { let migrations = await MigrationSource.getMigrations(options && options.skipLog) runInAction(() => { this.migrations = migrations.map(migration => { let oldMigration = this.migrations.find(r => r.id === migration.id) if (oldMigration) { migration.executions = oldMigration.executions } return migration }) this.loading = false this.migrationsLoaded = true }) } catch (ex) { runInAction(() => { this.loading = false }) throw ex } } getDefaultSkipOsMorphing(migration: ?MainItem) { let tasks = migration && migration.tasks if (tasks && !tasks.find(t => t.task_type === 'OS_MORPHING')) { return true } return null } @action async recreate( migration: MainItem, sourceEndpoint: Endpoint, destEndpoint: Endpoint, updateData: UpdateData, defaultStorage: ?string, updatedDefaultStorage: ?string, replicationCount: ?number ): Promise { let migrationResult = await MigrationSource.recreate({ sourceEndpoint, destEndpoint, instanceNames: migration.instances, sourceEnv: migration.source_environment, updatedSourceEnv: updateData.source, destEnv: migration.destination_environment, updatedDestEnv: updateData.destination, storageMappings: migration.storage_mappings, updatedStorageMappings: updateData.storage, defaultStorage, updatedDefaultStorage, networkMappings: migration.network_map, updatedNetworkMappings: updateData.network, defaultSkipOsMorphing: this.getDefaultSkipOsMorphing(migration), replicationCount, }) return migrationResult } @action async getMigration(migrationId: string, options?: { showLoading?: boolean, skipLog?: boolean }) { if (options && options.showLoading) { this.detailsLoading = true } try { let migration = await MigrationSource.getMigration(migrationId, options && options.skipLog) runInAction(() => { this.migrationDetails = migration this.migrations = this.migrations.map(m => m.id === migration.id ? migration : m) }) } finally { runInAction(() => { this.detailsLoading = false }) } } @action async cancel(migrationId: string, force: ?boolean) { await MigrationSource.cancel(migrationId, force) } @action async delete(migrationId: string) { await MigrationSource.delete(migrationId) runInAction(() => { this.migrations = this.migrations.filter(r => r.id !== migrationId) }) } @action async migrateReplica(replicaId: string, options: Field[], userScripts: InstanceScript[]) { let migration = await MigrationSource.migrateReplica(replicaId, options, userScripts) runInAction(() => { this.migrations = [ migration, ...this.migrations, ] }) return migration } @action clearDetails() { this.detailsLoading = true this.migrationDetails = null } } export default new MigrationStore()