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