github.com/Ilhicas/nomad@v1.0.4-0.20210304152020-e86851182bc3/client/allocrunner/network_hook_test.go (about) 1 package allocrunner 2 3 import ( 4 "testing" 5 6 "github.com/hashicorp/nomad/client/allocrunner/interfaces" 7 "github.com/hashicorp/nomad/helper/testlog" 8 "github.com/hashicorp/nomad/nomad/mock" 9 "github.com/hashicorp/nomad/nomad/structs" 10 "github.com/hashicorp/nomad/plugins/drivers" 11 "github.com/hashicorp/nomad/plugins/drivers/testutils" 12 "github.com/stretchr/testify/require" 13 ) 14 15 // statically assert network hook implements the expected interfaces 16 var _ interfaces.RunnerPrerunHook = (*networkHook)(nil) 17 var _ interfaces.RunnerPostrunHook = (*networkHook)(nil) 18 19 type mockNetworkIsolationSetter struct { 20 t *testing.T 21 expectedSpec *drivers.NetworkIsolationSpec 22 called bool 23 } 24 25 func (m *mockNetworkIsolationSetter) SetNetworkIsolation(spec *drivers.NetworkIsolationSpec) { 26 m.called = true 27 require.Exactly(m.t, m.expectedSpec, spec) 28 } 29 30 type mockNetworkStatusSetter struct { 31 t *testing.T 32 expectedStatus *structs.AllocNetworkStatus 33 called bool 34 } 35 36 func (m *mockNetworkStatusSetter) SetNetworkStatus(status *structs.AllocNetworkStatus) { 37 m.called = true 38 require.Exactly(m.t, m.expectedStatus, status) 39 } 40 41 // Test that the prerun and postrun hooks call the setter with the expected spec when 42 // the network mode is not host 43 func TestNetworkHook_Prerun_Postrun(t *testing.T) { 44 alloc := mock.Alloc() 45 alloc.Job.TaskGroups[0].Networks = []*structs.NetworkResource{ 46 { 47 Mode: "bridge", 48 }, 49 } 50 spec := &drivers.NetworkIsolationSpec{ 51 Mode: drivers.NetIsolationModeGroup, 52 Path: "test", 53 Labels: map[string]string{"abc": "123"}, 54 } 55 56 destroyCalled := false 57 nm := &testutils.MockDriver{ 58 MockNetworkManager: testutils.MockNetworkManager{ 59 CreateNetworkF: func(allocID string) (*drivers.NetworkIsolationSpec, bool, error) { 60 require.Equal(t, alloc.ID, allocID) 61 return spec, false, nil 62 }, 63 64 DestroyNetworkF: func(allocID string, netSpec *drivers.NetworkIsolationSpec) error { 65 destroyCalled = true 66 require.Equal(t, alloc.ID, allocID) 67 require.Exactly(t, spec, netSpec) 68 return nil 69 }, 70 }, 71 } 72 setter := &mockNetworkIsolationSetter{ 73 t: t, 74 expectedSpec: spec, 75 } 76 statusSetter := &mockNetworkStatusSetter{ 77 t: t, 78 expectedStatus: nil, 79 } 80 require := require.New(t) 81 82 logger := testlog.HCLogger(t) 83 hook := newNetworkHook(logger, setter, alloc, nm, &hostNetworkConfigurator{}, statusSetter) 84 require.NoError(hook.Prerun()) 85 require.True(setter.called) 86 require.False(destroyCalled) 87 require.NoError(hook.Postrun()) 88 require.True(destroyCalled) 89 90 // reset and use host network mode 91 setter.called = false 92 destroyCalled = false 93 alloc.Job.TaskGroups[0].Networks[0].Mode = "host" 94 hook = newNetworkHook(logger, setter, alloc, nm, &hostNetworkConfigurator{}, statusSetter) 95 require.NoError(hook.Prerun()) 96 require.False(setter.called) 97 require.False(destroyCalled) 98 require.NoError(hook.Postrun()) 99 require.False(destroyCalled) 100 101 }