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  })