105 lines
3.8 KiB
Plaintext
105 lines
3.8 KiB
Plaintext
@page "/clusters/new"
|
|
@using System.ComponentModel.DataAnnotations
|
|
@using ZB.MOM.WW.OtOpcUa.Admin.Services
|
|
@using ZB.MOM.WW.OtOpcUa.Configuration.Entities
|
|
@using ZB.MOM.WW.OtOpcUa.Configuration.Enums
|
|
@inject ClusterService ClusterSvc
|
|
@inject GenerationService GenerationSvc
|
|
@inject NavigationManager Nav
|
|
|
|
<h1 class="mb-4">New cluster</h1>
|
|
|
|
<EditForm Model="_input" OnValidSubmit="CreateAsync" FormName="new-cluster">
|
|
<DataAnnotationsValidator/>
|
|
|
|
<div class="row g-3">
|
|
<div class="col-md-6">
|
|
<label class="form-label">ClusterId <span class="text-danger">*</span></label>
|
|
<InputText @bind-Value="_input.ClusterId" class="form-control"/>
|
|
<div class="form-text">Stable internal ID. Lowercase alphanumeric + hyphens; ≤ 64 chars.</div>
|
|
<ValidationMessage For="() => _input.ClusterId"/>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<label class="form-label">Display name <span class="text-danger">*</span></label>
|
|
<InputText @bind-Value="_input.Name" class="form-control"/>
|
|
<ValidationMessage For="() => _input.Name"/>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<label class="form-label">Enterprise</label>
|
|
<InputText @bind-Value="_input.Enterprise" class="form-control"/>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<label class="form-label">Site</label>
|
|
<InputText @bind-Value="_input.Site" class="form-control"/>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<label class="form-label">Redundancy</label>
|
|
<InputSelect @bind-Value="_input.RedundancyMode" class="form-select">
|
|
<option value="@RedundancyMode.None">None (single node)</option>
|
|
<option value="@RedundancyMode.Warm">Warm (2 nodes)</option>
|
|
<option value="@RedundancyMode.Hot">Hot (2 nodes)</option>
|
|
</InputSelect>
|
|
</div>
|
|
</div>
|
|
|
|
@if (!string.IsNullOrEmpty(_error))
|
|
{
|
|
<div class="alert alert-danger mt-3">@_error</div>
|
|
}
|
|
|
|
<div class="mt-4">
|
|
<button type="submit" class="btn btn-primary" disabled="@_submitting">Create cluster</button>
|
|
<a href="/clusters" class="btn btn-secondary ms-2">Cancel</a>
|
|
</div>
|
|
</EditForm>
|
|
|
|
@code {
|
|
private sealed class Input
|
|
{
|
|
[Required, RegularExpression("^[a-z0-9-]{1,64}$", ErrorMessage = "Lowercase alphanumeric + hyphens only")]
|
|
public string ClusterId { get; set; } = string.Empty;
|
|
|
|
[Required, StringLength(128)]
|
|
public string Name { get; set; } = string.Empty;
|
|
|
|
[StringLength(32)] public string Enterprise { get; set; } = "zb";
|
|
[StringLength(32)] public string Site { get; set; } = "dev";
|
|
public RedundancyMode RedundancyMode { get; set; } = RedundancyMode.None;
|
|
}
|
|
|
|
private Input _input = new();
|
|
private bool _submitting;
|
|
private string? _error;
|
|
|
|
private async Task CreateAsync()
|
|
{
|
|
_submitting = true;
|
|
_error = null;
|
|
|
|
try
|
|
{
|
|
var cluster = new ServerCluster
|
|
{
|
|
ClusterId = _input.ClusterId,
|
|
Name = _input.Name,
|
|
Enterprise = _input.Enterprise,
|
|
Site = _input.Site,
|
|
RedundancyMode = _input.RedundancyMode,
|
|
NodeCount = _input.RedundancyMode == RedundancyMode.None ? (byte)1 : (byte)2,
|
|
Enabled = true,
|
|
CreatedBy = "admin-ui",
|
|
};
|
|
|
|
await ClusterSvc.CreateAsync(cluster, createdBy: "admin-ui", CancellationToken.None);
|
|
await GenerationSvc.CreateDraftAsync(cluster.ClusterId, createdBy: "admin-ui", CancellationToken.None);
|
|
|
|
Nav.NavigateTo($"/clusters/{cluster.ClusterId}");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_error = ex.Message;
|
|
}
|
|
finally { _submitting = false; }
|
|
}
|
|
}
|