コード例 #1
0
        public void HasTriggerWithJobId_QueryByMatchingJobId_ReturnsListWithSingle()
        {
            // Arrange
            var instantTrigger = new InstantTrigger {
                IsActive = true
            };
            var recurringTrigger = new RecurringTrigger()
            {
                IsActive = true
            };
            var scheduledTrigger = new ScheduledTrigger {
                IsActive = true
            };

            this.Services.JobStorageProvider.AddTrigger(100, instantTrigger);
            this.Services.JobStorageProvider.AddTrigger(200, recurringTrigger);
            this.Services.JobStorageProvider.AddTrigger(300, scheduledTrigger);

            // Act
            var triggers = this.QueryService.GetTriggersByJobId(200, 1, 50).Items;
            var assertingRecurringTrigger = triggers[0] as ComponentModel.Management.Model.RecurringTrigger;

            // Test
            Assert.IsNotNull(triggers);
            Assert.AreEqual(1, triggers.Count);
            Assert.AreEqual(recurringTrigger.Id, assertingRecurringTrigger.Id);
        }
コード例 #2
0
        public void JobRunIsScheduler_WhenTriggerGetsDisabled_JobRunWillBeRemoved()
        {
            var jobManagementService = this.Services.JobManagementService;
            var storageProvider      = this.Services.JobStorageProvider;

            var demoJob = new Job();

            storageProvider.AddJob(demoJob);

            var futureDate1 = DateTime.UtcNow.AddHours(2);

            var trigger = new ScheduledTrigger {
                JobId = demoJob.Id, StartDateTimeUtc = futureDate1, IsActive = true
            };

            jobManagementService.AddTrigger(demoJob.Id, trigger);

            // Wait for the scheduler to do his work
            WaitFor.HasElements(() => storageProvider.GetJobRuns().Items);

            var createdJobRun = storageProvider.GetJobRuns().Items.FirstOrDefault();

            Assert.IsNotNull(createdJobRun, "There should be exact one JobRun");
            Assert.IsTrue(createdJobRun.PlannedStartDateTimeUtc >= DateTime.UtcNow, "The job run needs to be in the future");
            Assert.AreEqual(futureDate1, createdJobRun.PlannedStartDateTimeUtc);

            jobManagementService.DisableTrigger(demoJob.Id, trigger.Id);

            // Wait for the scheduler to do his work
            WaitFor.HasElements(() => storageProvider.GetJobRuns().Items.Where(r => r.State == ComponentModel.JobStorage.Model.JobRunStates.Deleted).ToList());

            var jobRun = storageProvider.GetJobRuns().Items.FirstOrDefault();

            Assert.AreEqual(ComponentModel.JobStorage.Model.JobRunStates.Deleted, jobRun.State);
        }
コード例 #3
0
        public void HasOneJobRun_QueryByExistingTriggerId_ReturnsListWithSingle()
        {
            // Arrange
            var job = new Job {
                Id = 1337
            };
            var trigger = new ScheduledTrigger {
                Id = 34
            };

            var jobRun = new JobRun {
                Job = job, Trigger = trigger
            };

            this.Services.JobStorageProvider.AddJobRun(jobRun);

            // Act
            var runs = this.QueryService.GetJobRunsByTriggerId(1337, 34);

            Assert.IsNotNull(runs);
            Assert.AreEqual(1, runs.Items.Count);
            Assert.AreEqual(jobRun.Id, runs.Items[0].Id);
            Assert.AreEqual(34, runs.Items[0].TriggerId);
            Assert.AreEqual(1337, runs.Items[0].JobId);
        }
コード例 #4
0
        public void JobRunIsScheduler_WhenTriggerIsEnabled_JobRunWillBeScheduled()
        {
            var jobManagementService = this.Services.JobManagementService;
            var storageProvider      = this.Services.JobStorageProvider;

            var demoJob = new Job();

            storageProvider.AddJob(demoJob);

            var futureDate1 = DateTime.UtcNow.AddHours(2);

            var trigger = new ScheduledTrigger {
                JobId = demoJob.Id, StartDateTimeUtc = futureDate1, IsActive = false
            };

            jobManagementService.AddTrigger(demoJob.Id, trigger);

            // Base asserts
            var createdJobRun = storageProvider.GetJobRuns().Items.FirstOrDefault();

            Assert.IsNull(createdJobRun, "There should be exact no JobRun");

            jobManagementService.EnableTrigger(demoJob.Id, trigger.Id);

            // Wait for the scheduler to do his work
            WaitFor.HasElements(() => storageProvider.GetJobRuns().Items);

            var jobRun = storageProvider.GetJobRuns().Items.FirstOrDefault();

            Assert.AreEqual(JobRunStates.Scheduled, jobRun.State);
        }
コード例 #5
0
        public void JobService_ExistingScheduledTriggerIsUpdated_UpdateIsPersisted()
        {
            var demoJob         = new Job();
            var storageProvider = this.Services.JobStorageProvider;

            storageProvider.AddJob(demoJob);

            var futureDate1 = DateTime.UtcNow.AddHours(2);
            var futureDate2 = DateTime.UtcNow.AddHours(5);

            var initialTrigger = new ScheduledTrigger {
                JobId = demoJob.Id, StartDateTimeUtc = futureDate1, IsActive = true
            };

            storageProvider.AddTrigger(demoJob.Id, initialTrigger);

            var updatedTrigger = new ScheduledTrigger {
                Id = initialTrigger.Id, JobId = demoJob.Id, StartDateTimeUtc = futureDate2, IsActive = true
            };

            this.Services.JobManagementService.UpdateTriggerStartTime(demoJob.Id, updatedTrigger.Id, updatedTrigger.StartDateTimeUtc);

            var assertTrigger = (ScheduledTrigger)storageProvider.GetTriggerById(demoJob.Id, initialTrigger.Id);

            Assert.AreEqual(futureDate2, assertTrigger.StartDateTimeUtc);
        }
コード例 #6
0
        internal static ScheduledTrigger ConvertToTrigger(ScheduledTriggerDto dto)
        {
            var trigger = new ScheduledTrigger {
                StartDateTimeUtc = dto.StartDateTimeUtc
            };

            return((ScheduledTrigger)MapCommonValues(dto, trigger));
        }
コード例 #7
0
        internal static ScheduledTriggerDto ConvertToDto(ScheduledTrigger trigger)
        {
            var dto = new ScheduledTriggerDto {
                StartDateTimeUtc = trigger.StartDateTimeUtc
            };

            return((ScheduledTriggerDto)MapCommonValues(trigger, dto));
        }
コード例 #8
0
        public void AddTrigger(long jobId, ScheduledTrigger trigger)
        {
            var newTriggerId = this.localTriggers.Count + 1;

            trigger.Id    = newTriggerId;
            trigger.JobId = jobId;
            this.localTriggers.Add(trigger);
        }
コード例 #9
0
        public void Update(long jobId, ScheduledTrigger trigger)
        {
            using (var connection = this.connectionFactory.Open())
            {
                var entity = trigger.ToEntity();

                connection.Update(entity);
            }
        }
コード例 #10
0
        public void AddTrigger(long jobId, ScheduledTrigger trigger)
        {
            var model = this.mapper.Map <ScheduledTriggerModel>(trigger);

            this.triggerService.Add(jobId, model);

            trigger.Id    = model.Id;
            trigger.JobId = jobId;
        }
コード例 #11
0
        public void NewScheduledTrigger_IsAdded_WillBePlanned()
        {
            var scheduledTrigger = new ScheduledTrigger {
                JobId = this.demoJob1Id, StartDateTimeUtc = DateTime.UtcNow.AddSeconds(-1), IsActive = true
            };

            this.AddAndSignalNewTrigger(this.demoJob1Id, scheduledTrigger);

            Assert.AreEqual(1, this.lastIssuedPlan.Count, "A scheduled trigger should cause one item in the plan");
        }
コード例 #12
0
        private bool ApplyOtherChanges(ScheduledTrigger fromDb, ScheduledTrigger updatedOne)
        {
            if (fromDb.StartDateTimeUtc != updatedOne.StartDateTimeUtc)
            {
                fromDb.StartDateTimeUtc = updatedOne.StartDateTimeUtc;

                return(true);
            }

            return(false);
        }
コード例 #13
0
        public void NewScheduledTrigger_IsAdded_CreatesANewJobRun()
        {
            var scheduledTrigger = new ScheduledTrigger {
                JobId = this.demoJob1Id, StartDateTimeUtc = DateTime.UtcNow.AddSeconds(-1), IsActive = true
            };

            this.AddAndSignalNewTrigger(this.demoJob1Id, scheduledTrigger);

            var jobRuns = this.repository.GetJobRuns();

            Assert.AreEqual(1, jobRuns.Count, "A scheduled trigger should create exact one jobrun when added");
            Assert.AreEqual(scheduledTrigger.Id, jobRuns.Single().TriggerId, "The jobrun should reference the trigger that cause the job to run");
        }
コード例 #14
0
        private void InsertTrigger(ScheduledTrigger trigger)
        {
            var entity = trigger.ToEntity();

            if (entity.CreatedDateTimeUtc == default(DateTime))
            {
                entity.CreatedDateTimeUtc = DateTime.UtcNow;
            }

            using (var connection = this.connectionFactory.OpenDbConnection())
            {
                trigger.Id = connection.Insert(entity, true);
            }
        }
コード例 #15
0
 public static ComponentModel.JobStorage.Model.ScheduledTrigger ToModel(this ScheduledTrigger src, long jobId)
 {
     return(new ComponentModel.JobStorage.Model.ScheduledTrigger
     {
         Id = src.Id,
         CreatedDateTimeUtc = src.CreatedDateTimeUtc,
         Parameters = src.Parameters,
         StartDateTimeUtc = src.StartDateTimeUtc,
         IsActive = src.IsActive,
         UserId = src.UserId,
         Comment = src.Comment,
         UserDisplayName = src.UserDisplayName,
         JobId = jobId
     });
 }
コード例 #16
0
        public void NewScheduledTrigger_IsAdded_IsPlannedOnTime()
        {
            var dateTimeUtc = DateTime.UtcNow.AddHours(10);

            var scheduledTrigger = new ScheduledTrigger {
                JobId = this.demoJob1Id, StartDateTimeUtc = dateTimeUtc, IsActive = true
            };

            this.AddAndSignalNewTrigger(this.demoJob1Id, scheduledTrigger);

            var jobRun = this.repository.GetJobRuns().Single();

            Assert.AreEqual(dateTimeUtc, this.lastIssuedPlan.Single().PlannedStartDateTimeUtc, "The startdate should be considered in the plan");
            Assert.AreEqual(jobRun.Id, this.lastIssuedPlan.Single().Id, "The startdate should be considered in the plan");
        }
コード例 #17
0
        public void Update(long jobId, ScheduledTrigger trigger)
        {
            using (var session = this._documentStore.OpenSession())
            {
                var job = session.Load <Model.Job>(jobId);

                var triggerFromDb = job.ScheduledTriggers.First(p => p.Id == trigger.Id);
                job.ScheduledTriggers.Remove(triggerFromDb);

                var entity = trigger.ToEntity();

                job.ScheduledTriggers.Add(entity);

                session.Store(job);
                session.SaveChanges();
            }
        }
コード例 #18
0
        public void AddTrigger(long jobId, ScheduledTrigger trigger)
        {
            using (var session = this._documentStore.OpenSession())
            {
                var job    = session.Load <Model.Job>(jobId);
                var entity = trigger.ToEntity();
                entity.Id = ++job.LastTriggerId;
                entity.CreatedDateTimeUtc = DateTime.UtcNow;

                job.ScheduledTriggers.Add(entity);

                session.Store(job);
                session.SaveChanges();

                trigger.Id = entity.Id;
                trigger.CreatedDateTimeUtc = entity.CreatedDateTimeUtc;
            }
        }
コード例 #19
0
        private bool ApplyOtherChanges(ScheduledTrigger fromDb, ScheduledTrigger updatedOne)
        {
            bool hadChanges = false;

            if (fromDb.StartDateTimeUtc != updatedOne.StartDateTimeUtc)
            {
                fromDb.StartDateTimeUtc = updatedOne.StartDateTimeUtc;

                hadChanges = true;
            }

            if (this.ApplyBaseChanges(fromDb, updatedOne))
            {
                hadChanges = true;
            }

            return(hadChanges);
        }
コード例 #20
0
        public void GetScheduledTrigger()
        {
            using (this.GivenRunningServerWithWebApi())
            {
                var client = new JobbrClient(this.BackendAddress);

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

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

                var triggerDto = client.GetTriggerById <ScheduledTriggerDto>(job.Id, trigger.Id);

                Assert.IsNotNull(triggerDto);
                Assert.AreEqual(trigger.Id, triggerDto.Id);
            }
        }
コード例 #21
0
 public static Entities.Trigger ToEntity(this ScheduledTrigger model)
 {
     return(new Entities.Trigger
     {
         Id = model.Id,
         UserId = model.UserId,
         UserDisplayName = model.UserDisplayName,
         JobId = model.JobId,
         IsActive = model.IsActive,
         Comment = model.Comment,
         Parameters = model.Parameters,
         CreatedDateTimeUtc = model.CreatedDateTimeUtc,
         Type = Entities.TriggerType.ScheduledTrigger,
         NoParallelExecution = false,
         StartDateTimeUtc = model.StartDateTimeUtc,
         Deleted = model.Deleted,
     });
 }
コード例 #22
0
        internal PlanResult Plan(ScheduledTrigger trigger, bool isNew)
        {
            if (!trigger.IsActive)
            {
                return(PlanResult.FromAction(PlanAction.Obsolete));
            }

            var calculatedNextRun = trigger.StartDateTimeUtc;

            if (calculatedNextRun < this.dateTimeProvider.GetUtcNow() && !isNew)
            {
                return(PlanResult.FromAction(PlanAction.Obsolete));
            }

            return(new PlanResult {
                Action = PlanAction.Possible, ExpectedStartDateUtc = calculatedNextRun
            });
        }
コード例 #23
0
        public void ScheduledTrigger_HasCompletedJobRun_DoesNotTriggerNewOne()
        {
            // Note: The Scheduled Trigger needs to be in the past in order to invalidate the job reliable in this testing scenario (Issues with NCrunch, no issues with R# and VS-Runners)
            var scheduledTrigger = new ScheduledTrigger {
                JobId = this.demoJob1Id, StartDateTimeUtc = DateTime.UtcNow.AddSeconds(-1), IsActive = true
            };

            this.AddAndSignalNewTrigger(this.demoJob1Id, scheduledTrigger);

            // Simulate Job Completeness
            var jobRunByScheduledTrigger = this.repository.GetJobRuns().Single(jr => jr.TriggerId == scheduledTrigger.Id);

            jobRunByScheduledTrigger.State = JobRunStates.Completed;
            this.repository.Update(jobRunByScheduledTrigger);

            this.scheduler.OnJobRunEnded(jobRunByScheduledTrigger.Id);

            Assert.AreEqual(0, this.lastIssuedPlan.Count, "A scheduled trigger should not cause any additional jobruns after completion");
        }
コード例 #24
0
        public void UpdateScheduledTrigger()
        {
            using (this.GivenRunningServerWithWebApi())
            {
                var client = new JobbrClient(this.BackendAddress);

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

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

                var triggerDto = client.UpdateTrigger(job.Id, new ScheduledTriggerDto {
                    Id = trigger.Id, IsActive = true
                });

                Assert.IsNotNull(triggerDto);
                Assert.IsTrue(triggerDto.IsActive);
            }
        }
コード例 #25
0
        public static PSDataShareTrigger ToPsObject(this ScheduledTrigger trigger)
        {
            var parsedResourceId = new ResourceIdentifier(trigger.Id);

            return(new PSDataShareTrigger
            {
                Id = trigger.Id,
                Name = trigger.Name,
                Type = trigger.Type,
                ProvisioningState = (PSProvisioningState)Enum.Parse(
                    typeof(PSProvisioningState),
                    trigger.ProvisioningState),
                CreatedAt = trigger.CreatedAt,
                CreatedBy = trigger.UserName,
                RecurrenceInterval = trigger.RecurrenceInterval,
                SynchronizationMode = trigger.SynchronizationMode,
                SynchronizationTime = trigger.SynchronizationTime,
                TriggerStatus = trigger.TriggerStatus,
            });
        }
コード例 #26
0
        public void HasOneJobRun_QueryByInExistentTriggerId_ReturnsEmptyList()
        {
            // Arrange
            var job = new Job {
                Id = 1000
            };
            var trigger = new ScheduledTrigger {
                Id = 34
            };

            this.Services.JobStorageProvider.AddJobRun(new JobRun {
                Job = job, Trigger = trigger
            });

            // Act
            var runs = this.QueryService.GetJobRunsByTriggerId(-1, -1);

            Assert.IsNotNull(runs);
            Assert.AreEqual(0, runs.Items.Count);
        }
コード例 #27
0
        private void CreateNewTrigger()
        {
            var triggerModel = new ScheduledTrigger
            {
                RecurrenceInterval  = this.RecurrenceInterval,
                SynchronizationTime = this.SynchronizationTime,
                SynchronizationMode = SynchronizationMode.Incremental
            };

            var createFunc =
                (Func <string, string, string, string, Trigger, Trigger>) this.DataShareManagementClient.Triggers.Create;

            var trigger = createFunc(
                this.ResourceGroupName,
                this.AccountName,
                this.ShareSubscriptionName,
                this.Name,
                triggerModel) as ScheduledTrigger;

            this.WriteObject(trigger.ToPsObject());
        }
コード例 #28
0
        public void HasDifferentTriggerTypes_QueryById_ReturnsCorrectType()
        {
            // Arrange
            const long jobId            = 1;
            var        instantTrigger   = new InstantTrigger();
            var        recurringTrigger = new RecurringTrigger();
            var        scheduledTrigger = new ScheduledTrigger();

            this.Services.JobStorageProvider.AddTrigger(jobId, instantTrigger);
            this.Services.JobStorageProvider.AddTrigger(jobId, recurringTrigger);
            this.Services.JobStorageProvider.AddTrigger(jobId, scheduledTrigger);

            // Act
            var instantTypeTrigger   = this.QueryService.GetTriggerById(jobId, instantTrigger.Id);
            var recurringTypeTrigger = this.QueryService.GetTriggerById(jobId, recurringTrigger.Id);
            var scheduledTypeTrigger = this.QueryService.GetTriggerById(jobId, scheduledTrigger.Id);

            // Test
            Assert.AreEqual(typeof(ComponentModel.Management.Model.InstantTrigger), instantTypeTrigger.GetType());
            Assert.AreEqual(typeof(ComponentModel.Management.Model.RecurringTrigger), recurringTypeTrigger.GetType());
            Assert.AreEqual(typeof(ComponentModel.Management.Model.ScheduledTrigger), scheduledTypeTrigger.GetType());
        }
コード例 #29
0
        public void JobRunIsScheduled_ScheduledTriggerGetsUpdated_JobRunScheduleIsAdjusted()
        {
            var jobManagementService = this.Services.JobManagementService;
            var storageProvider      = this.Services.JobStorageProvider;

            var demoJob = new Job();

            storageProvider.AddJob(demoJob);

            var futureDate1 = DateTime.UtcNow.AddHours(1);
            var futureDate2 = DateTime.UtcNow.AddHours(10);

            var recurringTrigger = new ScheduledTrigger()
            {
                JobId = 1, StartDateTimeUtc = futureDate1, IsActive = true
            };

            jobManagementService.AddTrigger(1, recurringTrigger);

            // Wait for the scheduler to do his work
            WaitFor.HasElements(() => storageProvider.GetJobRuns().Items);

            var createdJobRun = storageProvider.GetJobRuns().Items.FirstOrDefault();

            // Base Assertions
            Assert.IsNotNull(createdJobRun, "There should be exact one JobRun which is not null");
            Assert.IsTrue(createdJobRun.PlannedStartDateTimeUtc >= DateTime.UtcNow, "The job run needs to be in the future");
            Assert.AreEqual(futureDate1, createdJobRun.PlannedStartDateTimeUtc);

            jobManagementService.UpdateTriggerStartTime(1, recurringTrigger.Id, futureDate2);

            // Wait for the scheduler to do his work
            WaitFor.HasElements(() => storageProvider.GetJobRuns().Items.Where(r => r.PlannedStartDateTimeUtc == futureDate2).ToList());

            var updatedJobRun = storageProvider.GetJobRuns().Items.FirstOrDefault();

            Assert.AreEqual(futureDate2, updatedJobRun.PlannedStartDateTimeUtc, "As per updated startddate, the job should now start on a different point in time");
        }
コード例 #30
0
        public void GivenScheduledTrigger_WhenUpdating_TriggerIsUpdated()
        {
            GivenRavenDb();
            GivenStorageProvider();

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

            this.StorageProvider.AddJob(job1);

            var trigger = new ScheduledTrigger {
                StartDateTimeUtc = DateTime.UtcNow
            };

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

            var trigger2 = (ScheduledTrigger)this.StorageProvider.GetTriggerById(job1.Id, trigger.Id);

            var startDateTime = DateTime.UtcNow.AddHours(5);

            trigger2.Comment          = "bla";
            trigger2.IsActive         = true;
            trigger2.Parameters       = "test-parameters";
            trigger2.UserId           = "ozu";
            trigger2.StartDateTimeUtc = startDateTime;

            this.StorageProvider.Update(job1.Id, trigger2);

            var trigger2Reloaded = (ScheduledTrigger)this.StorageProvider.GetTriggerById(job1.Id, trigger2.Id);

            Assert.AreEqual("bla", trigger2Reloaded.Comment);
            Assert.IsTrue(trigger2Reloaded.IsActive);
            Assert.AreEqual("test-parameters", trigger2Reloaded.Parameters);
            Assert.AreEqual("ozu", trigger2Reloaded.UserId);
            Assert.AreEqual(startDateTime.ToString(CultureInfo.InvariantCulture), trigger2Reloaded.StartDateTimeUtc.ToString(CultureInfo.InvariantCulture));
        }