/// <summary> /// Get Datasafe Blade power state /// </summary> /// <param name="bladeId">Blade ID(1-48)</param> /// <returns>Blade state response class object</returns> public DatasafeBladePowerStateResponse GetBladeDatasafePowerState(int bladeId) { Tracer.WriteInfo("Received GetBladeDatasafePowerState({0})", bladeId); Tracer.WriteUserLog("Invoked GetBladeDatasafePowerState(bladeid: {0})", bladeId); DatasafeBladePowerStateResponse stateResponse = new DatasafeBladePowerStateResponse(); stateResponse.bladeNumber = bladeId; stateResponse.isDatasafeBackupInProgress = false; stateResponse.bladePowerState = Contracts.PowerState.NA; stateResponse.completionCode = Contracts.CompletionCode.Unknown; stateResponse.statusDescription = String.Empty; if (!ConfigLoaded.DatasafeOperationsEnabled) { Tracer.WriteInfo("GetBladeDatasafePowerState: User requested API not enabled in app.config"); stateResponse.completionCode = Contracts.CompletionCode.CommandNotValidAtThisTime; stateResponse.statusDescription = "Datasafe commands are not enabled for this blade"; return stateResponse; } Contracts.ChassisResponse varResponse = ValidateRequest("GetBladeDatasafePowerState", bladeId); if (varResponse.completionCode != Contracts.CompletionCode.Success) { stateResponse.completionCode = varResponse.completionCode; stateResponse.statusDescription = varResponse.statusDescription; return stateResponse; } // Check to see if the blade enable itself is OFF - then the BMC power state does not matter BladePowerStatePacket response = ChassisState.BladePower[bladeId - 1].GetBladePowerState(); if (response.CompletionCode != CompletionCode.Success) { // No return here, because we still want to return a BMC state on the fall through, // if Blade enable read fails for whatever reason Tracer.WriteWarning("GetBladeDatasafePowerState: Blade {0} Power Enable state read failed (Completion Code: {1:X})", bladeId, response.CompletionCode); stateResponse.completionCode = ChassisManagerUtil.GetContractsCompletionCodeMapping((byte)response.CompletionCode); stateResponse.statusDescription = stateResponse.completionCode.ToString(); } else { // Only if the blade enable is OFF, we return that status, for anything else we have to read BMC status if (response.BladePowerState == (byte)Contracts.PowerState.OFF) { // Since we do not know if a blade is present in that slot or not, we return NA as power state // TODO: This was supposed to return OFF status, and not NA stateResponse.bladePowerState = Contracts.PowerState.NA; stateResponse.completionCode = Contracts.CompletionCode.Success; return stateResponse; } } Ipmi.SystemStatus powerState = WcsBladeFacade.GetChassisState((byte)bladeId); Tracer.WriteInfo("Return: {0}, Blade State: {1}", powerState.CompletionCode, powerState.PowerState.ToString()); if (powerState.CompletionCode != (byte)CompletionCode.Success) { Tracer.WriteError("GetBladeState Failed with Completion code {0:X}", powerState.CompletionCode); stateResponse.bladePowerState = Contracts.PowerState.NA; stateResponse.completionCode = ChassisManagerUtil.GetContractsCompletionCodeMapping((byte)powerState.CompletionCode); stateResponse.statusDescription = stateResponse.completionCode.ToString(); return stateResponse; } else // if success { stateResponse.completionCode = Contracts.CompletionCode.Success; if (powerState.PowerState == Ipmi.IpmiPowerState.On) { stateResponse.bladePowerState = Contracts.PowerState.ON; } else { stateResponse.bladePowerState = Contracts.PowerState.OFF; } } DatasafeBladeStatus datasafeResponse = DatasafeOperationSupport.ProcessDatasafeAction(bladeId, DatasafeActions.DoNothing); if (datasafeResponse == null) { stateResponse.completionCode = Contracts.CompletionCode.Failure; stateResponse.statusDescription = Contracts.CompletionCode.Failure.ToString(); return stateResponse; } stateResponse.isDatasafeBackupInProgress = datasafeResponse.isBackupPending; if (datasafeResponse.isBackupPending) { stateResponse.RemainingDataSafeDurationInSecs = datasafeResponse.remainingBackupDuration; } else { stateResponse.RemainingDataSafeDurationInSecs = 0; } if (datasafeResponse.status == DatasafeCommandsReturnStatus.CommandExecuted) { stateResponse.completionCode = Contracts.CompletionCode.Success; } else { stateResponse.completionCode = Contracts.CompletionCode.Failure; stateResponse.statusDescription = stateResponse.completionCode.ToString(); } return stateResponse; }
/// <summary> /// command specific implementation /// argVal command class member has all user-entered command argument indicators and parameter values /// Currently just prints all argument indicators and argument values /// </summary> internal override void commandImplementation() { DatasafeBladePowerStateResponse myResponse = new DatasafeBladePowerStateResponse(); DatasafeAllBladesPowerStateResponse myResponses = new DatasafeAllBladesPowerStateResponse(); try { if (this.argVal.ContainsKey('a')) { myResponses = WcsCli2CmConnectionManager.channel.GetAllBladesDatasafePowerState(); } else if (this.argVal.ContainsKey('i')) { dynamic bladeId = null; if (this.argVal.TryGetValue('i', out bladeId)) { myResponse = WcsCli2CmConnectionManager.channel.GetBladeDatasafePowerState((int)bladeId); } else { Console.WriteLine(WcsCliConstants.commandFailure + " No blade ID specified, please look at command help"); return; } } } catch (Exception ex) { SharedFunc.ExceptionOutput(ex); return; } if ((this.argVal.ContainsKey('a') && myResponses == null) || (this.argVal.ContainsKey('a') && myResponses.datasafeBladePowerStateResponseCollection == null) || myResponse == null) { Console.WriteLine(WcsCliConstants.serviceResponseEmpty); return; } if (this.argVal.ContainsKey('a')) { foreach (var response in myResponses.datasafeBladePowerStateResponseCollection) { if (ResponseValidation.ValidateBladeResponse(response.bladeNumber, null, response, false)) { Console.WriteLine(WcsCliConstants.commandSuccess + " DataSafe blade power state = " + response.bladePowerState); Console.WriteLine("DataSafe power backup in progress?: " + response.isDatasafeBackupInProgress); } } } else { if (ResponseValidation.ValidateBladeResponse(myResponse.bladeNumber, null, myResponse, false)) { Console.WriteLine(WcsCliConstants.commandSuccess + string.Format(" DataSafe blade power state = " + myResponse.bladePowerState)); Console.WriteLine("DataSafe power backup in progress?: " + myResponse.isDatasafeBackupInProgress); } } }