github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/apiserver/facades/controller/firewaller/modelfirewallruleswatcher_test.go (about) 1 // Copyright 2023 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package firewaller_test 5 6 import ( 7 jc "github.com/juju/testing/checkers" 8 "go.uber.org/mock/gomock" 9 gc "gopkg.in/check.v1" 10 11 "github.com/juju/juju/apiserver/facades/controller/firewaller" 12 "github.com/juju/juju/apiserver/facades/controller/firewaller/mocks" 13 "github.com/juju/juju/environs/config" 14 statetesting "github.com/juju/juju/state/testing" 15 coretesting "github.com/juju/juju/testing" 16 ) 17 18 var _ = gc.Suite(&ModelFirewallRulesWatcherSuite{}) 19 20 type ModelFirewallRulesWatcherSuite struct { 21 st *mocks.MockState 22 } 23 24 func (s *ModelFirewallRulesWatcherSuite) setup(c *gc.C) *gomock.Controller { 25 ctrl := gomock.NewController(c) 26 s.st = mocks.NewMockState(ctrl) 27 28 return ctrl 29 } 30 31 func cfg(c *gc.C, in map[string]interface{}) *config.Config { 32 attrs := coretesting.FakeConfig().Merge(in) 33 cfg, err := config.New(config.UseDefaults, attrs) 34 c.Assert(err, jc.ErrorIsNil) 35 return cfg 36 } 37 38 func mockNotifyWatcher(ctrl *gomock.Controller) (*mocks.MockNotifyWatcher, chan struct{}) { 39 ch := make(chan struct{}) 40 watcher := mocks.NewMockNotifyWatcher(ctrl) 41 watcher.EXPECT().Changes().Return(ch).MinTimes(1) 42 watcher.EXPECT().Wait().AnyTimes() 43 watcher.EXPECT().Kill().AnyTimes() 44 watcher.EXPECT().Stop().AnyTimes() 45 return watcher, ch 46 } 47 48 func (s *ModelFirewallRulesWatcherSuite) TestInitial(c *gc.C) { 49 ctrl := s.setup(c) 50 defer ctrl.Finish() 51 52 watcher, notifyCh := mockNotifyWatcher(ctrl) 53 defer close(notifyCh) 54 s.st.EXPECT().WatchForModelConfigChanges().Return(watcher) 55 56 s.st.EXPECT().ModelConfig().Return(cfg(c, map[string]interface{}{config.SSHAllowKey: "0.0.0.0/0"}), nil) 57 58 w, err := firewaller.NewModelFirewallRulesWatcher(s.st) 59 c.Assert(err, jc.ErrorIsNil) 60 defer statetesting.AssertStop(c, w) 61 wc := statetesting.NewNotifyWatcherC(c, w) 62 63 // Initial event 64 notifyCh <- struct{}{} 65 wc.AssertChanges(1) 66 } 67 68 func (s *ModelFirewallRulesWatcherSuite) TestConfigChange(c *gc.C) { 69 ctrl := s.setup(c) 70 defer ctrl.Finish() 71 72 watcher, notifyCh := mockNotifyWatcher(ctrl) 73 defer close(notifyCh) 74 75 s.st.EXPECT().WatchForModelConfigChanges().Return(watcher) 76 77 s.st.EXPECT().ModelConfig().Return(cfg(c, map[string]interface{}{config.SSHAllowKey: "0.0.0.0/0"}), nil) 78 s.st.EXPECT().ModelConfig().Return(cfg(c, map[string]interface{}{config.SSHAllowKey: "192.168.0.0/24"}), nil) 79 80 w, err := firewaller.NewModelFirewallRulesWatcher(s.st) 81 c.Assert(err, jc.ErrorIsNil) 82 defer statetesting.AssertStop(c, w) 83 wc := statetesting.NewNotifyWatcherC(c, w) 84 85 // Initial event 86 notifyCh <- struct{}{} 87 wc.AssertChanges(1) 88 89 // Config change 90 notifyCh <- struct{}{} 91 wc.AssertChanges(1) 92 } 93 94 func (s *ModelFirewallRulesWatcherSuite) TestIrrelevantConfigChange(c *gc.C) { 95 ctrl := s.setup(c) 96 defer ctrl.Finish() 97 98 watcher, notifyCh := mockNotifyWatcher(ctrl) 99 defer close(notifyCh) 100 101 s.st.EXPECT().WatchForModelConfigChanges().Return(watcher) 102 103 s.st.EXPECT().ModelConfig().Return(cfg(c, map[string]interface{}{config.SSHAllowKey: "0.0.0.0/0"}), nil) 104 s.st.EXPECT().ModelConfig().Return(cfg(c, map[string]interface{}{config.SSHAllowKey: "0.0.0.0/0"}), nil) 105 106 w, err := firewaller.NewModelFirewallRulesWatcher(s.st) 107 c.Assert(err, jc.ErrorIsNil) 108 defer statetesting.AssertStop(c, w) 109 wc := statetesting.NewNotifyWatcherC(c, w) 110 111 // Initial event 112 notifyCh <- struct{}{} 113 wc.AssertChanges(1) 114 115 // Config change 116 notifyCh <- struct{}{} 117 wc.AssertNoChange() 118 }