Example #1
0
        public IntegrationTestsContext()
        {
            bool lockTaken = false;

            Monitor.Enter(_lockObject, ref lockTaken);
            try
            {
                if (!isRegistered)
                {
                    ConventionPackDefault.Register();
                    isRegistered = true;
                }
            }
            finally
            {
                if (lockTaken)
                {
                    Monitor.Exit(_lockObject);
                }
            }

            MongoDatabaseOptions = new DatabaseOptions
            {
                ConnectionString = "mongodb://localhost:27017",
                ConnectionType   = ConnectionType.MongoDB,
                Datasource       = GenerateUniqueDatasourceName()
            };

            CreateSomeDummyData();
        }
Example #2
0
        public static IDatabaseOptionsBuilder AddDatabaseOptions(
            this IServiceCollection services,
            IConfiguration configuration)
        {
            services.Configure <DatabaseOptions>(configuration.GetSection("DatabaseOptions"));
            var databaseOptions        = configuration.GetSection("DatabaseOptions").Get <DatabaseOptions>();
            var databaseOptionsBuilder = new DatabaseOptionsBuilder(services, configuration, databaseOptions);

            services.AddSingleton(databaseOptions);
            if (databaseOptions.ConnectionType == ConnectionType.MongoDB)
            {
                ConventionPackDefault.Register();
                services.AddSingleton <MongoConnection>();
            }
            return(databaseOptionsBuilder);
        }
        public static void AddServiceManagement(this IServiceCollection services, IConfiguration configuration)
        {
            services.Configure <DatabaseOptions>(configuration.GetSection("DatabaseOptions"));
            var databaseOptions = configuration.GetSection("DatabaseOptions").Get <DatabaseOptions>();

            services.Configure <ServiceManagementOptions>(configuration.GetSection("ServiceManagementOptions"));
            services.Configure <CentralizedLogOptions>(configuration.GetSection("CentralizedLogOptions"));

            services.AddSingleton(databaseOptions);
            if (databaseOptions.ConnectionType == ConnectionType.MongoDB)
            {
                ConventionPackDefault.Register();
                services.AddSingleton <MongoConnection>();
                services.AddSingleton <IServiceRepository, ServiceMongoRepository>();
                services.AddSingleton <ILogEventRepository, LogEventMongoRepository>();
                services.AddSingleton <IMonitorCounterRepository, MonitorCounterMongoRepository>();
                services.AddSingleton <IMonitorHardwareReportRepository, MonitorHardwareReportMongoRepository>();
                services.AddSingleton <IMonitorHttpReportRepository, MonitorHttpReportMongoRepository>();
            }

            if (databaseOptions.ConnectionType == ConnectionType.SQLServer ||
                databaseOptions.ConnectionType == ConnectionType.PostgreSQL ||
                databaseOptions.ConnectionType == ConnectionType.MySQL)
            {
                services.AddTransient <LetPortalServiceManagementDbContext>();
                services.AddTransient <IServiceRepository, ServiceEFRepository>();
                services.AddTransient <ILogEventRepository, LogEventEFRepository>();
                services.AddTransient <IMonitorCounterRepository, MonitorCounterEFRepository>();
                services.AddTransient <IMonitorHardwareReportRepository, MonitorHardwareReportEFRepository>();
                services.AddTransient <IMonitorHttpReportRepository, MonitorHttpReportEFRepository>();
            }

            services.AddTransient <IServiceManagementProvider, ServiceManagamentProvider>();
            services.AddTransient <IMonitorServiceReportProvider, MonitorServiceReportProvider>();
            services.AddTransient <ILogEventProvider, LogEventProvider>();
            services.AddTransient <IMonitorProvider, MonitorProvider>();

            services.AddHostedService <CheckingLostServicesBackgroundTask>();
            services.AddHostedService <CheckingShutdownServicesBackgroundTask>();
            services.AddHostedService <GatherAllHardwareCounterServicesBackgroundTask>();
        }
        public static ILetPortalBuilder ActAsServiceManagement(
            this IServiceCollection serviceCollection,
            IConfiguration configuration,
            Action <LetPortalOptions> action = null)
        {
            var serviceOptions   = configuration.GetSection("ServiceOptions").Get <ServiceOptions>();
            var letPortalOptions = new LetPortalOptions();

            if (action != null)
            {
                action.Invoke(letPortalOptions);
            }
            var corsOptions = configuration.GetSection("CorsPortalOptions").Get <Core.Configurations.CorsPortalOptions>();

            var builder = new LetPortalBuilder(
                serviceCollection,
                configuration,
                letPortalOptions,
                corsOptions,
                serviceOptions);

            if (letPortalOptions.EnableDatabaseConnection)
            {
                builder.Services.Configure <DatabaseOptions>(configuration.GetSection("DatabaseOptions"));
                var databaseOptions = configuration.GetSection("DatabaseOptions").Get <DatabaseOptions>();
                builder.Services.AddSingleton(databaseOptions);
                builder.SetConnectionType(databaseOptions.ConnectionType);
                if (databaseOptions.ConnectionType == ConnectionType.MongoDB)
                {
                    ConventionPackDefault.Register();
                    builder.Services.AddSingleton <MongoConnection>();
                }
            }

            if (letPortalOptions.EnableMicroservices)
            {
                builder.Services.Configure <ServiceOptions>(configuration.GetSection("ServiceOptions"));
                builder.Services.AddSingleton <IServiceContext, InternalServiceContext>();
            }

            if (letPortalOptions.EnableServiceMonitor)
            {
                builder.Services.Configure <MonitorOptions>(configuration.GetSection("MonitorOptions"));
                builder.Services.AddSingleton <IMonitorHealthCheck, MonitorHealthCheck>();
                var monitorOption = configuration.GetSection("MonitorOptions").Get <MonitorOptions>();
                if (monitorOption.Enable)
                {
                    if (monitorOption.NotifyOptions.Enable)
                    {
                        builder.Services.Configure <HealthCheckPublisherOptions>(opts =>
                        {
                            opts.Delay = TimeSpan.FromSeconds(monitorOption.NotifyOptions.Delay);
                        });

                        builder.Services.AddSingleton <IHealthCheckPublisher, LetPortalMonitorHealthCheckPublisher>();
                    }
                    builder.SetHealthCheckBuilder(builder.Services.AddHealthChecks().AddCheck <LetPortalMonitorHealthCheck>(Constants.LetPortalHealthCheck));
                }
            }

            if (letPortalOptions.EnableSerilog)
            {
                builder.Services.Configure <LoggerOptions>(configuration.GetSection("LoggerOptions"));
                Log.Logger = new LoggerConfiguration()
                             .ReadFrom.Configuration(configuration)
                             .Enrich.WithProperty("ServiceName", serviceOptions.Name)
                             .CreateLogger();

                builder.Services.AddSingleton(Log.Logger);
                builder.Services.AddTransient(typeof(IServiceLogger <>), typeof(ServiceLogger <>));
            }

            return(builder);
        }
        public IntegrationTestsContext()
        {
            bool lockTaken = false;

            Monitor.Enter(_lockObject, ref lockTaken);
            try
            {
                if (!isRegistered)
                {
                    JObject jObject = JObject.Parse(File.ReadAllText(@"Artifacts\settings.json"));
                    intergrationTestOptions = jObject.ToObject <IntergrationTestOptions>();

                    if (AllowMongoDB)
                    {
                        ConventionPackDefault.Register();
                        MongoDbRegistry.RegisterEntities();
                    }

                    isRegistered = true;
                }
            }
            finally
            {
                if (lockTaken)
                {
                    Monitor.Exit(_lockObject);
                }
            }

            if (AllowMongoDB)
            {
                MongoDatabaseConenction = new DatabaseConnection
                {
                    Id                     = DataUtil.GenerateUniqueId(),
                    DisplayName            = "Test Database",
                    Name                   = "testdatabase",
                    TimeSpan               = DateTime.UtcNow.Ticks,
                    ConnectionString       = "mongodb://localhost:27017",
                    DatabaseConnectionType = "mongodb",
                    DataSource             = GenerateUniqueDatasourceName()
                };
                DatabaseConnection mongoOptions = intergrationTestOptions.DatabasesList.First(a => a.DatabaseConnectionType.ToEnum <ConnectionType>(true) == ConnectionType.MongoDB);
                MongoDatabaseConenction.ConnectionString = mongoOptions.ConnectionString;
            }

            if (AllowSQLServer)
            {
                string sqlDatasourceName = GenerateUniqueDatasourceName();
                SqlServerDatabaseConnection = new DatabaseConnection
                {
                    Id                     = DataUtil.GenerateUniqueId(),
                    DisplayName            = "Test Database",
                    Name                   = "testdatabase",
                    TimeSpan               = DateTime.UtcNow.Ticks,
                    ConnectionString       = "Server=.;Database=" + sqlDatasourceName + ";User Id=sa;Password = 123456;",
                    DatabaseConnectionType = "sqlserver",
                    DataSource             = sqlDatasourceName
                };
                DatabaseConnection sqlOptions = intergrationTestOptions.DatabasesList.First(a => a.DatabaseConnectionType.ToEnum <ConnectionType>(true) == ConnectionType.SQLServer);
                SqlServerDatabaseConnection.ConnectionString = string.Format(sqlOptions.ConnectionString, sqlDatasourceName);
            }

            if (AllowPostgreSQL)
            {
                string postgresqlDatasourceName = GenerateUniqueDatasourceName();
                PostgreSqlDatabaseConnection = new DatabaseConnection
                {
                    Id                     = DataUtil.GenerateUniqueId(),
                    DisplayName            = "Test Database",
                    Name                   = "testdatabase",
                    TimeSpan               = DateTime.UtcNow.Ticks,
                    ConnectionString       = "Host=localhost;Port=5432;Database=" + postgresqlDatasourceName + ";Username=postgres;Password=123456",
                    DatabaseConnectionType = "postgresql",
                    DataSource             = postgresqlDatasourceName
                };
                DatabaseConnection postgreOptions = intergrationTestOptions.DatabasesList.First(a => a.DatabaseConnectionType.ToEnum <ConnectionType>(true) == ConnectionType.PostgreSQL);
                PostgreSqlDatabaseConnection.ConnectionString = string.Format(postgreOptions.ConnectionString, postgresqlDatasourceName);
            }

            if (AllowMySQL)
            {
                string mysqlDatasourceName = GenerateUniqueDatasourceName();
                MySqlDatabaseConnection = new DatabaseConnection
                {
                    Id                     = DataUtil.GenerateUniqueId(),
                    DisplayName            = "Test Database",
                    Name                   = "testdatabase",
                    TimeSpan               = DateTime.UtcNow.Ticks,
                    ConnectionString       = "Host=localhost;Port=5432;Database=" + mysqlDatasourceName + ";Username=postgres;Password=123456",
                    DatabaseConnectionType = "mysql",
                    DataSource             = mysqlDatasourceName
                };
                DatabaseConnection mysqlOptions = intergrationTestOptions.DatabasesList.First(a => a.DatabaseConnectionType.ToEnum <ConnectionType>(true) == ConnectionType.MySQL);
                MySqlDatabaseConnection.ConnectionString = string.Format(mysqlOptions.ConnectionString, mysqlDatasourceName);
            }

            CreateSomeDummyData();
        }
Example #6
0
        private async Task OnExecuteAsync()
        {
            var services    = new ServiceCollection();
            var toolsOption = GetToolsOptions(ConfigFilePath);

            ConventionPackDefault.Register();
            MongoDbRegistry.RegisterEntities();
            var dbType         = DatabseType.ToEnum <ConnectionType>(true);
            var databaseOption = new DatabaseOptions
            {
                ConnectionString = !string.IsNullOrEmpty(Connection)
                    ? Connection : GetDefaultConnectionString(dbType, App, toolsOption),
                ConnectionType = dbType
            };

            var runningCommand = GetAvailableCommands().FirstOrDefault(a => a.CommandName.ToLower() == Command.ToLower());

            if (runningCommand != null)
            {
                ToolsContext toolsContext       = null;
                var          storingConnections = toolsOption.GetByDatabaseType(dbType);
                switch (dbType)
                {
                case ConnectionType.MongoDB:
                    var mongoConnection        = new MongoConnection(databaseOption);
                    var mongoVersionContext    = new MongoVersionContext(databaseOption);
                    var versionMongoRepository = new VersionMongoRepository(mongoConnection);
                    mongoVersionContext.ConnectionType           = ConnectionType.MongoDB;
                    mongoVersionContext.DatabaseOptions          = databaseOption;
                    mongoVersionContext.ServiceManagementOptions = storingConnections.ServiceManagementConnection;
                    mongoVersionContext.IdentityDbOptions        = storingConnections.IdentityConnection;
                    var latestVersion = versionMongoRepository.GetAsQueryable().ToList().LastOrDefault();

                    var allVersions = Enumerable.Empty <IVersion>();
                    IServiceProvider serviceProvider = null;
                    if (IsPortal())
                    {
                        RegisterServicesForPortal(services, databaseOption);
                        serviceProvider = services.BuildServiceProvider();
                        allVersions     = Scanner.GetAllPortalVersions(serviceProvider);
                    }
                    else if (IsIdentity())
                    {
                        RegisterServicesForIdentity(services, databaseOption);
                        serviceProvider = services.BuildServiceProvider();
                        allVersions     = Scanner.GetAllIdentityVersions(serviceProvider);
                    }

                    toolsContext = new ToolsContext
                    {
                        LatestVersion     = latestVersion,
                        VersionContext    = mongoVersionContext,
                        VersionNumber     = VersionNumber,
                        Versions          = allVersions,
                        VersionRepository = versionMongoRepository,
                        PatchesFolder     = PatchesFolder,
                        AllowPatch        = !string.IsNullOrEmpty(PatchesFolder),
                        Services          = serviceProvider,
                        Arguments         = CombineArguments()
                    };
                    break;

                case ConnectionType.PostgreSQL:
                case ConnectionType.MySQL:
                case ConnectionType.SQLServer:

                    if (IsPortal())
                    {
#pragma warning disable CA2000 // Dispose objects before losing scope
                        var letportalContext = new PortalDbContext(databaseOption);
#pragma warning restore CA2000 // Dispose objects before losing scope
                        letportalContext.Database.EnsureCreated();

#pragma warning disable CA2000 // Dispose objects before losing scope
                        var letportalContextForRepo = new PortalDbContext(databaseOption);
#pragma warning restore CA2000 // Dispose objects before losing scope
                        var sqlEFVersionContext = new EFVersionContext(letportalContext)
                        {
                            ConnectionType  = dbType,
                            DatabaseOptions = databaseOption
                        };
                        var portalVersionRepository = new VersionEFRepository(letportalContextForRepo);
                        var latestVersionEF         = portalVersionRepository.GetAsQueryable().ToList().LastOrDefault();
                        sqlEFVersionContext.ServiceManagementOptions = storingConnections.ServiceManagementConnection;
                        sqlEFVersionContext.IdentityDbOptions        = storingConnections.IdentityConnection;

                        RegisterServicesForPortal(services, databaseOption);
                        var sqlServiceProvider = services.BuildServiceProvider();
                        IEnumerable <IVersion> allSQLVersions = Scanner.GetAllPortalVersions(sqlServiceProvider);
                        toolsContext = new ToolsContext
                        {
                            LatestVersion     = latestVersionEF,
                            VersionContext    = sqlEFVersionContext,
                            VersionNumber     = VersionNumber,
                            Versions          = allSQLVersions,
                            VersionRepository = portalVersionRepository,
                            Services          = sqlServiceProvider,
                            AllowPatch        = !string.IsNullOrEmpty(PatchesFolder),
                            Arguments         = CombineArguments()
                        };
                    }
                    else if (IsIdentity())
                    {
#pragma warning disable CA2000 // Dispose objects before losing scope
                        var letIdentityContext = new IdentityDbContext(databaseOption);
#pragma warning restore CA2000 // Dispose objects before losing scope
                        letIdentityContext.Database.EnsureCreated();

#pragma warning disable CA2000 // Dispose objects before losing scope
                        var letportalContextForRepo = new IdentityDbContext(databaseOption);
#pragma warning restore CA2000 // Dispose objects before losing scope
                        var sqlEFVersionContext = new EFVersionContext(letportalContextForRepo)
                        {
                            ConnectionType  = dbType,
                            DatabaseOptions = databaseOption
                        };
                        var portalVersionRepository = new VersionEFRepository(letportalContextForRepo);
                        var latestVersionEF         = portalVersionRepository.GetAsQueryable().ToList().LastOrDefault();
                        sqlEFVersionContext.ServiceManagementOptions = storingConnections.ServiceManagementConnection;
                        sqlEFVersionContext.IdentityDbOptions        = storingConnections.IdentityConnection;

                        RegisterServicesForIdentity(services, databaseOption);
                        var sqlServiceProvider = services.BuildServiceProvider();
                        IEnumerable <IVersion> allSQLVersions = Scanner.GetAllIdentityVersions(sqlServiceProvider);

                        toolsContext = new ToolsContext
                        {
                            LatestVersion     = latestVersionEF,
                            VersionContext    = sqlEFVersionContext,
                            VersionNumber     = VersionNumber,
                            Versions          = allSQLVersions,
                            VersionRepository = portalVersionRepository,
                            AllowPatch        = !string.IsNullOrEmpty(PatchesFolder),
                            Services          = sqlServiceProvider
                        };
                    }

                    break;
                }

                if (toolsContext != null)
                {
                    Console.WriteLine("");
                    await runningCommand.RunAsync(toolsContext);

                    toolsContext.Dispose();
                }

                Console.WriteLine("-----------------------++++++DONE++++++-------------------------");
            }
            else
            {
                Console.WriteLine("Oops! We don't find any matching command to execute. If you don't know how to run, please type '--help'");
            }

            Console.ReadLine();
        }
Example #7
0
 public static void AddMongoConfig(this IServiceCollection serviceCollection)
 {
     ConventionPackDefault.Register();
 }
Example #8
0
        private async Task OnExecuteAsync()
        {
            var toolsOption = GetToolsOptions(ConfigFilePath);

            LoadPlugins(toolsOption.RequiredPlugins);
            LoadPatchs(toolsOption.RequiredPatchs);
            toolPlugins     = GetInstalledPlugins(toolsOption.RequiredPlugins);
            portalPatches   = GetInstalledPortalPatchs(toolsOption.RequiredPatchs);
            identityPatches = GetInstalledIdentityPatchs(toolsOption.RequiredPatchs);
            bool isRunningPlugin = !IsPortal() && !IsIdentity();

            // Check if run with mode patch
            bool isPatchRunning = false;

            if (!isRunningPlugin && !string.IsNullOrEmpty(PatchName) && Command != "install")
            {
                throw new NotSupportedException("Sorry, we only support -pn with install command.");
            }
            else if (!isRunningPlugin && !string.IsNullOrEmpty(PatchName) && Command == "install")
            {
                isPatchRunning = true;
            }


            IToolPlugin toolPlugin = isRunningPlugin ? toolPlugins.First(a => a.AppName == App) : null;
            var         services   = new ServiceCollection();

            ConventionPackDefault.Register();
            MongoDbRegistry.RegisterEntities();
            var dbType         = DatabseType.ToEnum <ConnectionType>(true);
            var databaseOption =
                new DatabaseOptions
            {
                ConnectionString = !string.IsNullOrEmpty(Connection)
                        ? Connection
                            : (isRunningPlugin ?
                               toolPlugin.LoadDefaultDatabase().ConnectionString
                                    : GetDefaultConnectionString(dbType, App, toolsOption)),
                ConnectionType = dbType
            };

            var runningCommand = GetAvailableCommands().FirstOrDefault(a => a.CommandName.ToLower() == Command.ToLower());

            if (runningCommand != null)
            {
                ToolsContext toolsContext       = null;
                var          storingConnections = toolsOption.GetByDatabaseType(dbType);
                switch (dbType)
                {
                case ConnectionType.MongoDB:
                    var mongoConnection        = new MongoConnection(databaseOption);
                    var mongoVersionContext    = new MongoVersionContext(databaseOption);
                    var versionMongoRepository = new VersionMongoRepository(mongoConnection);
                    var patchMongoRepository   = new PatchVersionMongoRepository(mongoConnection);
                    mongoVersionContext.ConnectionType           = ConnectionType.MongoDB;
                    mongoVersionContext.DatabaseOptions          = databaseOption;
                    mongoVersionContext.PortalDatabaseOptions    = toolsOption.MongoStoringConnections.PortalConnection;
                    mongoVersionContext.ServiceManagementOptions = storingConnections.ServiceManagementConnection;
                    mongoVersionContext.IdentityDbOptions        = storingConnections.IdentityConnection;
                    var latestVersion = await versionMongoRepository.GetLastestVersion(App);

                    var allVersions = Enumerable.Empty <IVersion>();
                    IServiceProvider          serviceProvider          = null;
                    PatchVersion              latestPatchVersion       = null;
                    IPortalPatchFeatureTool   portalPatchFeatureTool   = null;
                    IIdentityPatchFeatureTool identityPatchFeatureTool = null;
                    if (IsPortal())
                    {
                        RegisterServicesForPortal(services, databaseOption);
                        if (isPatchRunning)
                        {
                            latestPatchVersion = await patchMongoRepository.GetLatestAsync(App, PatchName);

                            portalPatchFeatureTool = portalPatches.First(a => a.PatchName == PatchName);
                            portalPatchFeatureTool.RegisterServices(services, configuration);
                        }
                        serviceProvider = services.BuildServiceProvider();
                        allVersions     = Scanner.GetAllPortalVersions(serviceProvider);
                    }
                    else if (IsIdentity())
                    {
                        RegisterServicesForIdentity(services, databaseOption);
                        if (isPatchRunning)
                        {
                            latestPatchVersion = await patchMongoRepository.GetLatestAsync(App, PatchName);

                            identityPatchFeatureTool = identityPatches.First(a => a.PatchName == PatchName);
                            identityPatchFeatureTool.RegisterServices(services, configuration);
                        }
                        serviceProvider = services.BuildServiceProvider();
                        allVersions     = Scanner.GetAllIdentityVersions(serviceProvider);
                    }
                    else
                    {
                        var foundPlugin = toolPlugins.First(a => a.AppName.Equals(App, StringComparison.OrdinalIgnoreCase));
                        foundPlugin.RegisterServices(services, configuration);
                        serviceProvider = services.BuildServiceProvider();
                        allVersions     = foundPlugin.GetAllVersions(serviceProvider);
                    }
                    toolsContext = new ToolsContext
                    {
                        LatestVersion          = latestVersion,
                        LatestPatchVersion     = latestPatchVersion,
                        VersionContext         = mongoVersionContext,
                        VersionNumber          = VersionNumber,
                        Versions               = allVersions,
                        VersionRepository      = versionMongoRepository,
                        PatchesFolder          = PatchesFolder,
                        AllowPatch             = !string.IsNullOrEmpty(PatchesFolder),
                        Services               = serviceProvider,
                        PatchVersionRepository = patchMongoRepository,
                        CurrentPatchPortal     = portalPatchFeatureTool,
                        CurrentIdentityPortal  = identityPatchFeatureTool,
                        Arguments              = CombineArguments()
                    };

                    break;

                case ConnectionType.PostgreSQL:
                case ConnectionType.MySQL:
                case ConnectionType.SQLServer:

#pragma warning disable CA2000 // Dispose objects before losing scope
                    var letportalContext = new SaturnFullContext(databaseOption);
#pragma warning restore CA2000 // Dispose objects before losing scope
                    letportalContext.Database.EnsureCreated();

#pragma warning disable CA2000 // Dispose objects before losing scope
                    var letportalContextForRepo = new SaturnFullContext(databaseOption);
#pragma warning restore CA2000 // Dispose objects before losing scope
                    var sqlEFVersionContext = new EFVersionContext(letportalContext)
                    {
                        ConnectionType  = dbType,
                        DatabaseOptions = databaseOption
                    };
                    var patchEFRepository       = new PatchVersionEFRepository(letportalContextForRepo);
                    var portalVersionRepository = new VersionEFRepository(letportalContextForRepo);
                    var latestVersionEF         = await portalVersionRepository.GetLastestVersion(App);

                    sqlEFVersionContext.ServiceManagementOptions = storingConnections.ServiceManagementConnection;
                    sqlEFVersionContext.IdentityDbOptions        = storingConnections.IdentityConnection;
                    sqlEFVersionContext.PortalDatabaseOptions    = storingConnections.PortalConnection;
                    var sqlAllVersions = Enumerable.Empty <IVersion>();
                    IServiceProvider          sqlServiceProvider         = null;
                    PatchVersion              latestEFPatchVersion       = null;
                    IPortalPatchFeatureTool   portalEFPatchFeatureTool   = null;
                    IIdentityPatchFeatureTool identityEFPatchFeatureTool = null;

                    if (IsPortal())
                    {
                        RegisterServicesForPortal(services, databaseOption);
                        if (isPatchRunning)
                        {
                            latestEFPatchVersion = await patchEFRepository.GetLatestAsync(App, PatchName);

                            portalEFPatchFeatureTool = portalPatches.First(a => a.PatchName == PatchName);
                            portalEFPatchFeatureTool.RegisterServices(services, configuration);
                        }
                        sqlServiceProvider = services.BuildServiceProvider();
                        sqlAllVersions     = Scanner.GetAllPortalVersions(sqlServiceProvider);
                    }
                    else if (IsIdentity())
                    {
                        RegisterServicesForIdentity(services, databaseOption);
                        if (isPatchRunning)
                        {
                            latestEFPatchVersion = await patchEFRepository.GetLatestAsync(App, PatchName);

                            identityEFPatchFeatureTool = identityPatches.First(a => a.PatchName == PatchName);
                            identityEFPatchFeatureTool.RegisterServices(services, configuration);
                        }
                        sqlServiceProvider = services.BuildServiceProvider();
                        sqlAllVersions     = Scanner.GetAllIdentityVersions(sqlServiceProvider);
                    }
                    else
                    {
                        var foundPlugin = toolPlugins.First(a => a.AppName.Equals(App, StringComparison.OrdinalIgnoreCase));
                        foundPlugin.RegisterServices(services, configuration);
                        sqlServiceProvider = services.BuildServiceProvider();
                        sqlAllVersions     = foundPlugin.GetAllVersions(sqlServiceProvider);
                    }
                    toolsContext = new ToolsContext
                    {
                        LatestVersion          = latestVersionEF,
                        VersionContext         = sqlEFVersionContext,
                        VersionNumber          = VersionNumber,
                        Versions               = sqlAllVersions,
                        VersionRepository      = portalVersionRepository,
                        AllowPatch             = !string.IsNullOrEmpty(PatchesFolder),
                        Services               = sqlServiceProvider,
                        Arguments              = CombineArguments(),
                        PatchesFolder          = PatchesFolder,
                        PatchVersionRepository = patchEFRepository,
                        CurrentPatchPortal     = portalEFPatchFeatureTool,
                        CurrentIdentityPortal  = identityEFPatchFeatureTool
                    };

                    break;
                }

                if (toolsContext != null)
                {
                    Console.WriteLine("");
                    await runningCommand.RunAsync(toolsContext);

                    toolsContext.Dispose();
                }

                Console.WriteLine("-----------------------++++++DONE++++++-------------------------");
            }
            else
            {
                Console.WriteLine("Oops! We don't find any matching command to execute. If you don't know how to run, please type '--help'");
            }

            Console.ReadLine();
        }