Esempio n. 1
0
        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);
            }
        }
Esempio n. 4
0
        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);
        }