private List <PlanAction> CompilePoolUpdateActionList(Host host, Pool_update poolUpdate) { var hostRebootRequired = WizardHelpers.IsHostRebootRequiredForUpdate(host, poolUpdate, LivePatchCodesByHost); var actions = new List <PlanAction> { new ApplyPoolUpdatePlanAction(host, poolUpdate, hostRebootRequired) }; if (hostRebootRequired) { actions.Add(new RestartHostPlanAction(host, host.GetRunningVMs())); } if (poolUpdate.after_apply_guidance.Contains(update_after_apply_guidance.restartXAPI)) { actions.Add(new RestartAgentPlanAction(host)); } if (poolUpdate.after_apply_guidance.Contains(update_after_apply_guidance.restartHVM)) { actions.Add(new RebootVMsPlanAction(host, host.GetRunningHvmVMs())); } if (poolUpdate.after_apply_guidance.Contains(update_after_apply_guidance.restartPV)) { actions.Add(new RebootVMsPlanAction(host, host.GetRunningPvVMs())); } return(actions); }
private void PrecheckSuppPack(Pool_update update, string suppPack, out bool alreadyApplied, out bool updateRequiresHostEvacuation) { alreadyApplied = false; if (Cancelling) { throw new CancelledException(); } var livePatchStatus = new Dictionary <string, livepatch_status>(); try { AddProgressStep(string.Format(Messages.UPDATES_WIZARD_RUNNING_PRECHECK, suppPack, host.Name())); PatchPrecheckCheck check = new PatchPrecheckCheck(host, update, livePatchStatus); var problems = check.RunAllChecks(); updateRequiresHostEvacuation = WizardHelpers.IsHostRebootRequiredForUpdate(host, update, livePatchStatus); if (problems != null && problems.Count > 0) { if (problems[0] is PatchAlreadyApplied) { log.InfoFormat("The update {0} is already applied on {1}. Ignore it.", suppPack, host.Name()); ReplaceProgressStep(string.Format(Messages.UPDATES_WIZARD_SKIPPING_UPDATE, suppPack, host.Name())); alreadyApplied = true; } else { throw new Exception(problems[0].Description); } } } catch (Exception ex) { log.Error(string.Format("Precheck failed on host {0}", host.Name()), ex); throw; } if (livePatchStatus.ContainsKey(host.uuid) && livePatchStatus[host.uuid] != livepatch_status.ok_livepatch_complete && !hostsThatWillRequireReboot.Contains(host.uuid)) { hostsThatWillRequireReboot.Add(host.uuid); } }
protected override void RunWithSession(ref Session session) { var master = Helpers.GetMaster(Connection); var mapping = (from HostUpdateMapping hum in mappings let xpm = hum as XenServerPatchMapping where xpm != null && xpm.Matches(master, xenServerPatch) select xpm).FirstOrDefault(); if (mapping == null || !mapping.IsValid) { return; } var livePatchStatus = new Dictionary <string, livepatch_status>(); if (Cancelling) { throw new CancelledException(); } var updateRequiresHostReboot = false; try { AddProgressStep(string.Format(Messages.UPDATES_WIZARD_RUNNING_PRECHECK, xenServerPatch.Name, host.Name())); RefreshUpdate(host, mapping, session); List <Problem> problems = null; if (mapping is PoolPatchMapping patchMapping) { log.InfoFormat("Running patch precheck on '{0}'. Patch = '{1}' (uuid = '{2}'; opaque_ref = '{3}')", host.Name(), patchMapping.Pool_patch.Name(), patchMapping.Pool_patch.uuid, patchMapping.Pool_patch.opaque_ref); problems = new PatchPrecheckCheck(host, patchMapping.Pool_patch, livePatchStatus).RunAllChecks(); updateRequiresHostReboot = WizardHelpers.IsHostRebootRequiredForUpdate(host, patchMapping.Pool_patch, livePatchStatus); } else if (mapping is PoolUpdateMapping updateMapping) { log.InfoFormat("Running update precheck on '{0}'. Update = '{1}' (uuid = '{2}'; opaque_ref = '{3}'", host.Name(), updateMapping.Pool_update.Name(), updateMapping.Pool_update.uuid, updateMapping.Pool_update.opaque_ref); problems = new PatchPrecheckCheck(host, updateMapping.Pool_update, livePatchStatus).RunAllChecks(); updateRequiresHostReboot = WizardHelpers.IsHostRebootRequiredForUpdate(host, updateMapping.Pool_update, livePatchStatus); } Problem problem = null; if (problems != null && problems.Count > 0) { problem = problems[0]; } if (problem != null) { throw new Exception(problem.Description); } } catch (Exception ex) { log.Error(string.Format("Precheck failed on host {0}", host.Name()), ex); throw; } if (updateRequiresHostReboot && !hostsThatWillRequireReboot.Contains(host.uuid)) { hostsThatWillRequireReboot.Add(host.uuid); } if (updateRequiresHostReboot && !mapping.HostsThatNeedEvacuated.Contains(host.uuid)) { mapping.HostsThatNeedEvacuated.Add(host.uuid); } if (livePatchStatus.ContainsKey(host.uuid) && livePatchStatus[host.uuid] == livepatch_status.ok_livepatch_complete) { if (!livePatchAttempts.ContainsKey(host.uuid) || livePatchAttempts[host.uuid] == null) { livePatchAttempts[host.uuid] = new List <string>(); } livePatchAttempts[host.uuid].Add(xenServerPatch.Uuid); } }
private List <HostPlan> CompileManualHostPlan(Pool pool, out List <Host> applicableHosts) { var poolHosts = pool.Connection.Cache.Hosts.ToList(); SelectedServers.Sort(); //master first and then the slaves var hostplans = new List <HostPlan>(); if (SelectedUpdateType == UpdateType.ISO) { if (PoolUpdate != null) //ely or greater { foreach (var server in SelectedServers) { if (poolHosts.Contains(server)) { var hostRebootRequired = WizardHelpers.IsHostRebootRequiredForUpdate(server, PoolUpdate, LivePatchCodesByHost); var updateActions = new List <PlanAction> { new ApplyPoolUpdatePlanAction(server, PoolUpdate, hostRebootRequired) }; hostplans.Add(new HostPlan(server, null, updateActions, null)); } } } else if (SuppPackVdis != null) //supp pack { foreach (var server in SelectedServers) { if (SuppPackVdis.ContainsKey(server) && poolHosts.Contains(server)) { var updateActions = new List <PlanAction> { new InstallSupplementalPackPlanAction(server, SuppPackVdis[server]) }; hostplans.Add(new HostPlan(server, null, updateActions, null)); } } } } else // legacy { foreach (var server in SelectedServers) { if (poolHosts.Contains(server)) { var hostRebootRequired = WizardHelpers.IsHostRebootRequiredForUpdate(server, Patch, LivePatchCodesByHost); var updateActions = new List <PlanAction> { new ApplyPatchPlanAction(server, Patch, hostRebootRequired) }; hostplans.Add(new HostPlan(server, null, updateActions, null)); } } if (RemoveUpdateFile && hostplans.Count > 0) { hostplans[hostplans.Count - 1].UpdatesPlanActions.Add(new RemoveUpdateFile(pool, Patch)); } } applicableHosts = hostplans.Select(h => h.Host).ToList(); return(hostplans); }