github.com/ablease/cli@v6.37.1-0.20180613014814-3adbb7d7fb19+incompatible/actor/cfnetworkingaction/policy_test.go (about) 1 package cfnetworkingaction_test 2 3 import ( 4 "errors" 5 6 "code.cloudfoundry.org/cfnetworking-cli-api/cfnetworking/cfnetv1" 7 "code.cloudfoundry.org/cli/actor/actionerror" 8 . "code.cloudfoundry.org/cli/actor/cfnetworkingaction" 9 "code.cloudfoundry.org/cli/actor/cfnetworkingaction/cfnetworkingactionfakes" 10 "code.cloudfoundry.org/cli/actor/v3action" 11 . "github.com/onsi/ginkgo" 12 . "github.com/onsi/gomega" 13 ) 14 15 var _ = Describe("Policy", func() { 16 var ( 17 actor *Actor 18 fakeV3Actor *cfnetworkingactionfakes.FakeV3Actor 19 fakeNetworkingClient *cfnetworkingactionfakes.FakeNetworkingClient 20 21 warnings Warnings 22 executeErr error 23 ) 24 25 BeforeEach(func() { 26 fakeV3Actor = new(cfnetworkingactionfakes.FakeV3Actor) 27 fakeNetworkingClient = new(cfnetworkingactionfakes.FakeNetworkingClient) 28 29 fakeV3Actor.GetApplicationByNameAndSpaceStub = func(appName string, spaceGUID string) (v3action.Application, v3action.Warnings, error) { 30 if appName == "appA" { 31 return v3action.Application{GUID: "appAGUID"}, []string{"v3ActorWarningA"}, nil 32 } else if appName == "appB" { 33 return v3action.Application{GUID: "appBGUID"}, []string{"v3ActorWarningB"}, nil 34 } 35 return v3action.Application{}, nil, nil 36 } 37 38 actor = NewActor(fakeNetworkingClient, fakeV3Actor) 39 }) 40 41 Describe("AddNetworkPolicy", func() { 42 JustBeforeEach(func() { 43 spaceGuid := "space" 44 srcApp := "appA" 45 destApp := "appB" 46 protocol := "tcp" 47 startPort := 8080 48 endPort := 8090 49 warnings, executeErr = actor.AddNetworkPolicy(spaceGuid, srcApp, destApp, protocol, startPort, endPort) 50 }) 51 52 It("creates policies", func() { 53 Expect(warnings).To(Equal(Warnings([]string{"v3ActorWarningA", "v3ActorWarningB"}))) 54 Expect(executeErr).NotTo(HaveOccurred()) 55 56 Expect(fakeV3Actor.GetApplicationByNameAndSpaceCallCount()).To(Equal(2)) 57 sourceAppName, spaceGUID := fakeV3Actor.GetApplicationByNameAndSpaceArgsForCall(0) 58 Expect(sourceAppName).To(Equal("appA")) 59 Expect(spaceGUID).To(Equal("space")) 60 61 destAppName, spaceGUID := fakeV3Actor.GetApplicationByNameAndSpaceArgsForCall(1) 62 Expect(destAppName).To(Equal("appB")) 63 Expect(spaceGUID).To(Equal("space")) 64 65 Expect(fakeNetworkingClient.CreatePoliciesCallCount()).To(Equal(1)) 66 Expect(fakeNetworkingClient.CreatePoliciesArgsForCall(0)).To(Equal([]cfnetv1.Policy{ 67 { 68 Source: cfnetv1.PolicySource{ 69 ID: "appAGUID", 70 }, 71 Destination: cfnetv1.PolicyDestination{ 72 ID: "appBGUID", 73 Protocol: "tcp", 74 Ports: cfnetv1.Ports{ 75 Start: 8080, 76 End: 8090, 77 }, 78 }, 79 }, 80 })) 81 }) 82 83 Context("when getting the source app fails ", func() { 84 BeforeEach(func() { 85 fakeV3Actor.GetApplicationByNameAndSpaceReturns(v3action.Application{}, []string{"v3ActorWarningA"}, errors.New("banana")) 86 }) 87 It("returns a sensible error", func() { 88 Expect(warnings).To(Equal(Warnings([]string{"v3ActorWarningA"}))) 89 Expect(executeErr).To(MatchError("banana")) 90 }) 91 }) 92 93 Context("when getting the destination app fails ", func() { 94 BeforeEach(func() { 95 fakeV3Actor.GetApplicationByNameAndSpaceStub = func(appName string, spaceGUID string) (v3action.Application, v3action.Warnings, error) { 96 if appName == "appB" { 97 return v3action.Application{}, []string{"v3ActorWarningB"}, errors.New("banana") 98 } 99 return v3action.Application{}, []string{"v3ActorWarningA"}, nil 100 } 101 }) 102 It("returns a sensible error", func() { 103 Expect(warnings).To(Equal(Warnings([]string{"v3ActorWarningA", "v3ActorWarningB"}))) 104 Expect(executeErr).To(MatchError("banana")) 105 }) 106 }) 107 108 Context("when creating the policy fails", func() { 109 BeforeEach(func() { 110 fakeNetworkingClient.CreatePoliciesReturns(errors.New("apple")) 111 }) 112 It("returns a sensible error", func() { 113 Expect(executeErr).To(MatchError("apple")) 114 }) 115 }) 116 }) 117 118 Describe("NetworkPoliciesBySpaceAndAppName", func() { 119 var ( 120 policies []Policy 121 srcApp string 122 ) 123 124 BeforeEach(func() { 125 fakeNetworkingClient.ListPoliciesReturns([]cfnetv1.Policy{{ 126 Source: cfnetv1.PolicySource{ 127 ID: "appAGUID", 128 }, 129 Destination: cfnetv1.PolicyDestination{ 130 ID: "appBGUID", 131 Protocol: "tcp", 132 Ports: cfnetv1.Ports{ 133 Start: 8080, 134 End: 8080, 135 }, 136 }, 137 }, { 138 Source: cfnetv1.PolicySource{ 139 ID: "appBGUID", 140 }, 141 Destination: cfnetv1.PolicyDestination{ 142 ID: "appBGUID", 143 Protocol: "tcp", 144 Ports: cfnetv1.Ports{ 145 Start: 8080, 146 End: 8080, 147 }, 148 }, 149 }, { 150 Source: cfnetv1.PolicySource{ 151 ID: "appCGUID", 152 }, 153 Destination: cfnetv1.PolicyDestination{ 154 ID: "appCGUID", 155 Protocol: "tcp", 156 Ports: cfnetv1.Ports{ 157 Start: 8080, 158 End: 8080, 159 }, 160 }, 161 }}, nil) 162 163 fakeV3Actor.GetApplicationsBySpaceStub = func(_ string) ([]v3action.Application, v3action.Warnings, error) { 164 return []v3action.Application{ 165 { 166 Name: "appA", 167 GUID: "appAGUID", 168 }, 169 { 170 Name: "appB", 171 GUID: "appBGUID", 172 }, 173 }, []string{"GetApplicationsBySpaceWarning"}, nil 174 } 175 176 }) 177 178 JustBeforeEach(func() { 179 spaceGuid := "space" 180 policies, warnings, executeErr = actor.NetworkPoliciesBySpaceAndAppName(spaceGuid, srcApp) 181 }) 182 183 Context("when listing policies based on a source app", func() { 184 BeforeEach(func() { 185 srcApp = "appA" 186 }) 187 188 It("lists only policies for which the app is a source", func() { 189 Expect(policies).To(Equal( 190 []Policy{{ 191 SourceName: "appA", 192 DestinationName: "appB", 193 Protocol: "tcp", 194 StartPort: 8080, 195 EndPort: 8080, 196 }}, 197 )) 198 }) 199 200 It("passes through the source app argument", func() { 201 Expect(warnings).To(Equal(Warnings([]string{"GetApplicationsBySpaceWarning", "v3ActorWarningA"}))) 202 Expect(executeErr).NotTo(HaveOccurred()) 203 204 Expect(fakeV3Actor.GetApplicationByNameAndSpaceCallCount()).To(Equal(1)) 205 sourceAppName, spaceGUID := fakeV3Actor.GetApplicationByNameAndSpaceArgsForCall(0) 206 Expect(sourceAppName).To(Equal("appA")) 207 Expect(spaceGUID).To(Equal("space")) 208 209 Expect(fakeNetworkingClient.ListPoliciesCallCount()).To(Equal(1)) 210 Expect(fakeNetworkingClient.ListPoliciesArgsForCall(0)).To(Equal([]string{"appAGUID"})) 211 }) 212 }) 213 214 Context("when getting the applications fails", func() { 215 BeforeEach(func() { 216 fakeV3Actor.GetApplicationsBySpaceReturns([]v3action.Application{}, []string{"GetApplicationsBySpaceWarning"}, errors.New("banana")) 217 }) 218 219 It("returns a sensible error", func() { 220 Expect(policies).To(Equal([]Policy{})) 221 Expect(warnings).To(Equal(Warnings([]string{"GetApplicationsBySpaceWarning"}))) 222 Expect(executeErr).To(MatchError("banana")) 223 }) 224 }) 225 226 Context("when getting the source app fails ", func() { 227 BeforeEach(func() { 228 fakeV3Actor.GetApplicationByNameAndSpaceStub = func(appName string, spaceGUID string) (v3action.Application, v3action.Warnings, error) { 229 if appName == "appA" { 230 return v3action.Application{}, []string{"v3ActorWarningA"}, errors.New("banana") 231 } 232 return v3action.Application{}, []string{"v3ActorWarningB"}, nil 233 } 234 235 srcApp = "appA" 236 }) 237 238 It("returns a sensible error", func() { 239 Expect(policies).To(Equal([]Policy{})) 240 Expect(warnings).To(Equal(Warnings([]string{"GetApplicationsBySpaceWarning", "v3ActorWarningA"}))) 241 Expect(executeErr).To(MatchError("banana")) 242 }) 243 }) 244 245 Context("when listing the policy fails", func() { 246 BeforeEach(func() { 247 fakeNetworkingClient.ListPoliciesReturns([]cfnetv1.Policy{}, errors.New("apple")) 248 }) 249 It("returns a sensible error", func() { 250 Expect(executeErr).To(MatchError("apple")) 251 }) 252 }) 253 }) 254 255 Describe("NetworkPoliciesBySpace", func() { 256 var ( 257 policies []Policy 258 ) 259 260 BeforeEach(func() { 261 fakeNetworkingClient.ListPoliciesReturns([]cfnetv1.Policy{{ 262 Source: cfnetv1.PolicySource{ 263 ID: "appAGUID", 264 }, 265 Destination: cfnetv1.PolicyDestination{ 266 ID: "appBGUID", 267 Protocol: "tcp", 268 Ports: cfnetv1.Ports{ 269 Start: 8080, 270 End: 8080, 271 }, 272 }, 273 }, { 274 Source: cfnetv1.PolicySource{ 275 ID: "appBGUID", 276 }, 277 Destination: cfnetv1.PolicyDestination{ 278 ID: "appBGUID", 279 Protocol: "tcp", 280 Ports: cfnetv1.Ports{ 281 Start: 8080, 282 End: 8080, 283 }, 284 }, 285 }, { 286 Source: cfnetv1.PolicySource{ 287 ID: "appCGUID", 288 }, 289 Destination: cfnetv1.PolicyDestination{ 290 ID: "appCGUID", 291 Protocol: "tcp", 292 Ports: cfnetv1.Ports{ 293 Start: 8080, 294 End: 8080, 295 }, 296 }, 297 }}, nil) 298 299 fakeV3Actor.GetApplicationsBySpaceStub = func(_ string) ([]v3action.Application, v3action.Warnings, error) { 300 return []v3action.Application{ 301 { 302 Name: "appA", 303 GUID: "appAGUID", 304 }, 305 { 306 Name: "appB", 307 GUID: "appBGUID", 308 }, 309 }, []string{"GetApplicationsBySpaceWarning"}, nil 310 } 311 312 }) 313 314 JustBeforeEach(func() { 315 spaceGuid := "space" 316 policies, warnings, executeErr = actor.NetworkPoliciesBySpace(spaceGuid) 317 }) 318 319 It("lists policies", func() { 320 Expect(policies).To(Equal( 321 []Policy{{ 322 SourceName: "appA", 323 DestinationName: "appB", 324 Protocol: "tcp", 325 StartPort: 8080, 326 EndPort: 8080, 327 }, { 328 SourceName: "appB", 329 DestinationName: "appB", 330 Protocol: "tcp", 331 StartPort: 8080, 332 EndPort: 8080, 333 }}, 334 )) 335 Expect(warnings).To(Equal(Warnings([]string{"GetApplicationsBySpaceWarning"}))) 336 Expect(executeErr).NotTo(HaveOccurred()) 337 338 Expect(fakeV3Actor.GetApplicationsBySpaceCallCount()).To(Equal(1)) 339 Expect(fakeV3Actor.GetApplicationByNameAndSpaceCallCount()).To(Equal(0)) 340 341 Expect(fakeNetworkingClient.ListPoliciesCallCount()).To(Equal(1)) 342 Expect(fakeNetworkingClient.ListPoliciesArgsForCall(0)).To(BeNil()) 343 }) 344 345 Context("when getting the applications fails", func() { 346 BeforeEach(func() { 347 fakeV3Actor.GetApplicationsBySpaceReturns([]v3action.Application{}, []string{"GetApplicationsBySpaceWarning"}, errors.New("banana")) 348 }) 349 350 It("returns a sensible error", func() { 351 Expect(policies).To(Equal([]Policy{})) 352 Expect(warnings).To(Equal(Warnings([]string{"GetApplicationsBySpaceWarning"}))) 353 Expect(executeErr).To(MatchError("banana")) 354 }) 355 }) 356 357 Context("when listing the policy fails", func() { 358 BeforeEach(func() { 359 fakeNetworkingClient.ListPoliciesReturns([]cfnetv1.Policy{}, errors.New("apple")) 360 }) 361 It("returns a sensible error", func() { 362 Expect(executeErr).To(MatchError("apple")) 363 }) 364 }) 365 }) 366 367 Describe("RemoveNetworkPolicy", func() { 368 BeforeEach(func() { 369 fakeNetworkingClient.ListPoliciesReturns([]cfnetv1.Policy{ 370 { 371 Source: cfnetv1.PolicySource{ 372 ID: "appAGUID", 373 }, 374 Destination: cfnetv1.PolicyDestination{ 375 ID: "appBGUID", 376 Protocol: "udp", 377 Ports: cfnetv1.Ports{ 378 Start: 123, 379 End: 345, 380 }, 381 }, 382 }, 383 }, nil) 384 }) 385 386 JustBeforeEach(func() { 387 spaceGuid := "space" 388 srcApp := "appA" 389 destApp := "appB" 390 protocol := "udp" 391 startPort := 123 392 endPort := 345 393 warnings, executeErr = actor.RemoveNetworkPolicy(spaceGuid, srcApp, destApp, protocol, startPort, endPort) 394 }) 395 It("removes policies", func() { 396 Expect(warnings).To(Equal(Warnings([]string{"v3ActorWarningA", "v3ActorWarningB"}))) 397 Expect(executeErr).NotTo(HaveOccurred()) 398 399 Expect(fakeV3Actor.GetApplicationByNameAndSpaceCallCount()).To(Equal(2)) 400 sourceAppName, spaceGUID := fakeV3Actor.GetApplicationByNameAndSpaceArgsForCall(0) 401 Expect(sourceAppName).To(Equal("appA")) 402 Expect(spaceGUID).To(Equal("space")) 403 404 destAppName, spaceGUID := fakeV3Actor.GetApplicationByNameAndSpaceArgsForCall(1) 405 Expect(destAppName).To(Equal("appB")) 406 Expect(spaceGUID).To(Equal("space")) 407 408 Expect(fakeNetworkingClient.ListPoliciesCallCount()).To(Equal(1)) 409 410 Expect(fakeNetworkingClient.RemovePoliciesCallCount()).To(Equal(1)) 411 Expect(fakeNetworkingClient.RemovePoliciesArgsForCall(0)).To(Equal([]cfnetv1.Policy{ 412 { 413 Source: cfnetv1.PolicySource{ 414 ID: "appAGUID", 415 }, 416 Destination: cfnetv1.PolicyDestination{ 417 ID: "appBGUID", 418 Protocol: "udp", 419 Ports: cfnetv1.Ports{ 420 Start: 123, 421 End: 345, 422 }, 423 }, 424 }, 425 })) 426 }) 427 428 Context("when the policy does not exist", func() { 429 BeforeEach(func() { 430 fakeNetworkingClient.ListPoliciesReturns([]cfnetv1.Policy{}, nil) 431 }) 432 433 It("returns an error", func() { 434 Expect(warnings).To(Equal(Warnings([]string{"v3ActorWarningA", "v3ActorWarningB"}))) 435 Expect(executeErr).To(MatchError(actionerror.PolicyDoesNotExistError{})) 436 }) 437 }) 438 439 Context("when getting the source app fails ", func() { 440 BeforeEach(func() { 441 fakeV3Actor.GetApplicationByNameAndSpaceReturns(v3action.Application{}, []string{"v3ActorWarningA"}, errors.New("banana")) 442 }) 443 It("returns a sensible error", func() { 444 Expect(warnings).To(Equal(Warnings([]string{"v3ActorWarningA"}))) 445 Expect(executeErr).To(MatchError("banana")) 446 }) 447 }) 448 449 Context("when getting the destination app fails ", func() { 450 BeforeEach(func() { 451 fakeV3Actor.GetApplicationByNameAndSpaceReturnsOnCall(0, v3action.Application{}, []string{"v3ActorWarningA"}, nil) 452 fakeV3Actor.GetApplicationByNameAndSpaceReturnsOnCall(1, v3action.Application{}, []string{"v3ActorWarningB"}, errors.New("banana")) 453 }) 454 455 It("returns a sensible error", func() { 456 Expect(warnings).To(Equal(Warnings([]string{"v3ActorWarningA", "v3ActorWarningB"}))) 457 Expect(executeErr).To(MatchError("banana")) 458 }) 459 }) 460 461 Context("when listing policies fails", func() { 462 BeforeEach(func() { 463 fakeNetworkingClient.ListPoliciesReturns([]cfnetv1.Policy{}, errors.New("apple")) 464 }) 465 It("returns a sensible error", func() { 466 Expect(executeErr).To(MatchError("apple")) 467 }) 468 }) 469 470 Context("when removing the policy fails", func() { 471 BeforeEach(func() { 472 fakeNetworkingClient.RemovePoliciesReturns(errors.New("apple")) 473 }) 474 It("returns a sensible error", func() { 475 Expect(executeErr).To(MatchError("apple")) 476 }) 477 }) 478 }) 479 })