github.com/jenspinney/cli@v6.42.1-0.20190207184520-7450c600020e+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  			srcSpaceGuid := "src-space"
    44  			srcApp := "appA"
    45  			destSpaceGuid := "dst-space"
    46  			destApp := "appB"
    47  			protocol := "tcp"
    48  			startPort := 8080
    49  			endPort := 8090
    50  			warnings, executeErr = actor.AddNetworkPolicy(srcSpaceGuid, srcApp, destSpaceGuid, destApp, protocol, startPort, endPort)
    51  		})
    52  
    53  		It("creates policies", func() {
    54  			Expect(warnings).To(ConsistOf("v3ActorWarningA", "v3ActorWarningB"))
    55  			Expect(executeErr).NotTo(HaveOccurred())
    56  
    57  			Expect(fakeV3Actor.GetApplicationByNameAndSpaceCallCount()).To(Equal(2))
    58  			sourceAppName, srcSpaceGUID := fakeV3Actor.GetApplicationByNameAndSpaceArgsForCall(0)
    59  			Expect(sourceAppName).To(Equal("appA"))
    60  			Expect(srcSpaceGUID).To(Equal("src-space"))
    61  
    62  			destAppName, destSpaceGUID := fakeV3Actor.GetApplicationByNameAndSpaceArgsForCall(1)
    63  			Expect(destAppName).To(Equal("appB"))
    64  			Expect(destSpaceGUID).To(Equal("dst-space"))
    65  
    66  			Expect(fakeNetworkingClient.CreatePoliciesCallCount()).To(Equal(1))
    67  			Expect(fakeNetworkingClient.CreatePoliciesArgsForCall(0)).To(Equal([]cfnetv1.Policy{
    68  				{
    69  					Source: cfnetv1.PolicySource{
    70  						ID: "appAGUID",
    71  					},
    72  					Destination: cfnetv1.PolicyDestination{
    73  						ID:       "appBGUID",
    74  						Protocol: "tcp",
    75  						Ports: cfnetv1.Ports{
    76  							Start: 8080,
    77  							End:   8090,
    78  						},
    79  					},
    80  				},
    81  			}))
    82  		})
    83  
    84  		When("getting the source app fails ", func() {
    85  			BeforeEach(func() {
    86  				fakeV3Actor.GetApplicationByNameAndSpaceReturns(v3action.Application{}, []string{"v3ActorWarningA"}, errors.New("banana"))
    87  			})
    88  			It("returns a sensible error", func() {
    89  				Expect(warnings).To(ConsistOf("v3ActorWarningA"))
    90  				Expect(executeErr).To(MatchError("banana"))
    91  			})
    92  		})
    93  
    94  		When("getting the destination app fails ", func() {
    95  			BeforeEach(func() {
    96  				fakeV3Actor.GetApplicationByNameAndSpaceStub = func(appName string, spaceGUID string) (v3action.Application, v3action.Warnings, error) {
    97  					if appName == "appB" {
    98  						return v3action.Application{}, []string{"v3ActorWarningB"}, errors.New("banana")
    99  					}
   100  					return v3action.Application{}, []string{"v3ActorWarningA"}, nil
   101  				}
   102  			})
   103  			It("returns a sensible error", func() {
   104  				Expect(warnings).To(ConsistOf("v3ActorWarningA", "v3ActorWarningB"))
   105  				Expect(executeErr).To(MatchError("banana"))
   106  			})
   107  		})
   108  
   109  		When("creating the policy fails", func() {
   110  			BeforeEach(func() {
   111  				fakeNetworkingClient.CreatePoliciesReturns(errors.New("apple"))
   112  			})
   113  			It("returns a sensible error", func() {
   114  				Expect(executeErr).To(MatchError("apple"))
   115  			})
   116  		})
   117  	})
   118  
   119  	Describe("NetworkPoliciesBySpaceAndAppName", func() {
   120  		var (
   121  			policies []Policy
   122  			srcApp   string
   123  		)
   124  
   125  		BeforeEach(func() {
   126  			fakeNetworkingClient.ListPoliciesReturns([]cfnetv1.Policy{{
   127  				Source: cfnetv1.PolicySource{
   128  					ID: "appAGUID",
   129  				},
   130  				Destination: cfnetv1.PolicyDestination{
   131  					ID:       "appBGUID",
   132  					Protocol: "tcp",
   133  					Ports: cfnetv1.Ports{
   134  						Start: 8080,
   135  						End:   8080,
   136  					},
   137  				},
   138  			}, {
   139  				Source: cfnetv1.PolicySource{
   140  					ID: "appAGUID",
   141  				},
   142  				Destination: cfnetv1.PolicyDestination{
   143  					ID:       "appCGUID",
   144  					Protocol: "tcp",
   145  					Ports: cfnetv1.Ports{
   146  						Start: 8080,
   147  						End:   8080,
   148  					},
   149  				},
   150  			}}, nil)
   151  
   152  			fakeV3Actor.GetApplicationByNameAndSpaceReturns(v3action.Application{
   153  				Name:      "appA",
   154  				GUID:      "appAGUID",
   155  				SpaceGUID: "spaceAGUID",
   156  			}, []string{"GetApplicationByNameAndSpaceWarning"}, nil)
   157  
   158  			fakeV3Actor.GetApplicationsByGUIDsReturns([]v3action.Application{
   159  				{
   160  					Name:      "appB",
   161  					GUID:      "appBGUID",
   162  					SpaceGUID: "spaceAGUID",
   163  				},
   164  				{
   165  					Name:      "appC",
   166  					GUID:      "appCGUID",
   167  					SpaceGUID: "spaceCGUID",
   168  				},
   169  			}, []string{"GetApplicationsByGUIDsWarning"}, nil)
   170  
   171  			fakeV3Actor.GetSpacesByGUIDsReturns([]v3action.Space{
   172  				{
   173  					Name:             "spaceA",
   174  					GUID:             "spaceAGUID",
   175  					OrganizationGUID: "orgAGUID",
   176  				},
   177  				{
   178  					Name:             "spaceC",
   179  					GUID:             "spaceCGUID",
   180  					OrganizationGUID: "orgCGUID",
   181  				},
   182  			}, []string{"GetSpacesByGUIDsWarning"}, nil)
   183  
   184  			fakeV3Actor.GetOrganizationsByGUIDsReturns([]v3action.Organization{
   185  				{
   186  					Name: "orgA",
   187  					GUID: "orgAGUID",
   188  				},
   189  				{
   190  					Name: "orgC",
   191  					GUID: "orgCGUID",
   192  				},
   193  			}, []string{"GetOrganizationsByGUIDsWarning"}, nil)
   194  		})
   195  
   196  		JustBeforeEach(func() {
   197  			srcSpaceGuid := "space"
   198  			policies, warnings, executeErr = actor.NetworkPoliciesBySpaceAndAppName(srcSpaceGuid, srcApp)
   199  		})
   200  
   201  		When("listing policies based on a source app", func() {
   202  			BeforeEach(func() {
   203  				srcApp = "appA"
   204  			})
   205  
   206  			It("lists only policies for which the app is a source", func() {
   207  				Expect(policies).To(Equal([]Policy{
   208  					{
   209  						SourceName:           "appA",
   210  						DestinationName:      "appB",
   211  						Protocol:             "tcp",
   212  						StartPort:            8080,
   213  						EndPort:              8080,
   214  						DestinationSpaceName: "spaceA",
   215  						DestinationOrgName:   "orgA",
   216  					},
   217  					{
   218  						SourceName:           "appA",
   219  						DestinationName:      "appC",
   220  						Protocol:             "tcp",
   221  						StartPort:            8080,
   222  						EndPort:              8080,
   223  						DestinationSpaceName: "spaceC",
   224  						DestinationOrgName:   "orgC",
   225  					},
   226  				},
   227  				))
   228  			})
   229  
   230  			It("passes through the source app argument", func() {
   231  				Expect(warnings).To(ConsistOf(
   232  					"GetApplicationByNameAndSpaceWarning",
   233  					"GetApplicationsByGUIDsWarning",
   234  					"GetSpacesByGUIDsWarning",
   235  					"GetOrganizationsByGUIDsWarning",
   236  				))
   237  				Expect(executeErr).NotTo(HaveOccurred())
   238  
   239  				Expect(fakeV3Actor.GetApplicationByNameAndSpaceCallCount()).To(Equal(1))
   240  				sourceAppName, spaceGUID := fakeV3Actor.GetApplicationByNameAndSpaceArgsForCall(0)
   241  				Expect(sourceAppName).To(Equal("appA"))
   242  				Expect(spaceGUID).To(Equal("space"))
   243  
   244  				Expect(fakeNetworkingClient.ListPoliciesCallCount()).To(Equal(1))
   245  				Expect(fakeNetworkingClient.ListPoliciesArgsForCall(0)).To(Equal([]string{"appAGUID"}))
   246  
   247  				Expect(fakeV3Actor.GetApplicationsByGUIDsCallCount()).To(Equal(1))
   248  				Expect(fakeV3Actor.GetApplicationsByGUIDsArgsForCall(0)).To(ConsistOf("appBGUID", "appCGUID"))
   249  
   250  				Expect(fakeV3Actor.GetSpacesByGUIDsCallCount()).To(Equal(1))
   251  				Expect(fakeV3Actor.GetSpacesByGUIDsArgsForCall(0)).To(ConsistOf("spaceAGUID", "spaceCGUID"))
   252  			})
   253  		})
   254  
   255  		When("getting the applications by name and space fails", func() {
   256  			BeforeEach(func() {
   257  				fakeV3Actor.GetApplicationByNameAndSpaceReturns(v3action.Application{}, []string{"GetApplicationsBySpaceWarning"}, errors.New("banana"))
   258  			})
   259  
   260  			It("returns a sensible error", func() {
   261  				Expect(policies).To(Equal([]Policy{}))
   262  				Expect(warnings).To(ContainElement("GetApplicationsBySpaceWarning"))
   263  				Expect(executeErr).To(MatchError("banana"))
   264  			})
   265  		})
   266  
   267  		When("listing the policy fails", func() {
   268  			BeforeEach(func() {
   269  				fakeNetworkingClient.ListPoliciesReturns([]cfnetv1.Policy{}, errors.New("apple"))
   270  			})
   271  			It("returns a sensible error", func() {
   272  				Expect(executeErr).To(MatchError("apple"))
   273  			})
   274  		})
   275  
   276  		When("getting the applications by guids fails", func() {
   277  			BeforeEach(func() {
   278  				fakeV3Actor.GetApplicationsByGUIDsReturns([]v3action.Application{}, []string{"GetApplicationsByGUIDsWarning"}, errors.New("banana"))
   279  			})
   280  
   281  			It("returns a sensible error", func() {
   282  				Expect(policies).To(Equal([]Policy{}))
   283  				Expect(warnings).To(ContainElement("GetApplicationsByGUIDsWarning"))
   284  				Expect(executeErr).To(MatchError("banana"))
   285  			})
   286  		})
   287  
   288  		When("getting the spaces by guids fails", func() {
   289  			BeforeEach(func() {
   290  				fakeV3Actor.GetSpacesByGUIDsReturns([]v3action.Space{}, []string{"GetSpacesByGUIDsWarning"}, errors.New("banana"))
   291  			})
   292  
   293  			It("returns a sensible error", func() {
   294  				Expect(policies).To(Equal([]Policy{}))
   295  				Expect(warnings).To(ContainElement("GetSpacesByGUIDsWarning"))
   296  				Expect(executeErr).To(MatchError("banana"))
   297  			})
   298  		})
   299  	})
   300  
   301  	Describe("NetworkPoliciesBySpace", func() {
   302  		var (
   303  			policies []Policy
   304  		)
   305  
   306  		BeforeEach(func() {
   307  			fakeNetworkingClient.ListPoliciesReturns([]cfnetv1.Policy{{
   308  				Source: cfnetv1.PolicySource{
   309  					ID: "appAGUID",
   310  				},
   311  				Destination: cfnetv1.PolicyDestination{
   312  					ID:       "appBGUID",
   313  					Protocol: "tcp",
   314  					Ports: cfnetv1.Ports{
   315  						Start: 8080,
   316  						End:   8080,
   317  					},
   318  				},
   319  			}, {
   320  				Source: cfnetv1.PolicySource{
   321  					ID: "appBGUID",
   322  				},
   323  				Destination: cfnetv1.PolicyDestination{
   324  					ID:       "appBGUID",
   325  					Protocol: "tcp",
   326  					Ports: cfnetv1.Ports{
   327  						Start: 8080,
   328  						End:   8080,
   329  					},
   330  				},
   331  			}, {
   332  				Source: cfnetv1.PolicySource{
   333  					ID: "appAGUID",
   334  				},
   335  				Destination: cfnetv1.PolicyDestination{
   336  					ID:       "appCGUID",
   337  					Protocol: "tcp",
   338  					Ports: cfnetv1.Ports{
   339  						Start: 8080,
   340  						End:   8080,
   341  					},
   342  				},
   343  			}}, nil)
   344  
   345  			fakeV3Actor.GetApplicationsBySpaceReturns([]v3action.Application{
   346  				{
   347  					Name:      "appA",
   348  					GUID:      "appAGUID",
   349  					SpaceGUID: "spaceAGUID",
   350  				},
   351  				{
   352  					Name:      "appB",
   353  					GUID:      "appBGUID",
   354  					SpaceGUID: "spaceAGUID",
   355  				},
   356  				{
   357  					Name:      "appC",
   358  					GUID:      "appCGUID",
   359  					SpaceGUID: "spaceCGUID",
   360  				},
   361  			}, []string{"GetApplicationsBySpaceWarning"}, nil)
   362  
   363  			fakeV3Actor.GetApplicationsByGUIDsReturns([]v3action.Application{
   364  				{
   365  					GUID:      "appBGUID",
   366  					Name:      "appB",
   367  					SpaceGUID: "spaceAGUID",
   368  				},
   369  				{
   370  					GUID:      "appCGUID",
   371  					Name:      "appC",
   372  					SpaceGUID: "spaceCGUID",
   373  				},
   374  			}, []string{"GetApplicationsByGUIDsWarning"}, nil)
   375  
   376  			fakeV3Actor.GetSpacesByGUIDsReturns([]v3action.Space{
   377  				{
   378  					GUID:             "spaceAGUID",
   379  					Name:             "spaceA",
   380  					OrganizationGUID: "orgAGUID",
   381  				},
   382  				{
   383  					GUID:             "spaceCGUID",
   384  					Name:             "spaceC",
   385  					OrganizationGUID: "orgCGUID",
   386  				},
   387  			}, []string{"GetSpaceByGUIDsWarning"}, nil)
   388  
   389  			fakeV3Actor.GetOrganizationsByGUIDsReturns([]v3action.Organization{
   390  				{
   391  					GUID: "orgAGUID",
   392  					Name: "orgA",
   393  				},
   394  				{
   395  					GUID: "orgCGUID",
   396  					Name: "orgC",
   397  				},
   398  			}, []string{"GetOrganizationsByGUIDsWarning"}, nil)
   399  		})
   400  
   401  		JustBeforeEach(func() {
   402  			spaceGuid := "space"
   403  			policies, warnings, executeErr = actor.NetworkPoliciesBySpace(spaceGuid)
   404  		})
   405  
   406  		It("lists policies", func() {
   407  			Expect(policies).To(Equal(
   408  				[]Policy{{
   409  					SourceName:           "appA",
   410  					DestinationName:      "appB",
   411  					Protocol:             "tcp",
   412  					StartPort:            8080,
   413  					EndPort:              8080,
   414  					DestinationSpaceName: "spaceA",
   415  					DestinationOrgName:   "orgA",
   416  				}, {
   417  					SourceName:           "appB",
   418  					DestinationName:      "appB",
   419  					Protocol:             "tcp",
   420  					StartPort:            8080,
   421  					EndPort:              8080,
   422  					DestinationSpaceName: "spaceA",
   423  					DestinationOrgName:   "orgA",
   424  				}, {
   425  					SourceName:           "appA",
   426  					DestinationName:      "appC",
   427  					Protocol:             "tcp",
   428  					StartPort:            8080,
   429  					EndPort:              8080,
   430  					DestinationSpaceName: "spaceC",
   431  					DestinationOrgName:   "orgC",
   432  				}},
   433  			))
   434  			Expect(warnings).To(ConsistOf(
   435  				"GetApplicationsBySpaceWarning",
   436  				"GetApplicationsByGUIDsWarning",
   437  				"GetSpaceByGUIDsWarning",
   438  				"GetOrganizationsByGUIDsWarning",
   439  			))
   440  			Expect(executeErr).NotTo(HaveOccurred())
   441  
   442  			Expect(fakeV3Actor.GetApplicationsBySpaceCallCount()).To(Equal(1))
   443  			Expect(fakeV3Actor.GetApplicationByNameAndSpaceCallCount()).To(Equal(0))
   444  
   445  			Expect(fakeNetworkingClient.ListPoliciesCallCount()).To(Equal(1))
   446  			Expect(fakeNetworkingClient.ListPoliciesArgsForCall(0)).To(ConsistOf("appAGUID", "appBGUID", "appCGUID"))
   447  
   448  			Expect(fakeV3Actor.GetApplicationsByGUIDsCallCount()).To(Equal(1))
   449  			Expect(fakeV3Actor.GetApplicationsByGUIDsArgsForCall(0)).To(ConsistOf("appBGUID", "appCGUID"))
   450  
   451  			Expect(fakeV3Actor.GetSpacesByGUIDsCallCount()).To(Equal(1))
   452  			Expect(fakeV3Actor.GetSpacesByGUIDsArgsForCall(0)).To(ConsistOf("spaceAGUID", "spaceCGUID"))
   453  
   454  			Expect(fakeV3Actor.GetOrganizationsByGUIDsCallCount()).To(Equal(1))
   455  			Expect(fakeV3Actor.GetOrganizationsByGUIDsArgsForCall(0)).To(ConsistOf("orgAGUID", "orgCGUID"))
   456  		})
   457  
   458  		// policy server returns policies that match the give app guid in the source or destination
   459  		// we only care about the policies that match the source guid.
   460  		When("the policy server returns policies that have matching destination app guids", func() {
   461  			BeforeEach(func() {
   462  				fakeNetworkingClient.ListPoliciesReturns([]cfnetv1.Policy{{
   463  					Source: cfnetv1.PolicySource{
   464  						ID: "appDGUID",
   465  					},
   466  					Destination: cfnetv1.PolicyDestination{
   467  						ID:       "appAGUID",
   468  						Protocol: "tcp",
   469  						Ports: cfnetv1.Ports{
   470  							Start: 8080,
   471  							End:   8080,
   472  						},
   473  					},
   474  				}}, nil)
   475  			})
   476  
   477  			It("filters them out ", func() {
   478  				Expect(policies).To(BeEmpty())
   479  			})
   480  		})
   481  
   482  		When("getting the applications fails", func() {
   483  			BeforeEach(func() {
   484  				fakeV3Actor.GetApplicationsBySpaceReturns([]v3action.Application{}, []string{"GetApplicationsBySpaceWarning"}, errors.New("banana"))
   485  			})
   486  
   487  			It("returns a sensible error", func() {
   488  				Expect(policies).To(Equal([]Policy{}))
   489  				Expect(warnings).To(ConsistOf("GetApplicationsBySpaceWarning"))
   490  				Expect(executeErr).To(MatchError("banana"))
   491  			})
   492  		})
   493  
   494  		When("listing the policy fails", func() {
   495  			BeforeEach(func() {
   496  				fakeNetworkingClient.ListPoliciesReturns([]cfnetv1.Policy{}, errors.New("apple"))
   497  			})
   498  			It("returns a sensible error", func() {
   499  				Expect(executeErr).To(MatchError("apple"))
   500  			})
   501  		})
   502  
   503  		When("getting the applications by guids fails", func() {
   504  			BeforeEach(func() {
   505  				fakeV3Actor.GetApplicationsByGUIDsReturns([]v3action.Application{}, []string{"GetApplicationsByGUIDsWarning"}, errors.New("banana"))
   506  			})
   507  
   508  			It("returns a sensible error", func() {
   509  				Expect(policies).To(Equal([]Policy{}))
   510  				Expect(warnings).To(ContainElement("GetApplicationsByGUIDsWarning"))
   511  				Expect(executeErr).To(MatchError("banana"))
   512  			})
   513  		})
   514  
   515  		When("getting the spaces by guids fails", func() {
   516  			BeforeEach(func() {
   517  				fakeV3Actor.GetSpacesByGUIDsReturns([]v3action.Space{}, []string{"GetSpacesByGUIDsWarning"}, errors.New("banana"))
   518  			})
   519  
   520  			It("returns a sensible error", func() {
   521  				Expect(policies).To(Equal([]Policy{}))
   522  				Expect(warnings).To(ContainElement("GetSpacesByGUIDsWarning"))
   523  				Expect(executeErr).To(MatchError("banana"))
   524  			})
   525  		})
   526  	})
   527  
   528  	Describe("RemoveNetworkPolicy", func() {
   529  		BeforeEach(func() {
   530  			fakeNetworkingClient.ListPoliciesReturns([]cfnetv1.Policy{
   531  				{
   532  					Source: cfnetv1.PolicySource{
   533  						ID: "appAGUID",
   534  					},
   535  					Destination: cfnetv1.PolicyDestination{
   536  						ID:       "appBGUID",
   537  						Protocol: "udp",
   538  						Ports: cfnetv1.Ports{
   539  							Start: 123,
   540  							End:   345,
   541  						},
   542  					},
   543  				},
   544  			}, nil)
   545  		})
   546  
   547  		JustBeforeEach(func() {
   548  			srcSpaceGuid := "spaceA"
   549  			srcApp := "appA"
   550  			destSpaceGuid := "spaceB"
   551  			destApp := "appB"
   552  			protocol := "udp"
   553  			startPort := 123
   554  			endPort := 345
   555  			warnings, executeErr = actor.RemoveNetworkPolicy(srcSpaceGuid, srcApp, destSpaceGuid, destApp, protocol, startPort, endPort)
   556  		})
   557  		It("removes policies", func() {
   558  			Expect(warnings).To(ConsistOf("v3ActorWarningA", "v3ActorWarningB"))
   559  			Expect(executeErr).NotTo(HaveOccurred())
   560  
   561  			Expect(fakeV3Actor.GetApplicationByNameAndSpaceCallCount()).To(Equal(2))
   562  			sourceAppName, spaceGUID := fakeV3Actor.GetApplicationByNameAndSpaceArgsForCall(0)
   563  			Expect(sourceAppName).To(Equal("appA"))
   564  			Expect(spaceGUID).To(Equal("spaceA"))
   565  
   566  			destAppName, spaceGUID := fakeV3Actor.GetApplicationByNameAndSpaceArgsForCall(1)
   567  			Expect(destAppName).To(Equal("appB"))
   568  			Expect(spaceGUID).To(Equal("spaceB"))
   569  
   570  			Expect(fakeNetworkingClient.ListPoliciesCallCount()).To(Equal(1))
   571  
   572  			Expect(fakeNetworkingClient.RemovePoliciesCallCount()).To(Equal(1))
   573  			Expect(fakeNetworkingClient.RemovePoliciesArgsForCall(0)).To(Equal([]cfnetv1.Policy{
   574  				{
   575  					Source: cfnetv1.PolicySource{
   576  						ID: "appAGUID",
   577  					},
   578  					Destination: cfnetv1.PolicyDestination{
   579  						ID:       "appBGUID",
   580  						Protocol: "udp",
   581  						Ports: cfnetv1.Ports{
   582  							Start: 123,
   583  							End:   345,
   584  						},
   585  					},
   586  				},
   587  			}))
   588  		})
   589  
   590  		When("the policy does not exist", func() {
   591  			BeforeEach(func() {
   592  				fakeNetworkingClient.ListPoliciesReturns([]cfnetv1.Policy{}, nil)
   593  			})
   594  
   595  			It("returns an error", func() {
   596  				Expect(warnings).To(ConsistOf("v3ActorWarningA", "v3ActorWarningB"))
   597  				Expect(executeErr).To(MatchError(actionerror.PolicyDoesNotExistError{}))
   598  			})
   599  		})
   600  
   601  		When("getting the source app fails ", func() {
   602  			BeforeEach(func() {
   603  				fakeV3Actor.GetApplicationByNameAndSpaceReturns(v3action.Application{}, []string{"v3ActorWarningA"}, errors.New("banana"))
   604  			})
   605  			It("returns a sensible error", func() {
   606  				Expect(warnings).To(ConsistOf("v3ActorWarningA"))
   607  				Expect(executeErr).To(MatchError("banana"))
   608  			})
   609  		})
   610  
   611  		When("getting the destination app fails ", func() {
   612  			BeforeEach(func() {
   613  				fakeV3Actor.GetApplicationByNameAndSpaceReturnsOnCall(0, v3action.Application{}, []string{"v3ActorWarningA"}, nil)
   614  				fakeV3Actor.GetApplicationByNameAndSpaceReturnsOnCall(1, v3action.Application{}, []string{"v3ActorWarningB"}, errors.New("banana"))
   615  			})
   616  
   617  			It("returns a sensible error", func() {
   618  				Expect(warnings).To(ConsistOf("v3ActorWarningA", "v3ActorWarningB"))
   619  				Expect(executeErr).To(MatchError("banana"))
   620  			})
   621  		})
   622  
   623  		When("listing policies fails", func() {
   624  			BeforeEach(func() {
   625  				fakeNetworkingClient.ListPoliciesReturns([]cfnetv1.Policy{}, errors.New("apple"))
   626  			})
   627  			It("returns a sensible error", func() {
   628  				Expect(executeErr).To(MatchError("apple"))
   629  			})
   630  		})
   631  
   632  		When("removing the policy fails", func() {
   633  			BeforeEach(func() {
   634  				fakeNetworkingClient.RemovePoliciesReturns(errors.New("apple"))
   635  			})
   636  			It("returns a sensible error", func() {
   637  				Expect(executeErr).To(MatchError("apple"))
   638  			})
   639  		})
   640  	})
   641  })