/* 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 } from 'mobx' import type { MainItem, UpdateData } from '../types/MainItem' import type { Field } from '../types/Field' import type { Endpoint } from '../types/Endpoint' import MigrationSource from '../sources/MigrationSource' class MigrationStore { @observable migrations: MainItem[] = [] @observable migrationDetails: ?MainItem = null @observable loading: boolean = true @observable canceling: boolean | { failed: boolean } = true @observable detailsLoading: boolean = true migrationsLoaded: boolean = false @action getMigrations(options?: { showLoading: boolean }) { if ((options && options.showLoading) || !this.migrationsLoaded) { this.loading = true } return MigrationSource.getMigrations().then(migrations => { 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(() => { this.loading = false }) } @action recreate(migration: MainItem, sourceEndpoint: Endpoint, destEndpoint: Endpoint, updateData: UpdateData): Promise { return MigrationSource.recreate({ sourceEndpoint, destEndpoint, instanceNames: migration.instances, destEnv: migration.destination_environment, updatedDestEnv: updateData.destination, storageMappings: migration.storage_mappings, updatedStorageMappings: updateData.storage, networkMappings: migration.network_map, updatedNetworkMappings: updateData.network, }) } @action getMigration(migrationId: string, showLoading: boolean) { this.detailsLoading = showLoading return MigrationSource.getMigration(migrationId).then(migration => { this.detailsLoading = false this.migrationDetails = migration }).catch(() => { this.detailsLoading = false }) } @action cancel(migrationId: string) { this.canceling = true return MigrationSource.cancel(migrationId).then(() => { this.canceling = false }).catch(() => { this.canceling = { failed: true } }) } @action delete(migrationId: string) { return MigrationSource.delete(migrationId).then(() => { this.migrations = this.migrations.filter(r => r.id !== migrationId) }) } @action migrateReplica(replicaId: string, options: Field[]): Promise { return MigrationSource.migrateReplica(replicaId, options).then(migration => { this.migrations = [ migration, ...this.migrations, ] return migration }) } @action clearDetails() { this.detailsLoading = true this.migrationDetails = null } } export default new MigrationStore()