2
0
Эх сурвалжийг харах

Merge pull request #364 from smiclea/remigrate-from-replica

Recreate migration from replica CORWEB-202
Dorin Paslaru 7 жил өмнө
parent
commit
69e4dd8c20

+ 8 - 0
src/components/organisms/MainDetails/MainDetails.jsx

@@ -338,6 +338,14 @@ class MainDetails extends React.Component<Props> {
               </Field>
             </Row>
           ) : null}
+          {this.props.item && this.props.item.replica_id ? (
+            <Row>
+              <Field>
+                <Label>Created from Replica</Label>
+                <ValueLink to={`/replica/${this.props.item.replica_id}`}>{this.props.item.replica_id}</ValueLink>
+              </Field>
+            </Row>
+          ) : null}
         </Column>
         <Column width="9.5%">
           <Arrow />

+ 41 - 3
src/components/pages/MigrationDetailsPage/MigrationDetailsPage.jsx

@@ -24,6 +24,8 @@ import DetailsContentHeader from '../../organisms/DetailsContentHeader'
 import MigrationDetailsContent from '../../organisms/MigrationDetailsContent'
 import AlertModal from '../../organisms/AlertModal'
 import EditReplica from '../../organisms/EditReplica'
+import Modal from '../../molecules/Modal'
+import ReplicaMigrationOptions from '../../organisms/ReplicaMigrationOptions'
 
 import migrationStore from '../../../stores/MigrationStore'
 import userStore from '../../../stores/UserStore'
@@ -36,6 +38,8 @@ import configLoader from '../../../utils/Config'
 import migrationImage from './images/migration.svg'
 import Palette from '../../styleUtils/Palette'
 
+import type { Field } from '../../../types/Field'
+
 const Wrapper = styled.div``
 
 type Props = {
@@ -46,6 +50,7 @@ type State = {
   showDeleteMigrationConfirmation: boolean,
   showCancelConfirmation: boolean,
   showEditModal: boolean,
+  showFromReplicaModal: boolean,
 }
 @observer
 class MigrationDetailsPage extends React.Component<Props, State> {
@@ -53,6 +58,7 @@ class MigrationDetailsPage extends React.Component<Props, State> {
     showDeleteMigrationConfirmation: false,
     showCancelConfirmation: false,
     showEditModal: false,
+    showFromReplicaModal: false,
   }
 
   pollTimeout: TimeoutID
@@ -128,9 +134,16 @@ class MigrationDetailsPage extends React.Component<Props, State> {
   }
 
   handleRecreateClick() {
-    this.setState({
-      showEditModal: true,
-    })
+    let replicaId = migrationStore.migrationDetails && migrationStore.migrationDetails.replica_id
+    if (!replicaId) {
+      this.setState({ showEditModal: true })
+      return
+    }
+    this.setState({ showFromReplicaModal: true })
+  }
+
+  handleCloseFromReplicaModal() {
+    this.setState({ showFromReplicaModal: false })
   }
 
   handleCloseCancelConfirmation() {
@@ -151,6 +164,18 @@ class MigrationDetailsPage extends React.Component<Props, State> {
     })
   }
 
+  recreateFromReplica(options: Field[]) {
+    let replicaId = migrationStore.migrationDetails && migrationStore.migrationDetails.replica_id
+    if (!replicaId) {
+      return
+    }
+
+    migrationStore.migrateReplica(replicaId, options).then(migration => {
+      this.props.history.push(`/migration/tasks/${migration.id}`)
+    })
+    this.handleCloseFromReplicaModal()
+  }
+
   pollData() {
     if (this.state.showEditModal) {
       return
@@ -256,7 +281,20 @@ class MigrationDetailsPage extends React.Component<Props, State> {
           onConfirmation={() => { this.handleCancelConfirmation() }}
           onRequestClose={() => { this.handleCloseCancelConfirmation() }}
         />
+        {this.state.showFromReplicaModal ? (
+          <Modal
+            isOpen
+            title="Recreate Migration from Replica"
+            onRequestClose={() => { this.handleCloseFromReplicaModal() }}
+          >
+            <ReplicaMigrationOptions
+              onCancelClick={() => { this.handleCloseFromReplicaModal() }}
+              onMigrateClick={options => { this.recreateFromReplica(options) }}
+            />
+          </Modal>
+        ) : null}
         {this.renderEditModal()}
+
       </Wrapper>
     )
   }

+ 11 - 1
src/components/pages/ReplicaDetailsPage/ReplicaDetailsPage.jsx

@@ -40,6 +40,7 @@ import endpointStore from '../../../stores/EndpointStore'
 import scheduleStore from '../../../stores/ScheduleStore'
 import instanceStore from '../../../stores/InstanceStore'
 import networkStore from '../../../stores/NetworkStore'
+import notificationStore from '../../../stores/NotificationStore'
 import configLoader from '../../../utils/Config'
 
 import replicaImage from './images/replica.svg'
@@ -261,7 +262,16 @@ class ReplicaDetailsPage extends React.Component<Props, State> {
   }
 
   migrateReplica(options: Field[]) {
-    migrationStore.migrateReplica(replicaStore.replicaDetails ? replicaStore.replicaDetails.id : '', options)
+    migrationStore.migrateReplica(replicaStore.replicaDetails ? replicaStore.replicaDetails.id : '', options).then(migration => {
+      notificationStore.alert('Migration successfully created from replica.', 'success', {
+        action: {
+          label: 'View Migration Status',
+          callback: () => {
+            this.props.history.push(`/migration/tasks/${migration.id}`)
+          },
+        },
+      })
+    })
     this.handleCloseMigrationModal()
   }
 

+ 2 - 12
src/stores/MigrationStore.js

@@ -19,9 +19,7 @@ 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 notificationStore from '../stores/NotificationStore'
 import MigrationSource from '../sources/MigrationSource'
-import DomUtils from '../utils/DomUtils'
 
 class MigrationStore {
   @observable migrations: MainItem[] = []
@@ -93,21 +91,13 @@ class MigrationStore {
     })
   }
 
-  @action migrateReplica(replicaId: string, options: Field[]) {
+  @action migrateReplica(replicaId: string, options: Field[]): Promise<MainItem> {
     return MigrationSource.migrateReplica(replicaId, options).then(migration => {
       this.migrations = [
         migration,
         ...this.migrations,
       ]
-
-      notificationStore.alert('Migration successfully created from replica.', 'success', {
-        action: {
-          label: 'View Migration Status',
-          callback: () => {
-            window.location.href = `/${DomUtils.urlHashPrefix}migration/tasks/${migration.id}`
-          },
-        },
-      })
+      return migration
     })
   }
 

+ 1 - 0
src/types/MainItem.js

@@ -45,6 +45,7 @@ export type MainItem = {
   tasks: Task[],
   created_at: Date,
   updated_at: Date,
+  replica_id?: string,
   origin_endpoint_id: string,
   destination_endpoint_id: string,
   instances: string[],