Skip to content
This repository has been archived by the owner on Nov 20, 2023. It is now read-only.

Refactore tye dashboard api #818

Merged
merged 10 commits into from
Dec 1, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/Microsoft.Tye.Hosting/Model/EnvironmentVariable.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,11 @@ public EnvironmentVariable(string name, string? value)
public string? Value { get; set; }

public EnvironmentVariableSource? Source { get; set; }

public void Deconstruct(out string name, out string? value)
{
name = Name;
value = Value;
}
}
}
157 changes: 76 additions & 81 deletions src/Microsoft.Tye.Hosting/TyeDashboardApi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -100,94 +100,90 @@ private static V1Service CreateServiceJson(Service service)
var description = service.Description;
var bindings = description.Bindings;

var v1bindingList = new List<V1ServiceBinding>();

foreach (var binding in bindings)
var v1BindingList = bindings.Select(binding => new V1ServiceBinding()
{
v1bindingList.Add(new V1ServiceBinding()
{
Name = binding.Name,
ConnectionString = binding.ConnectionString,
Port = binding.Port,
ContainerPort = binding.ContainerPort,
Host = binding.Host,
Protocol = binding.Protocol
});
}
Name = binding.Name,
ConnectionString = binding.ConnectionString,
Port = binding.Port,
ContainerPort = binding.ContainerPort,
Host = binding.Host,
Protocol = binding.Protocol
}).ToList();

var v1ConfigurationSourceList = new List<V1ConfigurationSource>();
foreach (var configSource in description.Configuration)
foreach (var (name, value) in description.Configuration)
{
v1ConfigurationSourceList.Add(new V1ConfigurationSource()
{
Name = configSource.Name,
Value = configSource.Value
Name = name,
Value = value
});
}

var v1RunInfo = new V1RunInfo();
if (description.RunInfo is DockerRunInfo dockerRunInfo)
{
v1RunInfo.Type = V1RunInfoType.Docker;
v1RunInfo.Image = dockerRunInfo.Image;
v1RunInfo.VolumeMappings = dockerRunInfo.VolumeMappings.Select(v => new V1DockerVolume
{
Name = v.Name,
Source = v.Source,
Target = v.Target
}).ToList();

v1RunInfo.WorkingDirectory = dockerRunInfo.WorkingDirectory;
v1RunInfo.Args = dockerRunInfo.Args;
}
else if (description.RunInfo is ExecutableRunInfo executableRunInfo)
{
v1RunInfo.Type = V1RunInfoType.Executable;
v1RunInfo.Args = executableRunInfo.Args;
v1RunInfo.Executable = executableRunInfo.Executable;
v1RunInfo.WorkingDirectory = executableRunInfo.WorkingDirectory;
}
else if (description.RunInfo is ProjectRunInfo projectRunInfo)
switch (description.RunInfo)
{
v1RunInfo.Type = V1RunInfoType.Project;
v1RunInfo.Args = projectRunInfo.Args;
v1RunInfo.Build = projectRunInfo.Build;
v1RunInfo.Project = projectRunInfo.ProjectFile.FullName;
case DockerRunInfo dockerRunInfo:
v1RunInfo.Type = V1RunInfoType.Docker;
v1RunInfo.Image = dockerRunInfo.Image;
v1RunInfo.VolumeMappings = dockerRunInfo.VolumeMappings.Select(v => new V1DockerVolume
{
Name = v.Name,
Source = v.Source,
Target = v.Target
}).ToList();

v1RunInfo.WorkingDirectory = dockerRunInfo.WorkingDirectory;
v1RunInfo.Args = dockerRunInfo.Args;
break;
case ExecutableRunInfo executableRunInfo:
v1RunInfo.Type = V1RunInfoType.Executable;
v1RunInfo.Args = executableRunInfo.Args;
v1RunInfo.Executable = executableRunInfo.Executable;
v1RunInfo.WorkingDirectory = executableRunInfo.WorkingDirectory;
break;
case ProjectRunInfo projectRunInfo:
v1RunInfo.Type = V1RunInfoType.Project;
v1RunInfo.Args = projectRunInfo.Args;
v1RunInfo.Build = projectRunInfo.Build;
v1RunInfo.Project = projectRunInfo.ProjectFile.FullName;
break;
}

var v1ServiceDescription = new V1ServiceDescription()
{
Bindings = v1bindingList,
Bindings = v1BindingList,
Configuration = v1ConfigurationSourceList,
Name = description.Name,
Replicas = description.Replicas,
RunInfo = v1RunInfo
};

var replicateDictionary = new Dictionary<string, V1ReplicaStatus>();
foreach (var replica in service.Replicas)
foreach (var (instance, replica) in service.Replicas)
{
var replicaStatus = new V1ReplicaStatus()
{
Name = replica.Value.Name,
Ports = replica.Value.Ports,
Environment = replica.Value.Environment,
State = replica.Value.State
Name = replica.Name,
Ports = replica.Ports,
Environment = replica.Environment,
State = replica.State
};

replicateDictionary[replica.Key] = replicaStatus;
replicateDictionary[instance] = replicaStatus;

if (replica.Value is ProcessStatus processStatus)
switch (replica)
{
replicaStatus.Pid = processStatus.Pid;
replicaStatus.ExitCode = processStatus.ExitCode;
}
else if (replica.Value is DockerStatus dockerStatus)
{
replicaStatus.DockerCommand = dockerStatus.DockerCommand;
replicaStatus.ContainerId = dockerStatus.ContainerId;
replicaStatus.DockerNetwork = dockerStatus.DockerNetwork;
replicaStatus.DockerNetworkAlias = dockerStatus.DockerNetworkAlias;
case ProcessStatus processStatus:
replicaStatus.Pid = processStatus.Pid;
replicaStatus.ExitCode = processStatus.ExitCode;
break;
case DockerStatus dockerStatus:
replicaStatus.DockerCommand = dockerStatus.DockerCommand;
replicaStatus.ContainerId = dockerStatus.ContainerId;
replicaStatus.DockerNetwork = dockerStatus.DockerNetwork;
replicaStatus.DockerNetworkAlias = dockerStatus.DockerNetworkAlias;
break;
}
}

Expand Down Expand Up @@ -218,38 +214,37 @@ private Task Logs(HttpContext context)
var name = (string?)context.Request.RouteValues["name"];
context.Response.ContentType = "application/json";

if (string.IsNullOrEmpty(name) || !app.Services.TryGetValue(name, out var service))
if (!string.IsNullOrEmpty(name) && app.Services.TryGetValue(name, out var service))
{
context.Response.StatusCode = 404;
return JsonSerializer.SerializeAsync(context.Response.Body, new
{
message = $"Unknown service {name}"
},
_options);
return JsonSerializer.SerializeAsync(context.Response.Body, service.CachedLogs, _options);
}

return JsonSerializer.SerializeAsync(context.Response.Body, service.CachedLogs, _options);
context.Response.StatusCode = 404;
return JsonSerializer.SerializeAsync(context.Response.Body, new
{
message = $"Unknown service {name}"
}, _options);
}

private Task AllMetrics(HttpContext context)
{
var app = context.RequestServices.GetRequiredService<Tye.Hosting.Model.Application>();
var app = context.RequestServices.GetRequiredService<Application>();

var sb = new StringBuilder();
foreach (var s in app.Services.OrderBy(s => s.Key))
foreach (var (serviceName, service) in app.Services.OrderBy(s => s.Key))
{
sb.AppendLine($"# {s.Key}");
foreach (var replica in s.Value.Replicas)
sb.AppendLine($"# {serviceName}");
foreach (var (instance, replica) in service.Replicas)
{
foreach (var metric in replica.Value.Metrics)
foreach (var (key, value) in replica.Metrics)
{
sb.Append(metric.Key);
sb.Append(key);
sb.Append("{");
sb.Append($"service=\"{s.Key}\",");
sb.Append($"instance=\"{replica.Key}\"");
sb.Append($"service=\"{serviceName}\",");
sb.Append($"instance=\"{instance}\"");
sb.Append("}");
sb.Append(" ");
sb.Append(metric.Value);
sb.Append(value);
sb.AppendLine();
}
}
Expand Down Expand Up @@ -278,16 +273,16 @@ private Task Metrics(HttpContext context)
_options);
}

foreach (var replica in service.Replicas)
foreach (var (instance, replica) in service.Replicas)
{
foreach (var metric in replica.Value.Metrics)
foreach (var (key, value) in replica.Metrics)
{
sb.Append(metric.Key);
sb.Append(key);
sb.Append("{");
sb.Append($"instance=\"{replica.Key}\"");
sb.Append($"instance=\"{instance}\"");
sb.Append("}");
sb.Append(" ");
sb.Append(metric.Value);
sb.Append(value);
sb.AppendLine();
}
}
Expand Down