// 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;
}
}
}