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  }