public static async Task <CloudStampyParameters> TestRunner([QueueTrigger("test-jobs", Connection = "StampyStorageConnectionString")] CloudStampyParameters request) { var nextJob = request.Copy(); nextJob.JobId = Guid.NewGuid().ToString(); if ((request.JobType & StampyJobType.Test) == StampyJobType.Test && (request.FlowStatus == Status.InProgress || request.FlowStatus == default(Status))) { if (request.TestCategories.Any() && !string.IsNullOrWhiteSpace(request.BuildPath) && !string.IsNullOrWhiteSpace(request.CloudName)) { var resultTasks = new List <Task <JobResult> >(); var results = new List <JobResult>(); foreach (var testCategorySet in request.TestCategories) { foreach (var testCategory in testCategorySet) { var testJob = request.Copy(); testJob.JobId = Guid.NewGuid().ToString(); testJob.TestCategories = new List <List <string> > { new List <string> { testCategory } }; //test should timeout after 180 minutes. //TODO double check if function runtime has default timeout resultTasks.Add(ExecuteJob(testJob, StampyJobType.Test, TimeSpan.FromHours(5))); } var testCategoryResults = await Task.WhenAll(resultTasks); resultTasks.Clear(); results.AddRange(testCategoryResults); } nextJob.FlowStatus = JobStatusHelper.DetermineOverallJobStatus(results); if ((nextJob.JobType & StampyJobType.RemoveResources) != StampyJobType.RemoveResources) { nextJob.JobType = nextJob.JobType | StampyJobType.RemoveResources; } nextJob.ExpiryDate = DateTime.UtcNow.AddHours(1).ToString(); } } return(nextJob); }
public static async Task <CloudStampyParameters> BuildChanges([QueueTrigger("build-jobs", Connection = "StampyStorageConnectionString")] CloudStampyParameters request) { if (string.IsNullOrWhiteSpace(request.JobId)) { request.JobId = Guid.NewGuid().ToString(); } var serviceCreationJob = request.Copy(); if ((request.JobType & StampyJobType.Build) == StampyJobType.Build) { var result = await ExecuteJob(request, StampyJobType.Build, TimeSpan.FromMinutes(120)); if (result.ResultDetails.TryGetValue("Build Share", out object val)) { serviceCreationJob.BuildPath = (string)val; } else { eventsLogger.WriteError("Build Share is empty"); } serviceCreationJob.FlowStatus = result.JobStatus == Status.Passed ? Status.InProgress : result.JobStatus; } serviceCreationJob.JobId = Guid.NewGuid().ToString(); return(serviceCreationJob); }
public static async Task <CloudStampyParameters> DeployToCloudService([QueueTrigger("deployment-jobs", Connection = "StampyStorageConnectionString")] CloudStampyParameters myQueueItem) { var nextJob = myQueueItem.Copy(); if ((myQueueItem.JobType & StampyJobType.Deploy) == StampyJobType.Deploy && (myQueueItem.FlowStatus == Status.InProgress || myQueueItem.FlowStatus == default(Status))) { var jobResult = await ExecuteJob(myQueueItem, StampyJobType.Deploy, TimeSpan.FromMinutes(240)); nextJob.FlowStatus = jobResult.JobStatus == Status.Passed ? Status.InProgress : jobResult.JobStatus; } nextJob.JobId = Guid.NewGuid().ToString(); return(nextJob); }
public static async Task CreateCloudService([QueueTrigger("service-creation-jobs", Connection = "StampyStorageConnectionString")] CloudStampyParameters request, [Queue("deployment-jobs")] ICollector <CloudStampyParameters> deploymentJobsQueue) { JobResult result; if ((request.JobType & StampyJobType.CreateService) == StampyJobType.CreateService && (request.FlowStatus == Status.InProgress || request.FlowStatus == default(Status))) { if (string.IsNullOrWhiteSpace(request.CloudName)) { const string alphanumericalchars = "abcdefghijklmnopqrstuvwxyz1234567890"; var rng = new RNGCryptoServiceProvider(); byte[] xx = new byte[16]; rng.GetBytes(xx); char[] y = new char[8]; for (int i = 0; i < y.Length; i++) { y[i] = alphanumericalchars[(xx[i] % alphanumericalchars.Length)]; } request.CloudName = $"stampy-{new string(y)}"; } result = await ExecuteJob(request, StampyJobType.CreateService, TimeSpan.FromMinutes(10)); if (result.JobStatus == Status.Passed) { //TODO check the deployment template set in the parameters. Use that to determine what kind of service to create //ServiceCreator creates the service using SetupPrivateStampWithGeo which essentially creates two cloud services. So enqueue a job to deploy to stamp and geomaster var geomasterJob = new CloudStampyParameters { RequestId = request.RequestId, JobId = Guid.NewGuid().ToString(), BuildPath = request.BuildPath, CloudName = $"{request.CloudName}geo", DeploymentTemplate = "GeoMaster_StompDeploy.xml", JobType = request.JobType, TestCategories = request.TestCategories, FlowStatus = result.JobStatus == Status.Passed ? Status.InProgress : result.JobStatus }; var stampJob = new CloudStampyParameters { RequestId = request.RequestId, JobId = Guid.NewGuid().ToString(), BuildPath = request.BuildPath, CloudName = $"{request.CloudName}", DeploymentTemplate = "Antares_StompDeploy.xml", JobType = request.JobType, TestCategories = request.TestCategories, FlowStatus = result.JobStatus == Status.Passed ? Status.InProgress : result.JobStatus }; deploymentJobsQueue.Add(geomasterJob); deploymentJobsQueue.Add(stampJob); } } else { var p = request.Copy(); p.JobId = Guid.NewGuid().ToString(); deploymentJobsQueue.Add(p); } }