From e75ae1de9697e221255537874c19f484214c3956 Mon Sep 17 00:00:00 2001 From: deverton-godaddy <115049356+deverton-godaddy@users.noreply.github.com> Date: Wed, 5 Jul 2023 09:35:38 +1000 Subject: [PATCH] [api] Add NetworkStatus to allocation response (#17280) Service discovery or mesh network systems consuming the Nomad event stream or API need to know the CNI assigned IP for the allocation. This data is returned by the underlying Nomad API but isn't mapped in the response struct. --- .changelog/17280.txt | 3 +++ api/allocations.go | 10 ++++++++++ api/allocations_test.go | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 .changelog/17280.txt diff --git a/.changelog/17280.txt b/.changelog/17280.txt new file mode 100644 index 000000000..621dba895 --- /dev/null +++ b/.changelog/17280.txt @@ -0,0 +1,3 @@ +```release-note:bug +api: add missing field NetworkStatus for Allocation +``` diff --git a/api/allocations.go b/api/allocations.go index 3ec147f21..121a75934 100644 --- a/api/allocations.go +++ b/api/allocations.go @@ -271,6 +271,7 @@ type Allocation struct { PreviousAllocation string NextAllocation string RescheduleTracker *RescheduleTracker + NetworkStatus *AllocNetworkStatus PreemptedAllocations []string PreemptedByAllocation string CreateIndex uint64 @@ -402,6 +403,15 @@ type AllocDeploymentStatus struct { ModifyIndex uint64 } +// AllocNetworkStatus captures the status of an allocation's network during runtime. +// Depending on the network mode, an allocation's address may need to be known to other +// systems in Nomad such as service registration. +type AllocNetworkStatus struct { + InterfaceName string + Address string + DNS *DNSConfig +} + type AllocatedResources struct { Tasks map[string]*AllocatedTaskResources Shared AllocatedSharedResources diff --git a/api/allocations_test.go b/api/allocations_test.go index 71586e004..a5d49ad73 100644 --- a/api/allocations_test.go +++ b/api/allocations_test.go @@ -161,6 +161,46 @@ func TestAllocations_CreateIndexSort(t *testing.T) { must.Eq(t, allocs, expect) } +func TestAllocations_Info(t *testing.T) { + testutil.RequireRoot(t) + testutil.Parallel(t) + + c, s := makeClient(t, nil, func(c *testutil.TestServerConfig) { + c.DevMode = true + }) + defer s.Stop() + a := c.Allocations() + + // wait for node + _ = oneNodeFromNodeList(t, c.Nodes()) + + // Create a job and attempt to register it + job := testJob() + resp, wm, err := c.Jobs().Register(job, nil) + must.NoError(t, err) + must.NotNil(t, resp) + must.UUIDv4(t, resp.EvalID) + assertWriteMeta(t, wm) + + // List allocations. + qo := &QueryOptions{ + WaitIndex: wm.LastIndex, + } + allocs, qm, err := a.List(qo) + must.NoError(t, err) + must.NonZero(t, qm.LastIndex) + + // Check that we got one allocation. + must.Len(t, 1, allocs) + must.Eq(t, resp.EvalID, allocs[0].EvalID) + + // Fetch alloc info. + qo.WaitIndex = qm.LastIndex + alloc, _, err := a.Info(allocs[0].ID, qo) + + must.NotNil(t, alloc.NetworkStatus) +} + func TestAllocations_RescheduleInfo(t *testing.T) { testutil.Parallel(t)