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); }
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); }
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); }
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); }