feat(swarm-mgmt): agent_host + updater opt-in; prevent duplicate forwarder spawn

This commit is contained in:
2026-04-19 05:12:55 -04:00
parent 95ae175e1b
commit e32fdf9cbf
8 changed files with 141 additions and 11 deletions

View File

@@ -14,6 +14,8 @@ interface BundleResult {
const AgentEnrollment: React.FC = () => {
const [masterHost, setMasterHost] = useState(window.location.hostname);
const [agentName, setAgentName] = useState('');
const [agentHost, setAgentHost] = useState('');
const [withUpdater, setWithUpdater] = useState(true);
const [servicesIni, setServicesIni] = useState<string | null>(null);
const [servicesIniName, setServicesIniName] = useState<string | null>(null);
const [submitting, setSubmitting] = useState(false);
@@ -47,6 +49,8 @@ const AgentEnrollment: React.FC = () => {
setResult(null);
setError(null);
setAgentName('');
setAgentHost('');
setWithUpdater(true);
setServicesIni(null);
setServicesIniName(null);
setCopied(false);
@@ -61,6 +65,8 @@ const AgentEnrollment: React.FC = () => {
const res = await api.post('/swarm/enroll-bundle', {
master_host: masterHost,
agent_name: agentName,
agent_host: agentHost,
with_updater: withUpdater,
services_ini: servicesIni,
});
setResult(res.data);
@@ -106,6 +112,16 @@ const AgentEnrollment: React.FC = () => {
required
/>
</label>
<label>
Agent host (IP or DNS of the new worker VM)
<input
type="text"
value={agentHost}
onChange={(e) => setAgentHost(e.target.value)}
placeholder="e.g. 192.168.1.23"
required
/>
</label>
<label>
Agent name (lowercase, digits, dashes)
<input
@@ -119,6 +135,14 @@ const AgentEnrollment: React.FC = () => {
<small className="field-warn"><AlertTriangle size={12} /> must match ^[a-z0-9][a-z0-9-]{`{0,62}`}$</small>
)}
</label>
<label className="form-inline">
<input
type="checkbox"
checked={withUpdater}
onChange={(e) => setWithUpdater(e.target.checked)}
/>
<span>Install updater daemon (lets the master push code updates to this agent)</span>
</label>
<label>
Services INI (optional)
<input ref={fileRef} type="file" accept=".ini,.conf,.txt" onChange={handleFile} />
@@ -128,7 +152,7 @@ const AgentEnrollment: React.FC = () => {
<button
type="submit"
className="control-btn primary"
disabled={submitting || !nameOk || !masterHost}
disabled={submitting || !nameOk || !masterHost || !agentHost}
>
{submitting ? 'Generating…' : 'Generate enrollment bundle'}
</button>

View File

@@ -129,6 +129,12 @@
font-family: inherit;
}
.form-stack label.form-inline {
flex-direction: row;
align-items: center;
gap: 8px;
}
.form-stack small {
opacity: 0.7;
font-size: 0.75rem;