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 }