public override void PageLoaded(PageLoadedDirection direction) { base.PageLoaded(direction); if (_thisPageIsCompleted) { return; } foreach (var pool in SelectedPools) { var master = Helpers.GetMaster(pool.Connection); var planActions = new List <PlanAction>(); var delayedActionsByHost = new Dictionary <Host, List <PlanAction> >(); var finalActions = new List <PlanAction>(); foreach (var host in pool.Connection.Cache.Hosts) { delayedActionsByHost.Add(host, new List <PlanAction>()); } var hosts = pool.Connection.Cache.Hosts; var us = Updates.GetUpgradeSequence(pool.Connection); Debug.Assert(us != null, "Update sequence should not be null."); if (us != null) { foreach (var patch in us.UniquePatches) { var hostsToApply = us.Where(u => u.Value.Contains(patch)).Select(u => u.Key).ToList(); hostsToApply.Sort(); planActions.Add(new DownloadPatchPlanAction(master.Connection, patch, AllDownloadedPatches)); planActions.Add(new UploadPatchToMasterPlanAction(master.Connection, patch, patchMappings, AllDownloadedPatches)); planActions.Add(new PatchPrechecksOnMultipleHostsInAPoolPlanAction(master.Connection, patch, hostsToApply, patchMappings)); foreach (var host in hostsToApply) { planActions.Add(new ApplyXenServerPatchPlanAction(host, patch, patchMappings)); planActions.AddRange(GetMandatoryActionListForPatch(host, patch)); UpdateDelayedAfterPatchGuidanceActionListForHost(delayedActionsByHost[host], host, patch); } //clean up master at the end: planActions.Add(new RemoveUpdateFileFromMasterPlanAction(master, patchMappings, patch)); }//patch } //add a revert pre-check action for this pool var problemsToRevert = ProblemsResolvedPreCheck.Where(p => hosts.ToList().Select(h => h.uuid).ToList().Contains(p.Check.Host.uuid)).ToList(); if (problemsToRevert.Count > 0) { finalActions.Add(new UnwindProblemsAction(problemsToRevert, string.Format(Messages.REVERTING_RESOLVED_PRECHECKS_POOL, pool.Connection.Name))); } if (planActions.Count > 0) { var bgw = new UpdateProgressBackgroundWorker(master, planActions, delayedActionsByHost, finalActions); backgroundWorkers.Add(bgw); } } //foreach in SelectedMasters foreach (var bgw in backgroundWorkers) { bgw.DoWork += new DoWorkEventHandler(WorkerDoWork); bgw.WorkerReportsProgress = true; bgw.ProgressChanged += new ProgressChangedEventHandler(WorkerProgressChanged); bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(WorkerCompleted); bgw.WorkerSupportsCancellation = true; bgw.RunWorkerAsync(); } if (backgroundWorkers.Count == 0) { _thisPageIsCompleted = true; _nextEnabled = true; OnPageUpdated(); } }
protected override void PageLoadedCore(PageLoadedDirection direction) { if (_thisPageIsCompleted) { return; } Debug.Assert(WizardMode == WizardMode.AutomatedUpdates || WizardMode == WizardMode.NewVersion && UpdateAlert != null); if (WizardMode == WizardMode.AutomatedUpdates) { labelTitle.Text = Messages.PATCHINGWIZARD_UPLOAD_AND_INSTALL_TITLE_AUTOMATED_MODE; } else if (WizardMode == WizardMode.NewVersion) { labelTitle.Text = Messages.PATCHINGWIZARD_UPLOAD_AND_INSTALL_TITLE_NEW_VERSION_AUTOMATED_MODE; } foreach (var pool in SelectedPools) { var master = Helpers.GetMaster(pool.Connection); var planActions = new List <PlanAction>(); var delayedActionsByHost = new Dictionary <Host, List <PlanAction> >(); var finalActions = new List <PlanAction>(); foreach (var host in pool.Connection.Cache.Hosts) { delayedActionsByHost.Add(host, new List <PlanAction>()); } var hosts = pool.Connection.Cache.Hosts; //if any host is not licensed for automated updates bool automatedUpdatesRestricted = pool.Connection.Cache.Hosts.Any(Host.RestrictBatchHotfixApply); var us = WizardMode == WizardMode.NewVersion ? Updates.GetUpgradeSequence(pool.Connection, UpdateAlert, ApplyUpdatesToNewVersion && !automatedUpdatesRestricted) : Updates.GetUpgradeSequence(pool.Connection); Debug.Assert(us != null, "Update sequence should not be null."); if (us != null) { foreach (var patch in us.UniquePatches) { var hostsToApply = us.Where(u => u.Value.Contains(patch)).Select(u => u.Key).ToList(); hostsToApply.Sort(); planActions.Add(new DownloadPatchPlanAction(master.Connection, patch, AllDownloadedPatches, PatchFromDisk)); planActions.Add(new UploadPatchToMasterPlanAction(master.Connection, patch, patchMappings, AllDownloadedPatches, PatchFromDisk)); planActions.Add(new PatchPrechecksOnMultipleHostsInAPoolPlanAction(master.Connection, patch, hostsToApply, patchMappings)); foreach (var host in hostsToApply) { planActions.Add(new ApplyXenServerPatchPlanAction(host, patch, patchMappings)); if (patch.GuidanceMandatory) { var action = patch.after_apply_guidance == after_apply_guidance.restartXAPI && delayedActionsByHost[host].Any(a => a is RestartHostPlanAction) ? new RestartHostPlanAction(host, host.GetRunningVMs(), restartAgentFallback: true) : GetAfterApplyGuidanceAction(host, patch.after_apply_guidance); if (action != null) { planActions.Add(action); // remove all delayed actions of the same kind that has already been added // (because this action is guidance-mandatory=true, therefore // it will run immediately, making delayed ones obsolete) delayedActionsByHost[host].RemoveAll(a => action.GetType() == a.GetType()); } } else { var action = GetAfterApplyGuidanceAction(host, patch.after_apply_guidance); // add the action if it's not already in the list if (action != null && !delayedActionsByHost[host].Any(a => a.GetType() == action.GetType())) { delayedActionsByHost[host].Add(action); } } } //clean up master at the end: planActions.Add(new RemoveUpdateFileFromMasterPlanAction(master, patchMappings, patch)); }//patch } //add a revert pre-check action for this pool var problemsToRevert = ProblemsResolvedPreCheck.Where(p => hosts.ToList().Select(h => h.uuid).ToList().Contains(p.Check.Host.uuid)).ToList(); if (problemsToRevert.Count > 0) { finalActions.Add(new UnwindProblemsAction(problemsToRevert, string.Format(Messages.REVERTING_RESOLVED_PRECHECKS_POOL, pool.Connection.Name))); } if (planActions.Count > 0) { var bgw = new UpdateProgressBackgroundWorker(planActions, delayedActionsByHost, finalActions); backgroundWorkers.Add(bgw); } } //foreach in SelectedMasters foreach (var bgw in backgroundWorkers) { bgw.DoWork += WorkerDoWork; bgw.WorkerReportsProgress = true; bgw.ProgressChanged += WorkerProgressChanged; bgw.RunWorkerCompleted += WorkerCompleted; bgw.WorkerSupportsCancellation = true; bgw.RunWorkerAsync(); } if (backgroundWorkers.Count == 0) { _thisPageIsCompleted = true; _nextEnabled = true; OnPageUpdated(); } }