Files
Entkube/src/EntKube.Clusters/Features/RegisterCluster/RegisterClusterHandler.cs
Nils Blomgren a96dd33039
Some checks failed
Build EntKube / build (push) Failing after 27s
Package Helm Chart / lint (push) Failing after 36s
Package Helm Chart / package (push) Has been skipped
Add unit tests for KubernetesCluster, Tenant, ServiceInstance, and RegisterClusterHandler
- Implement tests for KubernetesCluster including registration, connectivity status, and error handling.
- Create tests for Tenant creation, member management, and status changes.
- Add tests for ServiceInstance provisioning and state management.
- Introduce RegisterClusterHandler tests to validate registration requests and error scenarios.
- Set up project files for new test projects with necessary dependencies.
2026-05-05 11:44:36 +02:00

54 lines
1.9 KiB
C#

using EntKube.Clusters.Domain;
using EntKube.SharedKernel.Domain;
namespace EntKube.Clusters.Features.RegisterCluster;
/// <summary>
/// Handles the registration of a new Kubernetes cluster into the platform.
/// A tenant admin provides the cluster name, API server URL, and optionally
/// a kubeconfig secret reference. We validate the input, create the cluster
/// aggregate, and persist it. The cluster starts in Pending state until the
/// background health-check service confirms connectivity.
/// </summary>
public class RegisterClusterHandler
{
private readonly IClusterRepository repository;
public RegisterClusterHandler(IClusterRepository repository)
{
this.repository = repository;
}
public async Task<Result<Guid>> HandleAsync(RegisterClusterRequest request, CancellationToken ct = default)
{
// Validate that the caller provided the minimum required information.
// Without a name and API URL, we cannot register a cluster.
if (string.IsNullOrWhiteSpace(request.Name))
{
return Result.Failure<Guid>("Cluster name is required.");
}
if (string.IsNullOrWhiteSpace(request.ApiServerUrl))
{
return Result.Failure<Guid>("API server URL is required.");
}
// Create the cluster aggregate using the domain factory method.
// This encapsulates all the business rules for what a valid new cluster looks like.
KubernetesCluster cluster = KubernetesCluster.Register(
request.Name,
request.ApiServerUrl,
request.KubeConfigSecret);
// Persist the new cluster so it can be picked up by the health-check background service.
await repository.AddAsync(cluster, ct);
return Result.Success(cluster.Id);
}
}
public record RegisterClusterRequest(string Name, string ApiServerUrl, string? KubeConfigSecret);