public IWebConsoleData CreateWebConsole( string userId, ISessionToken sessionToken, ISolutionStsClient stsClient, string vcEndpoint) { IWebConsoleData result = null; _logger.LogInformation("StartCreateWebConsole"); try { Sessions.Instance.EnsureValidUser(userId); _logger.LogDebug("RunspaceProvider -> CreateWebConsole call"); string bearerSamlToken = ""; try { _logger.LogDebug($"HoK Saml Token availble: {sessionToken.HoKSamlToken != null}"); if (sessionToken.HoKSamlToken == null) { throw new Exception(APIGatewayResources.PowerCLIVCloginController_NoRefreshTokenAvailable_For_Session); } _logger.LogDebug($"STSClient -> IssueBearerTokenBySolutionToken call"); bearerSamlToken = stsClient .IssueBearerTokenBySolutionToken(sessionToken.HoKSamlToken.RawXmlElement) .OuterXml; } catch (Exception exc) { _logger.LogError(exc, "Issue Bearer Token failed"); result.State = DataTypes.WebConsoleState.Error; result.ErrorDetails = new DataTypes.ErrorDetails(exc); } var token = Convert.ToBase64String(System.Text.Encoding.Unicode.GetBytes(bearerSamlToken)); var webConsoleInfo = _runspaceProvider.CreateWebConsole(vcEndpoint, token, true); _logger.LogDebug($"Runspace provider result: {webConsoleInfo.Id}, {webConsoleInfo.CreationState}, {webConsoleInfo.CreationError}"); result = new WebConsoleData(webConsoleInfo); result.CreationTime = DateTime.Now; result.State = DataTypes.WebConsoleState.Available; _runspacesStatsMonitor.RegisterWebConsole(result, sessionToken.SessionId); _userWebConsoles.Add(userId, result.Id, result); } catch (RunspaceProviderException runspaceProviderException) { _logger.LogError(runspaceProviderException, "Runspace provider exception was thrown"); throw; } catch (Exception ex) { throw new RunspaceProviderException( string.Format( APIGatewayResources.MultiTenantRunspaceProvider_CreateFailed, userId, ex.Message), ex); } return(result); }
public IRunspaceData StartCreate( string userId, ISessionToken sessionToken, string name, bool runVcConnectionScript, ISolutionStsClient stsClient, string vcEndpoint) { IRunspaceData result = null; _logger.LogInformation("StartCreate"); try { Sessions.Instance.EnsureValidUser(userId); _logger.LogDebug("RunspaceProvider -> StartCreate call"); var runspaceInfo = _runspaceProvider.StartCreate(); _logger.LogDebug($"Runspace provider result: {runspaceInfo.Id}, {runspaceInfo.CreationState}, {runspaceInfo.CreationError}"); result = new RunspaceData(runspaceInfo); result.CreationTime = DateTime.Now; result.Name = name; result.RunVcConnectionScript = runVcConnectionScript; result.State = DataTypes.RunspaceState.Creating; _userRunspaces.Add(userId, result.Id, result); _runspacesStatsMonitor.Register(result, sessionToken.SessionId); Task.Run(() => { _logger.LogDebug("RunspaceProvider -> WaitCreateCompletion call"); var waitResult = _runspaceProvider.WaitCreateCompletion(result); _logger.LogDebug($"Runspace provider WaitCreateCompletion result: {waitResult.Id}, {waitResult.CreationState}, {waitResult.CreationError}"); if (waitResult.CreationState == RunspaceCreationState.Error) { ((RunspaceData)result).ErrorDetails = new DataTypes.ErrorDetails(waitResult.CreationError); ((RunspaceData)result).State = DataTypes.RunspaceState.Error; } else { // Update endpoint info ((RunspaceData)result).Endpoint = waitResult.Endpoint; } if (waitResult.CreationState == RunspaceCreationState.Ready && !runVcConnectionScript) { ((RunspaceData)result).State = DataTypes.RunspaceState.Ready; } _logger.LogDebug($"Connect VC requested: {runVcConnectionScript}"); if (runVcConnectionScript && waitResult.CreationState == RunspaceCreationState.Ready) { string bearerSamlToken = null; try { _logger.LogDebug($"HoK Saml Token availble: {sessionToken.HoKSamlToken != null}"); if (sessionToken.HoKSamlToken == null) { throw new Exception(APIGatewayResources.PowerCLIVCloginController_NoRefreshTokenAvailable_For_Session); } _logger.LogDebug($"STSClient -> IssueBearerTokenBySolutionToken call"); bearerSamlToken = stsClient .IssueBearerTokenBySolutionToken(sessionToken.HoKSamlToken.RawXmlElement) .OuterXml; } catch (Exception exc) { _logger.LogError(exc, "Issue Bearer Token failed"); result.State = DataTypes.RunspaceState.Error; result.ErrorDetails = new DataTypes.ErrorDetails(exc); } if (bearerSamlToken != null) { // Connect PowerCLI try { var scriptExecutionRequest = new DataTypes.ScriptExecution { OutputObjectsFormat = OutputObjectsFormat.Json, Name = "powerclivclogin", Script = PCLIScriptsReader.ConnectByStringSamlToken, ScriptParameters = new DataTypes.ScriptParameter[] { new DataTypes.ScriptParameter { Name = "server", Value = vcEndpoint }, new DataTypes.ScriptParameter { Name = "samlToken", Value = bearerSamlToken }, new DataTypes.ScriptParameter { Name = "allLinked", Value = true } } }; _logger.LogDebug($"Start Connect VC script"); var scriptResult = ScriptExecutionMediatorSingleton. Instance. ScriptExecutionMediator. StartScriptExecution(sessionToken.UserName, result, scriptExecutionRequest).Result; result.VcConnectionScriptId = scriptResult.Id; _logger.LogDebug($"Wait Connect VC script to complete"); while (scriptResult.State == ScriptState.Running) { var intermediateResult = ScriptExecutionMediatorSingleton.Instance.ScriptExecutionMediator.GetScriptExecution( sessionToken.UserName, scriptResult.Id); if (intermediateResult != null) { scriptResult = intermediateResult; } Thread.Sleep(200); } } catch (RunspaceEndpointException runspaceEndointException) { _logger.LogError(runspaceEndointException, "Runspace endpoint exception while waiting connect VC script"); result.ErrorDetails = new DataTypes.ErrorDetails(runspaceEndointException); result.State = DataTypes.RunspaceState.Error; } catch (Exception exc) { _logger.LogError(exc, "Wait Connect VC script failed"); result.ErrorDetails = new DataTypes.ErrorDetails(exc); result.State = DataTypes.RunspaceState.Error; } } if (result.State != DataTypes.RunspaceState.Error) { result.State = DataTypes.RunspaceState.Ready; } } }); } catch (RunspaceProviderException runspaceProviderException) { _logger.LogError(runspaceProviderException, "Runspace provider exception was thrown"); throw; } catch (Exception ex) { throw new RunspaceProviderException( string.Format( APIGatewayResources.MultiTenantRunspaceProvider_CreateFailed, userId, ex.Message), ex); } return(result); }