// Copyright Epic Games, Inc. All Rights Reserved. using System; using System.Collections.Generic; using System.Linq; using EpicGames.Core; using EpicGames.Horde.Commits; using EpicGames.Horde.Jobs.Templates; #pragma warning disable CA2227 // Change x to be read-only by removing the property setter namespace EpicGames.Horde.Jobs.Schedules { /// /// Response describing a schedule /// public class GetScheduleResponse { /// /// Whether the schedule is currently enabled /// public bool Enabled { get; set; } /// /// Maximum number of scheduled jobs at once /// public int MaxActive { get; set; } /// /// Maximum number of changes the schedule can fall behind head revision. If greater than zero, builds will be triggered for every submitted changelist until the backlog is this size. /// public int MaxChanges { get; set; } /// /// Whether the build requires a change to be submitted /// public bool RequireSubmittedChange { get; set; } /// /// Gate for this schedule to trigger /// public GetScheduleGateResponse? Gate { get; set; } /// /// Which commits to run this job for /// public List? Commits { get; set; } /// /// Parameters for the template /// public Dictionary TemplateParameters { get; set; } /// /// New patterns for the schedule /// public List Patterns { get; set; } /// /// Last changelist number that this was triggered for /// [Obsolete("Use LastTriggerCommitId instead")] public int LastTriggerChange { get => _lastTriggerChange ?? _lastTriggerCommitId?.TryGetPerforceChange() ?? 0; set => _lastTriggerChange = value; } int? _lastTriggerChange; /// /// Last changelist number that this was triggered for /// public CommitIdWithOrder? LastTriggerCommitId { get => _lastTriggerCommitId ?? CommitIdWithOrder.FromPerforceChange(_lastTriggerChange); set => _lastTriggerCommitId = value; } CommitIdWithOrder? _lastTriggerCommitId; /// /// Last time that the schedule was triggered /// public DateTimeOffset LastTriggerTime { get; set; } /// /// Next trigger times for schedule /// public List NextTriggerTimesUTC { get; set; } /// /// List of active jobs /// public List ActiveJobs { get; set; } /// /// Default constructor /// public GetScheduleResponse() { Patterns = new List(); TemplateParameters = new Dictionary(); NextTriggerTimesUTC = new List(); ActiveJobs = new List(); } /// /// Constructor /// /// Schedule to construct from /// The scheduler time zone public GetScheduleResponse(ISchedule schedule, TimeZoneInfo schedulerTimeZone) { Enabled = schedule.Enabled; MaxActive = schedule.MaxActive; MaxChanges = schedule.MaxChanges; RequireSubmittedChange = schedule.RequireSubmittedChange; Gate = (schedule.Gate == null) ? null : new GetScheduleGateResponse(schedule.Gate); Commits = schedule.Commits?.ToList(); TemplateParameters = schedule.TemplateParameters.ToDictionary(); Patterns = schedule.Patterns.ConvertAll(x => new GetSchedulePatternResponse(x)); LastTriggerCommitId = schedule.LastTriggerCommitId; LastTriggerTime = schedule.LastTriggerTimeUtc; ActiveJobs = new List(schedule.ActiveJobs); DateTime curTime = schedule.LastTriggerTimeUtc; NextTriggerTimesUTC = new List(); for (int i = 0; i < 16; i++) { DateTime? nextTime = schedule.GetNextTriggerTimeUtc(curTime, schedulerTimeZone); if (nextTime == null) { break; } curTime = nextTime.Value; NextTriggerTimesUTC.Add(curTime); } } } /// /// Gate allowing a schedule to trigger. /// public class GetScheduleGateResponse { /// /// The template containing the dependency /// public TemplateId TemplateId { get; set; } /// /// Target to wait for /// public string Target { get; set; } /// /// Default constructor /// public GetScheduleGateResponse() { Target = String.Empty; } /// /// Constructor /// public GetScheduleGateResponse(IScheduleGate gate) { TemplateId = gate.TemplateId; Target = gate.Target; } } /// /// Parameters to create a new schedule /// public class GetSchedulePatternResponse { /// /// Days of the week to run this schedule on. If null, the schedule will run every day. /// public List? DaysOfWeek { get; set; } /// /// Time during the day for the first schedule to trigger. Measured in minutes from midnight. /// public ScheduleTimeOfDay MinTime { get; set; } = new ScheduleTimeOfDay(0); /// /// Time during the day for the last schedule to trigger. Measured in minutes from midnight. /// public ScheduleTimeOfDay? MaxTime { get; set; } /// /// Interval between each schedule triggering /// public ScheduleInterval? Interval { get; set; } /// /// Constructor /// public GetSchedulePatternResponse() { } /// /// Constructor /// public GetSchedulePatternResponse(ISchedulePattern pattern) { DaysOfWeek = pattern.DaysOfWeek?.ToList(); MinTime = pattern.MinTime; MaxTime = pattern.MaxTime; Interval = pattern.Interval; } } /// /// Response describing when a schedule is expected to trigger /// public class GetScheduleForecastResponse { /// /// Next trigger times /// public List Times { get; set; } /// /// Constructor /// /// List of trigger times public GetScheduleForecastResponse(List times) { Times = times; } } }