private static async Task CheckInternal() { var config = SvzConfig.GetConfig(); Console.Write("Checking REDIS... "); using (var redisConn = ConnectionMultiplexer.Connect(config.Redis)) { var db = redisConn.GetDatabase(); var guid = Guid.NewGuid().ToString("N"); var isOk = await db.StringSetAsync($"healthcheck-{guid}", "ok", TimeSpan.FromSeconds(15)); if (!isOk) { throw new Exception("Redis failed!"); } } Console.Write("OK!" + Environment.NewLine); Console.Write("Checking Postgres... "); using (var conn = new NpgsqlConnection(config.Postgres.ConnectionString)) { var psqlTestVal = await conn.QuerySingleAsync <int>("SELECT 1"); if (psqlTestVal != 1) { throw new Exception("Postgres failed!"); } } Console.Write("OK!" + Environment.NewLine); Console.Write("Checking ElasticSearch... "); var esConnection = new ConnectionSettings(new Uri(config.ElasticSearch.Url)); var esClient = new ElasticClient(esConnection); var idxList = await esClient.GetIndexAsync("*"); if (!idxList.IsValid) { throw new Exception("ElasticSearch failed!"); } Console.Write("OK!" + Environment.NewLine); }
private static async Task SetupInternal() { var config = SvzConfig.GetConfig(); using (var conn = new NpgsqlConnection(config.Postgres.ConnectionString)) { var dbExists = (await conn.QueryAsync <int>( $"SELECT 1 from pg_database WHERE datname = '{config.Postgres.Database}'")).ToList(); if (dbExists.Any()) { Ms("Dropping existing Svz database... "); await conn.ExecuteScalarAsync($"DROP DATABASE \"{config.Postgres.Database}\""); Ok(); } Ms("Creating new Svz database... "); await conn.ExecuteScalarAsync($"CREATE DATABASE \"{config.Postgres.Database}\""); Ok(); } Ms("Running migrations... "); var optBuild = new DbContextOptionsBuilder <BookDbContext>(); optBuild.UseNpgsql($"{config.Postgres.ConnectionString};Database={config.Postgres.Database};"); using (var ctx = new BookDbContext(optBuild.Options)) { await ctx.Database.MigrateAsync(); Ok(); Ms("Import books from json... "); await ImportBooks("./books.json", ctx); Ok(); } var esConnection = new ConnectionSettings(new Uri(config.ElasticSearch.Url)); var esClient = new ElasticClient(esConnection); var idxResp = await esClient.GetIndexAsync(config.ElasticSearch.Index); foreach (var item in idxResp.Indices) { Ms($"Dropping ES Index: {item.Key}... "); var resp = await esClient.DeleteIndexAsync(item.Key); if (!resp.IsValid) { throw new Exception("Error deleting ES index: " + resp.ServerError.Error); } Ok(); } Ms("Creating ES index... "); var respCreate = await esClient.CreateIndexAsync(config.ElasticSearch.Index); if (!respCreate.IsValid) { throw new Exception("Error creating ES index: " + respCreate.ServerError.Error); } Ok(); Ms("Indexing data... "); Mapper.Initialize(cfg => { cfg.CreateMap <Book, BookSearchView>(); }); var bsearch = new List <BookSearchView>(); using (var ctx = new BookDbContext(optBuild.Options)) { var blist = ctx.Books.ToList(); bsearch = Mapper.Map <List <Book>, List <BookSearchView> >(blist); } var bulkDesc = new BulkDescriptor(); bulkDesc.CreateMany(bsearch, (x, y) => x.Id(y.BookId)).Index(config.ElasticSearch.Index); var respBulk = await esClient.BulkAsync(bulkDesc); if (!respBulk.IsValid) { throw new Exception("Error indexing ES data: " + respBulk.ServerError); } Ok(); }