Inheritance: IValidatableObject
Ejemplo n.º 1
0
		public void AddItemToJobQueue(JobQueueItem jobQueueItem)
		{
			try
			{
				Monitor.Enter(_lockAddItemToJobQueue);

				using (var sqlConnection = new SqlConnection(_connectionString))
				{
					sqlConnection.OpenWithRetry(_retryPolicy);
					using (var sqlCommand = _createSqlCommandHelper.CreateInsertIntoJobQueueCommand(jobQueueItem, sqlConnection, null))
					{
						sqlCommand.ExecuteNonQueryWithRetry(_retryPolicy);
					}
				}
			}
			catch (Exception exp)
			{
				this.Log().ErrorWithLineNumber(exp.Message, exp);
				throw;
			}
			finally
			{
				Monitor.Exit(_lockAddItemToJobQueue);
			}
		}
Ejemplo n.º 2
0
		public void ShouldBeAbleToPersistNewJobQueueItem()
		{
			var jobQueueItem = new JobQueueItem
			{
				Name = "Name Test",
				CreatedBy = "Created By Test",
				Serialized = "Serialized Test",
				Type = "Type Test"
			};

			ManagerController.AddItemToJobQueue(jobQueueItem);

			JobRepository.GetAllItemsInJobQueue().Count.Should().Be.EqualTo(1);
		}
		public void ShouldReturnBadRequestIfJobQueueItemHasInvalidCreatedByValue()
		{
			var jobQueueItem = new JobQueueItem
			{
				Name = "Name",
				Serialized = "Serialized",
				Type = "Type",
				CreatedBy = string.Empty
			};

			var response = ManagerController.AddItemToJobQueue(jobQueueItem);

			Assert.IsInstanceOf(typeof(BadRequestErrorMessageResult), response);
		}
Ejemplo n.º 4
0
		public void ShouldBeAbleToSendAQueuedJob()
		{
			var jobQueueItem = new JobQueueItem
			{
				JobId = Guid.NewGuid(),
				Name = "Name Test",
				CreatedBy = "Created By Test",
				Serialized = "Serialized Test",
				Type = "Type Test"
			};

			WorkerNodeRepository.AddWorkerNode(_workerNode);
			
			JobManager.AddItemToJobQueue(jobQueueItem);

			JobManager.AssignJobToWorkerNodes();

			JobRepository.GetAllItemsInJobQueue().Count.Should().Be(0);
			JobRepository.GetAllJobs().Count.Should().Be(1);
		}
Ejemplo n.º 5
0
		public void ShouldBeAbleToCancelJobOnNode()
		{
			var jobQueueItem = new JobQueueItem
			{
				JobId = Guid.NewGuid(),
				Name = "Name Test",
				CreatedBy = "Created By Test",
				Serialized = "Serialized Test",
				Type = "Type Test"
			};

			NodeRepository.AddWorkerNode(_workerNode);

			JobRepository.AddItemToJobQueue(jobQueueItem);

			JobRepository.AssignJobToWorkerNode();

			HttpSender.CallToWorkerNodes.Clear();
			ManagerController.CancelJobByJobId(jobQueueItem.JobId);

			HttpSender.CallToWorkerNodes.Count().Should().Be.EqualTo(1);
		}
Ejemplo n.º 6
0
		public void ShouldGetUniqueJobIdWhilePersistingJob()
		{
			var jobQueueItem1 = new JobQueueItem
			{
				Name = "Name1 Test",
				CreatedBy = "Created By Test",
				Serialized = "Serialized Test",
				Type = "Type Test"
			};
			var jobQueueItem2 = new JobQueueItem
			{
				Name = "Name2 Test",
				CreatedBy = "Created By Test",
				Serialized = "Serialized Test",
				Type = "Type Test"
			};

			ManagerController.AddItemToJobQueue(jobQueueItem1);
			ManagerController.AddItemToJobQueue(jobQueueItem2);

			var queuedItems = JobRepository.GetAllItemsInJobQueue();

			queuedItems[0].Should().Not.Be.EqualTo(queuedItems[1]);
		}
		public void ShouldReturnBadRequestIfJobRequestModelSerializedIsEmptyString()
		{
			var jobQueueItem = new JobQueueItem
			{
				Name = "Name",
				Serialized = string.Empty,
				Type = "Type",
				CreatedBy = "UserName"
			};

			var response =
				ManagerController.AddItemToJobQueue(jobQueueItem);

			Assert.IsInstanceOf(typeof(BadRequestErrorMessageResult), response);
		}
Ejemplo n.º 8
0
		public void ShouldBeAbleToCancelJobIfStarted()
		{
			var jobQueueItem = new JobQueueItem
			{
				JobId = Guid.NewGuid(),
				Name = "Name Test",
				CreatedBy = "Created By Test",
				Serialized = "Serialized Test",
				Type = "Type Test"
			};

			WorkerNodeRepository.AddWorkerNode(_workerNode);
		
			JobManager.AddItemToJobQueue(jobQueueItem);
			
			JobManager.AssignJobToWorkerNodes();
			
			var job = JobManager.GetJobByJobId(jobQueueItem.JobId);
			job.Satisfy(job1 => job1.Started != null);
			
			JobManager.CancelJobByJobId(jobQueueItem.JobId);
			
			job = JobManager.GetJobByJobId(jobQueueItem.JobId);
			job.Satisfy(job1 => job1.Result.StartsWith("cancel", StringComparison.InvariantCultureIgnoreCase));
			
			JobRepository.GetAllJobs().Count.Should().Be(1);
		}
Ejemplo n.º 9
0
		public void ShouldBeAbleToAddToJobQueue()
		{
			var jobQueueItem = new JobQueueItem
			{
				JobId = Guid.NewGuid(),
				Name = "Name Test",
				CreatedBy = "Created By Test",
				Serialized = "Serialized Test",
				Type = "Type Test"
			};

			JobManager.AddItemToJobQueue(jobQueueItem);
			
			JobRepository.GetAllItemsInJobQueue().Count.Should().Be(1);
		}
Ejemplo n.º 10
0
		private JobQueueItem CreateJobQueueItemFromSqlDataReader(SqlDataReader sqlDataReader)
		{
			var jobQueueItem = new JobQueueItem
			{
				JobId = sqlDataReader.GetGuid(sqlDataReader.GetOrdinal("JobId")),
				Name = sqlDataReader.GetNullableString(sqlDataReader.GetOrdinal("Name")),
				Serialized = sqlDataReader.GetNullableString(sqlDataReader.GetOrdinal("Serialized")).Replace(@"\", @""),
				Type = sqlDataReader.GetNullableString(sqlDataReader.GetOrdinal("Type")),
				CreatedBy = sqlDataReader.GetNullableString(sqlDataReader.GetOrdinal("CreatedBy")),
				Created = sqlDataReader.GetDateTime(sqlDataReader.GetOrdinal("Created"))
			};
			return jobQueueItem;
		}
Ejemplo n.º 11
0
		public void ShouldBeAbleToRequeueDeadJob()
		{
			var jobQueueItem = new JobQueueItem
			{
				JobId = Guid.NewGuid(),
				Name = "Name Test",
				CreatedBy = "Created By Test",
				Serialized = "Serialized Test",
				Type = "Type Test"
			};

			WorkerNodeRepository.AddWorkerNode(_workerNode);
		
			JobManager.AddItemToJobQueue(jobQueueItem);
			
			JobManager.AssignJobToWorkerNodes();
			
			var job = JobManager.GetJobByJobId(jobQueueItem.JobId);
			job.Satisfy(job1 => job1.Started != null);
			job.Satisfy(job1 => job1.Ended == null);

			NodeManager.RequeueJobsThatDidNotFinishedByWorkerNodeUri(new Uri(job.SentToWorkerNodeUri));

			JobRepository.GetAllJobs().Count.Should().Be(0);
			JobRepository.GetAllItemsInJobQueue().Count.Should().Be(1);
		}
Ejemplo n.º 12
0
		public void ShouldDeleteJobFromJobQueueIfNotAssignedToWorkerNode()
		{
			var jobQueueItem = new JobQueueItem
			{
				JobId = Guid.NewGuid(),
				Name = "Name Test",
				CreatedBy = "Created By Test",
				Serialized = "Serialized Test",
				Type = "Type Test"
			};

			JobManager.AddItemToJobQueue(jobQueueItem);

			JobManager.CancelJobByJobId(jobQueueItem.JobId);

			JobRepository.GetAllItemsInJobQueue().Count.Should().Be(0);
		}
Ejemplo n.º 13
0
		public void AddItemToJobQueue(JobQueueItem jobQueueItem)
		{
			_jobRepository.AddItemToJobQueue(jobQueueItem);
		}
Ejemplo n.º 14
0
		public SqlCommand CreateInsertIntoJobCommand(JobQueueItem jobQueueItem, string sentToWorkerNodeUri, SqlConnection sqlConnection, SqlTransaction sqlTransaction)
		{
			var insertIntoJobCommandText = @"INSERT INTO [Stardust].[Job]
								   ([JobId]
								   ,[Name]
								   ,[Created]
								   ,[CreatedBy]
								   ,[Started]
								   ,[Ended]
								   ,[Serialized]
								   ,[Type]
								   ,[SentToWorkerNodeUri]
								   ,[Result])
							 VALUES
								   (@JobId
								   ,@Name
								   ,@Created
								   ,@CreatedBy
								   ,@Started
								   ,@Ended
								   ,@Serialized
								   ,@Type
								   ,@SentToWorkerNodeUri
								   ,@Result)";

			var insertCommand = new SqlCommand(insertIntoJobCommandText, sqlConnection);
			insertCommand.Transaction = sqlTransaction;

			insertCommand.Parameters.AddWithValue("@JobId", jobQueueItem.JobId);
			insertCommand.Parameters.AddWithValue("@Name", jobQueueItem.Name);
			insertCommand.Parameters.AddWithValue("@Type", jobQueueItem.Type);
			insertCommand.Parameters.AddWithValue("@Serialized", jobQueueItem.Serialized);
			insertCommand.Parameters.AddWithValue("@Started", DateTime.UtcNow);
			insertCommand.Parameters.AddWithValue("@SentToWorkerNodeUri", sentToWorkerNodeUri);
			insertCommand.Parameters.AddWithValue("@CreatedBy", jobQueueItem.CreatedBy);
			insertCommand.Parameters.AddWithValue("@Created", jobQueueItem.Created);
			insertCommand.Parameters.AddWithValue("@Ended", DBNull.Value);

			return insertCommand;
		}
Ejemplo n.º 15
0
		public void ShouldAssignANewIdForANewQueueItem()
		{
			Guid oldGuid = Guid.NewGuid();
			var jobQueueItem = new JobQueueItem
			{
				JobId = oldGuid,
				Name = "Name",
				Serialized = "Serialized",
				Type = "Type",
				CreatedBy = "CreatedBy"
			};

			ManagerController.AddItemToJobQueue(jobQueueItem);

			var queuedItems = JobRepository.GetAllItemsInJobQueue();

			queuedItems[0].JobId.Should().Not.Be.EqualTo(oldGuid);
		}
Ejemplo n.º 16
0
		public SqlCommand CreateInsertIntoJobQueueCommand(JobQueueItem jobQueueItem, SqlConnection sqlConnection, SqlTransaction sqlTransaction)
		{
			const string insertIntoJobQueueCommandText = @"INSERT INTO [Stardust].[JobQueue]
							   ([JobId],
								[Name],
								[Type],
								[Serialized],
								[CreatedBy],
								[Created])
							VALUES 
								(@JobId,
								 @Name,
								 @Type,
								 @Serialized,
								 @CreatedBy,
								 @Created)";

			var insertCommand = new SqlCommand(insertIntoJobQueueCommandText, sqlConnection);
			insertCommand.Transaction = sqlTransaction;

			insertCommand.Parameters.AddWithValue("@JobId", jobQueueItem.JobId);
			insertCommand.Parameters.AddWithValue("@Name", jobQueueItem.Name);
			insertCommand.Parameters.AddWithValue("@Type", jobQueueItem.Type);
			insertCommand.Parameters.AddWithValue("@Serialized", jobQueueItem.Serialized);
			insertCommand.Parameters.AddWithValue("@Created", DateTime.UtcNow);
			insertCommand.Parameters.AddWithValue("@CreatedBy", jobQueueItem.CreatedBy);

			return insertCommand;
		}
Ejemplo n.º 17
0
		public void ShouldReturnIdOfPersistedJob()
		{
			var jobQueueItem = new JobQueueItem
			{
				Name = "Name Test",
				CreatedBy = "Created By Test",
				Serialized = "Serialized Test",
				Type = "Type Test"
			};
			
			IHttpActionResult actionResult =
				ManagerController.AddItemToJobQueue(jobQueueItem);

			var okNegotiatedContentResult = actionResult as OkNegotiatedContentResult<Guid>;
			var jobId = okNegotiatedContentResult.Content;

			jobId.Satisfy(guid => guid != Guid.Empty);
		}
Ejemplo n.º 18
0
		public void ShouldSendTheJobToAnotherNodeIfFirstReturnsConflict()
		{
			var jobQueueItem = new JobQueueItem
			{
				Name = "Name Test",
				CreatedBy = "Created By Test",
				Serialized = "Serialized Test",
				Type = "Type Test"
			};

			var workerNode2 = new WorkerNode
			{
				Url = new Uri("http://localhost:9051/")
			};
			
			NodeRepository.AddWorkerNode(_workerNode);
			Thread.Sleep(TimeSpan.FromSeconds(1));
			NodeRepository.AddWorkerNode(workerNode2);
			ThisNodeIsBusy(workerNode2.Url);

			ManagerController.AddItemToJobQueue(jobQueueItem);
			
			while (true)
			{
				if (JobRepository.GetAllJobs().Count == 1)
					break;
			}
			
			JobRepository.GetAllJobs().First().SentToWorkerNodeUri.Should().Be.EqualTo(_workerNode.Url.ToString());
		}
Ejemplo n.º 19
0
		public void ShouldRemoveAQueuedJobIfCancelled()
		{
			var jobQueueItem = new JobQueueItem
			{
				JobId = Guid.NewGuid(),
				Name = "Name Test",
				CreatedBy = "Created By Test",
				Serialized = "Serialized Test",
				Type = "Type Test"
			};

			NodeRepository.AddWorkerNode(_workerNode);

			JobRepository.AddItemToJobQueue(jobQueueItem);

			JobRepository.AssignJobToWorkerNode();

			ManagerController.CancelJobByJobId(jobQueueItem.JobId);

			JobRepository.GetAllItemsInJobQueue().Count.Should().Be.EqualTo(0);
		}
		public void ShouldReturnBadRequestIfJobRequestModelUserNameIsNull()
		{
			var jobQueueItem = new JobQueueItem
			{
				Name = "Name",
				Serialized = "Serialized",
				Type = "Type",
				CreatedBy = null
			};

			var response =
				ManagerController.AddItemToJobQueue(jobQueueItem);

			Assert.IsInstanceOf(typeof(BadRequestErrorMessageResult), response);
		}
Ejemplo n.º 21
0
		public void ShouldDoNothing_WhenNoWorkerNodeExists_AndJobQueueHasItems()
		{
			var jobQueueItem = new JobQueueItem
			{
				JobId = Guid.NewGuid(),
				Name = "Name Test",
				CreatedBy = "Created By Test",
				Serialized = "Serialized Test",
				Type = "Type Test"
			};

			JobManager.AddItemToJobQueue(jobQueueItem);

			JobManager.AssignJobToWorkerNodes();

			FakeHttpSender.CallToWorkerNodes.Should().Be.Empty();
		}
Ejemplo n.º 22
0
		public void RequeueJobThatDidNotEndByWorkerNodeUri(string workerNodeUri)
		{
			try
			{
				using (var sqlConnection = new SqlConnection(_connectionString))
				{
					sqlConnection.OpenWithRetry(_retryPolicy);

					using (var sqlTransaction = sqlConnection.BeginTransaction())
					{
						Job job = null;
						using (var selectJobThatDidNotEndCommand = _createSqlCommandHelper.CreateSelectJobThatDidNotEndCommand(workerNodeUri, sqlConnection, sqlTransaction))
						{
							using (var sqlDataReader = selectJobThatDidNotEndCommand.ExecuteReaderWithRetry(_retryPolicy))
							{
								if (sqlDataReader.HasRows)
								{
									sqlDataReader.Read();
									job = CreateJobFromSqlDataReader(sqlDataReader);
								}
							}
						}
						if (job != null)
						{
							var jobQueueItem = new JobQueueItem
							{
								Created = job.Created,
								CreatedBy = job.CreatedBy,
								JobId = job.JobId,
								Serialized = job.Serialized,
								Name = job.Name,
								Type = job.Type
							};

							using (var insertIntojobQueueCommand = _createSqlCommandHelper.CreateInsertIntoJobQueueCommand(jobQueueItem, sqlConnection, sqlTransaction))
							{
								insertIntojobQueueCommand.ExecuteNonQueryWithRetry(_retryPolicy);
							}
							using (var deleteJobByJobIdCommand = _createSqlCommandHelper.CreateDeleteJobByJobIdCommand(jobQueueItem.JobId, sqlConnection, sqlTransaction))
							{
								deleteJobByJobIdCommand.ExecuteNonQueryWithRetry(_retryPolicy);
							}
							Retry(sqlTransaction.Commit);
						}
					}
				}
			}
			catch (Exception exp)
			{
				this.Log().ErrorWithLineNumber(exp.Message, exp);
				throw;
			}
		}
Ejemplo n.º 23
0
		public void AddItemToJobQueue(JobQueueItem jobQueueItem)
		{
			_jobQueue.Add(jobQueueItem);
		}