github.com/anth0d/nomad@v0.0.0-20221214183521-ae3a0a2cad06/client/fingerprint/bridge_linux_test.go (about)

     1  package fingerprint
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"io/ioutil"
     7  	"os"
     8  	"strings"
     9  	"testing"
    10  
    11  	"github.com/hashicorp/nomad/ci"
    12  	"github.com/hashicorp/nomad/helper/testlog"
    13  	"github.com/stretchr/testify/require"
    14  )
    15  
    16  func TestBridgeFingerprint_detect(t *testing.T) {
    17  	ci.Parallel(t)
    18  
    19  	f := &BridgeFingerprint{logger: testlog.HCLogger(t)}
    20  	require.NoError(t, f.detect("ip_tables"))
    21  
    22  	err := f.detect("nonexistentmodule")
    23  	require.Error(t, err)
    24  	require.Contains(t, err.Error(), "3 errors occurred")
    25  }
    26  
    27  func writeFile(t *testing.T, prefix, content string) string {
    28  	f, err := ioutil.TempFile("", "bridge-fp-")
    29  	require.NoError(t, err)
    30  
    31  	_, err = io.Copy(f, strings.NewReader(content))
    32  	require.NoError(t, err)
    33  
    34  	err = f.Close()
    35  	require.NoError(t, err)
    36  
    37  	return f.Name()
    38  }
    39  
    40  func cleanupFile(t *testing.T, name string) {
    41  	err := os.Remove(name)
    42  	require.NoError(t, err)
    43  }
    44  
    45  const (
    46  	dynamicModuleContent = `
    47  ip_tables 32768 0 - Live 0xffffffffc03ee000
    48  x_tables 40960 1 ip_tables, Live 0xffffffffc03e3000
    49  autofs4 45056 2 - Live 0xffffffffc03d7000
    50  bpfilter 32768 0 - Live 0x0000000000000000
    51  br_netfilter 28672 0 - Live 0x0000000000000000
    52  bridge 176128 1 br_netfilter, Live 0x0000000000000000
    53  btrfs 1253376 0 - Live 0xffffffffc02a4000
    54  `
    55  
    56  	builtinModuleContent = `
    57  kernel/drivers/mfd/max14577.ko
    58  kernel/drivers/mfd/max77693.ko
    59  kernel/drivers/mfd/sec-core.ko
    60  kernel/drivers/mfd/sec-irq.ko
    61  kernel/drivers/net/bridge.ko
    62  kernel/drivers/net/tun.ko
    63  kernel/drivers/net/xen-netfront.k
    64  `
    65  
    66  	dependsModuleContent = `
    67  kernel/net/bridge/netfilter/ebt_log.ko: kernel/net/netfilter/x_tables.ko
    68  kernel/net/bridge/netfilter/ebt_nflog.ko: kernel/net/netfilter/x_tables.ko
    69  kernel/net/bridge/bridge.ko: kernel/net/802/stp.ko kernel/net/llc/llc.ko
    70  kernel/net/bridge/br_netfilter.ko: kernel/net/bridge/bridge.ko kernel/net/802/stp.ko kernel/net/llc/llc.ko
    71  kernel/net/appletalk/appletalk.ko: kernel/net/802/psnap.ko kernel/net/llc/llc.ko
    72  kernel/net/x25/x25.ko:
    73  # Dummy module to test RHEL modules.dep format
    74  kernel/net/bridge/bridgeRHEL.ko.xz: kernel/net/802/stp.ko.xz kernel/net/llc/llc.ko.xz
    75  `
    76  )
    77  
    78  func TestBridgeFingerprint_search(t *testing.T) {
    79  	ci.Parallel(t)
    80  
    81  	f := &BridgeFingerprint{logger: testlog.HCLogger(t)}
    82  
    83  	t.Run("dynamic loaded module", func(t *testing.T) {
    84  		t.Run("present", func(t *testing.T) {
    85  			file := writeFile(t, "bridge-fp-", dynamicModuleContent)
    86  			defer cleanupFile(t, file)
    87  
    88  			err := f.searchFile("bridge", file, f.regexp(dynamicModuleRe, "bridge"))
    89  			require.NoError(t, err)
    90  		})
    91  
    92  		t.Run("absent", func(t *testing.T) {
    93  			file := writeFile(t, "bridge-fp-", dynamicModuleContent)
    94  			defer cleanupFile(t, file)
    95  
    96  			err := f.searchFile("nonexistent", file, f.regexp(dynamicModuleRe, "nonexistent"))
    97  			require.EqualError(t, err, fmt.Sprintf("module nonexistent not in %s", file))
    98  		})
    99  	})
   100  
   101  	t.Run("builtin module", func(t *testing.T) {
   102  		t.Run("present", func(t *testing.T) {
   103  			file := writeFile(t, "bridge-fp-", builtinModuleContent)
   104  			defer cleanupFile(t, file)
   105  
   106  			err := f.searchFile("bridge", file, f.regexp(builtinModuleRe, "bridge"))
   107  			require.NoError(t, err)
   108  		})
   109  
   110  		t.Run("absent", func(t *testing.T) {
   111  			file := writeFile(t, "bridge-fp-", builtinModuleContent)
   112  			defer cleanupFile(t, file)
   113  
   114  			err := f.searchFile("nonexistent", file, f.regexp(builtinModuleRe, "nonexistent"))
   115  			require.EqualError(t, err, fmt.Sprintf("module nonexistent not in %s", file))
   116  		})
   117  	})
   118  
   119  	t.Run("dynamic unloaded module", func(t *testing.T) {
   120  		t.Run("present", func(t *testing.T) {
   121  			file := writeFile(t, "bridge-fp-", dependsModuleContent)
   122  			defer cleanupFile(t, file)
   123  
   124  			err := f.searchFile("bridge", file, f.regexp(dependsModuleRe, "bridge"))
   125  			require.NoError(t, err)
   126  
   127  			err = f.searchFile("bridgeRHEL", file, f.regexp(dependsModuleRe, "bridgeRHEL"))
   128  			require.NoError(t, err)
   129  		})
   130  
   131  		t.Run("absent", func(t *testing.T) {
   132  			file := writeFile(t, "bridge-fp-", dependsModuleContent)
   133  			defer cleanupFile(t, file)
   134  
   135  			err := f.searchFile("nonexistent", file, f.regexp(dependsModuleRe, "nonexistent"))
   136  			require.EqualError(t, err, fmt.Sprintf("module nonexistent not in %s", file))
   137  		})
   138  	})
   139  }