// Copyright Epic Games, Inc. All Rights Reserved.
using System.Reflection;
using EpicGames.Core;
using EpicGames.Horde;
using EpicGames.Horde.Utilities;
using JobDriver.Execution;
using JobDriver.Utility;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using OpenTelemetry.Trace;
namespace JobDriver
{
///
/// Application class for the job driver
///
public static class DriverApp
{
///
/// Main entry point
///
public static async Task Main(string[] args)
{
CommandLineArguments arguments = new CommandLineArguments(args);
// Create the services
IServiceCollection services = new ServiceCollection();
RegisterServices(services);
// Run the host
await using ServiceProvider serviceProvider = services.BuildServiceProvider();
int exitCode = await CommandHost.RunAsync(arguments, serviceProvider, null);
// JobDriver execution is often short-lived so ensure any outstanding traces are flushed
TracerProvider? tracerProvider = serviceProvider.GetService();
tracerProvider?.ForceFlush(5000);
return exitCode;
}
///
/// Helper method to register services for this app
///
///
public static void RegisterServices(IServiceCollection services)
{
// Read the driver config
IConfiguration configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: false)
.AddJsonFile("appsettings.Epic.json", optional: true)
.AddEnvironmentVariables()
.Build();
// Register the services
services.AddOptions().Configure(options => configuration.GetSection("Driver").Bind(options)).ValidateDataAnnotations();
services.AddLogging(builder => builder.AddEpicDefault());
// Read any OpenTelemetry settings as an env var, so we can bootstrap it during dependency injection setup
// Passing it as an argument is too late in startup
OpenTelemetrySettings openTelemetrySettings = new();
string? otelSettingsJson = Environment.GetEnvironmentVariable("UE_HORDE_OTEL_SETTINGS");
if (otelSettingsJson != null)
{
try
{
openTelemetrySettings = OpenTelemetrySettingsExtensions.Deserialize(otelSettingsJson, true);
}
catch (Exception e)
{
Console.WriteLine("Unable to enable OpenTelemetry: " + e.Message);
}
}
OpenTelemetryHelper.Configure(services, openTelemetrySettings);
services.AddHorde(options => options.AllowAuthPrompt = false);
services.AddSingleton();
services.AddSingleton();
services.AddSingleton();
services.AddSingleton();
services.AddSingleton();
services.AddCommandsFromAssembly(Assembly.GetExecutingAssembly());
}
}
}