From ee7a5369b1d3662639006645d3748dd77290511d Mon Sep 17 00:00:00 2001 From: Nick Ethier Date: Mon, 1 Feb 2021 15:56:43 -0500 Subject: [PATCH] scheduler: add tests and fix for detected host_network and to port field changes --- scheduler/util.go | 22 +++++++++++----- scheduler/util_test.go | 57 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 6 deletions(-) diff --git a/scheduler/util.go b/scheduler/util.go index 7261f67deb8..bfc1a39efc3 100644 --- a/scheduler/util.go +++ b/scheduler/util.go @@ -534,16 +534,26 @@ func networkUpdated(netA, netB []*structs.NetworkResource) bool { return false } -// networkPortMap takes a network resource and returns a map of port labels to -// values. The value for dynamic ports is disregarded even if it is set. This +// networkPortMap takes a network resource and returns a AllocatedPorts. +// The value for dynamic ports is disregarded even if it is set. This // makes this function suitable for comparing two network resources for changes. -func networkPortMap(n *structs.NetworkResource) map[string]int { - m := make(map[string]int, len(n.DynamicPorts)+len(n.ReservedPorts)) +func networkPortMap(n *structs.NetworkResource) structs.AllocatedPorts { + var m structs.AllocatedPorts for _, p := range n.ReservedPorts { - m[p.Label] = p.Value + m = append(m, structs.AllocatedPortMapping{ + Label: p.Label, + Value: p.Value, + To: p.To, + HostIP: p.HostNetwork, + }) } for _, p := range n.DynamicPorts { - m[p.Label] = -1 + m = append(m, structs.AllocatedPortMapping{ + Label: p.Label, + Value: -1, + To: p.To, + HostIP: p.HostNetwork, + }) } return m } diff --git a/scheduler/util_test.go b/scheduler/util_test.go index 654b23f2424..817e8ef86a7 100644 --- a/scheduler/util_test.go +++ b/scheduler/util_test.go @@ -762,6 +762,63 @@ func TestTasksUpdated_connectServiceUpdated(t *testing.T) { }) } +func TestNetworkUpdated(t *testing.T) { + t.Parallel() + cases := []struct { + name string + a []*structs.NetworkResource + b []*structs.NetworkResource + updated bool + }{ + { + name: "mode updated", + a: []*structs.NetworkResource{ + {Mode: "host"}, + }, + b: []*structs.NetworkResource{ + {Mode: "bridge"}, + }, + updated: true, + }, + { + name: "host_network updated", + a: []*structs.NetworkResource{ + {DynamicPorts: []structs.Port{ + {Label: "http", To: 8080}, + }}, + }, + b: []*structs.NetworkResource{ + {DynamicPorts: []structs.Port{ + {Label: "http", To: 8080, HostNetwork: "public"}, + }}, + }, + updated: true, + }, + { + name: "port.To updated", + a: []*structs.NetworkResource{ + {DynamicPorts: []structs.Port{ + {Label: "http", To: 8080}, + }}, + }, + b: []*structs.NetworkResource{ + {DynamicPorts: []structs.Port{ + {Label: "http", To: 8088}, + }}, + }, + updated: true, + }, + } + + for i := range cases { + c := cases[i] + t.Run(c.name, func(tc *testing.T) { + tc.Parallel() + require.Equal(tc, c.updated, networkUpdated(c.a, c.b), "unexpected network updated result") + }) + } +} + func TestEvictAndPlace_LimitLessThanAllocs(t *testing.T) { _, ctx := testContext(t) allocs := []allocTuple{