/// <summary> /// Build session info from data contract /// </summary> /// <param name="contract">indicating the session info data contract</param> /// <returns>returns session info instance</returns> public static SessionInfo BuildSessionInfoFromDataContract(SessionInfoContract contract) { SessionInfo info = new SessionInfo(); info.BrokerEpr = contract.BrokerEpr; info.BrokerLauncherEpr = contract.BrokerLauncherEpr; info.ClientBrokerHeartbeatInterval = contract.ClientBrokerHeartbeatInterval; info.ClientBrokerHeartbeatRetryCount = contract.ClientBrokerHeartbeatRetryCount; info.ControllerEpr = contract.ControllerEpr; info.Durable = contract.Durable; info.Id = contract.Id; info.JobState = contract.JobState; info.ResponseEpr = contract.ResponseEpr; info.Secure = contract.Secure; info.ServerVersion = contract.ServerVersion; info.ServiceOperationTimeout = contract.ServiceOperationTimeout; info.ServiceVersion = contract.ServiceVersion; info.SessionACL = contract.SessionACL; info.SessionOwner = contract.SessionOwner; info.TransportScheme = contract.TransportScheme; info.UseInprocessBroker = contract.UseInprocessBroker; info.UseAad = contract.UseAad; return(info); }
/// <summary> /// Attach the broker /// </summary> /// <param name="startInfo">session start info</param> /// <param name="sessionInfo">session info</param> /// <param name="durable">whether durable session</param> /// <param name="timeoutMilliseconds">attach timeout</param> /// <param name="binding">indicating the binding</param> /// <returns>session object</returns> public override async Task <SessionBase> AttachBroker(SessionStartInfo startInfo, SessionInfoContract sessionInfo, bool durable, int timeoutMilliseconds, Binding binding) { DateTime targetTimeout; Utility.ThrowIfNull(sessionInfo, "sessionInfo"); Utility.ThrowIfInvalidTimeout(timeoutMilliseconds, "timeoutMilliseconds"); if (timeoutMilliseconds == Timeout.Infinite) { targetTimeout = DateTime.MaxValue; } else { targetTimeout = DateTime.Now.AddMilliseconds(timeoutMilliseconds); } SessionBase.TraceSource.TraceEvent(TraceEventType.Information, 0, "[Session:{0}] Start to attach broker...", sessionInfo.Id); SessionInfo info = Utility.BuildSessionInfoFromDataContract(sessionInfo); // resourceProvider.GetResourceInfo(attachInfo, SessionBase.GetTimeout(targetTimeout)); SessionAttachInfo attachInfo = new SessionAttachInfo(startInfo.Headnode, sessionInfo.Id); attachInfo.TransportScheme = startInfo.TransportScheme; attachInfo.Username = startInfo.Username; attachInfo.InternalPassword = startInfo.InternalPassword; IBrokerFactory brokerFactory = BuildBrokerFactory(attachInfo, durable); try { return(await brokerFactory.AttachBroker(attachInfo, info, SessionBase.GetTimeout(targetTimeout), binding).ConfigureAwait(false)); } finally { IDisposable disposableObject = brokerFactory as IDisposable; if (disposableObject != null) { disposableObject.Dispose(); } } }
public override async Task <SessionBase> AttachBroker(SessionStartInfo startInfo, SessionInfoContract sessionInfo, bool durable, int timeoutMilliseconds, Binding binding) { throw new NotImplementedException(); }
public override async Task <SessionInfoContract> GetInfoAsync(string endpointPrefix, string sessionId) { SessionInfoContract sessionInfo = null; this.CheckAccess(); ParamCheckUtility.ThrowIfNullOrEmpty(endpointPrefix, "endpointPrefix"); TraceHelper.TraceEvent( sessionId, TraceEventType.Information, "[SessionLauncher] .GetInfo: headnode={0}, endpointPrefix={1}, sessionId={2}", Environment.MachineName, endpointPrefix, sessionId); if (!IsEndpointPrefixSupported(endpointPrefix)) { TraceHelper.TraceEvent(sessionId, TraceEventType.Error, "[SessionLauncher] .GetInfo: {0} is not a supported endpoint prefix.", endpointPrefix); ThrowHelper.ThrowSessionFault(SOAFaultCode.InvalidArgument, SR.SessionLauncher_EndpointNotSupported, endpointPrefix); } try { using (var batchClient = AzureBatchConfiguration.GetBatchClient()) { var jobId = AzureBatchSessionJobIdConverter.ConvertToAzureBatchJobId(sessionId); var sessionJob = await batchClient.JobOperations.GetJobAsync(jobId).ConfigureAwait(false); if (sessionJob == null) { throw new InvalidOperationException($"[{nameof(AzureBatchSessionLauncher)}] .{nameof(this.GetInfoAsync)} Failed to get batch job for session {sessionId}"); } TraceHelper.TraceEvent( sessionId, TraceEventType.Information, $"[{nameof(AzureBatchSessionLauncher)}] .{nameof(this.GetInfoAsync)}: try to get the job properties(Secure, TransportScheme, BrokerEpr, BrokerNode, ControllerEpr, ResponseEpr) for the job, jobid={sessionId}."); sessionInfo = new SessionInfoContract(); sessionInfo.Id = AzureBatchSessionJobIdConverter.ConvertToSessionId(sessionJob.Id); // TODO: sessionInfo.JobState var metadata = sessionJob.Metadata; if (metadata != null) { string brokerNodeString = null; foreach (var pair in metadata) { if (pair.Name.Equals(BrokerSettingsConstants.Secure, StringComparison.OrdinalIgnoreCase)) { string secureString = pair.Value; Debug.Assert(secureString != null, "BrokerSettingsConstants.Secure value should be a string."); bool secure; if (bool.TryParse(secureString, out secure)) { sessionInfo.Secure = secure; TraceHelper.TraceEvent(sessionId, TraceEventType.Information, "[SessionLauncher] .GetInfo: get the job secure property, Secure={0}.", secure); } else { TraceHelper.TraceEvent(sessionId, TraceEventType.Error, "Illegal secure value[{0}] for job's " + BrokerSettingsConstants.Secure + " property", secureString); } } else if (pair.Name.Equals(BrokerSettingsConstants.TransportScheme, StringComparison.OrdinalIgnoreCase)) { string schemeString = pair.Value; Debug.Assert(schemeString != null, "BrokerSettingsConstants.TransportScheme value should be a string."); int scheme; if (int.TryParse(schemeString, out scheme)) { sessionInfo.TransportScheme = (TransportScheme)scheme; TraceHelper.TraceEvent( sessionId, TraceEventType.Information, "[SessionLauncher] .GetInfo: get the job TransportScheme property, TransportScheme={0}.", sessionInfo.TransportScheme); } else { TraceHelper.TraceEvent( sessionId, TraceEventType.Error, "Illegal transport scheme value[{0}] for job's " + BrokerSettingsConstants.TransportScheme + " property", schemeString); } } else if (pair.Name.Equals(BrokerSettingsConstants.BrokerNode, StringComparison.OrdinalIgnoreCase)) { brokerNodeString = pair.Value; Debug.Assert(brokerNodeString != null, "BrokerSettingsConstants.BrokerNode value should be a string."); TraceHelper.TraceEvent( sessionId, TraceEventType.Information, "[SessionLauncher] .GetInfo: get the job BrokerLauncherEpr property, BrokerLauncherEpr={0}.", sessionInfo.BrokerLauncherEpr); } else if (pair.Name.Equals(BrokerSettingsConstants.Durable, StringComparison.OrdinalIgnoreCase)) { string durableString = pair.Value; Debug.Assert(durableString != null, "BrokerSettingsConstants.Durable value should be a string."); bool durable; if (bool.TryParse(durableString, out durable)) { sessionInfo.Durable = durable; TraceHelper.TraceEvent(sessionId, TraceEventType.Information, "[SessionLauncher] .GetInfo: get the job Durable property, Durable={0}.", sessionInfo.Durable); } else { TraceHelper.TraceEvent(sessionId, TraceEventType.Error, "Illegal secure value[{0}] for job's " + BrokerSettingsConstants.Durable + " property", durableString); } } else if (pair.Name.Equals(BrokerSettingsConstants.ServiceVersion, StringComparison.OrdinalIgnoreCase)) { if (pair.Value != null) { try { sessionInfo.ServiceVersion = new Version(pair.Value); TraceHelper.TraceEvent( sessionId, TraceEventType.Information, "[SessionLauncher] .GetInfo: get the job ServiceVersion property, ServiceVersion={0}.", (sessionInfo.ServiceVersion != null) ? sessionInfo.ServiceVersion.ToString() : string.Empty); } catch (Exception e) { TraceHelper.TraceEvent( sessionId, TraceEventType.Error, "Illegal secure value[{0}] for job's " + BrokerSettingsConstants.ServiceVersion + " property. Exception = {1}", pair.Value, e); } } } } if (!string.IsNullOrEmpty(brokerNodeString)) { if (brokerNodeString != Constant.InprocessBrokerNode) { sessionInfo.BrokerLauncherEpr = BrokerNodesManager.GenerateBrokerLauncherEpr(endpointPrefix, brokerNodeString, sessionInfo.TransportScheme); } } else { sessionInfo.UseInprocessBroker = true; } TraceHelper.TraceEvent( sessionId, TraceEventType.Information, "[SessionLauncher] .GetInfo: get the job BrokerLauncherEpr property, BrokerLauncherEpr={0}.", sessionInfo.BrokerLauncherEpr); } } } catch (Exception e) { TraceHelper.TraceEvent(sessionId, TraceEventType.Error, "[SessionLauncher] .GetInfo: Failed to get all properties from job[{0}], Exception:{1}", sessionId, e); ThrowHelper.ThrowSessionFault(SOAFaultCode.GetJobPropertyFailure, SR.SessionLauncher_FailToGetJobProperty, e.ToString()); } if (sessionInfo.SessionOwner == null) { sessionInfo.SessionOwner = "Everyone"; } if (sessionInfo.SessionACL == null) { sessionInfo.SessionACL = new string[0]; } if (sessionInfo.JobState == 0) { // TODO: apply job state converting sessionInfo.JobState = JobState.Running; } TraceHelper.TraceEvent( sessionId, TraceEventType.Information, "[SessionLauncher] .GetInfo: return the sessionInfo, BrokerEpr={0}, BrokerLauncherEpr={1}, ControllerEpr={2}, Id={3}, JobState={4}, ResponseEpr={5}, Secure={6}, TransportScheme={7}, sessionOwner={8}, sessionACL={9}", sessionInfo.BrokerEpr, sessionInfo.BrokerLauncherEpr, sessionInfo.ControllerEpr, sessionInfo.Id, sessionInfo.JobState, sessionInfo.ResponseEpr, sessionInfo.Secure, sessionInfo.TransportScheme, sessionInfo.SessionOwner ?? "null", sessionInfo.SessionACL?.Length.ToString() ?? "null"); return(sessionInfo); }
/// <summary> /// Attach the broker /// </summary> /// <param name="startInfo">session start info</param> /// <param name="sessionInfo">session info</param> /// <param name="durable">whether durable session</param> /// <param name="timeoutMilliseconds">attach timeout</param> /// <param name="binding">indicating the binding</param> /// <returns></returns> public abstract Task <SessionBase> AttachBroker(SessionStartInfo startInfo, SessionInfoContract sessionInfo, bool durable, int timeoutMilliseconds, Binding binding);