Example #1
0
        internal async Task HandleDisposeRequest(EditDisposeParams disposeParams,
                                                 RequestContext <EditDisposeResult> requestContext)
        {
            try
            {
                // Sanity check the owner URI
                Validate.IsNotNullOrWhitespaceString(nameof(disposeParams.OwnerUri), disposeParams.OwnerUri);

                // Attempt to remove the editSession
                EditSession editSession;
                if (!ActiveSessions.TryRemove(disposeParams.OwnerUri, out editSession))
                {
                    await requestContext.SendError(SR.EditDataSessionNotFound);

                    return;
                }

                // Everything was successful, return success
                await requestContext.SendResult(new EditDisposeResult());
            }
            catch (Exception e)
            {
                await requestContext.SendError(e.Message);
            }
        }
 /// <summary>
 /// Handles config view request
 /// </summary>
 /// <param name="parameters">Request parameters</param>
 /// <param name="requestContext">Request Context</param>
 /// <returns></returns>
 public async Task HandleServerConfigViewRequest(ServerConfigViewRequestParams parameters, RequestContext <ServerConfigViewResponseParams> requestContext)
 {
     Logger.Write(TraceEventType.Verbose, "HandleServerConfigViewRequest");
     try
     {
         ConnectionInfo connInfo;
         ConnectionServiceInstance.TryFindConnection(
             parameters.OwnerUri,
             out connInfo);
         if (connInfo == null)
         {
             await requestContext.SendError(new Exception(SR.ProfilerConnectionNotFound));
         }
         else
         {
             var serverConnection = ConnectionService.OpenServerConnection(connInfo);
             ServerConfigProperty serverConfig = GetConfig(serverConnection, parameters.ConfigNumber);
             await requestContext.SendResult(new ServerConfigViewResponseParams
             {
                 ConfigProperty = serverConfig
             });
         }
     }
     catch (Exception e)
     {
         // Exception related to run task will be captured here
         await requestContext.SendError(e);
     }
 }
Example #3
0
        public async Task HandleCreateCentralManagementServerRequest(CreateCentralManagementServerParams createCmsParams, RequestContext <ListRegisteredServersResult> requestContext)
        {
            Logger.Write(TraceEventType.Verbose, "HandleCreateCentralManagementServerRequest");
            try
            {
                CmsTask = Task.Run(async() =>
                {
                    try
                    {
                        //Validate params and connect
                        ServerConnection conn = await ValidateAndCreateConnection(createCmsParams.ConnectParams);

                        // Get Current Reg Servers on CMS
                        RegisteredServersStore store       = new RegisteredServersStore(conn);
                        ServerGroup parentGroup            = store.DatabaseEngineServerGroup;
                        ListRegisteredServersResult result = GetChildrenfromParentGroup(parentGroup);
                        if (result != null)
                        {
                            await requestContext.SendResult(result);
                            return;
                        }
                    }
                    catch (Exception ex)
                    {
                        // Exception related to connection/creation will only be caught here. Note that the outer catch will not catch them
                        await requestContext.SendError(ex);
                    }
                });
            }
            catch (Exception e)
            {
                // Exception related to run task will be captured here
                await requestContext.SendError(e);
            }
        }
        /// <summary>
        /// Handle get database info request
        /// </summary>
        internal static async Task HandleGetDatabaseInfoRequest(
            GetDatabaseInfoParams databaseParams,
            RequestContext <GetDatabaseInfoResponse> requestContext)
        {
            try
            {
                Func <Task> requestHandler = async() =>
                {
                    ConnectionInfo connInfo;
                    AdminService.ConnectionServiceInstance.TryFindConnection(
                        databaseParams.OwnerUri,
                        out connInfo);
                    DatabaseInfo info = null;

                    if (connInfo != null)
                    {
                        info = GetDatabaseInfo(connInfo);
                    }

                    await requestContext.SendResult(new GetDatabaseInfoResponse()
                    {
                        DatabaseInfo = info
                    });
                };

                Task task = Task.Run(async() => await requestHandler()).ContinueWithOnFaulted(async t =>
                {
                    await requestContext.SendError(t.Exception.ToString());
                });
            }
            catch (Exception ex)
            {
                await requestContext.SendError(ex.ToString());
            }
        }
        /// <summary>
        /// Handles external language delete request
        /// </summary>
        /// <param name="parameters">Request parameters</param>
        /// <param name="requestContext">Request Context</param>
        /// <returns></returns>
        public async Task HandleExternalLanguageDeleteRequest(ExternalLanguageDeleteRequestParams parameters, RequestContext <ExternalLanguageDeleteResponseParams> requestContext)
        {
            Logger.Write(TraceEventType.Verbose, "HandleExternalLanguageDeleteRequest");
            try
            {
                ConnectionInfo connInfo;
                ConnectionServiceInstance.TryFindConnection(
                    parameters.OwnerUri,
                    out connInfo);
                ExternalLanguageDeleteResponseParams response = new ExternalLanguageDeleteResponseParams
                {
                };

                if (connInfo == null)
                {
                    await requestContext.SendError(new Exception(SR.ConnectionServiceDbErrorDefaultNotConnected(parameters.OwnerUri)));
                }
                else
                {
                    using (IDbConnection dbConnection = ConnectionService.OpenSqlConnection(connInfo))
                    {
                        ExternalLanguageOperations.DeleteLanguage(dbConnection, parameters.LanguageName);
                    }

                    await requestContext.SendResult(response);
                }
            }
            catch (Exception e)
            {
                // Exception related to run task will be captured here
                await requestContext.SendError(e);
            }
        }
 /// <summary>
 /// Handle request to pause a profiling session
 /// </summary>
 internal async Task HandleGetXEventSessionsRequest(GetXEventSessionsParams parameters, RequestContext <GetXEventSessionsResult> requestContext)
 {
     await Task.Run(async() =>
     {
         try
         {
             var result = new GetXEventSessionsResult();
             ConnectionInfo connInfo;
             ConnectionServiceInstance.TryFindConnection(
                 parameters.OwnerUri,
                 out connInfo);
             if (connInfo == null)
             {
                 await requestContext.SendError(new Exception(SR.ProfilerConnectionNotFound));
             }
             else
             {
                 List <string> sessions = GetXEventSessionList(parameters.OwnerUri, connInfo);
                 result.Sessions        = sessions;
                 await requestContext.SendResult(result);
             }
         }
         catch (Exception e)
         {
             await requestContext.SendError(e);
         }
     });
 }
Example #7
0
        public async Task HandleRemoveServerGroupRequest(RemoveServerGroupParams removeServerGroupParams, RequestContext <bool> requestContext)
        {
            Logger.Write(TraceEventType.Verbose, "HandleRemoveServerGroupRequest");
            try
            {
                CmsTask = Task.Run(async() =>
                {
                    try
                    {
                        ServerConnection serverConn = ValidateAndCreateConnection(removeServerGroupParams.ParentOwnerUri);
                        if (serverConn != null)
                        {
                            RegisteredServersStore store = new RegisteredServersStore(serverConn);

                            ServerGroup parentGroup         = NavigateToServerGroup(store, removeServerGroupParams.RelativePath, false);
                            ServerGroup serverGrouptoRemove = parentGroup.ServerGroups.OfType <ServerGroup>().FirstOrDefault(r => r.Name == removeServerGroupParams.GroupName); // since duplicates are not allowed
                            serverGrouptoRemove?.Drop();
                            await requestContext.SendResult(true);
                        }
                        else
                        {
                            await requestContext.SendResult(false);
                        }
                    }
                    catch (Exception e)
                    {
                        await requestContext.SendError(e);
                    }
                });
            }
            catch (Exception e)
            {
                await requestContext.SendError(e);
            }
        }
Example #8
0
        private async Task SaveResultsHelper(SaveResultsRequestParams saveParams,
                                             RequestContext <SaveResultRequestResult> requestContext, IFileStreamFactory fileFactory)
        {
            // retrieve query for OwnerUri
            Query query;

            if (!ActiveQueries.TryGetValue(saveParams.OwnerUri, out query))
            {
                await requestContext.SendError(SR.QueryServiceQueryInvalidOwnerUri);

                return;
            }

            //Setup the callback for completion of the save task
            ResultSet.SaveAsAsyncEventHandler successHandler = async parameters =>
            {
                await requestContext.SendResult(new SaveResultRequestResult());
            };
            ResultSet.SaveAsFailureAsyncEventHandler errorHandler = async(parameters, reason) =>
            {
                string message = SR.QueryServiceSaveAsFail(Path.GetFileName(parameters.FilePath), reason);
                await requestContext.SendError(message);
            };

            try
            {
                // Launch the task
                query.SaveAs(saveParams, fileFactory, successHandler, errorHandler);
            }
            catch (Exception e)
            {
                await errorHandler(saveParams, e.Message);
            }
        }
Example #9
0
        /// <summary>
        /// Handles request to execute a selection of a document in the workspace service
        /// </summary>
        internal async Task HandleExecuteRequest(ExecuteRequestParamsBase executeParams,
                                                 RequestContext <ExecuteRequestResult> requestContext)
        {
            try
            {
                // Setup actions to perform upon successful start and on failure to start
                Func <Query, Task <bool> > queryCreateSuccessAction = async q =>
                {
                    await requestContext.SendResult(new ExecuteRequestResult());

                    Logger.Write(TraceEventType.Stop, $"Response for Query: '{executeParams.OwnerUri} sent. Query Complete!");
                    return(true);
                };
                Func <string, Task> queryCreateFailureAction = message =>
                {
                    Logger.Write(TraceEventType.Warning, $"Failed to create Query: '{executeParams.OwnerUri}. Message: '{message}' Complete!");
                    return(requestContext.SendError(message));
                };

                // Use the internal handler to launch the query
                WorkTask = Task.Run(async() =>
                {
                    await InterServiceExecuteQuery(executeParams, null, requestContext, queryCreateSuccessAction, queryCreateFailureAction, null, null);
                });
            }
            catch (Exception ex)
            {
                await requestContext.SendError(ex.ToString());
            }
        }
        private async Task HandleRequest <T>(Func <Task <T> > handler, Func <ExpiredTokenException, T> expiredTokenHandler, RequestContext <T> requestContext, string requestType)
        {
            Logger.Write(LogLevel.Verbose, requestType);

            try
            {
                T result = await handler();

                await requestContext.SendResult(result);
            }
            catch (ExpiredTokenException ex)
            {
                if (expiredTokenHandler != null)
                {
                    // This is a special exception indicating the token(s) used to request resources had expired.
                    // Any Azure resource should have handling for this such as an error path that clearly indicates that a refresh is needed
                    T result = expiredTokenHandler(ex);
                    await requestContext.SendResult(result);
                }
                else
                {
                    // No handling for expired tokens defined / expected
                    await requestContext.SendError(ex.Message);
                }
            }
            catch (Exception ex)
            {
                // Send just the error message back for now as stack trace isn't useful
                await requestContext.SendError(ex.Message);
            }
        }
Example #11
0
        /// <summary>
        /// Handles a request to get an execution plan
        /// </summary>
        internal async Task HandleExecutionPlanRequest(QueryExecutionPlanParams planParams,
                                                       RequestContext <QueryExecutionPlanResult> requestContext)
        {
            try
            {
                // Attempt to load the query
                Query query;
                if (!ActiveQueries.TryGetValue(planParams.OwnerUri, out query))
                {
                    await requestContext.SendError(SR.QueryServiceRequestsNoQuery);

                    return;
                }

                // Retrieve the requested execution plan and return it
                var result = new QueryExecutionPlanResult
                {
                    ExecutionPlan = await query.GetExecutionPlan(planParams.BatchIndex, planParams.ResultSetIndex)
                };
                await requestContext.SendResult(result);
            }
            catch (Exception e)
            {
                // This was unexpected, so send back as error
                await requestContext.SendError(e.Message);
            }
        }
        protected async Task HandleSetVariablesRequest(
            SetVariableRequestArguments setVariableParams,
            RequestContext <SetVariableResponseBody> requestContext)
        {
            try
            {
                string updatedValue =
                    await _editorSession.DebugService.SetVariable(
                        setVariableParams.VariablesReference,
                        setVariableParams.Name,
                        setVariableParams.Value);

                var setVariableResponse = new SetVariableResponseBody
                {
                    Value = updatedValue
                };

                await requestContext.SendResult(setVariableResponse);
            }
            catch (Exception ex) when(ex is ArgumentTransformationMetadataException ||
                                      ex is InvalidPowerShellExpressionException ||
                                      ex is SessionStateUnauthorizedAccessException)
            {
                // Catch common, innocuous errors caused by the user supplying a value that can't be converted or the variable is not settable.
                Logger.Write(LogLevel.Verbose, $"Failed to set variable: {ex.Message}");
                await requestContext.SendError(ex.Message);
            }
            catch (Exception ex)
            {
                Logger.Write(LogLevel.Error, $"Unexpected error setting variable: {ex.Message}");
                string msg =
                    $"Unexpected error: {ex.GetType().Name} - {ex.Message}  Please report this error to the PowerShellEditorServices project on GitHub.";
                await requestContext.SendError(msg);
            }
        }
Example #13
0
        private async Task HandleAssessmentRequest <TResult>(
            RequestContext <AssessmentResult <TResult> > requestContext,
            AssessmentParams requestParams,
            Func <SqlObjectLocator, Task <List <TResult> > > assessmentFunction)
            where TResult : AssessmentItemInfo
        {
            try
            {
                string randomUri = Guid.NewGuid().ToString();

                // get connection
                if (!ConnectionService.TryFindConnection(requestParams.OwnerUri, out var connInfo))
                {
                    await requestContext.SendError(SR.SqlAssessmentQueryInvalidOwnerUri);

                    return;
                }

                ConnectParams connectParams = new ConnectParams
                {
                    OwnerUri   = randomUri,
                    Connection = connInfo.ConnectionDetails,
                    Type       = ConnectionType.Default
                };

                if (!connInfo.TryGetConnection(ConnectionType.Default, out var connection))
                {
                    await requestContext.SendError(SR.SqlAssessmentConnectingError);
                }

                var workTask = CallAssessmentEngine <TResult>(
                    requestParams,
                    connectParams,
                    randomUri,
                    assessmentFunction)
                               .ContinueWith(async tsk =>
                {
                    await requestContext.SendResult(tsk.Result);
                });

                ActiveRequests.TryAdd(randomUri, workTask);
            }
            catch (Exception ex)
            {
                if (ex is StackOverflowException || ex is OutOfMemoryException)
                {
                    throw;
                }

                await requestContext.SendError(ex.ToString());
            }
        }
        /// <summary>
        /// Handle request to get backup configuration info
        /// </summary>
        /// <param name="optionsParams"></param>
        /// <param name="requestContext"></param>
        /// <returns></returns>
        public static async Task HandleBackupConfigInfoRequest(
            DefaultDatabaseInfoParams optionsParams,
            RequestContext <BackupConfigInfoResponse> requestContext)
        {
            try
            {
                var            response = new BackupConfigInfoResponse();
                ConnectionInfo connInfo;
                DisasterRecoveryService.ConnectionServiceInstance.TryFindConnection(
                    optionsParams.OwnerUri,
                    out connInfo);

                if (connInfo != null)
                {
                    DatabaseTaskHelper helper  = AdminService.CreateDatabaseTaskHelper(connInfo, databaseExists: true);
                    SqlConnection      sqlConn = GetSqlConnection(connInfo);
                    if ((sqlConn != null) && !connInfo.IsSqlDW && !connInfo.IsAzure)
                    {
                        BackupConfigInfo backupConfigInfo = DisasterRecoveryService.Instance.GetBackupConfigInfo(helper.DataContainer, sqlConn, sqlConn.Database);
                        backupConfigInfo.DatabaseInfo = AdminService.GetDatabaseInfo(connInfo);
                        response.BackupConfigInfo     = backupConfigInfo;
                    }
                }

                await requestContext.SendResult(response);
            }
            catch (Exception ex)
            {
                await requestContext.SendError(ex.ToString());
            }
        }
Example #15
0
        /// <summary>
        /// Handle request to start a profiling session
        /// </summary>
        internal async Task HandleStartProfilingRequest(StartProfilingParams parameters, RequestContext <StartProfilingResult> requestContext)
        {
            try
            {
                var            result = new StartProfilingResult();
                ConnectionInfo connInfo;
                ConnectionServiceInstance.TryFindConnection(
                    parameters.OwnerUri,
                    out connInfo);

                if (connInfo != null)
                {
                    ProfilerSession session = StartSession(parameters.OwnerUri, connInfo);
                    result.SessionId = session.SessionId;
                    result.Succeeded = true;
                }
                else
                {
                    result.Succeeded    = false;
                    result.ErrorMessage = SR.ProfilerConnectionNotFound;
                }

                await requestContext.SendResult(result);
            }
            catch (Exception e)
            {
                await requestContext.SendError(e);
            }
        }
        /// <summary>
        /// Handle request to get backup configuration info
        /// </summary>
        /// <param name="optionsParams"></param>
        /// <param name="requestContext"></param>
        /// <returns></returns>
        internal async Task HandleBackupConfigInfoRequest(
            DefaultDatabaseInfoParams optionsParams,
            RequestContext <BackupConfigInfoResponse> requestContext)
        {
            try
            {
                var            response = new BackupConfigInfoResponse();
                ConnectionInfo connInfo;
                DisasterRecoveryService.ConnectionServiceInstance.TryFindConnection(
                    optionsParams.OwnerUri,
                    out connInfo);

                if (connInfo != null)
                {
                    using (DatabaseTaskHelper helper = AdminService.CreateDatabaseTaskHelper(connInfo, databaseExists: true))
                    {
                        using (SqlConnection sqlConn = ConnectionService.OpenSqlConnection(connInfo, "Backup"))
                        {
                            if (sqlConn != null && !connInfo.IsCloud)
                            {
                                BackupConfigInfo backupConfigInfo = this.GetBackupConfigInfo(helper.DataContainer, sqlConn, sqlConn.Database);
                                response.BackupConfigInfo = backupConfigInfo;
                            }
                        }
                    }
                }

                await requestContext.SendResult(response);
            }
            catch (Exception ex)
            {
                await requestContext.SendError(ex.ToString());
            }
        }
        /// <summary>
        /// Handles a create database request
        /// </summary>
        internal static async Task HandleCreateDatabaseRequest(
            CreateDatabaseParams databaseParams,
            RequestContext <CreateDatabaseResponse> requestContext)
        {
            try
            {
                var            response = new DefaultDatabaseInfoResponse();
                ConnectionInfo connInfo;
                AdminService.ConnectionServiceInstance.TryFindConnection(
                    databaseParams.OwnerUri,
                    out connInfo);

                using (var taskHelper = CreateDatabaseTaskHelper(connInfo))
                {
                    DatabasePrototype prototype = taskHelper.Prototype;
                    DatabaseTaskHelper.ApplyToPrototype(databaseParams.DatabaseInfo, taskHelper.Prototype);

                    Database db = prototype.ApplyChanges();

                    await requestContext.SendResult(new CreateDatabaseResponse()
                    {
                        Result = true,
                        TaskId = 0
                    });
                }
            }
            catch (Exception ex)
            {
                await requestContext.SendError(ex.ToString());
            }
        }
Example #18
0
        /// <summary>
        /// Handles request to generate deploy script
        /// </summary>
        /// <returns></returns>
        public async Task HandleGenerateDeployScriptRequest(GenerateDeployScriptParams parameters, RequestContext <DacFxResult> requestContext)
        {
            try
            {
                ConnectionInfo connInfo;
                ConnectionServiceInstance.TryFindConnection(
                    parameters.OwnerUri,
                    out connInfo);
                if (connInfo != null)
                {
                    GenerateDeployScriptOperation operation = new GenerateDeployScriptOperation(parameters, connInfo);
                    SqlTask      sqlTask  = null;
                    TaskMetadata metadata = new TaskMetadata();
                    metadata.TaskOperation     = operation;
                    metadata.TaskExecutionMode = parameters.TaskExecutionMode;
                    metadata.ServerName        = connInfo.ConnectionDetails.ServerName;
                    metadata.DatabaseName      = parameters.DatabaseName;
                    metadata.Name = SR.GenerateScriptTaskName;

                    sqlTask = SqlTaskManagerInstance.CreateAndRun <SqlTask>(metadata);

                    await requestContext.SendResult(new DacFxResult()
                    {
                        OperationId  = operation.OperationId,
                        Success      = true,
                        ErrorMessage = string.Empty
                    });
                }
            }
            catch (Exception e)
            {
                await requestContext.SendError(e);
            }
        }
        /// <summary>
        /// Handle a table pr view metadata query request
        /// </summary>
        private static async Task HandleGetTableOrViewRequest(
            TableMetadataParams metadataParams,
            string objectType,
            RequestContext <TableMetadataResult> requestContext)
        {
            try
            {
                ConnectionInfo connInfo;
                MetadataService.ConnectionServiceInstance.TryFindConnection(
                    metadataParams.OwnerUri,
                    out connInfo);

                ColumnMetadata[] metadata = null;
                if (connInfo != null)
                {
                    using (SqlConnection sqlConn = ConnectionService.OpenSqlConnection(connInfo, "Metadata"))
                    {
                        TableMetadata table = new SmoMetadataFactory().GetObjectMetadata(
                            sqlConn, metadataParams.Schema,
                            metadataParams.ObjectName, objectType);
                        metadata = table.Columns;
                    }
                }

                await requestContext.SendResult(new TableMetadataResult
                {
                    Columns = metadata
                });
            }
            catch (Exception ex)
            {
                await requestContext.SendError(ex.ToString());
            }
        }
Example #20
0
        /// <summary>
        /// Handle a metadata query request
        /// </summary>
        internal static async Task HandleMetadataListRequest(
            MetadataQueryParams metadataParams,
            RequestContext <MetadataQueryResult> requestContext)
        {
            try
            {
                ConnectionInfo connInfo;
                MetadataService.ConnectionServiceInstance.TryFindConnection(
                    metadataParams.OwnerUri,
                    out connInfo);

                var metadata = new List <ObjectMetadata>();
                if (connInfo != null)
                {
                    using (SqlConnection sqlConn = OpenMetadataConnection(connInfo))
                    {
                        ReadMetadata(sqlConn, metadata);
                    }
                }

                await requestContext.SendResult(new MetadataQueryResult
                {
                    Metadata = metadata.ToArray()
                });
            }
            catch (Exception ex)
            {
                await requestContext.SendError(ex.ToString());
            }
        }
        public async Task HandleDisposeRequest(QueryDisposeParams disposeParams,
                                               RequestContext <QueryDisposeResult> requestContext)
        {
            try
            {
                // Attempt to remove the query for the owner uri
                Query result;
                if (!ActiveQueries.TryRemove(disposeParams.OwnerUri, out result))
                {
                    await requestContext.SendResult(new QueryDisposeResult
                    {
                        Messages = SR.QueryServiceRequestsNoQuery
                    });

                    return;
                }

                // Cleanup the query
                result.Dispose();

                // Success
                await requestContext.SendResult(new QueryDisposeResult
                {
                    Messages = null
                });
            }
            catch (Exception e)
            {
                await requestContext.SendError(e.Message);
            }
        }
Example #22
0
        /// <summary>
        /// Handles a request to cancel this query if it is in progress
        /// </summary>
        internal async Task HandleCancelRequest(QueryCancelParams cancelParams,
                                                RequestContext <QueryCancelResult> requestContext)
        {
            try
            {
                // Attempt to find the query for the owner uri
                Query result;
                if (!ActiveQueries.TryGetValue(cancelParams.OwnerUri, out result))
                {
                    await requestContext.SendResult(new QueryCancelResult
                    {
                        Messages = SR.QueryServiceRequestsNoQuery
                    });

                    return;
                }

                // Cancel the query and send a success message
                result.Cancel();
                await requestContext.SendResult(new QueryCancelResult());
            }
            catch (InvalidOperationException e)
            {
                // If this exception occurred, we most likely were trying to cancel a completed query
                await requestContext.SendResult(new QueryCancelResult
                {
                    Messages = e.Message
                });
            }
            catch (Exception e)
            {
                await requestContext.SendError(e.Message);
            }
        }
Example #23
0
        /// <summary>
        /// Handles request to generate deploy plan
        /// </summary>
        /// <returns></returns>
        public async Task HandleGenerateDeployPlanRequest(GenerateDeployPlanParams parameters, RequestContext <GenerateDeployPlanRequestResult> requestContext)
        {
            try
            {
                ConnectionInfo connInfo;
                ConnectionServiceInstance.TryFindConnection(
                    parameters.OwnerUri,
                    out connInfo);
                if (connInfo != null)
                {
                    GenerateDeployPlanOperation operation = new GenerateDeployPlanOperation(parameters, connInfo);
                    operation.Execute(parameters.TaskExecutionMode);

                    await requestContext.SendResult(new GenerateDeployPlanRequestResult()
                    {
                        OperationId  = operation.OperationId,
                        Success      = true,
                        ErrorMessage = string.Empty,
                        Report       = operation.DeployReport
                    });
                }
            }
            catch (Exception e)
            {
                await requestContext.SendError(e);
            }
        }
        /// <summary>
        /// Handle request to start a profiling session
        /// </summary>
        internal async Task HandleStartProfilingRequest(StartProfilingParams parameters, RequestContext <StartProfilingResult> requestContext)
        {
            await Task.Run(async() =>
            {
                try
                {
                    ConnectionInfo connInfo;
                    ConnectionServiceInstance.TryFindConnection(
                        parameters.OwnerUri,
                        out connInfo);
                    if (connInfo != null)
                    {
                        // create a new XEvent session and Profiler session
                        var xeSession = this.XEventSessionFactory.GetXEventSession(parameters.SessionName, connInfo);
                        // start monitoring the profiler session
                        monitor.StartMonitoringSession(parameters.OwnerUri, xeSession);

                        var result = new StartProfilingResult();
                        await requestContext.SendResult(result);
                    }
                    else
                    {
                        throw new Exception(SR.ProfilerConnectionNotFound);
                    }
                }
                catch (Exception e)
                {
                    await requestContext.SendError(new Exception(SR.StartSessionFailed(e.Message)));
                }
            });
        }
        /// <summary>
        /// Handles script as request messages
        /// </summary>
        /// <param name="scriptingParams"></param>
        /// <param name="requestContext"></param>
        internal static async Task HandleScriptingScriptAsRequest(
            ScriptingScriptAsParams scriptingParams,
            RequestContext <ScriptingScriptAsResult> requestContext)
        {
            try
            {
                ConnectionInfo connInfo;
                ScriptingService.ConnectionServiceInstance.TryFindConnection(
                    scriptingParams.OwnerUri,
                    out connInfo);

                ObjectMetadata metadata = scriptingParams.Metadata;
                string         script   = string.Empty;

                if (connInfo != null)
                {
                    script = QueueScriptOperation(scriptingParams.Operation, connInfo, metadata);
                }

                await requestContext.SendResult(new ScriptingScriptAsResult
                {
                    OwnerUri = scriptingParams.OwnerUri,
                    Script   = script
                });
            }
            catch (Exception ex)
            {
                await requestContext.SendError(ex.ToString());
            }
        }
Example #26
0
        public void SendException()
        {
            // Setup: Create a blocking collection to collect the output
            var bc = new BlockingCollection <Message>(new ConcurrentQueue <Message>());

            // If: I write an error as an exception with the request context
            const string errorMessage = "error";
            var          e            = new Exception(errorMessage);
            var          rc           = new RequestContext <CommonObjects.TestMessageContents>(CommonObjects.RequestMessage, bc);

            rc.SendError(e);

            // Then:
            // ... The message writer should have sent an error
            Assert.Single(bc);
            var firstMessage = bc.First();

            Assert.Equal(MessageType.ResponseError, firstMessage.MessageType);

            // ... The error object it built should have the reuired fields set
            var contents = firstMessage.GetTypedContents <Error>();

            Assert.Equal(e.HResult, contents.Code);
            Assert.Equal(errorMessage, contents.Message);
        }
Example #27
0
        internal async Task HandleRefreshRequest(RefreshParams refreshParams, RequestContext <bool> context)
        {
            try
            {
                Logger.Write(LogLevel.Verbose, "HandleRefreshRequest");
                Validate.IsNotNull(nameof(refreshParams), refreshParams);
                Validate.IsNotNull(nameof(context), context);

                string uri = refreshParams.SessionId;
                ObjectExplorerSession session = null;
                if (!sessionMap.TryGetValue(uri, out session))
                {
                    Logger.Write(LogLevel.Verbose, $"Cannot expand object explorer node. Couldn't find session for uri. {uri} ");
                    await serviceHost.SendEvent(ExpandCompleteNotification.Type, new ExpandResponse
                    {
                        SessionId    = refreshParams.SessionId,
                        NodePath     = refreshParams.NodePath,
                        ErrorMessage = $"Couldn't find session for session: {uri}"
                    });
                }
                else
                {
                    RunExpandTask(session, refreshParams, true);
                }
                await context.SendResult(true);
            }
            catch (Exception ex)
            {
                await context.SendError(ex.ToString());
            }
        }
Example #28
0
        internal async Task HandleCreateSessionRequest(ConnectionDetails connectionDetails, RequestContext <CreateSessionResponse> context)
        {
            try
            {
                Logger.Write(LogLevel.Verbose, "HandleCreateSessionRequest");
                Func <Task <CreateSessionResponse> > doCreateSession = async() =>
                {
                    Validate.IsNotNull(nameof(connectionDetails), connectionDetails);
                    Validate.IsNotNull(nameof(context), context);
                    return(await Task.Factory.StartNew(() =>
                    {
                        string uri = GenerateUri(connectionDetails);

                        return new CreateSessionResponse {
                            SessionId = uri
                        };
                    }));
                };

                CreateSessionResponse response = await HandleRequestAsync(doCreateSession, context, "HandleCreateSessionRequest");

                if (response != null)
                {
                    RunCreateSessionTask(connectionDetails, response.SessionId);
                }
            }
            catch (Exception ex)
            {
                await context.SendError(ex.ToString());
            }
        }
Example #29
0
        /// <summary>
        /// Handles schema compare open SCMP request
        /// </summary>
        /// <returns></returns>
        public async Task HandleSchemaCompareOpenScmpRequest(SchemaCompareOpenScmpParams parameters, RequestContext <SchemaCompareOpenScmpResult> requestContext)
        {
            try
            {
                CurrentSchemaCompareTask = Task.Run(async() =>
                {
                    SchemaCompareOpenScmpOperation operation = null;

                    try
                    {
                        operation = new SchemaCompareOpenScmpOperation(parameters);
                        operation.Execute(TaskExecutionMode.Execute);

                        await requestContext.SendResult(operation.Result);
                    }
                    catch (Exception e)
                    {
                        await requestContext.SendResult(new SchemaCompareOpenScmpResult()
                        {
                            Success      = false,
                            ErrorMessage = operation == null ? e.Message : operation.ErrorMessage,
                        });
                    }
                });
            }
            catch (Exception e)
            {
                await requestContext.SendError(e);
            }
        }
Example #30
0
 /// <summary>
 /// Handles schema compare cancel request
 /// </summary>
 /// <returns></returns>
 public async Task HandleSchemaCompareCancelRequest(SchemaCompareCancelParams parameters, RequestContext <ResultStatus> requestContext)
 {
     try
     {
         Action cancelAction = null;
         if (currentComparisonCancellationAction.Value.TryRemove(parameters.OperationId, out cancelAction))
         {
             if (cancelAction != null)
             {
                 cancelAction.Invoke();
                 await requestContext.SendResult(new ResultStatus()
                 {
                     Success      = true,
                     ErrorMessage = null
                 });
             }
         }
         else
         {
             await requestContext.SendResult(new ResultStatus()
             {
                 Success      = false,
                 ErrorMessage = SR.SchemaCompareSessionNotFound
             });
         }
     }
     catch (Exception e)
     {
         await requestContext.SendError(e);
     }
 }
Example #31
0
            /// <summary>
            /// Adds a procedure that can be called by remote peer to the scene.
            /// </summary>
            /// <param name="route"></param>
            /// <param name="handler"></param>
            /// <param name="ordered">True if the message should be alwayse receive in order, false otherwise.</param>
            /// <remarks>
            /// The procedure is added to the scene to which this service is attached.
            /// </remarks>
            public void AddProcedure(string route, Func<RequestContext<IScenePeer>, Task> handler, bool ordered)
            {
                this._scene.AddRoute(route, p =>
                {
                    var buffer = new byte[2];
                    p.Stream.Read(buffer, 0, 2);
                    var id = BitConverter.ToUInt16(buffer, 0);
                    var cts = new CancellationTokenSource();
                    var ctx = new RequestContext<IScenePeer>(p.Connection, _scene, id, ordered, new SubStream(p.Stream, false), cts.Token);
                    var identifier = System.Tuple.Create(p.Connection.Id, id);
                    if (_runningRequests.TryAdd(identifier, cts))
                    {
                        handler.InvokeWrapping(ctx).ContinueWith(t =>
                        {
                            _runningRequests.TryRemove(identifier, out cts);
                            if (t.Status == TaskStatus.RanToCompletion)
                            {
                                ctx.SendCompleted();
                            }
                            else if (t.Status == TaskStatus.Faulted)
                            {
                                var errorSent = false;

                                var ex = t.Exception.InnerExceptions.OfType<ClientException>();
                                if (ex.Any())
                                {
                                    ctx.SendError(string.Join("|", ex.Select(e => e.Message).ToArray()));
                                    errorSent = true;
                                }
                                if (t.Exception.InnerExceptions.Any(e => !(e is ClientException)))
                                {
                                    string errorMessage = string.Format("An error occured while executing procedure '{0}'.", route);
                                    if (!errorSent)
                                    {
                                        var errorId = Guid.NewGuid().ToString("N");
                                        ctx.SendError(string.Format("An exception occurred on the remote peer. Error {0}.", errorId));

                                        errorMessage = string.Format("Error {0}. ", errorId) + errorMessage;
                                    }

                                    _scene.DependencyResolver.Resolve<ILogger>().Log(LogLevel.Error, "rpc.server", errorMessage, t.Exception);

                                }

                            }
                        });
                    }
                }, new Dictionary<string, string> { { RpcClientPlugin.PluginName, RpcClientPlugin.Version } });
            }
            /// <summary>
            /// Adds a procedure that can be called by remote peer to the scene.
            /// </summary>
            /// <param name="route"></param>
            /// <param name="handler"></param>
            /// <param name="ordered">True if the message should be alwayse receive in order, false otherwise.</param>
            /// <remarks>
            /// The procedure is added to the scene to which this service is attached.
            /// </remarks>
            public void AddProcedure(string route, Func<RequestContext<IScenePeer>, Task> handler, bool ordered)
            {
                this._scene.AddRoute(route, p =>
                {
                    var buffer = new byte[2];
                    p.Stream.Read(buffer, 0, 2);
                    var id = BitConverter.ToUInt16(buffer, 0);
                    var cts = new CancellationTokenSource();
                    var ctx = new RequestContext<IScenePeer>(p.Connection, _scene, id, ordered,cts.Token);
                    if (_runningRequests.TryAdd(id, cts))
                    {
                        handler(ctx).ContinueWith(t =>
                        {
                            _runningRequests.TryRemove(id, out cts);
                            if (t.IsCompleted)
                            {
                                ctx.SendCompleted();
                            }
                            else
                            {
								_scene.resolver.GetComponent<ILogger>().Log(Stormancer.Diagnostics.LogLevel.Error, _scene.Id, "failed to create procedure");
                                var ex = t.Exception.InnerExceptions.OfType<ClientException>();
                                if (ex.Any())
                                {
                                    ctx.SendError(string.Join("|", ex.Select(e => e.Message).ToArray()));
                                }
                            }

                        });

                    }
                }, new Dictionary<string, string> { { "stormancer.plugins.rpc", "1.0.0" } });
				_scene.resolver.GetComponent<ILogger>().Log(Stormancer.Diagnostics.LogLevel.Trace, _scene.Id, "Procedure succesfully created");
            }