github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/state/relationnetworks_test.go (about)

     1  // Copyright 2017 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package state_test
     5  
     6  import (
     7  	"fmt"
     8  	"regexp"
     9  
    10  	"github.com/juju/errors"
    11  	"github.com/juju/mgo/v3/bson"
    12  	jc "github.com/juju/testing/checkers"
    13  	gc "gopkg.in/check.v1"
    14  
    15  	"github.com/juju/juju/state"
    16  )
    17  
    18  type relationNetworksSuite struct {
    19  	ConnSuite
    20  	relationNetworks state.RelationNetworker
    21  	direction        string
    22  	relation         *state.Relation
    23  }
    24  
    25  type relationIngressNetworksSuite struct {
    26  	relationNetworksSuite
    27  }
    28  
    29  type relationEgressNetworksSuite struct {
    30  	relationNetworksSuite
    31  }
    32  
    33  var _ = gc.Suite(&relationIngressNetworksSuite{})
    34  var _ = gc.Suite(&relationEgressNetworksSuite{})
    35  
    36  func (s *relationNetworksSuite) SetUpTest(c *gc.C) {
    37  	s.ConnSuite.SetUpTest(c)
    38  	wordpress := s.AddTestingApplication(c, "wordpress", s.AddTestingCharm(c, "wordpress"))
    39  	wordpressEP, err := wordpress.Endpoint("db")
    40  	c.Assert(err, jc.ErrorIsNil)
    41  	mysql := s.AddTestingApplication(c, "mysql", s.AddTestingCharm(c, "mysql"))
    42  	mysqlEP, err := mysql.Endpoint("server")
    43  	c.Assert(err, jc.ErrorIsNil)
    44  	s.relation, err = s.State.AddRelation(wordpressEP, mysqlEP)
    45  	c.Assert(err, jc.ErrorIsNil)
    46  }
    47  
    48  func (s *relationIngressNetworksSuite) SetUpTest(c *gc.C) {
    49  	s.relationNetworksSuite.SetUpTest(c)
    50  	s.direction = "ingress"
    51  	s.relationNetworks = state.NewRelationIngressNetworks(s.State)
    52  }
    53  
    54  func (s *relationEgressNetworksSuite) SetUpTest(c *gc.C) {
    55  	s.relationNetworksSuite.SetUpTest(c)
    56  	s.direction = "egress"
    57  	s.relationNetworks = state.NewRelationEgressNetworks(s.State)
    58  }
    59  
    60  func (s *relationNetworksSuite) TestSaveMissingRelation(c *gc.C) {
    61  	_, err := s.relationNetworks.Save("wordpress:db something:database", false, []string{"192.168.1.0/32"})
    62  	c.Assert(err, gc.ErrorMatches, ".*"+regexp.QuoteMeta(`"wordpress:db something:database" not found`))
    63  }
    64  
    65  func (s *relationNetworksSuite) TestSaveInvalidAddress(c *gc.C) {
    66  	_, err := s.relationNetworks.Save("wordpress:db mysql:server", false, []string{"192.168.1"})
    67  	c.Assert(err, gc.ErrorMatches, regexp.QuoteMeta(`CIDR "192.168.1" not valid`))
    68  }
    69  
    70  func (s *relationNetworksSuite) assertSavedIngressInfo(c *gc.C, relationKey string, expectedCIDRS ...string) {
    71  	coll, closer := state.GetCollection(s.State, "relationNetworks")
    72  	defer closer()
    73  
    74  	var raw bson.M
    75  	err := coll.FindId(fmt.Sprintf("%v:%v:default", relationKey, s.direction)).One(&raw)
    76  	c.Assert(err, jc.ErrorIsNil)
    77  	c.Assert(raw["_id"], gc.Equals, fmt.Sprintf("%v:%v:%v:default", s.State.ModelUUID(), relationKey, s.direction))
    78  	var cidrs []string
    79  	for _, m := range raw["cidrs"].([]interface{}) {
    80  		cidrs = append(cidrs, m.(string))
    81  	}
    82  	c.Assert(cidrs, jc.SameContents, expectedCIDRS)
    83  }
    84  
    85  func (s *relationNetworksSuite) TestSave(c *gc.C) {
    86  	rin, err := s.relationNetworks.Save("wordpress:db mysql:server", false, []string{"192.168.1.0/16"})
    87  	c.Assert(err, jc.ErrorIsNil)
    88  	c.Assert(rin.RelationKey(), gc.Equals, "wordpress:db mysql:server")
    89  	c.Assert(rin.CIDRS(), jc.DeepEquals, []string{"192.168.1.0/16"})
    90  	s.assertSavedIngressInfo(c, "wordpress:db mysql:server", "192.168.1.0/16")
    91  }
    92  
    93  func (s *relationNetworksSuite) TestSaveAdminOverrides(c *gc.C) {
    94  	_, err := s.relationNetworks.Save("wordpress:db mysql:server", false, []string{"192.168.1.0/16"})
    95  	c.Assert(err, jc.ErrorIsNil)
    96  	rin, err := s.relationNetworks.Save("wordpress:db mysql:server", true, []string{"10.2.0.0/16"})
    97  	c.Assert(err, jc.ErrorIsNil)
    98  	c.Assert(rin.RelationKey(), gc.Equals, "wordpress:db mysql:server")
    99  	c.Assert(rin.CIDRS(), jc.DeepEquals, []string{"10.2.0.0/16"})
   100  	result, err := s.relationNetworks.Networks("wordpress:db mysql:server")
   101  	c.Assert(err, jc.ErrorIsNil)
   102  	c.Assert(result.CIDRS(), jc.DeepEquals, []string{"10.2.0.0/16"})
   103  }
   104  
   105  func (s *relationNetworksSuite) TestSaveIdempotent(c *gc.C) {
   106  	_, err := s.relationNetworks.Save("wordpress:db mysql:server", false, []string{"192.168.1.0/16"})
   107  	c.Assert(err, jc.ErrorIsNil)
   108  	rin, err := s.relationNetworks.Save("wordpress:db mysql:server", false, []string{"192.168.1.0/16"})
   109  	c.Assert(err, jc.ErrorIsNil)
   110  	c.Assert(rin.RelationKey(), gc.Equals, "wordpress:db mysql:server")
   111  	c.Assert(rin.CIDRS(), jc.DeepEquals, []string{"192.168.1.0/16"})
   112  	s.assertSavedIngressInfo(c, "wordpress:db mysql:server", "192.168.1.0/16")
   113  }
   114  
   115  func (s *relationNetworksSuite) TestNetworks(c *gc.C) {
   116  	_, err := s.relationNetworks.Save("wordpress:db mysql:server", false, []string{"192.168.1.0/16"})
   117  	c.Assert(err, jc.ErrorIsNil)
   118  	result, err := s.relationNetworks.Networks("wordpress:db mysql:server")
   119  	c.Assert(err, jc.ErrorIsNil)
   120  	c.Assert(result.CIDRS(), gc.DeepEquals, []string{"192.168.1.0/16"})
   121  	_, err = s.relationNetworks.Networks("mediawiki:db mysql:server")
   122  	c.Assert(err, jc.Satisfies, errors.IsNotFound)
   123  }
   124  
   125  func (s *relationNetworksSuite) TestUpdateCIDRs(c *gc.C) {
   126  	_, err := s.relationNetworks.Save("wordpress:db mysql:server", false, []string{"192.168.1.0/16"})
   127  	c.Assert(err, jc.ErrorIsNil)
   128  	_, err = s.relationNetworks.Save("wordpress:db mysql:server", false, []string{"10.0.0.1/16"})
   129  	c.Assert(err, jc.ErrorIsNil)
   130  	s.assertSavedIngressInfo(c, "wordpress:db mysql:server", "10.0.0.1/16")
   131  }
   132  
   133  func (s *relationIngressNetworksSuite) TestCrossContanination(c *gc.C) {
   134  	_, err := s.relationNetworks.Save("wordpress:db mysql:server", false, []string{"192.168.1.0/16"})
   135  	c.Assert(err, jc.ErrorIsNil)
   136  	egress := state.NewRelationEgressNetworks(s.State)
   137  	_, err = egress.Networks(s.relation.Tag().Id())
   138  	c.Assert(err, jc.Satisfies, errors.IsNotFound)
   139  }
   140  
   141  func (s *relationEgressNetworksSuite) TestCrossContanination(c *gc.C) {
   142  	_, err := s.relationNetworks.Save("wordpress:db mysql:server", false, []string{"192.168.1.0/16"})
   143  	c.Assert(err, jc.ErrorIsNil)
   144  	ingress := state.NewRelationIngressNetworks(s.State)
   145  	_, err = ingress.Networks(s.relation.Tag().Id())
   146  	c.Assert(err, jc.Satisfies, errors.IsNotFound)
   147  }
   148  
   149  type relationRootNetworksSuite struct {
   150  	relationNetworksSuite
   151  }
   152  
   153  var _ = gc.Suite(&relationRootNetworksSuite{})
   154  
   155  func (s *relationRootNetworksSuite) SetUpTest(c *gc.C) {
   156  	s.ConnSuite.SetUpTest(c)
   157  	wordpress := s.AddTestingApplication(c, "wordpress", s.AddTestingCharm(c, "wordpress"))
   158  	wordpressEP, err := wordpress.Endpoint("db")
   159  	c.Assert(err, jc.ErrorIsNil)
   160  	mysql := s.AddTestingApplication(c, "mysql", s.AddTestingCharm(c, "mysql"))
   161  	mysqlEP, err := mysql.Endpoint("server")
   162  	c.Assert(err, jc.ErrorIsNil)
   163  	s.relation, err = s.State.AddRelation(wordpressEP, mysqlEP)
   164  	c.Assert(err, jc.ErrorIsNil)
   165  
   166  	s.direction = "ingress"
   167  	s.relationNetworks = state.NewRelationIngressNetworks(s.State)
   168  }
   169  
   170  func (s *relationRootNetworksSuite) TestAllRelationNetworks(c *gc.C) {
   171  	s.relationNetworks.Save("wordpress:db mysql:server", false, []string{"192.168.1.0/16"})
   172  
   173  	relationNetworks := state.NewRelationNetworks(s.State)
   174  	relations, err := relationNetworks.AllRelationNetworks()
   175  	c.Assert(err, jc.ErrorIsNil)
   176  	c.Assert(relations, gc.HasLen, 1)
   177  	s.assertSavedIngressInfo(c, "wordpress:db mysql:server", "192.168.1.0/16")
   178  }