Piscal processing work

This commit is contained in:
2016-04-06 13:00:12 -04:00
parent 214199fed5
commit 151f17943f
18 changed files with 141 additions and 127 deletions
+5
View File
@@ -50,6 +50,10 @@
<HintPath>..\packages\fasterflect.2.1.3\lib\net40\Fasterflect.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
<HintPath>..\packages\NLog.4.2.3\lib\net45\NLog.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Renci.SshNet, Version=2013.4.7.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\SSH.NET.2013.4.7\lib\net40\Renci.SshNet.dll</HintPath>
<Private>True</Private>
@@ -88,6 +92,7 @@
<Compile Include="Entities\LeafInputStatus.cs" />
<Compile Include="Parsers\FluxnetSiteCsvParser.cs" />
<Compile Include="Remote\PiscalClientException.cs" />
<Compile Include="Remote\PiscalLeafInput.cs" />
<Compile Include="Remote\PiscalLeafInputFile.cs" />
<Compile Include="Remote\PiscalLeafOutputFile.cs" />
<Compile Include="Remote\PiscalSshClient.cs" />
+4 -3
View File
@@ -66,7 +66,7 @@ namespace LeafWeb.Core.DAL
_db.SaveChanges();
}
private void SetLeafInputStatusNoUpdate(LeafInput leafInputFile, LeafInputStatusType status, string description = null)
private void SetLeafInputStatusNoUpdate(LeafInput leafInputFile, LeafInputStatusType status, string description = null, string details = null)
{
leafInputFile.CurrentStatus = status;
var leafInputFileStatus = new LeafInputStatus
@@ -74,6 +74,7 @@ namespace LeafWeb.Core.DAL
Status = status,
DateTime = DateTime.Now,
Description = description,
Details = details,
LeafInput = leafInputFile
};
if (leafInputFile.StatusHistory == null)
@@ -81,9 +82,9 @@ namespace LeafWeb.Core.DAL
leafInputFile.StatusHistory.Add(leafInputFileStatus);
}
public void SetLeafInputStatus(LeafInput leafInput, LeafInputStatusType status, string description = null)
public void SetLeafInputStatus(LeafInput leafInput, LeafInputStatusType status, string description = null, string details = null)
{
SetLeafInputStatusNoUpdate(leafInput, status, description);
SetLeafInputStatusNoUpdate(leafInput, status, description, details);
UpdateLeafInput(leafInput);
}
+1
View File
@@ -11,6 +11,7 @@ namespace LeafWeb.Core.Entities
public virtual LeafInput LeafInput { get; set; }
public LeafInputStatusType Status { get; set; }
public string Description { get; set; }
public string Details { get; set; }
public DateTime DateTime { get; set; }
}
}
+1 -1
View File
@@ -5,6 +5,6 @@ namespace LeafWeb.Core.Entities
Pending = 0,
Running = 1,
Complete = 2,
Error = 3
Exception = 3
}
}
-1
View File
@@ -8,6 +8,5 @@ namespace LeafWeb.Core.Remote
PiscalStatus GetLeafInputStatus(PiscalLeafInput leafInput);
IEnumerable<PiscalLeafOutputFile> RetrieveLeafOutput(PiscalLeafInput leafInput);
void CleanupLeafProcess(PiscalLeafInput leafInput);
string GetErrorMessage(PiscalLeafInput leafInput);
}
}
+40
View File
@@ -0,0 +1,40 @@
using System.Linq;
using AutoMapper;
using LeafWeb.Core.Entities;
using LeafWeb.Core.Utility;
namespace LeafWeb.Core.Remote
{
public class PiscalLeafInput
{
private static readonly IMapper Mapper;
public int LeafInputId { get; set; }
public string PhotosyntheticType { get; set; }
public string DirectoryName { get; set; }
public PiscalLeafInputFile[] InputFiles { get; set; }
static PiscalLeafInput()
{
var config =
new MapperConfiguration(cfg =>
{
cfg.CreateMap<LeafInput, PiscalLeafInput>()
.ForMember(dest => dest.DirectoryName,
opt => opt.MapFrom(src => PiscalUtility.GetPiscalDirectoryName(src)))
.ForMember(dest => dest.LeafInputId, opt => opt.MapFrom(src => src.Id))
.ForMember(dest => dest.InputFiles, opt => opt.MapFrom(src => src.InputFiles.Select(f => new PiscalLeafInputFile(f)).ToArray()))
.ForMember(
dest => dest.PhotosyntheticType,
opt => opt.MapFrom(src => src.PhotosynthesisType.Id.WhitespaceToUnderscore()));
});
Mapper = config.CreateMapper();
}
public PiscalLeafInput() { }
public PiscalLeafInput(LeafInput leafInput)
{
Mapper.Map(leafInput, this);
}
}
}
+1 -35
View File
@@ -1,43 +1,9 @@
using System.Linq;
using AutoMapper;
using AutoMapper;
using LeafWeb.Core.Entities;
using LeafWeb.Core.Utility;
namespace LeafWeb.Core.Remote
{
public class PiscalLeafInput
{
private static readonly IMapper Mapper;
public int LeafInputId { get; set; }
public string PhotosyntheticType { get; set; }
public string DirectoryName { get; set; }
public PiscalLeafInputFile[] InputFiles { get; set; }
static PiscalLeafInput()
{
var config =
new MapperConfiguration(cfg =>
{
cfg.CreateMap<LeafInput, PiscalLeafInput>()
.ForMember(dest => dest.DirectoryName,
opt => opt.MapFrom(src => PiscalUtility.GetPiscalDirectoryName(src)))
.ForMember(dest => dest.LeafInputId, opt => opt.MapFrom(src => src.Id))
.ForMember(dest => dest.InputFiles, opt => opt.MapFrom(src => src.InputFiles.Select(f => new PiscalLeafInputFile(f)).ToArray()))
.ForMember(
dest => dest.PhotosyntheticType,
opt => opt.MapFrom(src => src.PhotosynthesisType.Id.WhitespaceToUnderscore()));
});
Mapper = config.CreateMapper();
}
public PiscalLeafInput() { }
public PiscalLeafInput(LeafInput leafInput)
{
Mapper.Map(leafInput, this);
}
}
public class PiscalLeafInputFile
{
private static readonly IMapper Mapper;
+14 -27
View File
@@ -4,6 +4,7 @@ using System.Data.Common;
using System.IO;
using System.Linq;
using LeafWeb.Core.Utility;
using NLog;
using Renci.SshNet;
namespace LeafWeb.Core.Remote
@@ -14,10 +15,11 @@ namespace LeafWeb.Core.Remote
private const string RemoteScriptPath = BaseDirectory + "/piscal_manager.sh";
private readonly PasswordConnectionInfo _connectionInfo;
private const string StatusSuccess = "success";
private const string StatusComplete = "complete";
private const string StatusRunning = "running";
private const string StatusNotStarted = "not started";
private const string StatusError = "error";
Logger _logger = LogManager.GetCurrentClassLogger();
public PiscalSshClient(string connectionString)
{
@@ -45,10 +47,10 @@ namespace LeafWeb.Core.Remote
using (var scp = GetScpClient())
foreach (var file in leafInput.InputFiles)
{
var inputPath = $"{directory}/{file.Filename}";
var inputPath = $"{directory}/input/{file.Filename}";
using (var stream = new MemoryStream(file.Contents))
{
Console.WriteLine(inputPath);
_logger.Trace("Copying " + inputPath);
scp.Connect();
scp.Upload(stream, inputPath);
scp.Disconnect();
@@ -66,8 +68,7 @@ namespace LeafWeb.Core.Remote
using (var ssh = GetSshClient())
{
ssh.Connect();
var commandText = $"{RemoteScriptPath} -d {leafInput.DirectoryName} -p {leafInput.PhotosyntheticType}";
Console.Write(commandText);
var commandText = $"{RemoteScriptPath} -d {leafInput.DirectoryName} -p {leafInput.PhotosyntheticType} -s";
var command = ssh.CreateCommand(commandText);
command.Execute();
ssh.Disconnect();
@@ -75,7 +76,7 @@ namespace LeafWeb.Core.Remote
if (command.ExitStatus != 0)
throw new PiscalClientException(command.Result);
Console.Write(command.Result);
_logger.Debug(command.Result);
}
}
@@ -87,12 +88,12 @@ namespace LeafWeb.Core.Remote
{
case StatusRunning:
return PiscalStatus.Running;
case StatusSuccess:
return PiscalStatus.Success;
case StatusComplete:
return PiscalStatus.Complete;
case StatusNotStarted:
return PiscalStatus.NotStarted;
default:
return PiscalStatus.Error;
throw new PiscalClientException("Unknown status: " + statusRaw[0]);
}
}
@@ -101,7 +102,7 @@ namespace LeafWeb.Core.Remote
using (var ssh = GetSshClient())
{
ssh.Connect();
var commandText = $"{RemoteScriptPath} -d {leafInput.DirectoryName} -s";
var commandText = $"{RemoteScriptPath} -d {leafInput.DirectoryName}";
var command = ssh.CreateCommand(commandText);
command.Execute();
ssh.Disconnect();
@@ -123,7 +124,7 @@ namespace LeafWeb.Core.Remote
{
// get output files
var status = GetLeafInputStatusRaw(leafInput);
if (status[0] != StatusSuccess)
if (status[0] != StatusComplete)
throw new PiscalClientException("output not available, status is " + status[0]);
var filePaths = status.Skip(1);
@@ -149,23 +150,9 @@ namespace LeafWeb.Core.Remote
scp.Disconnect();
}
}
public string GetErrorMessage(PiscalLeafInput leafInput)
{
var status = GetLeafInputStatusRaw(leafInput);
if (status[0] != StatusError)
return string.Empty;
var errorLines = status.Skip(1).ToArray();
return errorLines.Join(Environment.NewLine);
}
public void CleanupLeafProcess(PiscalLeafInput leafInput)
{
var status = GetLeafInputStatusRaw(leafInput);
if (status[0] == StatusRunning)
throw new PiscalClientException("Trying to cleanup a running process");
using (var ssh = GetSshClient())
{
ssh.Connect();
+3 -4
View File
@@ -2,9 +2,8 @@ namespace LeafWeb.Core.Remote
{
public enum PiscalStatus
{
Running,
Success,
NotStarted,
Error
NotStarted, // Process has not been started
Running, // Process is currently executing
Complete, // Process has completed
}
}
+1
View File
@@ -4,5 +4,6 @@
<package id="CsvHelper" version="2.13.2.0" targetFramework="net45" />
<package id="EntityFramework" version="6.1.3" targetFramework="net45" />
<package id="fasterflect" version="2.1.3" targetFramework="net45" />
<package id="NLog" version="4.2.3" targetFramework="net45" />
<package id="SSH.NET" version="2013.4.7" targetFramework="net45" />
</packages>