private void OpenDatabaseActionCompleted(ActionBase sender) { VdiOpenDatabaseAction senderAction = (VdiOpenDatabaseAction)sender; senderAction.Completed -= OpenDatabaseActionCompleted; log.DebugFormat("Metadata database open ({0}). Now start recovering", senderAction.Vdi.Name()); metadataSession = senderAction.MetadataSession; if (metadataSession == null) { return; } // assign metadata session to all recover actions List <AsyncAction> recoverSubActions = new List <AsyncAction>(); foreach (var action in actions[senderAction.Vdi]) { if (action is DrRecoverAction) { ((DrRecoverAction)action).MetadataSession = metadataSession; recoverSubActions.Add(action); } } multipleRecoverAction = new MultipleAction(Connection, String.Format(Messages.DR_WIZARD_RECOVERPAGE_RECOVER_FROM, senderAction.Vdi.Name()), String.Format(Messages.DR_WIZARD_RECOVERPAGE_RECOVERING_FROM, senderAction.Vdi.Name()), Messages.COMPLETED, recoverSubActions); multipleRecoverAction.Completed += MultipleRecoverActionCompleted; multipleRecoverAction.RunAsync(); }
List <AsyncAction> CreateSubActionsFor(PoolMetadata poolMetadata) { log.DebugFormat("Generating recovery actions from pool {0} (VDI {1})", poolMetadata.Pool.Name(), poolMetadata.Vdi.Name()); List <AsyncAction> subActions = new List <AsyncAction>(); VdiOpenDatabaseAction openDatabaseAction = new VdiOpenDatabaseAction(Connection, poolMetadata.Vdi); openDatabaseAction.Completed += OpenDatabaseActionCompleted; subActions.Add(openDatabaseAction); foreach (var vmAppliance in poolMetadata.VmAppliances.Values) { DrRecoverAction drRecoverAction = new DrRecoverAction(Connection, vmAppliance); drRecoverAction.Completed += SingleRecoverActionCompleted; drRecoverAction.Changed += SingleRecoverActionChanged; subActions.Add(drRecoverAction); dataGridView1.Rows.Add(new DataGridViewRowRecover(vmAppliance)); objectsToBeRecovered++; } foreach (var vm in poolMetadata.Vms.Values) { if (vm.IsAssignedToVapp()) { //VM included in an appliance continue; } DrRecoverAction drRecoverAction = new DrRecoverAction(Connection, vm); drRecoverAction.Completed += SingleRecoverActionCompleted; drRecoverAction.Changed += SingleRecoverActionChanged; subActions.Add(drRecoverAction); dataGridView1.Rows.Add(new DataGridViewRowRecover(vm)); objectsToBeRecovered++; } log.DebugFormat("Done - {0} actions generated", subActions.Count); return(subActions); }
private void RecoverNextPool() { foreach (var actionList in actions.Values) { bool startRecovery = false; foreach (var action in actionList) { VdiOpenDatabaseAction openDatabaseAction = action as VdiOpenDatabaseAction; if (openDatabaseAction != null && !openDatabaseAction.IsCompleted) { startRecovery = true; log.DebugFormat("Open metadata database ({0})", openDatabaseAction.Vdi.Name()); openDatabaseAction.RunAsync(); break; } } if (startRecovery) { break; // start recovery of first "unrecovered" pool (unrecovered = !openDatabaseAction.IsCompleted) } } }
void worker_DoWork(object sender, DoWorkEventArgs e) { lock (_lock) { Program.Invoke(this, () => { dataGridView1.Rows.Clear(); progressBar1.Value = 0; }); RevertActions.Clear(); List <KeyValuePair <string, List <Check> > > checks = GenerateChecks(); _numberChecks = checks.Count; for (int i = 0; i < checks.Count; i++) { List <Check> checkGroup = checks[i].Value; DataGridViewRow row = new PreCheckHeaderRow(string.Format(Messages.DR_WIZARD_PRECHECKPAGE_HEADER, i + 1, checks.Count, checks[i].Key)); _worker.ReportProgress(5, row); Session metadataSession = null; // execute checks for (int j = 0; j < checkGroup.Count; j++) { if (_worker.CancellationPending) { e.Cancel = true; return; } Check check = checkGroup[j]; // special case - AssertCanBeRecoveredCheck - we need to open the metadata database if (check is AssertCanBeRecoveredCheck) { AssertCanBeRecoveredCheck thisCheck = check as AssertCanBeRecoveredCheck; AssertCanBeRecoveredCheck prevCheck = j > 0 ? checkGroup[j - 1] as AssertCanBeRecoveredCheck : null; if (prevCheck == null || prevCheck.Vdi.uuid != thisCheck.Vdi.uuid) { // close previous metadata session if (metadataSession != null) { metadataSession.logout(); } // open metadata database VdiOpenDatabaseAction action = new VdiOpenDatabaseAction(Connection, ((AssertCanBeRecoveredCheck )checkGroup[0]).Vdi); action.RunExternal(action.Session); if (action.Succeeded && action.MetadataSession != null) { metadataSession = action.MetadataSession; } } // run check if (metadataSession != null) { thisCheck.MetadataSession = metadataSession; row = ExecuteCheck(thisCheck); _worker.ReportProgress(PercentageSelectedObjects(j + 1), row); // close metadata session if this is the last check if (j == checkGroup.Count - 1) { metadataSession.logout(); } } } else { row = ExecuteCheck(check); _worker.ReportProgress(PercentageSelectedObjects(j + 1), row); } } } } }