github.com/iqoqo/nomad@v0.11.3-0.20200911112621-d7021c74d101/client/pluginmanager/csimanager/manager_test.go (about)

     1  package csimanager
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  
     7  	"github.com/hashicorp/nomad/client/dynamicplugins"
     8  	"github.com/hashicorp/nomad/client/pluginmanager"
     9  	"github.com/hashicorp/nomad/helper/testlog"
    10  	"github.com/hashicorp/nomad/nomad/structs"
    11  	"github.com/stretchr/testify/require"
    12  )
    13  
    14  var _ pluginmanager.PluginManager = (*csiManager)(nil)
    15  
    16  var fakePlugin = &dynamicplugins.PluginInfo{
    17  	Name:           "my-plugin",
    18  	Type:           "csi-controller",
    19  	ConnectionInfo: &dynamicplugins.PluginConnectionInfo{},
    20  }
    21  
    22  func setupRegistry() dynamicplugins.Registry {
    23  	return dynamicplugins.NewRegistry(
    24  		nil,
    25  		map[string]dynamicplugins.PluginDispenser{
    26  			"csi-controller": func(*dynamicplugins.PluginInfo) (interface{}, error) {
    27  				return nil, nil
    28  			},
    29  		})
    30  }
    31  
    32  func TestManager_Setup_Shutdown(t *testing.T) {
    33  	r := setupRegistry()
    34  	defer r.Shutdown()
    35  
    36  	cfg := &Config{
    37  		Logger:                testlog.HCLogger(t),
    38  		DynamicRegistry:       r,
    39  		UpdateNodeCSIInfoFunc: func(string, *structs.CSIInfo) {},
    40  	}
    41  	pm := New(cfg).(*csiManager)
    42  	pm.Run()
    43  	pm.Shutdown()
    44  }
    45  
    46  func TestManager_RegisterPlugin(t *testing.T) {
    47  	registry := setupRegistry()
    48  	defer registry.Shutdown()
    49  
    50  	require.NotNil(t, registry)
    51  
    52  	cfg := &Config{
    53  		Logger:                testlog.HCLogger(t),
    54  		DynamicRegistry:       registry,
    55  		UpdateNodeCSIInfoFunc: func(string, *structs.CSIInfo) {},
    56  	}
    57  	pm := New(cfg).(*csiManager)
    58  	defer pm.Shutdown()
    59  
    60  	require.NotNil(t, pm.registry)
    61  
    62  	err := registry.RegisterPlugin(fakePlugin)
    63  	require.Nil(t, err)
    64  
    65  	pm.Run()
    66  
    67  	require.Eventually(t, func() bool {
    68  		pmap, ok := pm.instances[fakePlugin.Type]
    69  		if !ok {
    70  			return false
    71  		}
    72  
    73  		_, ok = pmap[fakePlugin.Name]
    74  		return ok
    75  	}, 5*time.Second, 10*time.Millisecond)
    76  }
    77  
    78  func TestManager_DeregisterPlugin(t *testing.T) {
    79  	registry := setupRegistry()
    80  	defer registry.Shutdown()
    81  
    82  	require.NotNil(t, registry)
    83  
    84  	cfg := &Config{
    85  		Logger:                testlog.HCLogger(t),
    86  		DynamicRegistry:       registry,
    87  		UpdateNodeCSIInfoFunc: func(string, *structs.CSIInfo) {},
    88  		PluginResyncPeriod:    500 * time.Millisecond,
    89  	}
    90  	pm := New(cfg).(*csiManager)
    91  	defer pm.Shutdown()
    92  
    93  	require.NotNil(t, pm.registry)
    94  
    95  	err := registry.RegisterPlugin(fakePlugin)
    96  	require.Nil(t, err)
    97  
    98  	pm.Run()
    99  
   100  	require.Eventually(t, func() bool {
   101  		_, ok := pm.instances[fakePlugin.Type][fakePlugin.Name]
   102  		return ok
   103  	}, 5*time.Second, 10*time.Millisecond)
   104  
   105  	err = registry.DeregisterPlugin(fakePlugin.Type, fakePlugin.Name)
   106  	require.Nil(t, err)
   107  
   108  	require.Eventually(t, func() bool {
   109  		_, ok := pm.instances[fakePlugin.Type][fakePlugin.Name]
   110  		return !ok
   111  	}, 5*time.Second, 10*time.Millisecond)
   112  }
   113  
   114  // TestManager_MultiplePlugins ensures that multiple plugins with the same
   115  // name but different types (as found with monolith plugins) don't interfere
   116  // with each other.
   117  func TestManager_MultiplePlugins(t *testing.T) {
   118  	registry := setupRegistry()
   119  	defer registry.Shutdown()
   120  
   121  	require.NotNil(t, registry)
   122  
   123  	cfg := &Config{
   124  		Logger:                testlog.HCLogger(t),
   125  		DynamicRegistry:       registry,
   126  		UpdateNodeCSIInfoFunc: func(string, *structs.CSIInfo) {},
   127  		PluginResyncPeriod:    500 * time.Millisecond,
   128  	}
   129  	pm := New(cfg).(*csiManager)
   130  	defer pm.Shutdown()
   131  
   132  	require.NotNil(t, pm.registry)
   133  
   134  	err := registry.RegisterPlugin(fakePlugin)
   135  	require.Nil(t, err)
   136  
   137  	fakeNodePlugin := *fakePlugin
   138  	fakeNodePlugin.Type = "csi-node"
   139  	err = registry.RegisterPlugin(&fakeNodePlugin)
   140  	require.Nil(t, err)
   141  
   142  	pm.Run()
   143  
   144  	require.Eventually(t, func() bool {
   145  		_, ok := pm.instances[fakePlugin.Type][fakePlugin.Name]
   146  		return ok
   147  	}, 5*time.Second, 10*time.Millisecond)
   148  
   149  	require.Eventually(t, func() bool {
   150  		_, ok := pm.instances[fakeNodePlugin.Type][fakeNodePlugin.Name]
   151  		return ok
   152  	}, 5*time.Second, 10*time.Millisecond)
   153  
   154  	err = registry.DeregisterPlugin(fakePlugin.Type, fakePlugin.Name)
   155  	require.Nil(t, err)
   156  
   157  	require.Eventually(t, func() bool {
   158  		_, ok := pm.instances[fakePlugin.Type][fakePlugin.Name]
   159  		return !ok
   160  	}, 5*time.Second, 10*time.Millisecond)
   161  }