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 }