From 8a32ebe7d76832fb4e9f96d4d94ba054204b323e Mon Sep 17 00:00:00 2001 From: Tudor Stanciu Date: Fri, 14 Jan 2022 19:31:27 +0200 Subject: [PATCH] RestartMachineHandler --- .../CommandHandlers/RestartMachineHandler.cs | 67 +++++++++++++++++++ .../Commands/RestartMachine.cs | 12 ++++ .../Events/MachineRestarted.cs | 4 ++ .../Controllers/ResurrectorController.cs | 7 ++ 4 files changed, 90 insertions(+) create mode 100644 src/api/NetworkResurrector.Api.Application/CommandHandlers/RestartMachineHandler.cs create mode 100644 src/api/NetworkResurrector.Api.PublishedLanguage/Commands/RestartMachine.cs create mode 100644 src/api/NetworkResurrector.Api.PublishedLanguage/Events/MachineRestarted.cs diff --git a/src/api/NetworkResurrector.Api.Application/CommandHandlers/RestartMachineHandler.cs b/src/api/NetworkResurrector.Api.Application/CommandHandlers/RestartMachineHandler.cs new file mode 100644 index 0000000..e5502a7 --- /dev/null +++ b/src/api/NetworkResurrector.Api.Application/CommandHandlers/RestartMachineHandler.cs @@ -0,0 +1,67 @@ +using MediatR; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; +using NetworkResurrector.Agent.PublishedLanguage.Dto; +using NetworkResurrector.Agent.Wrapper.Services; +using NetworkResurrector.Api.Domain.Constants; +using NetworkResurrector.Api.Domain.Repositories; +using NetworkResurrector.Api.PublishedLanguage.Commands; +using NetworkResurrector.Api.PublishedLanguage.Events; +using NetworkResurrector.Server.Wrapper.Services; +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace NetworkResurrector.Api.Application.CommandHandlers +{ + public class RestartMachineHandler : IRequestHandler + { + private readonly ILogger _logger; + private readonly IResurrectorService _resurrectorService; + private readonly INetworkRepository _repository; + private readonly IResurrectorAgentService _resurrectorAgentService; + private readonly IConfiguration _configuration; + + public RestartMachineHandler(ILogger logger, IResurrectorService resurrectorService, INetworkRepository repository, IResurrectorAgentService resurrectorAgentService, IConfiguration configuration) + { + _logger=logger; + _resurrectorService=resurrectorService; + _repository=repository; + _resurrectorAgentService=resurrectorAgentService; + _configuration=configuration; + } + + public async Task Handle(RestartMachine command, CancellationToken cancellationToken) + { + _logger.LogDebug($"Start restart machine {command.MachineId}"); + var machine = await _repository.GetMachine(command.MachineId); + var powerConfiguration = await _repository.GetPowerActionConfiguration(command.MachineId, PowerActions.RESTART); + + //log activity + + var ipAddressOrMachineName = machine.IPv4Address ?? machine.MachineName; + MachineRestarted result; + + switch (powerConfiguration.Performer.PerformerCode) + { + case PowerActionPerformers.NETWORK_RESURRECTOR_AGENT: + if (machine.Agent == null) + throw new Exception($"Cannot use network resurrector agent as restart performer for machine '{ipAddressOrMachineName}' because it is not configured."); + + var owner = new ActionOwner(_configuration.GetValue("Service:Code")); + var options = new ActionOptions(command.Delay ?? 0, command.Force); + var RestartResultByAgent = await _resurrectorAgentService.Restart(ipAddressOrMachineName, machine.Agent.AgentPort, owner, options); + var status = RestartResultByAgent.Success ? $"Machine '{ipAddressOrMachineName}' successfully restarted." : $"Machine '{ipAddressOrMachineName}' could not be restarted."; + result = new MachineRestarted(RestartResultByAgent.Success, status); + break; + + default: + throw new Exception($"Power action performer {powerConfiguration.Performer.PerformerCode} is not implemented."); + } + + _logger.LogDebug($"Machine {command.MachineId} restart finished. Success: {result.Success}; Status: {result.Status}"); + + return result; + } + } +} diff --git a/src/api/NetworkResurrector.Api.PublishedLanguage/Commands/RestartMachine.cs b/src/api/NetworkResurrector.Api.PublishedLanguage/Commands/RestartMachine.cs new file mode 100644 index 0000000..55cd68e --- /dev/null +++ b/src/api/NetworkResurrector.Api.PublishedLanguage/Commands/RestartMachine.cs @@ -0,0 +1,12 @@ +using NDB.Application.DataContracts; +using NetworkResurrector.Api.PublishedLanguage.Events; + +namespace NetworkResurrector.Api.PublishedLanguage.Commands +{ + public class RestartMachine : Command + { + public int MachineId { get; set; } + public int? Delay { get; set; } + public bool Force { get; set; } + } +} diff --git a/src/api/NetworkResurrector.Api.PublishedLanguage/Events/MachineRestarted.cs b/src/api/NetworkResurrector.Api.PublishedLanguage/Events/MachineRestarted.cs new file mode 100644 index 0000000..68f15bc --- /dev/null +++ b/src/api/NetworkResurrector.Api.PublishedLanguage/Events/MachineRestarted.cs @@ -0,0 +1,4 @@ +namespace NetworkResurrector.Api.PublishedLanguage.Events +{ + public record MachineRestarted(bool Success, string Status); +} diff --git a/src/api/NetworkResurrector.Api/Controllers/ResurrectorController.cs b/src/api/NetworkResurrector.Api/Controllers/ResurrectorController.cs index 103abc6..984e018 100644 --- a/src/api/NetworkResurrector.Api/Controllers/ResurrectorController.cs +++ b/src/api/NetworkResurrector.Api/Controllers/ResurrectorController.cs @@ -38,5 +38,12 @@ namespace NetworkResurrector.Api.Controllers var result = await _mediator.Send(shutdownMachine); return Ok(result); } + + [HttpPost("restart")] + public async Task RestartMachine([FromBody] RestartMachine restartMachine) + { + var result = await _mediator.Send(restartMachine); + return Ok(result); + } } }