Ejemplo n.º 1
0
 public Runspace(IRunspaceData runspaceData)
 {
     if (runspaceData == null)
     {
         throw new ArgumentNullException(nameof(runspaceData));
     }
     Id                    = runspaceData.Id;
     CreationTime          = runspaceData.CreationTime;
     Name                  = runspaceData.Name;
     RunVcConnectionScript = runspaceData.RunVcConnectionScript;
     State                 = runspaceData.State;
     VcConnectionScriptId  = runspaceData.VcConnectionScriptId;
     ErrorDetails          = runspaceData.ErrorDetails;
 }
Ejemplo n.º 2
0
        public IRunspaceData Get(string userId, string runspaceId)
        {
            _logger.LogInformation($"Get runspace with id: {runspaceId}");
            IRunspaceData result = null;

            try {
                Sessions.Instance.EnsureValidUser(userId);

                if (!_userRunspaces.Contains(userId))
                {
                    throw new RunspaceProviderException(
                              string.Format(APIGatewayResources.MultiTenantRunspaceProvider_UserHasNoRunspaces, userId));
                }

                if (!_userRunspaces.Contains(userId, runspaceId))
                {
                    throw new RunspaceProviderException(
                              string.Format(APIGatewayResources.MultiTenantRunspaceProvider_UserHasNoRunspaceWithId, userId, runspaceId));
                }

                var runspaceInfo = _runspaceProvider.Get(runspaceId);
                var runspaceData = _userRunspaces.GetData(userId, runspaceId);
                if (runspaceInfo == null && runspaceData != null)
                {
                    _userRunspaces.RemoveData(userId, runspaceId);
                }
                else
                {
                    result = runspaceData;
                }
            } catch (Exception ex) {
                throw new RunspaceProviderException(
                          string.Format(
                              APIGatewayResources.MultiTenantRunspaceProvider_GetFailed,
                              userId,
                              ex.Message),
                          ex);
            }

            return(result);
        }
Ejemplo n.º 3
0
        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);
        }
        public async Task <ActionResult <DataTypes.ScriptExecution> > Post([FromBody] DataTypes.ScriptExecution script_execution)
        {
            ActionResult <DataTypes.ScriptExecution> result = null;

            // Get Runspace Endpoint or throw Runspace Not Found
            IRunspaceData runspaceInfo = null;

            try {
                var authzToken = SessionToken.FromHeaders(Request.Headers);

                runspaceInfo =
                    RunspaceProviderSingleton.
                    Instance.
                    RunspaceProvider.
                    Get(authzToken.UserName, script_execution.RunspaceId);
            } catch (Exception) {
            }

            if (runspaceInfo == null)
            {
                result = NotFound(
                    new ErrorDetails(
                        ApiErrorCodes.GetErrorCode(
                            nameof(APIGatewayResources.RunspaceNotFound)),
                        string.Format(
                            APIGatewayResources.RunspaceNotFound, script_execution.RunspaceId)));
            }
            else if (runspaceInfo.State != RunspaceState.Ready)
            {
                result = StatusCode(
                    500,
                    new ErrorDetails(
                        ApiErrorCodes.GetErrorCode(
                            nameof(APIGatewayResources.RunspaceNotReady)),
                        string.Format(
                            APIGatewayResources.RunspaceNotReady,
                            script_execution.RunspaceId,
                            runspaceInfo.State)));
            }
            else
            {
                // Add Script Execution in the ScriptExecutionMediator
                try {
                    var authzToken = SessionToken.FromHeaders(Request.Headers);

                    var scriptResult =
                        await ScriptExecutionMediatorSingleton.Instance.ScriptExecutionMediator.StartScriptExecution(
                            authzToken.UserName,
                            runspaceInfo,
                            script_execution);

                    result = StatusCode(
                        202,
                        new DataTypes.ScriptExecution(scriptResult));
                } catch (RunspaceEndpointException runspaceEndointException) {
                    result = StatusCode(
                        runspaceEndointException.HttpErrorCode,
                        new ErrorDetails(
                            ApiErrorCodes.CalculateScriptsErrorCode(runspaceEndointException.ErrorCode),
                            runspaceEndointException.Message,
                            runspaceEndointException.ToString()));
                } catch (Exception exc) {
                    result = StatusCode(
                        500,
                        new ErrorDetails(
                            ApiErrorCodes.GetErrorCode(
                                nameof(APIGatewayResources.ScriptsController_RunspaceFailedToProcessScriptRequest)),
                            APIGatewayResources.ScriptsController_RunspaceFailedToProcessScriptRequest,
                            exc.ToString()));
                }
            }


            return(result);
        }