Initial working prototype

This commit is contained in:
Fishandchips321 2025-12-20 20:48:14 +00:00
parent 3f6ff87370
commit ccc5337dc1
17 changed files with 506 additions and 57 deletions

View file

@ -25,29 +25,27 @@ public class ServiceController : ControllerBase
}
[HttpPost()]
public async Task<IActionResult> ToggleContainer(string containerName, string? containerNamespace, string action)
public async Task<IActionResult> ToggleContainer([FromQuery] string containerName, string? containerNamespace, string action)
{
if (containerName == string.Empty || action == string.Empty)
{
return BadRequest("Missing required parameter");
}
var container = await _service.GetContainer(containerName, containerNamespace);
switch (action)
{
case "START":
await _service.StartContainer(container);
await _service.StartContainer(containerName, containerNamespace);
break;
case "STOP":
await _service.StopContainer(container);
await _service.StopContainer(containerName, containerNamespace);
break;
default:
return BadRequest("Incorrect action");
}
return Ok(container);
return Ok();
}
}

View file

@ -3,6 +3,6 @@ namespace ContainerDashboard.Models;
public class Container
{
public string Name { get; set; } = string.Empty;
public string containerNamespace { get; set; } = string.Empty;
public string ContainerNamespace { get; set; } = string.Empty;
public bool Running { get; set; } = false;
}

View file

@ -6,6 +6,6 @@ public interface IContainerHandler
{
public Task<Container[]> GetContainers();
public Task<Container> GetContainer(string containerName, string? containerNamespace);
public Task StartContainer();
public Task StopContainer();
public Task StartContainer(string containerName, string? containerNamespace);
public Task StopContainer(string containerName, string? containerNamespace);
}

View file

@ -36,11 +36,14 @@ public class KubernetesHandler : IContainerHandler
foreach (var item in list.Items)
{
if (item.Namespace() == "kube-system")
continue;
var c = new Container
{
containerNamespace = item.Namespace(),
ContainerNamespace = item.Namespace(),
Name = item.Name(),
Running = item.Status.Replicas > 0
Running = item.Status.ReadyReplicas > 0
};
containers.Add(c);
@ -49,13 +52,57 @@ public class KubernetesHandler : IContainerHandler
return containers.ToArray();
}
public Task StartContainer()
public async Task StartContainer(string containerName, string? containerNamespace)
{
throw new NotImplementedException();
var container = await _client.AppsV1.ReadNamespacedDeploymentAsync(containerName, containerNamespace);
if (container == null)
{
throw new Exception($"Could not get container {containerName} in namespace {containerNamespace}");
}
var patchStr = @"
{
""spec"": {
""replicas"": 1
}
}
";
var patch = new V1Patch(patchStr, V1Patch.PatchType.MergePatch);
var result = await _client.AppsV1.PatchNamespacedDeploymentAsync(patch, containerName, containerNamespace, fieldManager: "ContainerDashboard");
if (result == null)
{
throw new Exception($"Could not update container {containerName} in namespace {containerNamespace}");
}
}
public Task StopContainer()
public async Task StopContainer(string containerName, string? containerNamespace)
{
throw new NotImplementedException();
var container = await _client.AppsV1.ReadNamespacedDeploymentAsync(containerName, containerNamespace);
if (container == null)
{
throw new Exception($"Could not get container {containerName} in namespace {containerNamespace}");
}
var patchStr = @"
{
""spec"": {
""replicas"": 0
}
}
";
var patch = new V1Patch(patchStr, V1Patch.PatchType.MergePatch);
var result = await _client.AppsV1.PatchNamespacedDeploymentAsync(patch, containerName, containerNamespace, fieldManager: "ContainerDashboard");
if (result == null)
{
throw new Exception($"Could not update container {containerName} in namespace {containerNamespace}");
}
}
}

View file

@ -12,23 +12,18 @@ public class ContainerService : IContainerService
_handler = handler;
}
public Task<Container> GetContainer(string containerName, string? containerNamespace)
{
throw new NotImplementedException();
}
public async Task<Container[]> GetContainers()
{
return await _handler.GetContainers();
}
public Task StartContainer(Container container)
public async Task StartContainer(string containerName, string? containerNamespace)
{
throw new NotImplementedException();
await _handler.StartContainer(containerName, containerNamespace);
}
public Task StopContainer(Container container)
public async Task StopContainer(string containerName, string? containerNamespace)
{
throw new NotImplementedException();
await _handler.StopContainer(containerName, containerNamespace);
}
}

View file

@ -5,7 +5,6 @@ namespace ContainerDashboard.Services;
public interface IContainerService
{
public Task<Container[]> GetContainers();
public Task<Container> GetContainer(string containerName, string? containerNamespace);
public Task StartContainer(Container container);
public Task StopContainer(Container container);
public Task StartContainer(string containerName, string? containerNamespace);
public Task StopContainer(string containerName, string? containerNamespace);
}