public void GivenThreeJobRunsOfChefkoch_WhenQueryingByUserDisplayName_ReturnsOnlyJobRunsOfThatUser()
        {
            GivenRavenDb();
            GivenStorageProvider();

            var job1 = new Job {
                UniqueName = "testjob1", Type = "Jobs.Test1"
            };

            this.StorageProvider.AddJob(job1);

            var trigger1 = new InstantTrigger {
                IsActive = true, UserDisplayName = "chefkoch"
            };

            this.StorageProvider.AddTrigger(job1.Id, trigger1);

            var jobRun1 = new JobRun {
                JobId = job1.Id, TriggerId = trigger1.Id, PlannedStartDateTimeUtc = DateTime.UtcNow, State = JobRunStates.Completed
            };
            var jobRun2 = new JobRun {
                JobId = job1.Id, TriggerId = trigger1.Id, PlannedStartDateTimeUtc = DateTime.UtcNow, State = JobRunStates.Completed
            };
            var jobRun3 = new JobRun {
                JobId = job1.Id, TriggerId = trigger1.Id, PlannedStartDateTimeUtc = DateTime.UtcNow, State = JobRunStates.Completed
            };

            this.StorageProvider.AddJobRun(jobRun1);
            this.StorageProvider.AddJobRun(jobRun2);
            this.StorageProvider.AddJobRun(jobRun3);

            WaitForIndexing(this.Store);

            var jobRuns = this.StorageProvider.GetJobRunsByUserDisplayName("chefkoch");

            Assert.AreEqual(3, jobRuns.Count);
        }
        public void GivenThreeJobRuns_WhenQueryingByTriggerPaged_ResultIsPaged()
        {
            GivenRavenDb();
            GivenStorageProvider();

            var job1 = new Job {
                UniqueName = "testjob1", Type = "Jobs.Test1"
            };

            this.StorageProvider.AddJob(job1);

            var trigger1 = new InstantTrigger {
                IsActive = true
            };

            this.StorageProvider.AddTrigger(job1.Id, trigger1);

            var jobRun1 = new JobRun {
                JobId = job1.Id, TriggerId = trigger1.Id, PlannedStartDateTimeUtc = DateTime.UtcNow, State = JobRunStates.Completed
            };
            var jobRun2 = new JobRun {
                JobId = job1.Id, TriggerId = trigger1.Id, PlannedStartDateTimeUtc = DateTime.UtcNow, State = JobRunStates.Completed
            };
            var jobRun3 = new JobRun {
                JobId = job1.Id, TriggerId = trigger1.Id, PlannedStartDateTimeUtc = DateTime.UtcNow, State = JobRunStates.Failed
            };

            this.StorageProvider.AddJobRun(jobRun1);
            this.StorageProvider.AddJobRun(jobRun2);
            this.StorageProvider.AddJobRun(jobRun3);

            WaitForIndexing(this.Store);

            var jobRuns = this.StorageProvider.GetJobRunsByTriggerId(job1.Id, trigger1.Id, 0, 2);

            Assert.AreEqual(2, jobRuns.Count);
        }
示例#3
0
        private void UpdatePlannedJobRun(JobRun plannedNextRun, JobTriggerBase trigger, DateTime calculatedNextRun)
        {
            // Is this value in sync with the schedule table?
            if (plannedNextRun.PlannedStartDateTimeUtc == calculatedNextRun)
            {
                Logger.DebugFormat(
                    "The previously planned startdate '{0}' is still correct for JobRun (id: {1}) triggered by trigger with id '{2}' (Type: '{3}', userId: '{4}', userName: '******')",
                    calculatedNextRun,
                    plannedNextRun.Id,
                    trigger.Id,
                    trigger.GetType().Name,
                    trigger.UserId,
                    trigger.UserDisplayName);

                return;
            }

            // Was the change too close before the execution date?
            var utcNow = this.dateTimeProvider.GetUtcNow();

            if (utcNow.AddSeconds(this.configuration.AllowChangesBeforeStartInSec) >= calculatedNextRun)
            {
                Logger.WarnFormat(
                    "The planned startdate '{0}' has changed to '{1}'. This change was done too close (less than {2} seconds) to the next planned run and cannot be adjusted",
                    plannedNextRun.PlannedStartDateTimeUtc,
                    calculatedNextRun,
                    this.configuration.AllowChangesBeforeStartInSec);

                return;
            }

            Logger.WarnFormat("The calculated startdate '{0}' has changed to '{1}', the planned jobRun needs to be updated as next step", plannedNextRun.PlannedStartDateTimeUtc, calculatedNextRun);

            plannedNextRun.PlannedStartDateTimeUtc = calculatedNextRun;
            this.repository.Update(plannedNextRun);
        }
示例#4
0
 private void RunJobImmediately(object sender, JobRun e)
 {
     e.Run();
 }
示例#5
0
 public void AddJobRun(JobRun jobRun)
 {
 }
示例#6
0
 public void Update(JobRun jobRun)
 {
     this.localJobRuns.Remove(this.localJobRuns.FirstOrDefault(jr => jr.Id == jobRun.Id));
     this.localJobRuns.Add(jobRun);
 }
示例#7
0
        public static JobRun ToModel(this Entities.JobRunInfo entity)
        {
            var jobrun = new JobRun
            {
                Id = entity.Id,
                ActualEndDateTimeUtc    = entity.ActualEndDateTimeUtc,
                ActualStartDateTimeUtc  = entity.ActualStartDateTimeUtc,
                EstimatedEndDateTimeUtc = entity.EstimatedEndDateTimeUtc,
                InstanceParameters      = entity.InstanceParameters,
                JobParameters           = entity.JobParameters,
                Pid = entity.Pid,
                PlannedStartDateTimeUtc = entity.PlannedStartDateTimeUtc,
                Progress = entity.Progress,
                State    = entity.State,
                Deleted  = entity.Deleted,
                Job      = new Job
                {
                    Id = entity.JobId,
                    CreatedDateTimeUtc = entity.JobCreatedDateTimeUtc,
                    UniqueName         = entity.JobUniqueName,
                    Type               = entity.JobType,
                    Parameters         = entity.JobParameters,
                    UpdatedDateTimeUtc = entity.JobUpdatedDateTimeUtc,
                    Title              = entity.JobTitle,
                },
            };

            if (entity.TriggerType == Entities.TriggerType.InstantTrigger)
            {
                jobrun.Trigger = new InstantTrigger
                {
                    Id = entity.TriggerId,
                    UserDisplayName    = entity.TriggerUserDisplayName,
                    JobId              = entity.JobId,
                    CreatedDateTimeUtc = entity.TriggerCreatedDateTimeUtc,
                    Parameters         = entity.TriggerParameters,
                    DelayedMinutes     = entity.TriggerDelayedMinutes,
                    UserId             = entity.TriggerUserId,
                    IsActive           = entity.TriggerIsActive,
                    Comment            = entity.TriggerComment,
                    Deleted            = entity.Deleted,
                };
            }
            else if (entity.TriggerType == Entities.TriggerType.RecurringTrigger)
            {
                jobrun.Trigger = new RecurringTrigger
                {
                    Id = entity.TriggerId,
                    UserDisplayName     = entity.TriggerUserDisplayName,
                    JobId               = entity.JobId,
                    CreatedDateTimeUtc  = entity.TriggerCreatedDateTimeUtc,
                    Parameters          = entity.TriggerParameters,
                    UserId              = entity.TriggerUserId,
                    IsActive            = entity.TriggerIsActive,
                    Comment             = entity.TriggerComment,
                    EndDateTimeUtc      = entity.TriggerEndDateTimeUtc,
                    StartDateTimeUtc    = entity.TriggerStartDateTimeUtc,
                    Definition          = entity.TriggerDefinition,
                    NoParallelExecution = entity.TriggerNoParallelExecution,
                    Deleted             = entity.Deleted,
                };
            }
            else if (entity.TriggerType == Entities.TriggerType.ScheduledTrigger)
            {
                jobrun.Trigger = new RecurringTrigger
                {
                    Id = entity.TriggerId,
                    UserDisplayName     = entity.TriggerUserDisplayName,
                    JobId               = entity.JobId,
                    CreatedDateTimeUtc  = entity.TriggerCreatedDateTimeUtc,
                    Parameters          = entity.TriggerParameters,
                    UserId              = entity.TriggerUserId,
                    IsActive            = entity.TriggerIsActive,
                    Comment             = entity.TriggerComment,
                    EndDateTimeUtc      = entity.TriggerEndDateTimeUtc,
                    StartDateTimeUtc    = entity.TriggerStartDateTimeUtc,
                    Definition          = entity.TriggerDefinition,
                    NoParallelExecution = entity.TriggerNoParallelExecution,
                    Deleted             = entity.Deleted,
                };
            }

            return(jobrun);
        }
示例#8
0
 public void AddJobRun(JobRun jobRun)
 {
     this.CheckFailAll();
     this.inMemoryVersion.AddJobRun(jobRun);
 }
示例#9
0
 public void Update(JobRun jobRun)
 {
     this.CheckFailAll();
     this.inMemoryVersion.Update(jobRun);
 }
示例#10
0
 public void Update(JobRun jobRun)
 {
 }
示例#11
0
        public static JobRun ApplyTo(this ComponentModel.JobStorage.Model.JobRun src, JobRun targetEntity)
        {
            targetEntity.Id = src.Id > 0 ? $"{JobRun.CollectionPrefix}/{src.Id}" : null;
            targetEntity.ActualEndDateTimeUtc    = src.ActualEndDateTimeUtc;
            targetEntity.ActualStartDateTimeUtc  = src.ActualStartDateTimeUtc;
            targetEntity.EstimatedEndDateTimeUtc = src.EstimatedEndDateTimeUtc;
            targetEntity.InstanceParameters      = src.InstanceParameters;
            targetEntity.JobParameters           = src.JobParameters;
            targetEntity.Pid = src.Pid;
            targetEntity.PlannedStartDateTimeUtc = src.PlannedStartDateTimeUtc;
            targetEntity.Progress = src.Progress;
            targetEntity.State    = (JobRunStates)src.State;

            return(targetEntity);
        }
示例#12
0
        public void SetPidForJobRun(JobRun jobRun, int id)
        {
            jobRun.Pid = id;

            this.storageProvider.Update(jobRun);
        }
示例#13
0
 public void AddJobRun(JobRun jobRun)
 {
     throw new NotImplementedException();
 }
示例#14
0
 public void Update(JobRun jobRun)
 {
     this.storageProvider.Update(jobRun);
 }
        /// <summary>
        /// Report a given <paramref name="jobRun"/> as a logging metric with the specified <paramref name="metricName"/>.
        /// </summary>
        /// <param name="logger">The instance to report the job outcome.</param>
        /// <param name="metricName">The name of the logging metric.</param>
        /// <param name="jobRun">The instance to report.</param>
        /// <param name="context">The additional contextual information related to the to be logged metric.</param>
        /// <exception cref="ArgumentException">Thrown when the <paramref name="metricName"/> is blank.</exception>
        /// <exception cref="ArgumentNullException">Thrown when the <paramref name="jobRun"/> is <c>null</c>.</exception>
        public static void LogMetricFinishedJobOutcome(this ILogger logger, string metricName, JobRun jobRun, Dictionary <string, object> context = null)
        {
            Guard.NotNull(logger, nameof(logger));
            Guard.NotNullOrWhitespace(metricName, nameof(metricName));
            Guard.NotNull(jobRun, nameof(jobRun));

            TextInfo text = new CultureInfo("en-US", useUserOverride: false).TextInfo;

            logger.LogInformation("Found finished job run with ID {RunId}", jobRun.Run.RunId);

            RunResultState?resultState = jobRun.Run.State.ResultState;

            if (resultState is null)
            {
                logger.LogWarning("Cannot find result state of finished job run with ID {RunId}", jobRun.Run.RunId);
            }
            else
            {
                string outcome = text.ToLower(resultState.ToString());

                var startContext = new Dictionary <string, object>
                {
                    { "Run Id", jobRun.Run.RunId },
                    { "Job Id", jobRun.Run.JobId },
                    { "Job Name", jobRun.JobName },
                    { "Outcome", outcome }
                };

                if (context != null)
                {
                    foreach (KeyValuePair <string, object> item in context)
                    {
                        if (startContext.ContainsKey(item.Key))
                        {
                            logger.LogWarning(
                                "Cannot add duplicate key '{KeyName}' to metric finished Databricks job context",
                                item.Key);
                        }
                        else
                        {
                            startContext.Add(item.Key, item.Value);
                        }
                    }
                }

                logger.LogMetric(metricName, value: 1, context: startContext);
            }
        }
示例#16
0
        public void Get_JobRuns_By_States()
        {
            using (this.GivenRunningServerWithWebApi())
            {
                var client = new JobbrClient(this.BackendAddress);

                var job = new Job();
                this.JobStorage.AddJob(job);

                var trigger = new RecurringTrigger();
                this.JobStorage.AddTrigger(job.Id, trigger);

                var jobRun = new JobRun {
                    Job = new Job {
                        Id = job.Id
                    }, Trigger = new RecurringTrigger {
                        Id = trigger.Id
                    }, State = JobRunStates.Completed
                };
                this.JobStorage.AddJobRun(jobRun);

                var jobRun2 = new JobRun {
                    Job = new Job {
                        Id = job.Id
                    }, Trigger = new RecurringTrigger {
                        Id = trigger.Id
                    }, State = JobRunStates.Completed
                };
                this.JobStorage.AddJobRun(jobRun2);

                var jobRun3 = new JobRun {
                    Job = new Job {
                        Id = job.Id
                    }, Trigger = new RecurringTrigger {
                        Id = trigger.Id
                    }, State = JobRunStates.Failed
                };
                this.JobStorage.AddJobRun(jobRun3);

                var jobRun4 = new JobRun {
                    Job = new Job {
                        Id = job.Id
                    }, Trigger = new RecurringTrigger {
                        Id = trigger.Id
                    }, State = JobRunStates.Connected
                };
                this.JobStorage.AddJobRun(jobRun4);

                var jobRuns = client.QueryJobRunsByStates("Completed,Connected");

                Assert.AreEqual(3, jobRuns.TotalItems);

                jobRuns = client.QueryJobRunsByStates("Completed,Connected,Failed");

                Assert.AreEqual(4, jobRuns.TotalItems);

                jobRuns = client.QueryJobRunsByStates("Failed");

                Assert.AreEqual(1, jobRuns.TotalItems);
            }
        }
示例#17
0
 public SimpleJob(JobRun run)
 {
     _run = run;
 }
示例#18
0
 public void Update(JobRun jobRun)
 {
     throw new NotImplementedException();
 }