internal static Contracts.StartSerialResponse StartBladeSerialSession(int bladeId, int timeoutInSecs) { Contracts.StartSerialResponse response = new Contracts.StartSerialResponse(); response.completionCode = Contracts.CompletionCode.Failure; response.serialSessionToken = null; Tracer.WriteInfo("BladeSerialSessionMetadata StartBladeSerialSession({0})", bladeId); // If there is an already existing Blade serial session (indicated by a valid bladeId and a valid sessionToken), return failure with appropriate completion code if (CompareAndSwapMetadata(ConfigLoaded.InactiveBladePortId, ConfigLoaded.InactiveBladeSerialSessionToken, ConfigLoaded.InactiveBladePortId, ConfigLoaded.InactiveBladeSerialSessionToken) != CompletionCode.Success) { Tracer.WriteError("StartBladeSerialSession({0}): Start failed because of already active session.", bladeId); response.completionCode = Contracts.CompletionCode.SerialSessionActive; return(response); } // Ipmi command to indicate start of serial session // This has to be executed before Enabling comm. dev. safe mode otherwise this will fail Ipmi.SerialMuxSwitch sms = WcsBladeFacade.SetSerialMuxSwitch((byte)bladeId, Ipmi.MuxSwtich.SwitchSystem); // If set serial mux fails - reverse all operations if (sms.CompletionCode != (byte)CompletionCode.Success) { Tracer.WriteError("BladeSerialSessionMetadata.StartBladeSerialSession({0}): Ipmi SetSerialMuxSwitch Failed", bladeId); if (!CommunicationDevice.DisableSafeMode()) { Tracer.WriteError("BladeSerialSessionMetadata.StartBladeSerialSession({0}): Unable to disable comm.dev. safe mode", bladeId); } // Whenever we disable safe mode, make sure that no more serial session activity may be performed - by reseting metadata if (!BladeSerialSessionMetadata.ResetMetadata()) { Tracer.WriteError("BladeSerialSessionMetadata.StopBladeSerialSession({0}): Unable to reset metadata", bladeId); } return(response); } byte[] randomNumber = new byte[8]; new System.Security.Cryptography.RNGCryptoServiceProvider().GetNonZeroBytes(randomNumber); // Initialize Blade Serial Session MetaData - Init function does this automically // This function acts as a serialization point - only one active thread can proceed beyond this if (CompareAndSwapMetadata(ConfigLoaded.InactiveBladePortId, ConfigLoaded.InactiveBladeSerialSessionToken, bladeId, BitConverter.ToString(randomNumber), DateTime.Now) != CompletionCode.Success) { response.completionCode = Contracts.CompletionCode.SerialSessionActive; return(response); } response.completionCode = Contracts.CompletionCode.Success; response.serialSessionToken = BitConverter.ToString(randomNumber); // Initializing TimeoutBladeSerialSessionInSecs with user defined session timeout ConfigLoaded.TimeoutBladeSerialSessionInSecs = timeoutInSecs; return(response); }
internal static Contracts.ChassisResponse StopBladeSerialSession(int bladeId, string sessionToken, bool forceKill = false) { Contracts.ChassisResponse response = new Contracts.ChassisResponse(); response.completionCode = Contracts.CompletionCode.Failure; Tracer.WriteInfo("BladeSerialSessionMetadata.Received Stopbladeserialsession({0})", bladeId); // If there is NOT an already existing Blade serial session (indicated by a invalid bladeId and a invalid sessionToken), return failure with appropriate completion code if (CompareAndSwapMetadata(ConfigLoaded.InactiveBladePortId, ConfigLoaded.InactiveBladeSerialSessionToken, ConfigLoaded.InactiveBladePortId, ConfigLoaded.InactiveBladeSerialSessionToken) == CompletionCode.Success) { Tracer.WriteError("StopBladeSerialSession({0}): Stop failed because of no active session.", bladeId); response.completionCode = Contracts.CompletionCode.NoActiveSerialSession; return(response); } // Normal scenario when forcekill option is not true.. check for bladeid correctness and if it currently holds the serial session if (!forceKill) { if (ChassisManagerUtil.CheckBladeId((byte)bladeId) != (byte)CompletionCode.Success) { response.completionCode = Contracts.CompletionCode.ParameterOutOfRange; return(response); } // If this bladeid do not currently hold the serial session, return failure if (CompareAndSwapMetadata(bladeId, sessionToken, bladeId, sessionToken) != CompletionCode.Success) { response.completionCode = Contracts.CompletionCode.SerialSessionActive; return(response); } } // Communication device has to come out of safe mode - should allow IPMI commands to go to the BMC if (!CommunicationDevice.DisableSafeMode()) { Tracer.WriteError( "BladeSerialSessionMetadata.StopBladeSerialSession({0}): CommunicationDevice.DisableSafeMode Failed", bladeId); } Ipmi.SerialMuxSwitch rms; // If forcekill parameter is false, then use the bladeid that is passed by the user if (!forceKill) { rms = WcsBladeFacade.ResetSerialMux((byte)bladeId); } // If forcekill parameter is true, then use the bladeid that currently holds the serial session else { rms = WcsBladeFacade.ResetSerialMux((byte)BladeSerialSessionMetadata.bladeId); } if (rms.CompletionCode != (byte)CompletionCode.Success) { Tracer.WriteError("BladeSerialSessionMetadata.StopBladeSerialSession({0}): Ipmi ReSetSerialMuxSwitch Failed", bladeId); } if (!BladeSerialSessionMetadata.ResetMetadata()) { Tracer.WriteError("BladeSerialSessionMetadata.StopBladeSerialSession: Unable to reset metadata"); } response.completionCode = Contracts.CompletionCode.Success; // Resetting TimeoutBladeSerialSessionInSecs to 0 to account for default or user provided session timeout value ConfigLoaded.TimeoutBladeSerialSessionInSecs = 0; return(response); }