From 9de39242863e68e6856618b05ebe8127ce2a6c87 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Thu, 11 Oct 2018 21:37:05 +0000 Subject: [PATCH] --- devdocs/todo.txt | 2 +- devdocs/tools.txt | 13 +++++---- server/AyaNova/biz/JobsBiz.cs | 14 +++++++++- server/AyaNova/biz/TrialBiz.cs | 2 +- server/AyaNova/util/Seeder.cs | 50 ++++++++++++++++++++++------------ 5 files changed, 56 insertions(+), 25 deletions(-) diff --git a/devdocs/todo.txt b/devdocs/todo.txt index fe8baae3..a0baf2ad 100644 --- a/devdocs/todo.txt +++ b/devdocs/todo.txt @@ -39,7 +39,7 @@ IMMEDIATE ITEMS: - Seeder should be changed to log job info for each step - Should server show uptime? - +- Log route: Add a route to download *all* log files as a single zip archive which will make life much easier for analysis diff --git a/devdocs/tools.txt b/devdocs/tools.txt index d8498d6b..6741dc49 100644 --- a/devdocs/tools.txt +++ b/devdocs/tools.txt @@ -92,9 +92,9 @@ https://risingstars.js.org/2017/en/ - Run new image - sudo docker-compose up -d - - Restart NGINX container as it seems to lose it's mind when the AyaNova container is restarted (502 BAD GATEWAY error) - - from /docker/letsencrypt-docker-nginx/src/production run sudo docker-compose up -d - - Or just use the restartnginx.sh script in xfer at the server + - Restart NGINX container (IF NECESSARY) as it seems to sometimes lose it's mind when the AyaNova container is restarted (502 BAD GATEWAY error) + - use the restartnginx.sh script in xfer at the server + - or from /docker/letsencrypt-docker-nginx/src/production run sudo docker-compose up -d - Test - If 502 BAD GATEWAY then AyaNova server is not up so the NGINX config bombs because it's proxying to it. @@ -107,10 +107,13 @@ https://risingstars.js.org/2017/en/ - Stop container if not already stopped: execute sudo docker-compose down - Edit docker-compose.yml, uncomment line with erase db environment variable and re-start to erase db - sudo docker-compose up -d - - Stop the container again, use nano to edit docker-compose.yml and re-comment the erase db evenironment variable + - Stop the container again, use nano to edit docker-compose.yml and re-comment the erase db environment variable - Start the container again with the up command - FETCH TEST KEY: - - Go into the api explorer, authenticate then select the POST to license route (not the TRIAL one), this will fetch a test key and install it + - Go into the api explorer, authenticate then + - select the POST to license Trial route first { "registeredTo": "TestCo", "emailAddress": "cardjohn@ayanova.com"} + - This seems to setup the db to accept a trial key when fetching the regular key next + - select the POST to license route (not the TRIAL one), this will fetch a test key and install it - SEED DB: - Go to trial route and pick seed level (HUGE for proper testing) and activate - NOTE: as of today 2018-10-9 it takes 8 minutes at the Devops server to generate the HUGE dataset diff --git a/server/AyaNova/biz/JobsBiz.cs b/server/AyaNova/biz/JobsBiz.cs index a9ee0188..c72b5c3a 100644 --- a/server/AyaNova/biz/JobsBiz.cs +++ b/server/AyaNova/biz/JobsBiz.cs @@ -228,6 +228,16 @@ namespace AyaNova.Biz + /// + /// Make a log entry for a job + /// (no context version) + /// + /// + /// + internal static OpsJobLog LogJob(Guid jobId, string statusText) + { + return LogJob(jobId, statusText); + } /// /// Make a log entry for a job @@ -235,8 +245,10 @@ namespace AyaNova.Biz /// /// /// - internal static OpsJobLog LogJob(Guid jobId, string statusText, AyContext ct) + internal static OpsJobLog LogJob(Guid jobId, string statusText, AyContext ct = null) { + if (ct == null) + ct = ServiceProviderProvider.DBContext; if (string.IsNullOrWhiteSpace(statusText)) statusText = "No status provided"; OpsJobLog newObj = new OpsJobLog(); diff --git a/server/AyaNova/biz/TrialBiz.cs b/server/AyaNova/biz/TrialBiz.cs index de15f6e3..f3faf618 100644 --- a/server/AyaNova/biz/TrialBiz.cs +++ b/server/AyaNova/biz/TrialBiz.cs @@ -70,7 +70,7 @@ namespace AyaNova.Biz //Get the import filename from the jsondata JObject jobData = JObject.Parse(job.JobInfo); var seedLevel = (Seeder.SeedLevel)jobData["seedLevel"].Value(); - Seeder.SeedDatabase(seedLevel); + Seeder.SeedDatabase(seedLevel, job.GId); JobsBiz.LogJob(job.GId, "Finished.", ct); JobsBiz.UpdateJobStatus(job.GId, JobStatus.Completed, ct); await Task.CompletedTask; diff --git a/server/AyaNova/util/Seeder.cs b/server/AyaNova/util/Seeder.cs index 11e4ebd2..8a5b523b 100644 --- a/server/AyaNova/util/Seeder.cs +++ b/server/AyaNova/util/Seeder.cs @@ -14,15 +14,22 @@ namespace AyaNova.Util public static class Seeder { - public enum SeedLevel { SmallOneManShopTrialDataSet, MediumLocalServiceCompanyTrialDataSet, LargeCorporateMultiRegionalTrialDataSet, HugeForLoadTest }; ////////////////////////////////////////////////////// //Seed database for trial and testing purposes // + public static void SeedDatabase(SeedLevel slevel) { + SeedDatabase(slevel, Guid.Empty); + } + + public static void SeedDatabase(SeedLevel slevel, Guid JobId) + { + bool LogJob = JobId != Guid.Empty; + ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger("Seeder"); ApiServerState apiServerState = (ApiServerState)ServiceProviderProvider.Provider.GetService(typeof(ApiServerState)); @@ -36,15 +43,16 @@ namespace AyaNova.Util try { - log.LogInformation("SEEDER: Seed data level - " + slevel.ToString()); + LogStatus(JobId, LogJob, log, $"SEEDER: Seed data level - {slevel.ToString()}"); //Only allow this in a trial database if (!AyaNova.Core.License.ActiveKey.TrialLicense) { - throw new System.NotSupportedException("This database has a registered license key and can't be seeded."); + var msg = "This database has a registered license key so it can't be seeded"; + LogStatus(JobId, LogJob, log, msg); + throw new System.NotSupportedException(msg); } - log.LogInformation("Setting server state to OpsOnly"); apiServerState.SetOpsOnly("Seeding database"); //Erase all the data except for the license, schema and the manager user @@ -123,8 +131,8 @@ namespace AyaNova.Util //this is a large corporation with multiple branches in multiple locations all in the same country //Each location has a full staff and corporate head office has an overarching staff member in charge of each location - //PERF - log.LogInformation($"Seeding 279 user(s)...."); + //PERF + LogStatus(JobId, LogJob, log, $"Seeding 279 user(s)...."); var watch = new Stopwatch(); watch.Start(); @@ -172,18 +180,17 @@ namespace AyaNova.Util //PERF watch.Stop(); - log.LogInformation($"279 Users seeded in {watch.ElapsedMilliseconds} ms"); - + LogStatus(JobId, LogJob, log, $"279 Users seeded in {watch.ElapsedMilliseconds} ms"); //5000 widgets - log.LogInformation($"Seeding 5000 Widgets...."); + LogStatus(JobId, LogJob, log, $"Seeding 5,000 Widgets...."); watch = new Stopwatch(); watch.Start(); GenSeedWidget(log, 5000); //PERF watch.Stop(); - log.LogInformation($"5k Widgets seeded in {watch.ElapsedMilliseconds} ms"); + LogStatus(JobId, LogJob, log, $"5k Widgets seeded in {watch.ElapsedMilliseconds} ms"); #endregion genlarge } break; @@ -195,7 +202,7 @@ namespace AyaNova.Util //It is acceptable for this seeding to take many hours as it would normally be used rarely //PERF - log.LogInformation($"Seeding 1,410 user(s)...."); + LogStatus(JobId, LogJob, log, $"Seeding 1,410 user(s)...."); var watch = new Stopwatch(); watch.Start(); @@ -243,27 +250,27 @@ namespace AyaNova.Util //PERF watch.Stop(); - log.LogInformation($"1,410 Users seeded in {watch.ElapsedMilliseconds} ms"); - + LogStatus(JobId, LogJob, log, $"1,410 Users seeded in {watch.ElapsedMilliseconds} ms"); //20000 widgets - log.LogInformation($"Seeding 20,000 Widgets...."); + LogStatus(JobId, LogJob, log, $"Seeding 20,000 Widgets...."); watch = new Stopwatch(); watch.Start(); GenSeedWidget(log, 20000); watch.Stop(); - log.LogInformation($"20k Widgets seeded in {watch.ElapsedMilliseconds} ms"); + LogStatus(JobId, LogJob, log, $"20k Widgets seeded in {watch.ElapsedMilliseconds} ms"); #endregion genhuge } break; } - - log.LogInformation("Seeding completed successfully"); + LogStatus(JobId, LogJob, log, "Seeding completed successfully"); } catch (Exception ex) { log.LogError(ex, "Seeder:SeedDatabase error during ops"); + if (LogJob) + JobsBiz.LogJob(JobId, $"Seeder:SeedDatabase error during ops\r\n{ex.Message}"); throw ex; } finally @@ -274,6 +281,15 @@ namespace AyaNova.Util } + //Log the status and also job if it's run via job + private static void LogStatus(Guid JobId, bool LogJob, ILogger log, string msg) + { + log.LogInformation(msg); + if (LogJob) + JobsBiz.LogJob(JobId, msg); + } + + public static long RUNNING_COUNT = 0; public static string Uniquify(string s) {