Example #1
0
        private List <Host> GetSelectedServers()
        {
            if (poolSelectionOnly)
            {
                var enabledHosts = new List <Host>();
                foreach (PatchingHostsDataGridViewRow row in dataGridViewHosts.Rows)
                {
                    if (row.IsAHostRow && row.Enabled)
                    {
                        enabledHosts.Add((Host)row.Tag);
                    }
                }

                if (WizardMode != WizardMode.SingleUpdate)
                {
                    //prechecks will fail in automated updates mode if one of the hosts is unreachable
                    return(SelectedPools.SelectMany(p => p.Connection.Cache.Hosts.Where(host => enabledHosts.Contains(host)).OrderBy(host => host)).ToList());
                }

                //prechecks will issue warning but allow updates to be installed on the reachable hosts only
                return(SelectedPools.SelectMany(p => p.Connection.Cache.Hosts.Where(host => host.IsLive() && enabledHosts.Contains(host)).OrderBy(host => host)).ToList());
            }
            else
            {
                List <Host> hosts = new List <Host>();
                foreach (PatchingHostsDataGridViewRow row in dataGridViewHosts.Rows)
                {
                    if (row.IsSelectableHost)
                    {
                        if ((row.HasPool && ((int)row.Cells[POOL_ICON_HOST_CHECKBOX_COL].Value) == CHECKED) || (!row.HasPool && ((int)row.Cells[POOL_CHECKBOX_COL].Value) == CHECKED))
                        {
                            hosts.Add((Host)row.Tag);
                        }
                    }
                }
                return(hosts);
            }
        }
        protected virtual List <CheckGroup> GenerateCommonChecks(List <Host> applicableServers)
        {
            var groups = new List <CheckGroup>();

            //HostLivenessCheck checks
            var livenessChecks = new List <Check>();

            foreach (Host host in applicableServers)
            {
                livenessChecks.Add(new HostLivenessCheck(host));
            }

            groups.Add(new CheckGroup(Messages.CHECKING_HOST_LIVENESS_STATUS, livenessChecks));

            //HA checks

            var haChecks = new List <Check>();

            foreach (Host host in SelectedServers)
            {
                if (Helpers.HostIsMaster(host))
                {
                    haChecks.Add(new HAOffCheck(host));
                }
            }
            groups.Add(new CheckGroup(Messages.CHECKING_HA_STATUS, haChecks));

            //PBDsPluggedCheck
            var pbdChecks = new List <Check>();

            foreach (Host host in applicableServers)
            {
                SR uploadSr = null;
                if (PoolUpdate != null && SrUploadedUpdates != null)
                {
                    foreach (var dict in SrUploadedUpdates)
                    {
                        if (dict.Key.uuid == PoolUpdate.uuid && dict.Value.ContainsKey(host))
                        {
                            uploadSr = dict.Value[host];
                            break;
                        }
                    }
                }
                pbdChecks.Add(new PBDsPluggedCheck(host, uploadSr));
            }

            groups.Add(new CheckGroup(Messages.CHECKING_STORAGE_CONNECTIONS_STATUS, pbdChecks));

            XenServerVersion highestNewVersion = null;

            //Disk space, reboot required and can evacuate host checks for automated and version updates
            if (WizardMode != WizardMode.SingleUpdate)
            {
                var diskChecks     = new List <Check>();
                var rebootChecks   = new List <Check>();
                var evacuateChecks = new List <Check>();

                foreach (Pool pool in SelectedPools)
                {
                    //if any host is not licensed for automated updates
                    bool automatedUpdatesRestricted = pool.Connection.Cache.Hosts.Any(Host.RestrictBatchHotfixApply);

                    var minimalPatches = WizardMode == WizardMode.NewVersion
                        ? Updates.GetMinimalPatches(UpdateAlert, ApplyUpdatesToNewVersion && !automatedUpdatesRestricted)
                        : Updates.GetMinimalPatches(pool.Connection);

                    if (minimalPatches == null)
                    {
                        continue;
                    }

                    var us    = new Dictionary <Host, List <XenServerPatch> >();
                    var hosts = pool.Connection.Cache.Hosts;
                    Array.Sort(hosts);

                    foreach (var h in hosts)
                    {
                        var ps = Updates.GetPatchSequenceForHost(h, minimalPatches);
                        if (ps != null)
                        {
                            us[h] = ps;
                        }
                    }

                    log.InfoFormat("Minimal patches for {0}: {1}", pool.Name(), string.Join(",", minimalPatches.Select(p => p.Name)));

                    // we check the contains-livepatch property of all the applicable patches to determine if a host will need to be rebooted after patch installation,
                    // because the minimal patches might roll-up patches that are not live-patchable
                    var allPatches = WizardMode == WizardMode.NewVersion
                        ? Updates.GetAllPatches(UpdateAlert, ApplyUpdatesToNewVersion && !automatedUpdatesRestricted)
                        : Updates.GetAllPatches(pool.Connection);

                    foreach (Host host in us.Keys)
                    {
                        diskChecks.Add(new DiskSpaceForAutomatedUpdatesCheck(host, us));

                        if (us[host] != null && us[host].Count > 0)
                        {
                            var allApplicablePatches = Updates.GetPatchSequenceForHost(host, allPatches);
                            var restartHostPatches   = allApplicablePatches != null
                                ? allApplicablePatches.Where(p => p.after_apply_guidance == after_apply_guidance.restartHost).ToList()
                                : new List <XenServerPatch>();

                            rebootChecks.Add(new HostNeedsRebootCheck(host, restartHostPatches));
                            if (restartHostPatches.Any(p => !p.ContainsLivepatch))
                            {
                                evacuateChecks.Add(new AssertCanEvacuateCheck(host));
                            }

                            foreach (var p in us[host])
                            {
                                var newVersion = Updates.XenServerVersions.FirstOrDefault(v => v.PatchUuid != null && v.PatchUuid.Equals(p.Uuid, StringComparison.OrdinalIgnoreCase));
                                if (newVersion != null && (highestNewVersion == null || newVersion.Version > highestNewVersion.Version))
                                {
                                    highestNewVersion = newVersion;
                                }
                            }
                        }
                    }
                }

                groups.Add(new CheckGroup(Messages.PATCHINGWIZARD_PRECHECKPAGE_CHECKING_DISK_SPACE, diskChecks));
                if (rebootChecks.Count > 0)
                {
                    groups.Add(new CheckGroup(Messages.CHECKING_SERVER_NEEDS_REBOOT, rebootChecks));
                }
                if (evacuateChecks.Count > 0)
                {
                    groups.Add(new CheckGroup(Messages.CHECKING_CANEVACUATE_STATUS, evacuateChecks));
                }
            }

            //XenCenter version check
            if (highestNewVersion != null || UpdateAlert?.NewServerVersion != null)
            {
                // add XenCenter version check as the first group
                groups.Insert(0, new CheckGroup(Messages.CHECKING_XENCENTER_VERSION,
                                                new List <Check> {
                    new XenCenterVersionCheck(highestNewVersion ?? UpdateAlert.NewServerVersion)
                }));
            }

            //GFS2 check for version updates
            if (WizardMode == WizardMode.NewVersion)
            {
                var gfs2Checks = new List <Check>();

                foreach (Pool pool in SelectedPools.Where(p =>
                                                          Helpers.KolkataOrGreater(p.Connection) && !Helpers.LimaOrGreater(p.Connection)))
                {
                    Host host = pool.Connection.Resolve(pool.master);
                    gfs2Checks.Add(new PoolHasGFS2SR(host));
                }

                if (gfs2Checks.Count > 0)
                {
                    groups.Add(new CheckGroup(Messages.CHECKING_CLUSTERING_STATUS, gfs2Checks));
                }
            }

            return(groups);
        }
        protected virtual List <CheckGroup> GenerateChecks(Pool_update update)
        {
            List <Host> applicableServers = update != null?SelectedServers.Where(h => !update.AppliedOn(h)).ToList() : SelectedServers;

            var groups = GenerateCommonChecks(applicableServers);

            //Update Homogeneity check for InvernessOrGreater
            if (update != null)
            {
                var homogeneityChecks = new List <Check>();
                foreach (var pool in SelectedPools.Where(pool => Helpers.InvernessOrGreater(pool.Connection)))
                {
                    homogeneityChecks.Add(new ServerSelectionCheck(pool, update, SelectedServers));
                }

                if (homogeneityChecks.Count > 0)
                {
                    groups.Add(new CheckGroup(Messages.CHECKING_SERVER_SELECTION, homogeneityChecks));
                }
            }

            //Checking other things
            if (update != null)
            {
                var serverChecks = new List <Check>();
                foreach (Host host in SelectedServers)
                {
                    var updates            = new List <Pool_update>(host.Connection.Cache.Pool_updates);
                    var poolUpdateFromHost = updates.Find(p => string.Equals(p.uuid, update.uuid, StringComparison.OrdinalIgnoreCase));

                    SR uploadSr = null;
                    if (SrUploadedUpdates != null && poolUpdateFromHost != null &&
                        SrUploadedUpdates.ContainsKey(poolUpdateFromHost) && SrUploadedUpdates[poolUpdateFromHost].ContainsKey(host))
                    {
                        uploadSr = SrUploadedUpdates[poolUpdateFromHost][host];
                    }

                    serverChecks.Add(new PatchPrecheckCheck(host, poolUpdateFromHost, LivePatchCodesByHost, uploadSr));
                }
                groups.Add(new CheckGroup(Messages.CHECKING_SERVER_SIDE_STATUS, serverChecks));
            }

            //Checking if the host needs a reboot
            if (WizardMode == WizardMode.SingleUpdate)
            {
                var rebootChecks = new List <Check>();
                var guidance     = update != null
                    ? update.after_apply_guidance
                    : new List <update_after_apply_guidance> {
                    update_after_apply_guidance.restartHost
                };
                foreach (var host in applicableServers)
                {
                    rebootChecks.Add(new HostNeedsRebootCheck(host, guidance, LivePatchCodesByHost));
                }

                groups.Add(new CheckGroup(Messages.CHECKING_SERVER_NEEDS_REBOOT, rebootChecks));
            }

            //Checking can evacuate host
            if (WizardMode == WizardMode.SingleUpdate && (update == null || update.after_apply_guidance.Contains(update_after_apply_guidance.restartHost)))
            {
                var evacuateChecks = new List <Check>();
                foreach (Host host in applicableServers)
                {
                    evacuateChecks.Add(new AssertCanEvacuateCheck(host, LivePatchCodesByHost));
                }

                groups.Add(new CheckGroup(Messages.CHECKING_CANEVACUATE_STATUS, evacuateChecks));
            }

            //Checking if a reboot is pending on master
            var restartChecks = new List <Check>();

            foreach (var pool in SelectedPools)
            {
                restartChecks.Add(new RestartHostOrToolstackPendingOnMasterCheck(pool, update == null ? null : update.uuid));
            }
            groups.Add(new CheckGroup(Messages.CHECKING_FOR_PENDING_RESTART, restartChecks));

            return(groups);
        }
        protected override List <CheckGroup> GenerateChecks(Pool_patch patch)
        {
            var groups = new List <CheckGroup>();

            List <Host> hostsToUpgrade         = new List <Host>();
            List <Host> hostsToUpgradeOrUpdate = new List <Host>();

            foreach (var pool in SelectedPools)
            {
                var poolHostsToUpgrade = pool.HostsToUpgrade();
                hostsToUpgrade.AddRange(poolHostsToUpgrade);
                hostsToUpgradeOrUpdate.AddRange(ApplyUpdatesToNewVersion
                    ? HostsToUpgradeOrUpdate(pool)
                    : poolHostsToUpgrade);
            }

            //XenCenter version check (if any of the selected server version is not the latest)
            var latestCrVersion = Updates.XenServerVersions.FindAll(item => item.LatestCr).OrderByDescending(v => v.Version).FirstOrDefault();

            if (latestCrVersion != null &&
                hostsToUpgradeOrUpdate.Any(host => new Version(Helpers.HostProductVersion(host)) < latestCrVersion.Version))
            {
                groups.Add(new CheckGroup(Messages.CHECKING_XENCENTER_VERSION, new List <Check> {
                    new XenCenterVersionCheck(null)
                }));
            }

            //HostMaintenanceModeCheck checks - for hosts that will be upgraded or updated
            var livenessChecks = new List <Check>();

            foreach (Host host in hostsToUpgradeOrUpdate)
            {
                livenessChecks.Add(new HostLivenessCheck(host, hostsToUpgrade.Contains(host)));
            }
            groups.Add(new CheckGroup(Messages.CHECKING_HOST_LIVENESS_STATUS, livenessChecks));

            //HotfixesCheck - for hosts that will be upgraded
            var hotfixChecks = new List <Check>();

            foreach (var host in hostsToUpgrade)
            {
                if (HotfixFactory.IsHotfixRequired(host) && !ManualUpgrade)
                {
                    hotfixChecks.Add(new HostHasHotfixCheck(host));
                }
            }
            if (hotfixChecks.Count > 0)
            {
                groups.Add(new CheckGroup(Messages.CHECKING_UPGRADE_HOTFIX_STATUS, hotfixChecks));
            }

            //SafeToUpgrade- and PrepareToUpgrade- checks - in automatic mode only, for hosts that will be upgraded
            if (!ManualUpgrade)
            {
                var prepareToUpgradeChecks = new List <Check>();
                foreach (var host in hostsToUpgrade)
                {
                    prepareToUpgradeChecks.Add(new PrepareToUpgradeCheck(host, InstallMethodConfig));
                }
                groups.Add(new CheckGroup(Messages.CHECKING_PREPARE_TO_UPGRADE, prepareToUpgradeChecks));

                var safeToUpgradeChecks = new List <Check>();
                foreach (var host in hostsToUpgrade)
                {
                    safeToUpgradeChecks.Add(new SafeToUpgradeCheck(host));
                }
                groups.Add(new CheckGroup(Messages.CHECKING_SAFE_TO_UPGRADE, safeToUpgradeChecks));
            }

            //vSwitch controller check - for each pool
            var vSwitchChecks = (from Host server in SelectedMasters
                                 let check = new VSwitchControllerCheck(server, InstallMethodConfig, ManualUpgrade)
                                             where check.CanRun()
                                             select check as Check).ToList();

            if (vSwitchChecks.Count > 0)
            {
                groups.Add(new CheckGroup(Messages.CHECKING_VSWITCH_CONTROLLER_GROUP, vSwitchChecks));
            }

            //protocol check - for each pool
            var sslChecks = (from Host server in SelectedMasters
                             let check = new PoolLegacySslCheck(server, InstallMethodConfig, ManualUpgrade)
                                         where check.CanRun()
                                         select check as Check).ToList();

            if (sslChecks.Count > 0)
            {
                groups.Add(new CheckGroup(Messages.CHECKING_SECURITY_PROTOCOL_GROUP, sslChecks));
            }

            //power on mode check - for each host
            var iloChecks = (from Host server in hostsToUpgradeOrUpdate
                             let check = new PowerOniLoCheck(server, InstallMethodConfig, ManualUpgrade)
                                         where check.CanRun()
                                         select check as Check).ToList();

            if (iloChecks.Count > 0)
            {
                groups.Add(new CheckGroup(Messages.CHECKING_POWER_ON_MODE_GROUP, iloChecks));
            }

            //Checking PV guests - for hosts that have any PV guests and warn the user before the upgrade.
            var pvChecks = (from Host server in SelectedMasters
                            let check = new PVGuestsCheck(server, true, ManualUpgrade, InstallMethodConfig)
                                        where check.CanRun()
                                        select check as Check).ToList();

            if (pvChecks.Count > 0)
            {
                groups.Add(new CheckGroup(Messages.CHECKING_PV_GUESTS, pvChecks));
            }

            //HA checks - for each pool
            var haChecks = (from Host server in SelectedMasters
                            select new HAOffCheck(server) as Check).ToList();

            groups.Add(new CheckGroup(Messages.CHECKING_HA_STATUS, haChecks));

            //Checking can evacuate host - for hosts that will be upgraded or updated
            var evacuateChecks = new List <Check>();

            foreach (Host host in hostsToUpgradeOrUpdate)
            {
                evacuateChecks.Add(new AssertCanEvacuateUpgradeCheck(host));
            }
            groups.Add(new CheckGroup(Messages.CHECKING_CANEVACUATE_STATUS, evacuateChecks));

            //PBDsPluggedCheck -  for hosts that will be upgraded or updated
            var pbdChecks = new List <Check>();

            foreach (Host host in hostsToUpgradeOrUpdate)
            {
                pbdChecks.Add(new PBDsPluggedCheck(host));
            }
            groups.Add(new CheckGroup(Messages.CHECKING_STORAGE_CONNECTIONS_STATUS, pbdChecks));

            //HostMemoryPostUpgradeCheck - for hosts that will be upgraded
            var mostMemoryPostUpgradeChecks = new List <Check>();

            foreach (var host in hostsToUpgrade)
            {
                mostMemoryPostUpgradeChecks.Add(new HostMemoryPostUpgradeCheck(host, InstallMethodConfig));
            }
            if (mostMemoryPostUpgradeChecks.Count > 0)
            {
                groups.Add(new CheckGroup(Messages.CHECKING_HOST_MEMORY_POST_UPGRADE, mostMemoryPostUpgradeChecks));
            }

            var gfs2Checks = new List <Check>();

            foreach (Pool pool in SelectedPools.Where(p =>
                                                      Helpers.KolkataOrGreater(p.Connection) && !Helpers.LimaOrGreater(p.Connection)))
            {
                Host host = pool.Connection.Resolve(pool.master);
                gfs2Checks.Add(new PoolHasGFS2SR(host));
            }

            if (gfs2Checks.Count > 0)
            {
                groups.Add(new CheckGroup(Messages.CHECKING_CLUSTERING_STATUS, gfs2Checks));
            }

            //Checking automated updates are possible if apply updates checkbox is ticked
            if (ApplyUpdatesToNewVersion)
            {
                var automatedUpdateChecks = (from Host server in SelectedMasters
                                             select new AutomatedUpdatesLicenseCheck(server) as Check).ToList();

                automatedUpdateChecks.Add(new CfuAvailabilityCheck());

                groups.Add(new CheckGroup(Messages.CHECKING_AUTOMATED_UPDATES_POSSIBLE,
                                          automatedUpdateChecks));
            }

            return(groups);
        }
Example #5
0
        protected override List <CheckGroup> GenerateChecks(Pool_patch patch)
        {
            var groups = new List <CheckGroup>();

            //XenCenter version check (if any of the selected server version is not the latest)
            var latestCrVersion = Updates.XenServerVersions.FindAll(item => item.LatestCr).OrderByDescending(v => v.Version).FirstOrDefault();

            if (latestCrVersion != null &&
                SelectedServers.Any(host => new Version(Helpers.HostProductVersion(host)) < latestCrVersion.Version))
            {
                groups.Add(new CheckGroup(Messages.CHECKING_XENCENTER_VERSION, new List <Check> {
                    new XenCenterVersionCheck(null)
                }));
            }

            //HostMaintenanceModeCheck checks
            var livenessChecks = new List <Check>();

            foreach (Host host in SelectedServers)
            {
                livenessChecks.Add(new HostMaintenanceModeCheck(host));
            }

            groups.Add(new CheckGroup(Messages.CHECKING_HOST_LIVENESS_STATUS, livenessChecks));

            //HA checks
            var haChecks = new List <Check>();

            foreach (Pool pool in SelectedPools)
            {
                Host host = pool.Connection.Resolve(pool.master);

                if (host == null)
                {
                    continue;
                }

                haChecks.Add(new HAOffCheck(host));
            }
            groups.Add(new CheckGroup(Messages.CHECKING_HA_STATUS, haChecks));

            //Checking can evacuate host
            var evacuateChecks = new List <Check>();

            foreach (Host host in SelectedServers)
            {
                evacuateChecks.Add(new AssertCanEvacuateUpgradeCheck(host));
            }

            groups.Add(new CheckGroup(Messages.CHECKING_CANEVACUATE_STATUS, evacuateChecks));

            //PBDsPluggedCheck
            var pbdChecks = new List <Check>();

            foreach (Host host in SelectedServers)
            {
                pbdChecks.Add(new PBDsPluggedCheck(host));
            }
            groups.Add(new CheckGroup(Messages.CHECKING_STORAGE_CONNECTIONS_STATUS, pbdChecks));


            //HotfixesCheck required for MNR, Cowley, Boston and Sanibel
            var hotfixChecks = new List <Check>();

            foreach (var host in SelectedServers)
            {
                if (new HotfixFactory().IsHotfixRequired(host) && !ManualUpgrade)
                {
                    hotfixChecks.Add(new HostHasHotfixCheck(host));
                }
            }
            if (hotfixChecks.Count > 0)
            {
                groups.Add(new CheckGroup(Messages.CHECKING_UPGRADE_HOTFIX_STATUS, hotfixChecks));
            }


            //iSL (StorageLink) check - CA-223486: only for pre-Creedence
            var preCreedenceServers = SelectedServers.Where(h => !Helpers.CreedenceOrGreater(h)).ToList();

            if (preCreedenceServers.Any())
            {
                var srLinkChecks = new List <Check>();
                foreach (Host host in preCreedenceServers)
                {
                    srLinkChecks.Add(new HostHasUnsupportedStorageLinkSRCheck(host));
                }
                groups.Add(new CheckGroup(Messages.CHECKING_STORAGELINK_STATUS, srLinkChecks));
            }

            //SafeToUpgradeCheck - in automatic mode only
            if (!ManualUpgrade)
            {
                var upgradeChecks = new List <Check>();
                foreach (Host host in SelectedServers)
                {
                    upgradeChecks.Add(new SafeToUpgradeCheck(host));
                }

                groups.Add(new CheckGroup(Messages.CHECKING_SAFE_TO_UPGRADE, upgradeChecks));
            }

            var gfs2Checks = new List <Check>();

            foreach (Pool pool in SelectedPools.Where(p =>
                                                      Helpers.KolkataOrGreater(p.Connection) && !Helpers.LimaOrGreater(p.Connection)))
            {
                Host host = pool.Connection.Resolve(pool.master);
                gfs2Checks.Add(new PoolHasGFS2SR(host));
            }

            if (gfs2Checks.Count > 0)
            {
                groups.Add(new CheckGroup(Messages.CHECKING_CLUSTERING_STATUS, gfs2Checks));
            }

            return(groups);
        }
Example #6
0
        protected override List <CheckGroup> GenerateChecks(Pool_patch patch)
        {
            var groups = new List <CheckGroup>();

            List <Host> hostsToUpgrade         = new List <Host>();
            List <Host> hostsToUpgradeOrUpdate = new List <Host>();

            foreach (var pool in SelectedPools)
            {
                var poolHostsToUpgrade = pool.HostsToUpgrade();
                hostsToUpgrade.AddRange(poolHostsToUpgrade);
                hostsToUpgradeOrUpdate.AddRange(ApplyUpdatesToNewVersion
                    ? HostsToUpgradeOrUpdate(pool)
                    : poolHostsToUpgrade);
            }

            //XenCenter version check (if any of the selected server version is not the latest)
            var latestCrVersion = Updates.XenServerVersions.FindAll(item => item.LatestCr).OrderByDescending(v => v.Version).FirstOrDefault();

            if (latestCrVersion != null &&
                hostsToUpgradeOrUpdate.Any(host => new Version(Helpers.HostProductVersion(host)) < latestCrVersion.Version))
            {
                groups.Add(new CheckGroup(Messages.CHECKING_XENCENTER_VERSION, new List <Check> {
                    new XenCenterVersionCheck(null)
                }));
            }

            //HostMaintenanceModeCheck checks - for hosts that will be upgraded or updated
            var livenessChecks = new List <Check>();

            foreach (Host host in hostsToUpgradeOrUpdate)
            {
                livenessChecks.Add(new HostMaintenanceModeCheck(host, !hostsToUpgrade.Contains(host)));
            }
            groups.Add(new CheckGroup(Messages.CHECKING_HOST_LIVENESS_STATUS, livenessChecks));

            //HA checks - for each pool
            var haChecks = (from Host server in SelectedMasters
                            select new HAOffCheck(server) as Check).ToList();

            groups.Add(new CheckGroup(Messages.CHECKING_HA_STATUS, haChecks));

            //Checking can evacuate host - for hosts that will be upgraded or updated
            var evacuateChecks = new List <Check>();

            foreach (Host host in hostsToUpgradeOrUpdate)
            {
                evacuateChecks.Add(new AssertCanEvacuateUpgradeCheck(host));
            }
            groups.Add(new CheckGroup(Messages.CHECKING_CANEVACUATE_STATUS, evacuateChecks));

            //PBDsPluggedCheck -  for hosts that will be upgraded or updated
            var pbdChecks = new List <Check>();

            foreach (Host host in hostsToUpgradeOrUpdate)
            {
                pbdChecks.Add(new PBDsPluggedCheck(host));
            }
            groups.Add(new CheckGroup(Messages.CHECKING_STORAGE_CONNECTIONS_STATUS, pbdChecks));


            //HotfixesCheck - for hosts that will be upgraded
            var hotfixChecks = new List <Check>();

            foreach (var host in hostsToUpgrade)
            {
                if (new HotfixFactory().IsHotfixRequired(host) && !ManualUpgrade)
                {
                    hotfixChecks.Add(new HostHasHotfixCheck(host));
                }
            }
            if (hotfixChecks.Count > 0)
            {
                groups.Add(new CheckGroup(Messages.CHECKING_UPGRADE_HOTFIX_STATUS, hotfixChecks));
            }


            //iSL (StorageLink) check - CA-223486: only for pre-Creedence
            var preCreedenceServers = hostsToUpgrade.Where(h => !Helpers.CreedenceOrGreater(h)).ToList();

            if (preCreedenceServers.Any())
            {
                var srLinkChecks = new List <Check>();
                foreach (Host host in preCreedenceServers)
                {
                    srLinkChecks.Add(new HostHasUnsupportedStorageLinkSRCheck(host));
                }
                groups.Add(new CheckGroup(Messages.CHECKING_STORAGELINK_STATUS, srLinkChecks));
            }

            //SafeToUpgradeCheck - in automatic mode only, for hosts that will be upgraded
            if (!ManualUpgrade)
            {
                var upgradeChecks = new List <Check>();
                foreach (var host in hostsToUpgrade)
                {
                    upgradeChecks.Add(new SafeToUpgradeCheck(host));
                }
                groups.Add(new CheckGroup(Messages.CHECKING_SAFE_TO_UPGRADE, upgradeChecks));
            }

            var gfs2Checks = new List <Check>();

            foreach (Pool pool in SelectedPools.Where(p =>
                                                      Helpers.KolkataOrGreater(p.Connection) && !Helpers.LimaOrGreater(p.Connection)))
            {
                Host host = pool.Connection.Resolve(pool.master);
                gfs2Checks.Add(new PoolHasGFS2SR(host));
            }

            if (gfs2Checks.Count > 0)
            {
                groups.Add(new CheckGroup(Messages.CHECKING_CLUSTERING_STATUS, gfs2Checks));
            }

            //Checking automated updates are possible if apply updates checkbox is ticked
            if (ApplyUpdatesToNewVersion)
            {
                var automatedUpdateChecks = (from Host server in SelectedMasters
                                             select new AutomatedUpdatesLicenseCheck(server) as Check).ToList();

                automatedUpdateChecks.Add(new CfuAvailabilityCheck());

                groups.Add(new CheckGroup(Messages.CHECKING_AUTOMATED_UPDATES_POSSIBLE,
                                          automatedUpdateChecks));
            }

            return(groups);
        }
        protected virtual List <CheckGroup> GenerateCommonChecks(List <Host> applicableServers)
        {
            var groups = new List <CheckGroup>();

            //XenCenter version check
            if (UpdateAlert != null && UpdateAlert.NewServerVersion != null)
            {
                groups.Add(new CheckGroup(Messages.CHECKING_XENCENTER_VERSION, new List <Check> {
                    new XenCenterVersionCheck(UpdateAlert.NewServerVersion)
                }));
            }

            //HostLivenessCheck checks
            var livenessChecks = new List <Check>();

            foreach (Host host in applicableServers)
            {
                livenessChecks.Add(new HostLivenessCheck(host));
            }

            groups.Add(new CheckGroup(Messages.CHECKING_HOST_LIVENESS_STATUS, livenessChecks));

            //HA checks

            var haChecks = new List <Check>();

            foreach (Host host in SelectedServers)
            {
                if (Helpers.HostIsMaster(host))
                {
                    haChecks.Add(new HAOffCheck(host));
                }
            }
            groups.Add(new CheckGroup(Messages.CHECKING_HA_STATUS, haChecks));

            //PBDsPluggedCheck
            var pbdChecks = new List <Check>();

            foreach (Host host in applicableServers)
            {
                SR uploadSr = null;
                if (PoolUpdate != null && SrUploadedUpdates != null)
                {
                    foreach (var dict in SrUploadedUpdates)
                    {
                        if (dict.Key.uuid == PoolUpdate.uuid && dict.Value.ContainsKey(host))
                        {
                            uploadSr = dict.Value[host];
                            break;
                        }
                    }
                }
                pbdChecks.Add(new PBDsPluggedCheck(host, uploadSr));
            }

            groups.Add(new CheckGroup(Messages.CHECKING_STORAGE_CONNECTIONS_STATUS, pbdChecks));

            //Disk space check for automated updates
            if (WizardMode != WizardMode.SingleUpdate)
            {
                var diskChecks = new List <Check>();

                foreach (Pool pool in SelectedPools)
                {
                    //if any host is not licensed for automated updates
                    bool automatedUpdatesRestricted = pool.Connection.Cache.Hosts.Any(Host.RestrictBatchHotfixApply);

                    var minimalPatches = WizardMode == WizardMode.NewVersion
                        ? Updates.GetMinimalPatches(pool.Connection, UpdateAlert, ApplyUpdatesToNewVersion && !automatedUpdatesRestricted)
                        : Updates.GetMinimalPatches(pool.Connection);

                    if (minimalPatches == null)
                    {
                        continue;
                    }

                    var us    = new Dictionary <Host, List <XenServerPatch> >();
                    var hosts = pool.Connection.Cache.Hosts;

                    foreach (var h in hosts)
                    {
                        var ps = Updates.GetPatchSequenceForHost(h, minimalPatches);
                        if (ps != null)
                        {
                            us[h] = ps;
                        }
                    }

                    log.InfoFormat("Minimal patches for {0}: {1}", pool.Name(), string.Join(",", minimalPatches.Select(p => p.Name)));

                    foreach (Host host in us.Keys)
                    {
                        diskChecks.Add(new DiskSpaceForAutomatedUpdatesCheck(host, us));
                    }
                }
                groups.Add(new CheckGroup(Messages.PATCHINGWIZARD_PRECHECKPAGE_CHECKING_DISK_SPACE, diskChecks));
            }

            //Checking reboot required and can evacuate host for version updates
            if (WizardMode == WizardMode.NewVersion && UpdateAlert != null && UpdateAlert.Patch != null && UpdateAlert.Patch.after_apply_guidance == after_apply_guidance.restartHost)
            {
                var guidance = new List <after_apply_guidance> {
                    UpdateAlert.Patch.after_apply_guidance
                };

                var rebootChecks = new List <Check>();
                foreach (var host in SelectedServers)
                {
                    rebootChecks.Add(new HostNeedsRebootCheck(host, guidance, LivePatchCodesByHost));
                }
                groups.Add(new CheckGroup(Messages.CHECKING_SERVER_NEEDS_REBOOT, rebootChecks));

                var evacuateChecks = new List <Check>();
                foreach (Host host in SelectedServers)
                {
                    evacuateChecks.Add(new AssertCanEvacuateCheck(host, LivePatchCodesByHost));
                }

                groups.Add(new CheckGroup(Messages.CHECKING_CANEVACUATE_STATUS, evacuateChecks));
            }

            if (WizardMode == WizardMode.NewVersion)
            {
                var gfs2Checks = new List <Check>();

                foreach (Pool pool in SelectedPools.Where(p =>
                                                          Helpers.KolkataOrGreater(p.Connection) && !Helpers.LimaOrGreater(p.Connection)))
                {
                    Host host = pool.Connection.Resolve(pool.master);
                    gfs2Checks.Add(new PoolHasGFS2SR(host));
                }

                if (gfs2Checks.Count > 0)
                {
                    groups.Add(new CheckGroup(Messages.CHECKING_CLUSTERING_STATUS, gfs2Checks));
                }
            }

            return(groups);
        }
Example #8
0
        protected virtual List <KeyValuePair <string, List <Check> > > GenerateChecks(Pool_update update)
        {
            List <Host> applicableServers = update != null?SelectedServers.Where(h => !update.AppliedOn(h)).ToList() : SelectedServers;

            List <KeyValuePair <string, List <Check> > > checks = GenerateCommonChecks(applicableServers);
            List <Check> checkGroup;

            //Update Homogeneity check for InvernessOrGreater
            if (update != null)
            {
                var homogeneityChecks = new List <Check>();
                foreach (var pool in SelectedPools.Where(pool => Helpers.InvernessOrGreater(pool.Connection)))
                {
                    homogeneityChecks.Add(new ServerSelectionCheck(pool, update, SelectedServers));
                }

                if (homogeneityChecks.Count > 0)
                {
                    checks.Add(new KeyValuePair <string, List <Check> >(Messages.CHECKING_SERVER_SELECTION, homogeneityChecks));
                }
            }

            //Checking other things
            if (update != null)
            {
                checks.Add(new KeyValuePair <string, List <Check> >(Messages.CHECKING_SERVER_SIDE_STATUS, new List <Check>()));
                checkGroup = checks[checks.Count - 1].Value;
                foreach (Host host in SelectedServers)
                {
                    List <Pool_update> updates            = new List <Pool_update>(host.Connection.Cache.Pool_updates);
                    Pool_update        poolUpdateFromHost = updates.Find(otherPatch => string.Equals(otherPatch.uuid, update.uuid, StringComparison.OrdinalIgnoreCase));
                    checkGroup.Add(new PatchPrecheckCheck(host, poolUpdateFromHost, LivePatchCodesByHost));
                }
            }

            //Checking if the host needs a reboot
            if (WizardMode == WizardMode.SingleUpdate)
            {
                checks.Add(new KeyValuePair <string, List <Check> >(Messages.CHECKING_SERVER_NEEDS_REBOOT, new List <Check>()));
                checkGroup = checks[checks.Count - 1].Value;
                var guidance = update != null
                    ? update.after_apply_guidance
                    : new List <update_after_apply_guidance> {
                    update_after_apply_guidance.restartHost
                };
                foreach (var host in applicableServers)
                {
                    checkGroup.Add(new HostNeedsRebootCheck(host, guidance, LivePatchCodesByHost));
                }
            }

            //Checking can evacuate host
            if (update == null || update.after_apply_guidance.Contains(update_after_apply_guidance.restartHost))
            {
                checks.Add(new KeyValuePair <string, List <Check> >(Messages.CHECKING_CANEVACUATE_STATUS, new List <Check>()));
                checkGroup = checks[checks.Count - 1].Value;
                foreach (Host host in applicableServers)
                {
                    checkGroup.Add(new AssertCanEvacuateCheck(host, LivePatchCodesByHost));
                }
            }

            if (update != null || WizardMode == WizardMode.AutomatedUpdates)
            {
                checks.Add(new KeyValuePair <string, List <Check> >(Messages.CHECKING_FOR_PENDING_RESTART, new List <Check>()));
                checkGroup = checks[checks.Count - 1].Value;

                foreach (var pool in SelectedPools)
                {
                    checkGroup.Add(new RestartHostOrToolstackPendingOnMasterCheck(pool, WizardMode == WizardMode.AutomatedUpdates ? null : update.uuid));
                }
            }

            return(checks);
        }