示例#1
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);
        }
示例#2
0
        public static IJob GetJob(ICloudStampyLogger logger, CloudStampyParameters args, StampyJobType requestedJobType)
        {
            IJob job = null;

            switch (requestedJobType)
            {
            case StampyJobType.None:
                break;

            case StampyJobType.CreateService:
                job = new ServiceCreationJob(logger, args);
                break;

            case StampyJobType.Build:
                job = new BuildJob(logger, args);
                break;

            case StampyJobType.Deploy:
                job = new DeploymentJob(logger, args);
                break;

            case StampyJobType.Test:
                job = new TestJob(logger, args);
                break;

            case StampyJobType.RemoveResources:
                job = new ScavengerJob(logger, args);
                break;

            default:
                break;
            }

            return(job);
        }
 public AntaresDeploymentBaseJob(ICloudStampyLogger logger, CloudStampyParameters cloudStampyArgs)
 {
     _logger               = logger;
     _result               = new JobResult();
     Parameters            = cloudStampyArgs;
     _statusMessageBuilder = new StringBuilder();
 }
示例#4
0
 public OneBranchBuildClient(ICloudStampyLogger logger, CloudStampyParameters cloudStampyArgs)
 {
     _logger           = logger;
     _cloudStampyArgs  = cloudStampyArgs;
     _buildLogsWritter = new AzureFileLogger(new LoggingConfiguration(), cloudStampyArgs, logger);
     _buildLogsWriterUnfinishedJobs = new List <Task>();
     _runningProcess = new List <ProcessAction>();
 }
示例#5
0
 public AzureFileLogger(IConfiguration configuration, CloudStampyParameters p, ICloudStampyLogger logger)
 {
     _loggingTasks  = new ConcurrentQueue <Task>();
     _kustoLogger   = logger;
     _parameters    = p;
     _configuration = configuration;
     _requests      = new ConcurrentQueue <string>();
     LogUrls        = new Dictionary <string, string>();
 }
示例#6
0
 public ServiceCreationJob(ICloudStampyLogger logger, CloudStampyParameters cloudStampyArgs)
 {
     _logger                        = logger;
     _result                        = new JobResult();
     _parameters                    = cloudStampyArgs;
     _statusMessageBuilder          = new StringBuilder();
     _azureFilesWriter              = new AzureFileLogger(new LoggingConfiguration(), cloudStampyArgs, logger);
     _azureLogsWriterUnfinishedJobs = new List <Task>();
 }
示例#7
0
 public DeploymentJob(ICloudStampyLogger logger, CloudStampyParameters cloudStampyArgs)
 {
     _logger               = logger;
     _result               = new JobResult();
     _parameters           = cloudStampyArgs;
     _statusMessageBuilder = new StringBuilder();
     _deploymentContent    = new ConcurrentQueue <string>();
     _loggingTasks         = new List <Task>();
 }
示例#8
0
        public BuildJob(ICloudStampyLogger logger, CloudStampyParameters cloudStampyArgs)
        {
            _logger = logger;
            _args   = cloudStampyArgs;

            if (!string.IsNullOrWhiteSpace(_args.DpkPath))
            {
                _buildClient = new LabMachineBuildClient(_logger, _args);
            }
            else
            {
                _buildClient = new OneBranchBuildClient(_logger, _args);
            }
        }
示例#9
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);
        }
示例#10
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);
        }
示例#11
0
 public ScavengerJob(ICloudStampyLogger logger, CloudStampyParameters cloudStampyArgs) : base(logger, cloudStampyArgs)
 {
 }
示例#12
0
 public static ITestClient GetTestClient(ICloudStampyLogger logger, CloudStampyParameters args)
 {
     return(new LabMachineTestClient(logger, args));
 }
示例#13
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);
            }
        }
示例#14
0
        private static async Task <JobResult> ExecuteJob(CloudStampyParameters queueItem, StampyJobType requestedJobType, TimeSpan timeout)
        {
            JobResult jobResult    = null;
            Exception jobException = null;

            var sw  = new Stopwatch();
            var job = JobFactory.GetJob(eventsLogger, queueItem, requestedJobType);

            if (job != null)
            {
                try
                {
                    sw.Start();
                    eventsLogger.WriteInfo(queueItem, "start job");
                    var jobResultTask = Task.Run(() => job.Execute());
                    var timeoutTask   = Task.Run(async() => await Task.Delay(timeout));

                    Task finishedTask;

                    while (true)
                    {
                        var timerTask = Task.Run(async() => await Task.Delay(TimeSpan.FromMinutes(1)));
                        finishedTask = await Task.WhenAny(new Task[] { jobResultTask, timerTask, timeoutTask });

                        //log the progress of the job
                        resultsLogger.WriteJobProgress(queueItem.RequestId, queueItem.JobId, requestedJobType, job.JobStatus.ToString(), job.ReportUri);

                        if (finishedTask.Id == jobResultTask.Id)
                        {
                            //job is done
                            jobResult = await jobResultTask;
                            break;
                        }
                        else if (finishedTask.Id == timeoutTask.Id)
                        {
                            jobResult = new JobResult {
                                JobStatus = Status.Cancelled
                            };
                            eventsLogger.WriteError(queueItem, $"Cancel job. {job.GetType().ToString()} took longer than timeout of {timeout.TotalMinutes.ToString()}mins");
                            var isCancelled = await job.Cancel();

                            if (!isCancelled)
                            {
                                eventsLogger.WriteError(queueItem, "Error while cancelling job");
                            }
                            else
                            {
                                eventsLogger.WriteInfo(queueItem, "Cancelled job successfully");
                            }

                            break;
                        }
                    }
                    sw.Stop();
                }
                catch (Exception ex)
                {
                    jobException = ex;
                    jobResult    = new JobResult {
                        JobStatus = Status.Failed
                    };
                    eventsLogger.WriteError(queueItem, "Error while running job", ex);
                    throw new JobExecutionException(job.GetType().Name, "Error while running job", ex);
                }
                finally
                {
                    resultsLogger.WriteResult(queueItem.RequestId, queueItem.JobId, requestedJobType, jobResult.JobStatus.ToString(), (int)sw.Elapsed.TotalMinutes, job.ReportUri, jobException);
                }
            }
            else
            {
                eventsLogger.WriteError(queueItem, "Cannot run this job");
            }

            return(jobResult);
        }
示例#15
0
 public TestJob(ICloudStampyLogger logger, CloudStampyParameters args)
 {
     _logger = logger;
     _args   = args;
 }
示例#16
0
 public void WriteError(CloudStampyParameters stampyParameters, string source, string message, Exception ex = null)
 {
     Write(stampyParameters.RequestId, stampyParameters.JobId, source, message, ex);
 }
示例#17
0
 public void WriteInfo(CloudStampyParameters stampyParameters, string source, string message)
 {
     Write(stampyParameters.RequestId, stampyParameters.JobId, source, message, null);
 }
示例#18
0
 public LabMachineBuildClient(ICloudStampyLogger logger, CloudStampyParameters cloudStampArgs)
 {
     _logger = logger;
     _args   = cloudStampArgs;
 }
示例#19
0
 public LabMachineTestClient(ICloudStampyLogger logger, CloudStampyParameters args)
 {
     _logger = logger;
     _args   = args;
 }