Skip to content

Commit b96c603

Browse files
committed
improving on the code to limit the responsabilities of the kubernetes facade
1 parent b63ee36 commit b96c603

File tree

9 files changed

+32
-35
lines changed

9 files changed

+32
-35
lines changed

packages/backend/orchestrator/service/Orchestrator/Events/JobEventsProducer.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,15 @@ public enum JobStatus
1414
{
1515
Success,
1616
Failed,
17-
Ended
17+
Ended,
18+
Started
1819
}
1920

2021
private static readonly Dictionary<JobStatus, string> JobStatusMapping = new Dictionary<JobStatus, string>() {
2122
{ JobStatus.Success, "Success" },
2223
{ JobStatus.Failed, "Failed" },
23-
{ JobStatus.Ended, "Ended" }
24+
{ JobStatus.Ended, "Ended" },
25+
{ JobStatus.Started, "Started" }
2426
};
2527

2628
private static Dictionary<string, JobStatus> InvertStatusMapping(Dictionary<JobStatus, string> jobStatusMapping)

packages/backend/orchestrator/service/Orchestrator/Jobs/Commands/NucleiCustomJobCommand.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public class NucleiCustomJobCommand : KubernetesJobCommand<CustomJobRequest>
1111
{
1212
protected override KubernetesJobTemplate JobTemplate { get; }
1313

14-
public NucleiCustomJobCommand(CustomJobRequest request, JobModel model, IKubernetesFacade kubernetes, IMessagesProducer<JobEventMessage> eventsProducer, JobLogsProducer jobLogsProducer, IFindingsParser parser, ILogger<NucleiCustomJobCommand> logger, IConfiguration config)
14+
public NucleiCustomJobCommand(CustomJobRequest request, JobModel model, IKubernetesFacade kubernetes, JobEventsProducer eventsProducer, JobLogsProducer jobLogsProducer, IFindingsParser parser, ILogger<NucleiCustomJobCommand> logger, IConfiguration config)
1515
: base(request, kubernetes, eventsProducer, jobLogsProducer, parser, logger)
1616
{
1717
JobTemplate = new NucleiCustomJobTemplate(request.JobId, config, request.CustomJobParameters, model.Code, request.JobPodMilliCpuLimit, request.JobPodMemoryKbLimit, model.FindingHandler, model.Image);

packages/backend/orchestrator/service/Orchestrator/Jobs/Commands/PythonCustomJobCommand.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public class PythonCustomJobCommand : KubernetesJobCommand<CustomJobRequest>
1111
{
1212
protected override KubernetesJobTemplate JobTemplate { get; }
1313

14-
public PythonCustomJobCommand(CustomJobRequest request, JobModel model, IKubernetesFacade kubernetes, IMessagesProducer<JobEventMessage> eventsProducer, JobLogsProducer jobLogsProducer, IFindingsParser parser, ILogger<PythonCustomJobCommand> logger, IConfiguration config)
14+
public PythonCustomJobCommand(CustomJobRequest request, JobModel model, IKubernetesFacade kubernetes, JobEventsProducer eventsProducer, JobLogsProducer jobLogsProducer, IFindingsParser parser, ILogger<PythonCustomJobCommand> logger, IConfiguration config)
1515
: base(request, kubernetes, eventsProducer, jobLogsProducer, parser, logger)
1616
{
1717
JobTemplate = new PythonCustomJobTemplate(request.JobId, config, request.CustomJobParameters, model.Code, request.JobPodMilliCpuLimit, request.JobPodMemoryKbLimit, model.Image);

packages/backend/orchestrator/service/Orchestrator/Jobs/JobFactory.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ namespace Orchestrator.Jobs;
1717
public class JobFactory : IJobFactory
1818
{
1919
private IKubernetesFacade Kubernetes { get; }
20-
private IMessagesProducer<JobEventMessage> EventsProducer { get; }
20+
private JobEventsProducer EventsProducer { get; }
2121
private JobLogsProducer JobLogsProducer { get; }
2222
private IFindingsParser Parser { get; }
2323
private ILoggerFactory LoggerFactory { get; }
@@ -28,7 +28,7 @@ public JobFactory(IKubernetesFacade kubernetes, IMessagesProducer<JobEventMessag
2828
{
2929
JobLogsProducer = jobLogsProducer as JobLogsProducer;
3030
Kubernetes = kubernetes;
31-
EventsProducer = eventsProducer;
31+
EventsProducer = eventsProducer as JobEventsProducer;
3232
Parser = parser;
3333
LoggerFactory = loggerFactoryFactory;
3434
Logger = loggerFactoryFactory.CreateLogger<JobFactory>();

packages/backend/orchestrator/service/Orchestrator/Jobs/JobManagementCommands/TerminateJobCommand.cs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,21 @@ namespace Orchestrator.Jobs.JobManagementCommand;
88

99
public class TerminateJobCommand : KubernetesManagementCommand<TerminateJobRequest>
1010
{
11-
public TerminateJobCommand(TerminateJobRequest request, IKubernetesFacade kubernetes, IMessagesProducer<JobEventMessage> eventsProducer, JobLogsProducer jobLogsProducer, IFindingsParser parser, ILogger<TerminateJobCommand> logger, IConfiguration config)
11+
public TerminateJobCommand(TerminateJobRequest request, IKubernetesFacade kubernetes, JobEventsProducer eventsProducer, JobLogsProducer jobLogsProducer, IFindingsParser parser, ILogger<TerminateJobCommand> logger, IConfiguration config)
1212
: base(request, kubernetes, eventsProducer, jobLogsProducer, parser, logger, config)
1313
{ }
1414

15-
public override Task Execute()
15+
public async override Task Execute()
1616
{
17-
Kubernetes.TerminateJob(Request.JobId, Namespace);
18-
return Task.CompletedTask;
17+
bool terminationSuccess = await Kubernetes.TerminateJob(Request.JobId, Namespace);
18+
if (terminationSuccess)
19+
{
20+
LogsProducer.LogDebug(Request.JobId, $"Job terminated");
21+
}
22+
else
23+
{
24+
LogsProducer.LogDebug(Request.JobId, "Tried to terminate, but no corresponding job was runnning");
25+
}
26+
_ = EventsProducer.LogStatus(Request.JobId, JobEventsProducer.JobStatus.Ended);
1927
}
2028
}

packages/backend/orchestrator/service/Orchestrator/Jobs/KubernetesJobCommand.cs

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ namespace Orchestrator.Jobs;
88
public abstract class KubernetesJobCommand<T> : JobCommand where T : JobRequest
99
{
1010
private IKubernetesFacade Kubernetes { get; }
11-
private IMessagesProducer<JobEventMessage> EventsProducer { get; }
11+
private JobEventsProducer EventsProducer { get; }
1212
private JobLogsProducer LogsProducer { get; }
1313
private IFindingsParser Parser { get; }
1414
private ILogger Logger { get; }
1515
protected T Request { get; }
1616

1717
protected abstract KubernetesJobTemplate JobTemplate { get; }
1818

19-
protected KubernetesJobCommand(T request, IKubernetesFacade kubernetes, IMessagesProducer<JobEventMessage> eventsProducer, JobLogsProducer jobLogsProducer, IFindingsParser parser, ILogger logger)
19+
protected KubernetesJobCommand(T request, IKubernetesFacade kubernetes, JobEventsProducer eventsProducer, JobLogsProducer jobLogsProducer, IFindingsParser parser, ILogger logger)
2020
{
2121
Request = request;
2222
Kubernetes = kubernetes;
@@ -34,11 +34,6 @@ public override async Task Execute()
3434
LogsProducer.LogDebug(Request.JobId, "Job picked up by orchestrator.");
3535
Logger.LogInformation(Request.JobId, "Job created, listening for events.");
3636

37-
await EventsProducer.Produce(new JobEventMessage
38-
{
39-
JobId = Request.JobId,
40-
FindingsJson = "{ \"findings\": [{ \"type\": \"JobStatusFinding\", \"status\": \"Started\" }]}",
41-
Timestamp = TimeUtils.CurrentTimeMs(),
42-
});
37+
await EventsProducer.LogStatus(Request.JobId, JobEventsProducer.JobStatus.Started);
4338
}
4439
}

packages/backend/orchestrator/service/Orchestrator/Jobs/KubernetesManagementCommand.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@ namespace Orchestrator.Jobs;
1010
public abstract class KubernetesManagementCommand<T> : JobCommand where T : JobManagementRequest
1111
{
1212
protected IKubernetesFacade Kubernetes { get; }
13-
private IMessagesProducer<JobEventMessage> EventsProducer { get; }
14-
private JobLogsProducer LogsProducer { get; }
13+
protected JobEventsProducer EventsProducer { get; }
14+
protected JobLogsProducer LogsProducer { get; }
1515
private IFindingsParser Parser { get; }
1616
private ILogger Logger { get; }
1717
protected T Request { get; }
1818
public string Namespace { get; set; } = "default";
1919
protected IConfiguration Config { get; init; }
2020

21-
protected KubernetesManagementCommand(T request, IKubernetesFacade kubernetes, IMessagesProducer<JobEventMessage> eventsProducer, JobLogsProducer jobLogsProducer, IFindingsParser parser, ILogger logger, IConfiguration config)
21+
protected KubernetesManagementCommand(T request, IKubernetesFacade kubernetes, JobEventsProducer eventsProducer, JobLogsProducer jobLogsProducer, IFindingsParser parser, ILogger logger, IConfiguration config)
2222
{
2323
Request = request;
2424
Kubernetes = kubernetes;

packages/backend/orchestrator/service/Orchestrator/K8s/IKubernetesFacade.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public interface IKubernetesFacade
1414
/// Creates a jobTemplate.
1515
/// </summary>
1616
/// <returns></returns>
17-
Task TerminateJob(string jobId, string jobNamespace = "default");
17+
Task<bool> TerminateJob(string jobId, string jobNamespace = "default");
1818

1919
/// <summary>
2020
/// True if the pod is in the status "Failed" or "Succeeded", false otherwise

packages/backend/orchestrator/service/Orchestrator/K8s/KubernetesFacade.cs

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,15 @@ namespace Orchestrator.K8s;
88
public class KubernetesFacade : IKubernetesFacade
99
{
1010
private readonly ILogger<KubernetesFacade> Logger;
11-
private JobEventsProducer JobEventsProducer { get; }
12-
private JobLogsProducer JobLogsProducer { get; }
1311

1412
/// <summary>
1513
/// Gets or sets the Kubernetes configuration.
1614
/// </summary>
1715
//// private KubernetesClientConfiguration KubernetesConfiguration => KubernetesClientConfiguration.BuildConfigFromConfigFile(Environment.GetEnvironmentVariable("KUBECONFIG"));
1816
private static KubernetesClientConfiguration KubernetesConfiguration => KubernetesClientConfiguration.InClusterConfig();
1917

20-
public KubernetesFacade(ILogger<KubernetesFacade> logger, IMessagesProducer<JobEventMessage> jobEventsProducer, IMessagesProducer<JobLogMessage> jobLogsProducer)
18+
public KubernetesFacade(ILogger<KubernetesFacade> logger)
2119
{
22-
JobEventsProducer = jobEventsProducer as JobEventsProducer;
23-
JobLogsProducer = jobLogsProducer as JobLogsProducer;
2420
Logger = logger;
2521
}
2622

@@ -137,7 +133,7 @@ public async Task<bool> IsJobPodFinished(string jobName, string jobNamespace = "
137133
/// <param name="jobId"></param>
138134
/// <param name="jobNamespace"></param>
139135
/// <returns>true if the job was running and terminated, false if it was not running.</returns>
140-
public async Task TerminateJob(string jobId, string jobNamespace = "default")
136+
public async Task<bool> TerminateJob(string jobId, string jobNamespace = "default")
141137
{
142138
using var client = new Kubernetes(KubernetesConfiguration);
143139
string labelSelector = "red-kite.io/jobid=" + jobId;
@@ -149,14 +145,10 @@ public async Task TerminateJob(string jobId, string jobNamespace = "default")
149145
var options = new V1DeleteOptions(gracePeriodSeconds: 0, propagationPolicy: "Foreground");
150146

151147
await RetryableCall(() => client.DeleteNamespacedJobAsync(runningJob.Metadata.Name, jobNamespace, options));
152-
JobLogsProducer.LogDebug(jobId, $"Job terminated");
148+
return true;
153149
}
154-
else
155-
{
156-
JobLogsProducer.LogDebug(jobId, "Tried to terminate, but no corresponding job was runnning");
157-
}
158-
_ = JobEventsProducer.LogStatus(jobId, JobEventsProducer.JobStatus.Ended);
159-
return;
150+
151+
return false;
160152
}
161153

162154
/// <summary>

0 commit comments

Comments
 (0)