示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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);
            }
        }