/// <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;
        }
コード例 #3
0
        /// <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;
        }