/// <summary> /// Returns Blade Information including Blade Type, and State Information, Processor information, Memory information /// PCie information and Hard Disk information (JBOD only) /// </summary> /// <returns></returns> public Contracts.BladeHealthResponse GetBladeHealth(int bladeId, bool cpuInfo = false, bool memInfo = false, bool diskInfo = false, bool pcieInfo = false, bool sensorInfo = false, bool tempInfo = false, bool fruInfo = false) { Tracer.WriteInfo("Received GetBladeHealth({0})", bladeId); Tracer.WriteUserLog("Invoked GetBladeHealth({0})", bladeId); BladeHealthResponse response = new BladeHealthResponse(); response.bladeNumber = bladeId; response.completionCode = Contracts.CompletionCode.Unknown; response.statusDescription = String.Empty; Contracts.ChassisResponse varResponse = ValidateRequest("GetBladeHealth", bladeId); if (varResponse.completionCode != Contracts.CompletionCode.Success) { response.completionCode = varResponse.completionCode; response.statusDescription = varResponse.statusDescription; return response; } // Initialize BladeShellResponse object BladeShellResponse shellResp = new BladeShellResponse(); shellResp.bladeNumber = bladeId; // If all options are false (default values), then return everything except sensor info. // Since the sensor info takes a long time to read, don't read it unless the user explicitly requests it. if (!cpuInfo && !memInfo && !diskInfo && !pcieInfo && !sensorInfo && !tempInfo && !fruInfo) { cpuInfo = memInfo = diskInfo = pcieInfo = tempInfo = fruInfo = true; } try { // proc, mem, disk, me, temp, power, fru, pcie, misc HardwareStatus hardwareStatus = WcsBladeFacade.GetHardwareInfo((byte)bladeId, cpuInfo, memInfo, diskInfo, false, tempInfo, false, fruInfo, pcieInfo, sensorInfo); Type hwType = hardwareStatus.GetType(); response.completionCode = ChassisManagerUtil.GetContractsCompletionCodeMapping((byte)hardwareStatus.CompletionCode); if (hardwareStatus.CompletionCode != (byte)CompletionCode.Success) { Tracer.WriteError("GetBladeHealth: Hardware status command failed with completion code: {0:X}", hardwareStatus.CompletionCode); } else { if (hardwareStatus.CompletionCode != (byte)Contracts.CompletionCode.Success) { shellResp.completionCode = Contracts.CompletionCode.Failure; shellResp.statusDescription = Contracts.CompletionCode.Failure + ": Internal Error"; } else { shellResp.completionCode = Contracts.CompletionCode.Success; } if (hwType == typeof(ComputeStatus)) { ComputeStatus hwResponse = (ComputeStatus)hardwareStatus; shellResp.completionCode = Contracts.CompletionCode.Success; shellResp.bladeNumber = bladeId; shellResp.bladeState = FunctionValidityChecker.CheckBladeStateValidity((byte)bladeId).PowerStatus.ToString(); shellResp.bladeType = hwResponse.BladeType; // generate processor info response.processorInfo = new List<ProcessorInfo>(); // populate processor info if required if (cpuInfo) foreach (KeyValuePair<byte, Ipmi.ProcessorInfo> instance in hwResponse.ProcInfo) { if (instance.Value.CompletionCode == (byte)CompletionCode.Success) response.processorInfo.Add(new ProcessorInfo(Contracts.CompletionCode.Success, instance.Key, instance.Value.ProcessorType.ToString(), instance.Value.ProcessorState.ToString(), instance.Value.Frequency)); else response.processorInfo.Add(new ProcessorInfo( ChassisManagerUtil.GetContractsCompletionCodeMapping((byte)instance.Value.CompletionCode))); } // generate memory info response.memoryInfo = new List<MemoryInfo>(); // populate memory info if required if (memInfo) { foreach (KeyValuePair<byte, Ipmi.MemoryInfo> instance in hwResponse.MemInfo) { if (instance.Value.CompletionCode == (byte)CompletionCode.Success) { if (instance.Value.Status == Ipmi.MemoryStatus.NotPresent) { response.memoryInfo.Add(new MemoryInfo(Contracts.CompletionCode.Success, instance.Key, instance.Value.Status.ToString(), instance.Value.Speed, instance.Value.MemorySize, instance.Value.Status.ToString(), instance.Value.Status.ToString())); } else { response.memoryInfo.Add(new MemoryInfo(Contracts.CompletionCode.Success, instance.Key, instance.Value.MemoryType.ToString(), instance.Value.Speed, instance.Value.MemorySize, instance.Value.Voltage, instance.Value.Status.ToString())); } } else response.memoryInfo.Add(new MemoryInfo( ChassisManagerUtil.GetContractsCompletionCodeMapping((byte)instance.Value.CompletionCode))); } } // initialize PcieInfo response.pcieInfo = new List<PCIeInfo>(); // populate PcieInfo if required. if (pcieInfo) { foreach (KeyValuePair<byte, Ipmi.PCIeInfo> instance in hwResponse.PcieInfo) { if (instance.Value.CompletionCode == (byte)CompletionCode.Success) response.pcieInfo.Add(new PCIeInfo(Contracts.CompletionCode.Success, instance.Key, instance.Value.CardState.ToString(), instance.Value.VendorId, instance.Value.DeviceId, instance.Value.SubsystemId)); else response.pcieInfo.Add(new PCIeInfo( ChassisManagerUtil.GetContractsCompletionCodeMapping((byte)instance.Value.CompletionCode))); } } // initialize disk info response.sensors = new List<SensorInfo>(); // add hardware sensor info if required. if (sensorInfo) { foreach (HardwareSensor sensor in hwResponse.HardwareSdr) { if (sensor.Sdr.CompletionCode == (byte)CompletionCode.Success) response.sensors.Add(new SensorInfo(Contracts.CompletionCode.Success, sensor.Sdr.SensorNumber, sensor.Sdr.SensorType.ToString(), sensor.Sdr.EntityId.ToString(), sensor.Sdr.EntityInstance.ToString(), sensor.Sdr.EntityType.ToString(), sensor.Reading.Reading.ToString(), sensor.Reading.EventDescription, sensor.Sdr.Description)); else response.sensors.Add(new SensorInfo( ChassisManagerUtil.GetContractsCompletionCodeMapping((byte)sensor.Sdr.CompletionCode))); } } // add temp sensor info if required. if (tempInfo) { foreach (HardwareSensor sensor in hwResponse.TempSensors) { if (sensor.Sdr.CompletionCode == (byte)CompletionCode.Success) response.sensors.Add(new SensorInfo(Contracts.CompletionCode.Success, sensor.Sdr.SensorNumber, sensor.Sdr.SensorType.ToString(), sensor.Sdr.EntityId.ToString(), sensor.Sdr.EntityInstance.ToString(), sensor.Sdr.EntityType.ToString(), sensor.Reading.Reading.ToString(), sensor.Reading.EventDescription, sensor.Sdr.Description)); else response.sensors.Add(new SensorInfo( ChassisManagerUtil.GetContractsCompletionCodeMapping((byte)sensor.Sdr.CompletionCode))); } } // append fru info if required AppendFruInfo(ref response, hwResponse, fruInfo); } else if (hwType == typeof(JbodStatus)) { JbodStatus hwResponse = (JbodStatus)hardwareStatus; shellResp.bladeNumber = bladeId; shellResp.bladeState = FunctionValidityChecker.CheckBladeStateValidity((byte)bladeId).PowerStatus.ToString(); shellResp.bladeType = hwResponse.BladeType; if (diskInfo) { if (hwResponse.CompletionCode == (byte)CompletionCode.Success) { response.jbodDiskInfo = new JbodDiskStatus(Contracts.CompletionCode.Success, hwResponse.DiskStatus.Channel, hwResponse.DiskStatus.DiskCount); response.jbodDiskInfo.diskInfo = new List<DiskInfo>(); foreach (KeyValuePair<byte, Ipmi.DiskStatus> instance in hwResponse.DiskStatus.DiskState) { response.jbodDiskInfo.diskInfo.Add(new DiskInfo(Contracts.CompletionCode.Success, instance.Key, instance.Value.ToString())); } } else { response.jbodDiskInfo = new JbodDiskStatus(ChassisManagerUtil.GetContractsCompletionCodeMapping((byte)hwResponse.CompletionCode)); } } if (tempInfo) { if (hwResponse.DiskInfo.CompletionCode == (byte)CompletionCode.Success) response.jbodInfo = new JbodInfo(Contracts.CompletionCode.Success, hwResponse.DiskInfo.Unit.ToString(), hwResponse.DiskInfo.Reading); else response.jbodInfo = new JbodInfo(ChassisManagerUtil.GetContractsCompletionCodeMapping((byte)hwResponse.DiskInfo.CompletionCode)); } // append fru info if required AppendFruInfo(ref response, hwResponse, fruInfo); } else if (hwType == typeof(UnknownBlade)) { UnknownBlade hwResponse = (UnknownBlade)hardwareStatus; // return errored response. shellResp.bladeNumber = bladeId; shellResp.bladeState = FunctionValidityChecker.CheckBladeStateValidity((byte)bladeId).PowerStatus.ToString(); shellResp.bladeType = hwResponse.BladeType; // append fru info if required AppendFruInfo(ref response, hwResponse, false); } response.bladeShell = shellResp; } } catch (Exception ex) { response.completionCode = Contracts.CompletionCode.Failure; response.statusDescription = response.completionCode.ToString() + ": " + ex.Message; Tracer.WriteError("Exception while processing Hardware Status of Blade {0}: {1}", bladeId, ex); } return response; }
/// <summary> /// Returns Chassis Health including Fan Speed and Health, PSU Health, Battery Health and Blade Type and Health /// </summary> /// <returns></returns> public Contracts.ChassisHealthResponse GetChassisHealth(bool bladeHealth = false, bool psuHealth = false, bool fanHealth = false, bool batteryHealth = false) { Tracer.WriteInfo("Received GetChassisHealth bladeHealth = {0}, psuHealth = {1}, fanHealth = {2})", bladeHealth, psuHealth, fanHealth); Tracer.WriteInfo(" batteryHealth = {0}", batteryHealth); Tracer.WriteUserLog("Received GetChassisHealth bladeHealth = {0}, psuHealth = {1}, fanHealth = {2})", bladeHealth, psuHealth, fanHealth); Tracer.WriteUserLog(" batteryHealth = {0}", batteryHealth); // If all options are not given by user, then default to providing all information if (!bladeHealth && !psuHealth && !fanHealth && !batteryHealth) { bladeHealth = psuHealth = fanHealth = batteryHealth = true; } ChassisHealthResponse response = new ChassisHealthResponse(); response.completionCode = Contracts.CompletionCode.Unknown; response.statusDescription = String.Empty; if (bladeHealth) { response.bladeShellCollection = new List<BladeShellResponse>(); // Populate Blade Shell information (Type, Internal State) for (byte i = 1; i <= ConfigLoaded.Population; i++) { BladeShellResponse br = new BladeShellResponse(); br.completionCode = Contracts.CompletionCode.Success; br.bladeNumber = i; br.bladeState = FunctionValidityChecker.CheckBladeStateValidity(i).PowerStatus.ToString(); br.bladeType = ChassisState.GetBladeTypeName(ChassisState.GetBladeType(i)); response.bladeShellCollection.Add(br); } response.completionCode = Contracts.CompletionCode.Success; // Always success if bladeinfo requested, since reading static variable Tracer.WriteInfo("Populated Blade Shell information, state and type for blades"); } // Get Psu health information if (psuHealth) { response.psuInfoCollection = GetPsuInfo(); // if the master object is not successful, check child objects if (response.completionCode != Contracts.CompletionCode.Success) { // if it received any positive results, return success. foreach (PsuInfo psu in response.psuInfoCollection) { // if any children are successful, set master to success. if (psu.completionCode == Contracts.CompletionCode.Success) { response.completionCode = Contracts.CompletionCode.Success; break; // once a match has been found escape foreach } } } if (ConfigLoaded.NumPsus == 0) { response.completionCode = Contracts.CompletionCode.Success; response.statusDescription += "\nPower Supply monitoring not supported in sku configuration."; } } // Get battery health information if (batteryHealth) { // Get the battery info response.batteryInfoCollection = GetBatteryInfo(); // if the master object is not successful, check child objects if (response.completionCode != Contracts.CompletionCode.Success) { // if battery status received any positive results, return success. foreach (BatteryInfo battery in response.batteryInfoCollection) { // if any children are successful, set master to success. if (battery.completionCode == Contracts.CompletionCode.Success) { response.completionCode = Contracts.CompletionCode.Success; break; // once a match has been found escape foreach } } } if (ConfigLoaded.NumBatteries == 0) { response.completionCode = Contracts.CompletionCode.Success; response.statusDescription += "\nBattery monitoring not supported in sku configuration."; } } // Get Fan Health Information if (fanHealth) { response.fanInfoCollection = GetFanInfo(); // if the master object is not successful, check child objects if (response.completionCode != Contracts.CompletionCode.Success) { // if it received any positive results, return success. foreach (FanInfo fan in response.fanInfoCollection) { // if any children are successful, set master to success. if (fan.completionCode == Contracts.CompletionCode.Success || fan.completionCode == Contracts.CompletionCode.FanlessChassis) { response.completionCode = Contracts.CompletionCode.Success; break; // once a match has been found escape foreach } } } if (ConfigLoaded.NumFans == 0) { response.completionCode = Contracts.CompletionCode.Success; response.statusDescription += "\nFan monitoring not supported in sku configuration."; } } return response; }
/// <summary> /// Returns Chassis Health including Fan Speed and Health, PSU Health and Blade Type and Health /// </summary> /// <returns></returns> public Contracts.ChassisHealthResponse GetChassisHealth(bool bladeHealth = false, bool psuHealth = false, bool fanHealth = false) { Tracer.WriteInfo("Received GetChassisHealth({0},{1},{2})", bladeHealth, psuHealth, fanHealth); Tracer.WriteUserLog("Invoked GetChassisHealth({0},{1},{2})", bladeHealth, psuHealth, fanHealth); // If all options are not given by user, then default to providing all information if (!bladeHealth && !psuHealth && !fanHealth) { bladeHealth = psuHealth = fanHealth = true; } ChassisHealthResponse response = new ChassisHealthResponse(); response.completionCode = Contracts.CompletionCode.Unknown; response.statusDescription = String.Empty; if (bladeHealth) { response.bladeShellCollection = new List<BladeShellResponse>(); // Populate Blade Shell information (Type, Internal State) for (byte i = 1; i <= ConfigLoaded.Population; i++) { BladeShellResponse br = new BladeShellResponse(); br.completionCode = Contracts.CompletionCode.Success; br.bladeNumber = i; br.bladeState = ChassisState.GetStateName(i); br.bladeType = ChassisState.GetBladeTypeName(ChassisState.GetBladeType(i)); response.bladeShellCollection.Add(br); } response.completionCode = Contracts.CompletionCode.Success; // Always success if bladeinfo requested, since reading static variable Tracer.WriteInfo("Populated Blade Shell information, state and type for blades"); } // Get Psu health information if (psuHealth) { response.psuInfoCollection = GetPsuInfo(); // if the master object is not successful, check child objects if(response.completionCode != Contracts.CompletionCode.Success) { // if it received any positive results, return success. foreach (PsuInfo psu in response.psuInfoCollection) { // if any children are successful, set master to success. if (psu.completionCode == Contracts.CompletionCode.Success) { response.completionCode = Contracts.CompletionCode.Success; break; // once a match has been found escape foreach } } } } // Get Fan Health Information if (fanHealth) { response.fanInfoCollection = GetFanInfo(); // if the master object is not successful, check child objects if (response.completionCode != Contracts.CompletionCode.Success) { // if it received any positive results, return success. foreach (FanInfo fan in response.fanInfoCollection) { // if any children are successful, set master to success. if (fan.completionCode == Contracts.CompletionCode.Success || fan.completionCode == Contracts.CompletionCode.FanlessChassis ) { response.completionCode = Contracts.CompletionCode.Success; break; // once a match has been found escape foreach } } } } return response; }