mirror of
https://github.com/microsoft/onefuzz.git
synced 2025-06-15 19:38:11 +00:00
@ -122,16 +122,37 @@ public enum ScalesetState
|
||||
CreationFailed
|
||||
}
|
||||
|
||||
|
||||
public enum JobState
|
||||
{
|
||||
Init,
|
||||
Enabled,
|
||||
Stopping,
|
||||
Stopped
|
||||
}
|
||||
|
||||
public static class JobStateHelper
|
||||
{
|
||||
private static readonly HashSet<JobState> _shuttingDown = new HashSet<JobState>(new[] { JobState.Stopping, JobState.Stopped });
|
||||
private static readonly HashSet<JobState> _avaiable = new HashSet<JobState>(new[] { JobState.Init, JobState.Enabled });
|
||||
private static readonly HashSet<JobState> _needsWork = new HashSet<JobState>(new[] { JobState.Init, JobState.Stopping });
|
||||
|
||||
public static IReadOnlySet<JobState> Available => _avaiable;
|
||||
public static IReadOnlySet<JobState> NeedsWork => _needsWork;
|
||||
public static IReadOnlySet<JobState> ShuttingDown => _shuttingDown;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static class ScalesetStateHelper
|
||||
{
|
||||
|
||||
static ConcurrentDictionary<string, ScalesetState[]> _states = new ConcurrentDictionary<string, ScalesetState[]>();
|
||||
|
||||
/// set of states that indicate the scaleset can be updated
|
||||
public static ScalesetState[] CanUpdate()
|
||||
{
|
||||
return
|
||||
_states.GetOrAdd("CanUpdate", k => new[]{
|
||||
_states.GetOrAdd(nameof(CanUpdate), k => new[]{
|
||||
ScalesetState.Running,
|
||||
ScalesetState.Resize
|
||||
});
|
||||
@ -141,7 +162,7 @@ public static class ScalesetStateHelper
|
||||
public static ScalesetState[] NeedsWork()
|
||||
{
|
||||
return
|
||||
_states.GetOrAdd("CanUpdate", k => new[]{
|
||||
_states.GetOrAdd(nameof(NeedsWork), k => new[]{
|
||||
ScalesetState.Init,
|
||||
ScalesetState.Setup,
|
||||
ScalesetState.Resize,
|
||||
@ -154,7 +175,7 @@ public static class ScalesetStateHelper
|
||||
public static ScalesetState[] Available()
|
||||
{
|
||||
return
|
||||
_states.GetOrAdd("CanUpdate", k =>
|
||||
_states.GetOrAdd(nameof(Available), k =>
|
||||
{
|
||||
return
|
||||
new[]{
|
||||
@ -168,7 +189,7 @@ public static class ScalesetStateHelper
|
||||
public static ScalesetState[] Resizing()
|
||||
{
|
||||
return
|
||||
_states.GetOrAdd("CanDelete", k =>
|
||||
_states.GetOrAdd(nameof(Resizing), k =>
|
||||
{
|
||||
return
|
||||
new[]{
|
||||
@ -222,7 +243,7 @@ public static class TaskStateHelper
|
||||
public static TaskState[] Available()
|
||||
{
|
||||
return
|
||||
_states.GetOrAdd("Available", k =>
|
||||
_states.GetOrAdd(nameof(Available), k =>
|
||||
{
|
||||
return
|
||||
new[]{
|
||||
|
@ -524,3 +524,27 @@ public record SecretData<T>(T Secret)
|
||||
return "[REDACTED]";
|
||||
}
|
||||
}
|
||||
|
||||
public record JobConfig(
|
||||
string Project,
|
||||
string Name,
|
||||
string Build,
|
||||
int Duration,
|
||||
string? Logs
|
||||
);
|
||||
|
||||
public record JobTaskInfo(
|
||||
Guid TaskId,
|
||||
TaskType Type,
|
||||
TaskState State
|
||||
);
|
||||
|
||||
public record Job(
|
||||
[PartitionKey] Guid JobId,
|
||||
JobState State,
|
||||
JobConfig Config,
|
||||
string? Error,
|
||||
DateTimeOffset? EndTime,
|
||||
List<JobTaskInfo>? TaskInfo,
|
||||
UserInfo UserInfo
|
||||
) : StatefulEntityBase<JobState>(State);
|
||||
|
@ -83,6 +83,7 @@ public class Program
|
||||
.AddScoped<INotificationOperations, NotificationOperations>()
|
||||
.AddScoped<IUserCredentials, UserCredentials>()
|
||||
.AddScoped<ISecretsOperations, SecretsOperations>()
|
||||
.AddScoped<IJobOperations, JobOperations>()
|
||||
|
||||
//Move out expensive resources into separate class, and add those as Singleton
|
||||
// ArmClient, Table Client(s), Queue Client(s), HttpClient, etc.
|
||||
|
19
src/ApiService/ApiService/onefuzzlib/JobOperations.cs
Normal file
19
src/ApiService/ApiService/onefuzzlib/JobOperations.cs
Normal file
@ -0,0 +1,19 @@
|
||||
using ApiService.OneFuzzLib.Orm;
|
||||
|
||||
namespace Microsoft.OneFuzz.Service;
|
||||
|
||||
public interface IJobOperations : IStatefulOrm<Job, JobState>
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
public class JobOperations : StatefulOrm<Job, JobState>, IJobOperations
|
||||
{
|
||||
|
||||
public JobOperations(IStorage storage, ILogTracer log, IServiceConfig config)
|
||||
: base(storage, log, config)
|
||||
{
|
||||
}
|
||||
|
||||
}
|
@ -310,6 +310,21 @@ namespace Tests
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
public static Gen<Job> Job()
|
||||
{
|
||||
return Arb.Generate<Tuple<Guid, JobState, JobConfig, string?, DateTimeOffset?, List<JobTaskInfo>?, UserInfo>>().Select(
|
||||
arg => new Job(
|
||||
JobId: arg.Item1,
|
||||
State: arg.Item2,
|
||||
Config: arg.Item3,
|
||||
Error: arg.Item4,
|
||||
EndTime: arg.Item5,
|
||||
TaskInfo: arg.Item6,
|
||||
UserInfo: arg.Item7
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
public class OrmArb
|
||||
@ -403,6 +418,10 @@ namespace Tests
|
||||
{
|
||||
return Arb.From(OrmGenerators.WebhookMessageEventGrid());
|
||||
}
|
||||
public static Arbitrary<Job> Job()
|
||||
{
|
||||
return Arb.From(OrmGenerators.Job());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -598,7 +617,11 @@ namespace Tests
|
||||
}
|
||||
|
||||
|
||||
|
||||
[Property]
|
||||
public bool Job(Job j)
|
||||
{
|
||||
return Test(j);
|
||||
}
|
||||
|
||||
/*
|
||||
//Sample function on how repro a failing test run, using Replay
|
||||
|
Reference in New Issue
Block a user