164 lines
5.1 KiB
C#
164 lines
5.1 KiB
C#
using KubernetesWorkflow;
|
|
using Logging;
|
|
using Newtonsoft.Json;
|
|
using Newtonsoft.Json.Linq;
|
|
using Utils;
|
|
|
|
namespace DistTestCore.Marketplace
|
|
{
|
|
public class ContainerInfoExtractor
|
|
{
|
|
private readonly BaseLog log;
|
|
private readonly StartupWorkflow workflow;
|
|
private readonly RunningContainer container;
|
|
|
|
public ContainerInfoExtractor(BaseLog log, StartupWorkflow workflow, RunningContainer container)
|
|
{
|
|
this.log = log;
|
|
this.workflow = workflow;
|
|
this.container = container;
|
|
}
|
|
|
|
public string ExtractAccount(int? orderNumber)
|
|
{
|
|
log.Debug();
|
|
var account = Retry(() => FetchAccount(orderNumber));
|
|
if (string.IsNullOrEmpty(account)) throw new InvalidOperationException("Unable to fetch account for geth node. Test infra failure.");
|
|
|
|
return account;
|
|
}
|
|
|
|
public string ExtractPubKey()
|
|
{
|
|
log.Debug();
|
|
var pubKey = Retry(FetchPubKey);
|
|
if (string.IsNullOrEmpty(pubKey)) throw new InvalidOperationException("Unable to fetch enode from geth node. Test infra failure.");
|
|
|
|
return pubKey;
|
|
}
|
|
|
|
public string ExtractPrivateKey(int? orderNumber)
|
|
{
|
|
log.Debug();
|
|
var privKey = Retry(() => FetchPrivateKey(orderNumber));
|
|
if (string.IsNullOrEmpty(privKey)) throw new InvalidOperationException("Unable to fetch private key from geth node. Test infra failure.");
|
|
|
|
return privKey;
|
|
}
|
|
|
|
public string ExtractMarketplaceAddress()
|
|
{
|
|
log.Debug();
|
|
var marketplaceAddress = Retry(FetchMarketplaceAddress);
|
|
if (string.IsNullOrEmpty(marketplaceAddress)) throw new InvalidOperationException("Unable to fetch marketplace account from codex-contracts node. Test infra failure.");
|
|
|
|
return marketplaceAddress;
|
|
}
|
|
|
|
public string ExtractMarketplaceAbi()
|
|
{
|
|
log.Debug();
|
|
var marketplaceAbi = Retry(FetchMarketplaceAbi);
|
|
if (string.IsNullOrEmpty(marketplaceAbi)) throw new InvalidOperationException("Unable to fetch marketplace artifacts from codex-contracts node. Test infra failure.");
|
|
|
|
return marketplaceAbi;
|
|
}
|
|
|
|
private string Retry(Func<string> fetch)
|
|
{
|
|
var result = string.Empty;
|
|
Time.WaitUntil(() =>
|
|
{
|
|
result = Catch(fetch);
|
|
return !string.IsNullOrEmpty(result);
|
|
}, TimeSpan.FromMinutes(1), TimeSpan.FromSeconds(3));
|
|
|
|
return result;
|
|
}
|
|
|
|
private string Catch(Func<string> fetch)
|
|
{
|
|
try
|
|
{
|
|
return fetch();
|
|
}
|
|
catch
|
|
{
|
|
return string.Empty;
|
|
}
|
|
}
|
|
|
|
private string FetchAccount(int? orderNumber)
|
|
{
|
|
return workflow.ExecuteCommand(container, "cat", GethContainerRecipe.GetAccountFilename(orderNumber));
|
|
}
|
|
|
|
private string FetchPrivateKey(int? orderNumber)
|
|
{
|
|
return workflow.ExecuteCommand(container, "cat", GethContainerRecipe.GetPrivateKeyFilename(orderNumber));
|
|
}
|
|
|
|
private string FetchMarketplaceAddress()
|
|
{
|
|
var json = workflow.ExecuteCommand(container, "cat", CodexContractsContainerRecipe.MarketplaceAddressFilename);
|
|
var marketplace = JsonConvert.DeserializeObject<MarketplaceJson>(json);
|
|
return marketplace!.address;
|
|
}
|
|
|
|
private string FetchMarketplaceAbi()
|
|
{
|
|
var json = workflow.ExecuteCommand(container, "cat", CodexContractsContainerRecipe.MarketplaceArtifactFilename);
|
|
|
|
var artifact = JObject.Parse(json);
|
|
var abi = artifact["abi"];
|
|
return abi!.ToString(Formatting.None);
|
|
}
|
|
|
|
private string FetchPubKey()
|
|
{
|
|
var enodeFinder = new PubKeyFinder();
|
|
workflow.DownloadContainerLog(container, enodeFinder);
|
|
return enodeFinder.GetPubKey();
|
|
}
|
|
}
|
|
|
|
public class PubKeyFinder : LogHandler, ILogHandler
|
|
{
|
|
private const string openTag = "self=enode://";
|
|
private const string openTagQuote = "self=\"enode://";
|
|
private string pubKey = string.Empty;
|
|
|
|
public string GetPubKey()
|
|
{
|
|
return pubKey;
|
|
}
|
|
|
|
protected override void ProcessLine(string line)
|
|
{
|
|
if (line.Contains(openTag))
|
|
{
|
|
ExtractPubKey(openTag, line);
|
|
}
|
|
else if (line.Contains(openTagQuote))
|
|
{
|
|
ExtractPubKey(openTagQuote, line);
|
|
}
|
|
}
|
|
|
|
private void ExtractPubKey(string tag, string line)
|
|
{
|
|
var openIndex = line.IndexOf(tag) + tag.Length;
|
|
var closeIndex = line.IndexOf("@");
|
|
|
|
pubKey = line.Substring(
|
|
startIndex: openIndex,
|
|
length: closeIndex - openIndex);
|
|
}
|
|
}
|
|
|
|
public class MarketplaceJson
|
|
{
|
|
public string address { get; set; } = string.Empty;
|
|
}
|
|
}
|