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  }