From 5d5bb262b7d3c99da234db84016cfe5796ddcf01 Mon Sep 17 00:00:00 2001 From: Michael Schurter Date: Wed, 5 Jan 2022 17:01:53 -0800 Subject: [PATCH] Merge pull request #11744 from hashicorp/b-node-copy Fix Node.Copy() --- .changelog/11744.txt | 3 +++ nomad/node_endpoint_test.go | 4 +--- nomad/structs/structs.go | 24 +++++++++++++++++------- nomad/structs/structs_test.go | 9 +++++++++ 4 files changed, 30 insertions(+), 10 deletions(-) create mode 100644 .changelog/11744.txt diff --git a/.changelog/11744.txt b/.changelog/11744.txt new file mode 100644 index 000000000000..f8a3fb52e0a0 --- /dev/null +++ b/.changelog/11744.txt @@ -0,0 +1,3 @@ +```release-note:bug +core: Fix missing fields in Node.Copy() +``` diff --git a/nomad/node_endpoint_test.go b/nomad/node_endpoint_test.go index 65ac8c03a0c0..1070892b0813 100644 --- a/nomad/node_endpoint_test.go +++ b/nomad/node_endpoint_test.go @@ -1531,9 +1531,7 @@ func TestClientEndpoint_GetNode(t *testing.T) { node.StatusUpdatedAt = resp2.Node.StatusUpdatedAt node.SecretID = "" node.Events = resp2.Node.Events - if !reflect.DeepEqual(node, resp2.Node) { - t.Fatalf("bad: %#v \n %#v", node, resp2.Node) - } + require.Equal(t, node, resp2.Node) // assert that the node register event was set correctly if len(resp2.Node.Events) != 1 { diff --git a/nomad/structs/structs.go b/nomad/structs/structs.go index 2f4b5314cc40..af54e453e245 100644 --- a/nomad/structs/structs.go +++ b/nomad/structs/structs.go @@ -1980,19 +1980,19 @@ func (n *Node) Copy() *Node { nn := new(Node) *nn = *n nn.Attributes = helper.CopyMapStringString(nn.Attributes) - nn.Resources = nn.Resources.Copy() - nn.Reserved = nn.Reserved.Copy() nn.NodeResources = nn.NodeResources.Copy() nn.ReservedResources = nn.ReservedResources.Copy() + nn.Resources = nn.Resources.Copy() + nn.Reserved = nn.Reserved.Copy() nn.Links = helper.CopyMapStringString(nn.Links) nn.Meta = helper.CopyMapStringString(nn.Meta) - nn.Events = copyNodeEvents(n.Events) nn.DrainStrategy = nn.DrainStrategy.Copy() - nn.LastDrain = nn.LastDrain.Copy() + nn.Events = copyNodeEvents(n.Events) + nn.Drivers = copyNodeDrivers(n.Drivers) nn.CSIControllerPlugins = copyNodeCSI(nn.CSIControllerPlugins) nn.CSINodePlugins = copyNodeCSI(nn.CSINodePlugins) - nn.Drivers = copyNodeDrivers(n.Drivers) nn.HostVolumes = copyNodeHostVolumes(n.HostVolumes) + nn.LastDrain = nn.LastDrain.Copy() return nn } @@ -2602,6 +2602,7 @@ func (n *NetworkResource) Copy() *NetworkResource { } newR := new(NetworkResource) *newR = *n + newR.DNS = n.DNS.Copy() if n.ReservedPorts != nil { newR.ReservedPorts = make([]Port, len(n.ReservedPorts)) copy(newR.ReservedPorts, n.ReservedPorts) @@ -2816,8 +2817,7 @@ func (n *NodeResources) Copy() *NodeResources { newN := new(NodeResources) *newN = *n - - // Copy the networks + newN.Cpu = n.Cpu.Copy() newN.Networks = n.Networks.Copy() if n.NodeNetworks != nil { @@ -3011,6 +3011,16 @@ type NodeCpuResources struct { ReservableCpuCores []uint16 } +func (n NodeCpuResources) Copy() NodeCpuResources { + newN := n + if n.ReservableCpuCores != nil { + newN.ReservableCpuCores = make([]uint16, len(n.ReservableCpuCores)) + copy(newN.ReservableCpuCores, n.ReservableCpuCores) + } + + return newN +} + func (n *NodeCpuResources) Merge(o *NodeCpuResources) { if o == nil { return diff --git a/nomad/structs/structs_test.go b/nomad/structs/structs_test.go index d54c6e44a3f5..aa55f3d819f4 100644 --- a/nomad/structs/structs_test.go +++ b/nomad/structs/structs_test.go @@ -1672,6 +1672,15 @@ func TestNetworkResource_Copy(t *testing.T) { t.Run(tc.name, func(t *testing.T) { output := tc.inputNetworkResource.Copy() assert.Equal(t, tc.inputNetworkResource, output, tc.name) + + if output == nil { + return + } + + // Assert changes to the copy aren't propagated to the + // original + output.DNS.Servers[1] = "foo" + assert.NotEqual(t, tc.inputNetworkResource, output, tc.name) }) } }