github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/api/firewaller/firewaller_test.go (about) 1 // Copyright 2013 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 "github.com/juju/utils" 9 gc "gopkg.in/check.v1" 10 "gopkg.in/juju/names.v2" 11 12 "github.com/juju/juju/api" 13 "github.com/juju/juju/api/base/testing" 14 "github.com/juju/juju/api/firewaller" 15 "github.com/juju/juju/apiserver/params" 16 "github.com/juju/juju/core/relation" 17 jujutesting "github.com/juju/juju/juju/testing" 18 "github.com/juju/juju/state" 19 coretesting "github.com/juju/juju/testing" 20 ) 21 22 // NOTE: This suite is intended for embedding into other suites, 23 // so common code can be reused. Do not add test cases to it, 24 // otherwise they'll be run by each other suite that embeds it. 25 type firewallerSuite struct { 26 jujutesting.JujuConnSuite 27 28 st api.Connection 29 machines []*state.Machine 30 application *state.Application 31 charm *state.Charm 32 units []*state.Unit 33 relations []*state.Relation 34 35 firewaller *firewaller.Client 36 } 37 38 var _ = gc.Suite(&firewallerSuite{}) 39 40 func (s *firewallerSuite) SetUpTest(c *gc.C) { 41 s.JujuConnSuite.SetUpTest(c) 42 43 // Reset previous machines and units (if any) and create 3 44 // machines for the tests. The first one is a manager node. 45 s.machines = make([]*state.Machine, 3) 46 s.units = make([]*state.Unit, 3) 47 48 var err error 49 s.machines[0], err = s.State.AddMachine("quantal", state.JobManageModel, state.JobHostUnits) 50 c.Assert(err, jc.ErrorIsNil) 51 password, err := utils.RandomPassword() 52 c.Assert(err, jc.ErrorIsNil) 53 err = s.machines[0].SetPassword(password) 54 c.Assert(err, jc.ErrorIsNil) 55 err = s.machines[0].SetProvisioned("i-manager", "", "fake_nonce", nil) 56 c.Assert(err, jc.ErrorIsNil) 57 s.st = s.OpenAPIAsMachine(c, s.machines[0].Tag(), password, "fake_nonce") 58 c.Assert(s.st, gc.NotNil) 59 60 // Note that the specific machine ids allocated are assumed 61 // to be numerically consecutive from zero. 62 for i := 1; i <= 2; i++ { 63 s.machines[i], err = s.State.AddMachine("quantal", state.JobHostUnits) 64 c.Check(err, jc.ErrorIsNil) 65 } 66 // Create an application and three units for these machines. 67 s.charm = s.AddTestingCharm(c, "wordpress") 68 s.application = s.AddTestingApplication(c, "wordpress", s.charm) 69 // Add the rest of the units and assign them. 70 for i := 0; i <= 2; i++ { 71 s.units[i], err = s.application.AddUnit(state.AddUnitParams{}) 72 c.Check(err, jc.ErrorIsNil) 73 err = s.units[i].AssignToMachine(s.machines[i]) 74 c.Check(err, jc.ErrorIsNil) 75 } 76 77 // Create a relation. 78 s.AddTestingApplication(c, "mysql", s.AddTestingCharm(c, "mysql")) 79 eps, err := s.State.InferEndpoints("wordpress", "mysql") 80 c.Assert(err, jc.ErrorIsNil) 81 82 s.relations = make([]*state.Relation, 1) 83 s.relations[0], err = s.State.AddRelation(eps...) 84 c.Assert(err, jc.ErrorIsNil) 85 86 // Create the firewaller API facade. 87 firewallerClient, err := firewaller.NewClient(s.st) 88 c.Assert(err, jc.ErrorIsNil) 89 c.Assert(firewallerClient, gc.NotNil) 90 s.firewaller = firewallerClient 91 } 92 93 func (s *firewallerSuite) TestWatchEgressAddressesForRelation(c *gc.C) { 94 var callCount int 95 relationTag := names.NewRelationTag("mediawiki:db mysql:db") 96 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 97 c.Check(objType, gc.Equals, "Firewaller") 98 c.Check(version, gc.Equals, 0) 99 c.Check(id, gc.Equals, "") 100 c.Check(request, gc.Equals, "WatchEgressAddressesForRelations") 101 c.Assert(arg, gc.DeepEquals, params.Entities{Entities: []params.Entity{{Tag: relationTag.String()}}}) 102 c.Assert(result, gc.FitsTypeOf, ¶ms.StringsWatchResults{}) 103 *(result.(*params.StringsWatchResults)) = params.StringsWatchResults{ 104 Results: []params.StringsWatchResult{{ 105 Error: ¶ms.Error{Message: "FAIL"}, 106 }}, 107 } 108 callCount++ 109 return nil 110 }) 111 client, err := firewaller.NewClient(apiCaller) 112 c.Assert(err, jc.ErrorIsNil) 113 _, err = client.WatchEgressAddressesForRelation(relationTag) 114 c.Check(err, gc.ErrorMatches, "FAIL") 115 c.Check(callCount, gc.Equals, 1) 116 } 117 118 func (s *firewallerSuite) TestWatchInressAddressesForRelation(c *gc.C) { 119 var callCount int 120 relationTag := names.NewRelationTag("mediawiki:db mysql:db") 121 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 122 c.Check(objType, gc.Equals, "Firewaller") 123 c.Check(version, gc.Equals, 0) 124 c.Check(id, gc.Equals, "") 125 c.Check(request, gc.Equals, "WatchIngressAddressesForRelations") 126 c.Assert(arg, gc.DeepEquals, params.Entities{Entities: []params.Entity{{Tag: relationTag.String()}}}) 127 c.Assert(result, gc.FitsTypeOf, ¶ms.StringsWatchResults{}) 128 *(result.(*params.StringsWatchResults)) = params.StringsWatchResults{ 129 Results: []params.StringsWatchResult{{ 130 Error: ¶ms.Error{Message: "FAIL"}, 131 }}, 132 } 133 callCount++ 134 return nil 135 }) 136 client, err := firewaller.NewClient(apiCaller) 137 c.Assert(err, jc.ErrorIsNil) 138 _, err = client.WatchIngressAddressesForRelation(relationTag) 139 c.Check(err, gc.ErrorMatches, "FAIL") 140 c.Check(callCount, gc.Equals, 1) 141 } 142 143 func (s *firewallerSuite) TestControllerAPIInfoForModel(c *gc.C) { 144 var callCount int 145 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 146 c.Check(objType, gc.Equals, "Firewaller") 147 c.Check(version, gc.Equals, 0) 148 c.Check(id, gc.Equals, "") 149 c.Check(request, gc.Equals, "ControllerAPIInfoForModels") 150 c.Assert(arg, gc.DeepEquals, params.Entities{Entities: []params.Entity{{Tag: coretesting.ModelTag.String()}}}) 151 c.Assert(result, gc.FitsTypeOf, ¶ms.ControllerAPIInfoResults{}) 152 *(result.(*params.ControllerAPIInfoResults)) = params.ControllerAPIInfoResults{ 153 Results: []params.ControllerAPIInfoResult{{ 154 Error: ¶ms.Error{Message: "FAIL"}, 155 }}, 156 } 157 callCount++ 158 return nil 159 }) 160 client, err := firewaller.NewClient(apiCaller) 161 c.Assert(err, jc.ErrorIsNil) 162 _, err = client.ControllerAPIInfoForModel(coretesting.ModelTag.Id()) 163 c.Check(err, gc.ErrorMatches, "FAIL") 164 c.Check(callCount, gc.Equals, 1) 165 } 166 167 func (s *firewallerSuite) TestMacaroonForRelation(c *gc.C) { 168 var callCount int 169 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 170 c.Check(objType, gc.Equals, "Firewaller") 171 c.Check(version, gc.Equals, 0) 172 c.Check(id, gc.Equals, "") 173 c.Check(request, gc.Equals, "MacaroonForRelations") 174 c.Assert(arg, gc.DeepEquals, params.Entities{Entities: []params.Entity{ 175 {Tag: names.NewRelationTag("mysql:db wordpress:db").String()}}}) 176 c.Assert(result, gc.FitsTypeOf, ¶ms.MacaroonResults{}) 177 *(result.(*params.MacaroonResults)) = params.MacaroonResults{ 178 Results: []params.MacaroonResult{{ 179 Error: ¶ms.Error{Message: "FAIL"}, 180 }}, 181 } 182 callCount++ 183 return nil 184 }) 185 client, err := firewaller.NewClient(apiCaller) 186 c.Assert(err, jc.ErrorIsNil) 187 _, err = client.MacaroonForRelation("mysql:db wordpress:db") 188 c.Check(err, gc.ErrorMatches, "FAIL") 189 c.Check(callCount, gc.Equals, 1) 190 } 191 192 func (s *firewallerSuite) TestSetRelationStatus(c *gc.C) { 193 var callCount int 194 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 195 c.Check(objType, gc.Equals, "Firewaller") 196 c.Check(version, gc.Equals, 0) 197 c.Check(id, gc.Equals, "") 198 c.Check(request, gc.Equals, "SetRelationsStatus") 199 c.Assert(arg, gc.DeepEquals, params.SetStatus{Entities: []params.EntityStatusArgs{ 200 { 201 Tag: names.NewRelationTag("mysql:db wordpress:db").String(), 202 Status: "suspended", 203 Info: "a message", 204 }}}) 205 c.Assert(result, gc.FitsTypeOf, ¶ms.ErrorResults{}) 206 *(result.(*params.ErrorResults)) = params.ErrorResults{ 207 Results: []params.ErrorResult{{ 208 Error: ¶ms.Error{Message: "FAIL"}, 209 }}, 210 } 211 callCount++ 212 return nil 213 }) 214 client, err := firewaller.NewClient(apiCaller) 215 c.Assert(err, jc.ErrorIsNil) 216 err = client.SetRelationStatus("mysql:db wordpress:db", relation.Suspended, "a message") 217 c.Check(err, gc.ErrorMatches, "FAIL") 218 c.Check(callCount, gc.Equals, 1) 219 } 220 221 func (s *firewallerSuite) TestFirewallRules(c *gc.C) { 222 var callCount int 223 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 224 c.Check(objType, gc.Equals, "Firewaller") 225 c.Check(version, gc.Equals, 0) 226 c.Check(id, gc.Equals, "") 227 c.Check(request, gc.Equals, "FirewallRules") 228 c.Assert(arg, gc.DeepEquals, params.KnownServiceArgs{ 229 KnownServices: []params.KnownServiceValue{ 230 params.JujuApplicationOfferRule, params.JujuControllerRule, 231 }, 232 }) 233 c.Assert(result, gc.FitsTypeOf, ¶ms.ListFirewallRulesResults{}) 234 *(result.(*params.ListFirewallRulesResults)) = params.ListFirewallRulesResults{ 235 Rules: []params.FirewallRule{ 236 {KnownService: params.JujuApplicationOfferRule, WhitelistCIDRS: []string{"10.0.0.0/16"}}, 237 }, 238 } 239 callCount++ 240 return nil 241 }) 242 client, err := firewaller.NewClient(apiCaller) 243 c.Assert(err, jc.ErrorIsNil) 244 result, err := client.FirewallRules("juju-application-offer", "juju-controller") 245 c.Assert(err, jc.ErrorIsNil) 246 c.Assert(result, gc.HasLen, 1) 247 c.Check(callCount, gc.Equals, 1) 248 }