public bool Handle(BackgroundTask task, BackgroundTaskService.BackgroundTaskLog log)
        {
            bool res;

            try
            {
                var data = DatabaseDacPacUpdateTaskData.FromString(task.Data);
                log.LogInfo("DACPAC: " + data.DacPacName);
                var azureJobsCreds = new AzureSqlJobCredentials
                {
                    ServerName   = data.ServerName,
                    DatabaseName = data.DatabaseName,
                    Username     = data.Username,
                    Password     = data.Password
                };

                var work = Do(azureJobsCreds, log, data);
                work.Wait();
                res = work.Result;
            }
            catch (Exception ex)
            {
                log.LogError("Error during database update");
                log.LogException(ex);
                res = false;
            }
            return(res);
        }
        private async static Task <bool> Do(AzureSqlJobCredentials azureJobsCreds, BackgroundTaskService.BackgroundTaskLog log, DatabaseDacPacUpdateTaskData data)
        {
            var serviceLocator = ServiceLocatorFactory.CreateMasterSysAdmin();

            var masterTargets = new List <DatabaseTarget>
            {
                new DatabaseTarget(Settings.ChalkableSchoolDbServers.First(), Settings.MasterDbName)
            };

            log.LogInfo("Master DacPac deployment initated");

            if (!(await DeployDacPac(azureJobsCreds, data.DacPacName + "-master", data.MasterDacPacUri, masterTargets, log)))
            {
                return(false);
            }

            log.LogInfo("Preparing schools DacPac targets");

            var schoolTargets = new List <DatabaseTarget>(
                Settings.ChalkableSchoolDbServers.Select(x => new DatabaseTarget(x, Settings.SchoolTemplateDbName))
                .Concat(serviceLocator.DistrictService.GetDistricts().Select(x => new DatabaseTarget(x.ServerUrl, x.Id.ToString())))
                );

            log.LogInfo("Schools DacPac deployment initated");

            if (!(await DeployDacPac(azureJobsCreds, data.DacPacName + "-school", data.SchoolDacPacUri, schoolTargets, log)))
            {
                return(false);
            }

            log.LogInfo("Deploy success");

            return(true);
        }
Exemplo n.º 3
0
        public bool Handle(BackgroundTask task, BackgroundTaskService.BackgroundTaskLog log)
        {
            var importService = new AcademicBenchmarkImport.ImportService(log);

            importService.Import();

            return(true);
        }
Exemplo n.º 4
0
        public ImportService(BackgroundTaskService.BackgroundTaskLog log)
        {
            var admin = new User {
                Id = Guid.Empty, Login = "******", LoginInfo = new UserLoginInfo()
            };

            _sysAdminContext = new UserContext(admin, CoreRoles.SUPER_ADMIN_ROLE, null, null, null, null, null);
            Log = log;
        }
Exemplo n.º 5
0
        public bool Handle(BackgroundTask task, BackgroundTaskService.BackgroundTaskLog log)
        {
            bool res = true;

            try
            {
                var data         = task.GetData <DatabaseUpdateTaskData>();
                var sl           = ServiceLocatorFactory.CreateMasterSysAdmin();
                var districts    = sl.DistrictService.GetDistricts();
                var masterSqls   = data.Sqls.Where(x => x.RunOnMaster).ToList();
                var districtSqls = data.Sqls.Where(x => !x.RunOnMaster).ToList();

                using (var uow = new UnitOfWork(Settings.MasterConnectionString, true))
                {
                    foreach (var updateSql in masterSqls)
                    {
                        var cmd = uow.GetTextCommandWithParams(updateSql.Sql, new Dictionary <string, object>());
                        cmd.CommandTimeout = Settings.DbUpdateTimeout;
                        cmd.ExecuteNonQuery();
                    }
                    uow.Commit();
                }


                foreach (var dbServer in Settings.ChalkableSchoolDbServers)
                {
                    using (var uow = new UnitOfWork(Settings.GetSchoolTemplateConnectionString(dbServer), true))
                    {
                        foreach (var updateSql in districtSqls)
                        {
                            var cmd = uow.GetTextCommandWithParams(updateSql.Sql, new Dictionary <string, object>());
                            cmd.CommandTimeout = Settings.DbUpdateTimeout;
                            cmd.ExecuteNonQuery();
                        }
                        uow.Commit();
                    }
                }
                var runer = new AllSchoolRunner <IEnumerable <UpdateSql> >();
                if (!runer.Run(districts, districtSqls, log, ExecSql, task1 => AllSchoolRunner <IEnumerable <UpdateSql> > .TaskStatusEnum.Completed))
                {
                    res = false;
                }
            }
            catch (Exception ex)
            {
                while (ex != null)
                {
                    log.LogError("Error during database update");
                    log.LogError(ex.Message);
                    log.LogError(ex.StackTrace);
                    ex = ex.InnerException;
                }
                res = false;
            }
            return(res);
        }
Exemplo n.º 6
0
        public bool Handle(BackgroundTask task, BackgroundTaskService.BackgroundTaskLog log)
        {
            var    data    = task.GetData <ReportProcessingTaskData>();
            var    sl      = ServiceLocatorFactory.CreateSchoolLocator(data.UserContext);
            string appRoot = Environment.GetEnvironmentVariable("RoleRoot");

            data.ReportInputModel.DefaultDataPath = Path.Combine(appRoot + @"\", @"approot\");
            sl.ReportService.GenerateReportCard(data.ReportInputModel);

            return(true);
        }
Exemplo n.º 7
0
        public ImportService(Guid districtId, SisConnectionInfo connectionInfo, BackgroundTaskService.BackgroundTaskLog log)
        {
            ConnectionInfo  = connectionInfo;
            Log             = log;
            this.districtId = districtId;
            var admin = new User {
                Id = Guid.Empty, Login = "******", LoginInfo = new UserLoginInfo()
            };

            sysadminCntx = new UserContext(admin, CoreRoles.SUPER_ADMIN_ROLE, null, null, null, null, null);
        }
Exemplo n.º 8
0
        public override void HandleInternal(BackgroundTask task, District district, BackgroundTaskService.BackgroundTaskLog log)
        {
            var info = new SisConnectionInfo
            {
                SisPassword = district.SisPassword,
                SisUrl      = district.SisUrl,
                SisUserName = district.SisUserName
            };
            var importService = new ImportService(district.Id, info, log);

            importService.Resync(task.Data);
        }
Exemplo n.º 9
0
        public ImportService(Guid districtId, SisConnectionInfo connectionInfo, BackgroundTaskService.BackgroundTaskLog log, Guid taskId)
        {
            // TODO: obviously we don't want duplicate code here
            this.taskId     = taskId;
            ConnectionInfo  = connectionInfo;
            Log             = log;
            this.districtId = districtId;
            var admin = new User {
                Id = Guid.Empty, Login = "******", LoginInfo = new UserLoginInfo()
            };

            sysadminCntx = new UserContext(admin, CoreRoles.SUPER_ADMIN_ROLE, null, null, null, null, null);
        }
Exemplo n.º 10
0
        public bool Handle(BackgroundTask task, BackgroundTaskService.BackgroundTaskLog log)
        {
            var sl = ServiceLocatorFactory.CreateMasterSysAdmin();

            if (!task.DistrictRef.HasValue)
            {
                log.LogError(string.Format("attendance notification task {0} should contains school id", task.Id));
                return(false);
            }
            //var schoolSl = sl.SchoolServiceLocator(task.DistrictRef.Value, null);
            //schoolSl.AttendanceService.ProcessClassAttendance(schoolSl.Context.NowSchoolTime);
            throw new NotImplementedException();
            return(true);
        }
Exemplo n.º 11
0
        public void Test()
        {
            AzureSqlJobCredentials creds = new AzureSqlJobCredentials()
            {
                DatabaseName = "edjb0d1a0ab363747abbc2ee",
                Password     = "******",
                ServerName   = "edjb0d1a0ab363747abbc2ee.database.windows.net",
                Username     = "******"
            };

            var id = Guid.NewGuid();

            Debug.WriteLine(id);
            BackgroundTaskService.BackgroundTaskLog log = new BackgroundTaskService.BackgroundTaskLog(id, 1);
            var data = DatabaseDacPacUpdateTaskData.FromString("{\"DacPacName\":\"0-7-1d38ca879106-2321\",\"MasterDacPacUri\":\"https://chalkablestat.blob.core.windows.net/artifacts-db/0-7-1d38ca879106-2321/Chalkable.Database.Master.dacpac\",\"SchoolDacPacUri\":\"https://chalkablestat.blob.core.windows.net/artifacts-db/0-7-1d38ca879106-2321/Chalkable.Database.School.dacpac\",\"ServerName\":\"edjb0d1a0ab363747abbc2ee.database.windows.net\",\"DatabaseName\":\"edjb0d1a0ab363747abbc2ee\",\"Username\":\"chalkadmin@edjb0d1a0ab363747abbc2ee\",\"Password\":\"Hellowebapps1!\"}");

            DatabaseDacPacUpdateTaskHandler.Test(creds, log, data).Wait();
        }
        private static async Task <JobExecutionInfo> StartJob(AzureSqlJobClient elasticJobs, IList <DatabaseTarget> targets
                                                              , BackgroundTaskService.BackgroundTaskLog log, string dacPacName, string dacPacUri)
        {
            var dacPackDef = await elasticJobs.Content.GetContentAsync(dacPacName) ??
                             await elasticJobs.Content.CreateDacpacAsync(dacPacName, new Uri(dacPacUri));

            var pwd        = CreatePassword(Settings.ChalkableSchoolDbPassword);
            var credential = await elasticJobs.Credentials.CreateCredentialAsync(Guid.NewGuid().ToString(), Settings.ChalkableSchoolDbUser, pwd);

            string jobNamePrefix = "Apply DACPAC " + dacPacName + " ";
            int    lastNumber    = await FindLastUsedNumber(elasticJobs, jobNamePrefix, log);

            if (lastNumber >= 0)
            {
                bool inProgress = await IsJobInProgress(elasticJobs, BuildJobName(jobNamePrefix, lastNumber));

                if (inProgress)
                {
                    throw new Exception("Previous job on this version is not end yet");
                }
            }

            var rooTarget = await elasticJobs.Targets.CreateCustomCollectionTargetAsync("Targets for DACPAC " + dacPacName + " " + Guid.NewGuid());

            log.LogInfo("Job targets created as " + rooTarget.TargetId + " " + rooTarget.CustomCollectionName);
            await CreateDbTargets(elasticJobs, rooTarget, log, targets, 20, 2000);

            var jobName = BuildJobName(jobNamePrefix, lastNumber + 1);
            var job     = await elasticJobs.Jobs.CreateJobAsync(jobName, new JobBuilder
            {
                ContentName    = dacPackDef.ContentName,
                TargetId       = rooTarget.TargetId,
                CredentialName = credential.CredentialName
            });

            log.LogInfo("Job created as " + job.TargetId + " " + job.JobName);
            var jobExecution = await elasticJobs.JobExecutions.StartJobExecutionAsync(job.JobName);

            log.LogInfo($"{dacPacName} execution job as {jobExecution.JobExecutionId} with lifecycle {jobExecution.Lifecycle}");
            return(jobExecution);
        }
Exemplo n.º 13
0
        public bool Handle(BackgroundTask task, BackgroundTaskService.BackgroundTaskLog log)
        {
            var sl               = ServiceLocatorFactory.CreateMasterSysAdmin();
            var data             = task.GetData <PictureImportTaskData>();
            var district         = sl.DistrictService.GetByIdOrNull(data.DistrictId);
            var connectorLocator = ConnectorLocator.Create(district.SisUserName, district.SisPassword, district.SisUrl);

            foreach (var person in data.PersonIds)
            {
                var content = connectorLocator.UsersConnector.GetPhoto(person);
                if (content != null)
                {
                    sl.PersonPictureService.UploadPicture(data.DistrictId, person, content);
                }
                else
                {
                    sl.PersonPictureService.DeletePicture(data.DistrictId, person);
                }
            }
            return(true);
        }
Exemplo n.º 14
0
        public bool Handle(BackgroundTask task, BackgroundTaskService.BackgroundTaskLog log)
        {
            if (!task.DistrictRef.HasValue)
            {
                throw new ChalkableException("No district id for district task");
            }
            var sl = ServiceLocatorFactory.CreateMasterSysAdmin();

            if (!sl.DistrictService.IsOnline(task.DistrictRef.Value))
            {
                log.LogError($"district {task.DistrictRef.Value} is not online yet");
                return(false);
            }

            var districtId = task.DistrictRef.Value;

            var district = sl.DistrictService.GetByIdOrNull(districtId);

            HandleInternal(task, district, log);
            return(true);
        }
        private static async Task CreateDbTarget(AzureSqlJobClient elasticJobs, CustomCollectionTargetInfo rootTarget
                                                 , BackgroundTaskService.BackgroundTaskLog log, DatabaseTarget dbTarget)
        {
            try
            {
                var dbTargetInfo = await elasticJobs.Targets.GetDatabaseTargetAsync(dbTarget.Server, dbTarget.Name)
                                   ?? await elasticJobs.Targets.CreateDatabaseTargetAsync(dbTarget.Server, dbTarget.Name);

                var result = await elasticJobs.Targets.AddChildTargetAsync(rootTarget.TargetId, dbTargetInfo.TargetId);

                if (!result)
                {
                    throw new Exception("child target adding returns false");
                }
                log.LogInfo("Targeting db " + dbTarget.Name + "@" + dbTarget.Server + " complete as " + dbTargetInfo.TargetId);
            }
            catch (Exception e)
            {
                log.LogException(e);
                throw new Exception("Targeting db " + dbTarget.Name + "@" + dbTarget.Server + " failed.", e);
            }
        }
Exemplo n.º 16
0
        public bool Run(IList <District> schools, T data, BackgroundTaskService.BackgroundTaskLog log, Func <Task, string> f, Func <Task, TaskStatusEnum> checkStatus)
        {
            var allTasks    = new List <Task>();
            var threadTasks = new List <Task>();
            var threads     = new List <Thread>();

            var ts = new ParameterizedThreadStart(delegate(object o)
            {
                var tasks = (IList <Task>)o;
                Run(tasks, f, checkStatus);
            });
            var districtPerThread = Settings.AllSchoolRunnerDistrictPerThread;

            foreach (var school in schools)
            {
                var t = new Task
                {
                    Completed = false,
                    Database  = school.Id.ToString(),
                    Server    = school.ServerUrl,
                    Success   = false,
                    Data      = data
                };
                allTasks.Add(t);
                threadTasks.Add(t);
                if (threadTasks.Count == districtPerThread)
                {
                    var thread = new Thread(ts);
                    threads.Add(thread);
                    thread.Start(threadTasks);
                    threadTasks = new List <Task>();
                }
            }
            if (threadTasks.Count > 0)
            {
                var thread = new Thread(ts);
                threads.Add(thread);
                thread.Start(threadTasks);
            }


            for (int i = 0; i < threads.Count; i++)
            {
                threads[i].Join();
            }

            bool res = true;

            for (int i = 0; i < allTasks.Count; i++)
            {
                if (!allTasks[i].Success)
                {
                    log.LogError(string.Format("Db error: {0} - {1}", allTasks[i].Server, allTasks[i].Database));
                    if (allTasks[i].ErrorMessage != null)
                    {
                        log.LogError(allTasks[i].ErrorMessage);
                    }
                    res = false;
                }
            }
            return(res);
        }
        private static async Task <bool> DeployDacPac(AzureSqlJobCredentials azureJobsCreds, string dacPacName, string dacPacUri,
                                                      IList <DatabaseTarget> targets, BackgroundTaskService.BackgroundTaskLog log)
        {
            var elasticJobs = CreateAzureSqlJobClient(azureJobsCreds);

            var jobExecution = await StartJob(elasticJobs, targets, log, dacPacName, dacPacUri);

            JobStatHelper helper = new JobStatHelper(azureJobsCreds);

            DateTime?since     = null;
            var      lifecycle = jobExecution.Lifecycle;

            while (true)
            {
                try
                {
                    var status = await elasticJobs.JobExecutions.GetJobExecutionAsync(jobExecution.JobExecutionId);

                    if (status.Lifecycle != lifecycle)
                    {
                        log.LogInfo($"{dacPacName} job is {status.Lifecycle}");
                    }
                    lifecycle = status.Lifecycle;

                    var stats = helper.GetChilderJobExecutionStat(jobExecution.JobName);
                    log.LogInfo("Task stats:\n" + stats.Select(x => x.Lifecycle + ": " + x.Count).JoinString("\n"));

                    var taskExecutions = helper.GetJobTaskExecutions(jobExecution.JobName, since, null);
                    log.LogInfo(taskExecutions.Select(x => x.Message));
                    since = taskExecutions.Max(x => x.EndTime);

                    switch (status.Lifecycle)
                    {
                    case JobExecutionLifecycle.Failed:
                    case JobExecutionLifecycle.Canceled:
                    case JobExecutionLifecycle.Skipped:
                    case JobExecutionLifecycle.TimedOut:
                        log.LogError("Deploy " + status.Lifecycle);
                        return(false);

                    case JobExecutionLifecycle.Succeeded:
                        log.Flush();
                        return(true);
                    }
                }
                catch (SqlException e)
                {
                    log.LogInfo($"Failed to connect to {azureJobsCreds.DatabaseName}@{azureJobsCreds.DatabaseName}: {e.Message}");
                    log.LogException(e);
                }

                await Task.Delay(30000);
            }
        }
Exemplo n.º 18
0
 public abstract void HandleInternal(BackgroundTask task, District district, BackgroundTaskService.BackgroundTaskLog log);
Exemplo n.º 19
0
        public bool Handle(BackgroundTask task, BackgroundTaskService.BackgroundTaskLog log)
        {
            var sl   = ServiceLocatorFactory.CreateMasterSysAdmin();
            var data = task.GetData <DatabaseBackupRestoreTaskData>();

            if (data.BackupMaster)
            {
                var c = new SqlConnection(sl.Context.MasterConnectionString);
                var t = new AllSchoolRunner <long> .Task
                {
                    Database  = c.Database,
                    Server    = c.DataSource,
                    Data      = data.Time,
                    Success   = false,
                    Completed = false
                };
                if (backup)
                {
                    AllSchoolRunner <long> .Run(new List <AllSchoolRunner <long> .Task> {
                        t
                    }, x => BackupHelper.DoExport(x.Data, x.Server, x.Database), CheckStatus);
                }
                else
                {
                    AllSchoolRunner <long> .Run(new List <AllSchoolRunner <long> .Task> {
                        t
                    }, Restore, CheckStatus);
                }
                if (!t.Success)
                {
                    log.LogError($"Db {actionName} error: Master Database");
                    if (t.ErrorMessage != null)
                    {
                        log.LogError(t.ErrorMessage);
                    }
                    return(false);
                }
            }

            string[] serversForTemplateDbs = Settings.ChalkableSchoolDbServers;
            if (backup)
            {
                serversForTemplateDbs = serversForTemplateDbs.Take(1).ToArray();
            }
            foreach (var dbServer in serversForTemplateDbs)
            {
                var c = new SqlConnection(Settings.GetSchoolTemplateConnectionString(dbServer));
                var t = new AllSchoolRunner <long> .Task
                {
                    Database  = c.Database,
                    Server    = c.DataSource,
                    Data      = data.Time,
                    Success   = false,
                    Completed = false
                };
                if (backup)
                {
                    AllSchoolRunner <long> .Run(new List <AllSchoolRunner <long> .Task> {
                        t
                    }, x => BackupHelper.DoExport(x.Data, x.Server, x.Database), CheckStatus);
                }
                else
                {
                    AllSchoolRunner <long> .Run(new List <AllSchoolRunner <long> .Task> {
                        t
                    }, Restore, CheckStatus);
                }
                if (!t.Success)
                {
                    log.LogError(string.Format("Db {0} error: Template Database", actionName));
                    if (t.ErrorMessage != null)
                    {
                        log.LogError(t.ErrorMessage);
                    }
                    return(false);
                }
            }

            var  schools = sl.DistrictService.GetDistricts();
            var  runer   = new AllSchoolRunner <long>();
            bool res;

            if (backup)
            {
                res = runer.Run(schools, data.Time, log, t => BackupHelper.DoExport(t.Data, t.Server, t.Database), CheckStatus);
            }
            else
            {
                res = runer.Run(schools, data.Time, log, Restore, CheckStatus);
            }
            return(res);
        }
        private static async Task <int> FindLastUsedNumber(AzureSqlJobClient elasticJobs, string jobNamePrefix, BackgroundTaskService.BackgroundTaskLog log)
        {
            for (int i = 0; i < int.MaxValue; i++)
            {
                var jobName = BuildJobName(jobNamePrefix, i);
                log.LogInfo($"checking if {jobName} exists");
                var job = await elasticJobs.Jobs.GetJobAsync(jobName);

                if (job == null)
                {
                    return(i - 1);
                }
            }
            throw new Exception($"we used {int.MaxValue} numbers for jobs ????");
        }
 public static Task <bool> Test(AzureSqlJobCredentials creds, BackgroundTaskService.BackgroundTaskLog log, DatabaseDacPacUpdateTaskData data)
 {
     return(Do(creds, log, data));
 }
        private static async Task CreateDbTargets(AzureSqlJobClient elasticJobs, CustomCollectionTargetInfo rootTarget, BackgroundTaskService.BackgroundTaskLog log
                                                  , IList <DatabaseTarget> dbTargets, int pageSize, int delay)
        {
            for (int i = 0; i < dbTargets.Count; i += pageSize)
            {
                await Task.WhenAll(dbTargets.Skip(i).Take(pageSize).Select(x => CreateDbTarget(elasticJobs, rootTarget, log, x)).ToArray());

                Thread.Sleep(delay);
            }
        }
Exemplo n.º 23
0
 public bool Handle(BackgroundTask task, BackgroundTaskService.BackgroundTaskLog log)
 {
     log.LogError("This operation is not supported");
     return(false);
 }