github.com/infobloxopen/infoblox-go-client@v1.1.1/connector_test.go (about)

     1  package ibclient
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"fmt"
     7  	"net/http"
     8  	"net/url"
     9  	"strings"
    10  
    11  	. "github.com/onsi/ginkgo"
    12  	. "github.com/onsi/gomega"
    13  )
    14  
    15  type FakeRequestBuilder struct {
    16  	hostConfig HostConfig
    17  
    18  	r   RequestType
    19  	obj IBObject
    20  	ref string
    21  
    22  	urlStr  string
    23  	bodyStr []byte
    24  	req     *http.Request
    25  }
    26  
    27  func (rb *FakeRequestBuilder) Init(cfg HostConfig) {
    28  	rb.hostConfig = cfg
    29  }
    30  
    31  func (rb *FakeRequestBuilder) BuildUrl(r RequestType, objType string, ref string, returnFields []string, queryParams QueryParams) string {
    32  	return rb.urlStr
    33  }
    34  
    35  func (rb *FakeRequestBuilder) BuildBody(r RequestType, obj IBObject) []byte {
    36  	return []byte{}
    37  }
    38  
    39  func (rb *FakeRequestBuilder) BuildRequest(r RequestType, obj IBObject, ref string, queryParams QueryParams) (*http.Request, error) {
    40  	Expect(r).To(Equal(rb.r))
    41  	if rb.obj == nil {
    42  		Expect(obj).To(BeNil())
    43  	} else {
    44  		Expect(obj).To(Equal(rb.obj))
    45  	}
    46  	Expect(ref).To(Equal(rb.ref))
    47  
    48  	return rb.req, nil
    49  }
    50  
    51  type FakeHttpRequestor struct {
    52  	config TransportConfig
    53  
    54  	req *http.Request
    55  	res []byte
    56  }
    57  
    58  func (hr *FakeHttpRequestor) Init(config TransportConfig) {
    59  	hr.config = config
    60  }
    61  
    62  func (hr *FakeHttpRequestor) SendRequest(req *http.Request) ([]byte, error) {
    63  	Expect(req).To(Equal(hr.req))
    64  
    65  	return hr.res, nil
    66  }
    67  
    68  func MockValidateConnector(c *Connector) (err error) {
    69  	return
    70  }
    71  
    72  var _ = Describe("Connector", func() {
    73  
    74  	Describe("WapiRequestBuilder", func() {
    75  		host := "172.22.18.66"
    76  		version := "2.2"
    77  		port := "443"
    78  		username := "myname"
    79  		password := "mysecrete!"
    80  		hostCfg := HostConfig{
    81  			Host:     host,
    82  			Version:  version,
    83  			Port:     port,
    84  			Username: username,
    85  			Password: password,
    86  		}
    87  
    88  		wrb := WapiRequestBuilder{HostConfig: hostCfg}
    89  
    90  		Describe("BuildUrl", func() {
    91  			Context("for CREATE request", func() {
    92  				objType := "networkview"
    93  				ref := ""
    94  				returnFields := []string{}
    95  				var queryParams QueryParams
    96  				It("should return expected url string for CREATE request when forceProxy is false", func() {
    97  					queryParams.forceProxy = false //disable proxy
    98  					expectedURLStr := fmt.Sprintf("https://%s:%s/wapi/v%s/%s",
    99  						host, port, version, objType)
   100  					urlStr := wrb.BuildUrl(CREATE, objType, ref, returnFields, queryParams)
   101  					Expect(urlStr).To(Equal(expectedURLStr))
   102  				})
   103  				It("should return expected url string for CREATE request when forceProxy is true", func() {
   104  					queryParams.forceProxy = true //proxy enabled
   105  					expectedURLStr := fmt.Sprintf("https://%s:%s/wapi/v%s/%s",
   106  						host, port, version, objType)
   107  					urlStr := wrb.BuildUrl(CREATE, objType, ref, returnFields, queryParams)
   108  					Expect(urlStr).To(Equal(expectedURLStr))
   109  
   110  				})
   111  			})
   112  			Context("for GET request", func() {
   113  				objType := "network"
   114  				ref := ""
   115  				returnFields := []string{"extattrs", "network", "network_view"}
   116  				returnFieldsStr := "_return_fields" + "=" + url.QueryEscape(strings.Join(returnFields, ","))
   117  				var queryParams QueryParams
   118  				It("should return expected url string for GET for the return fields when forceProxy is false", func() {
   119  					queryParams.forceProxy = false // disable proxy
   120  					expectedURLStr := fmt.Sprintf("https://%s:%s/wapi/v%s/%s?%s",
   121  						host, port, version, objType, returnFieldsStr)
   122  					urlStr := wrb.BuildUrl(GET, objType, ref, returnFields, queryParams)
   123  					Expect(urlStr).To(Equal(expectedURLStr))
   124  				})
   125  				It("should return expected url string for GET for the return fields when forceProxy is true", func() {
   126  					queryParams.forceProxy = true // proxy enabled
   127  					qry := "_proxy_search=GM"
   128  					expectedURLStr := fmt.Sprintf("https://%s:%s/wapi/v%s/%s?%s&%s",
   129  						host, port, version, objType, qry, returnFieldsStr)
   130  					urlStr := wrb.BuildUrl(GET, objType, ref, returnFields, queryParams)
   131  					Expect(urlStr).To(Equal(expectedURLStr))
   132  				})
   133  			})
   134  			Context("for DELETE request", func() {
   135  				objType := ""
   136  				ref := "fixedaddress/ZG5zLmJpbmRfY25h:12.0.10.1/external"
   137  				returnFields := []string{}
   138  				var queryParams QueryParams
   139  				It("should return expected url string for DELETE request when forceProxy is false", func() {
   140  					queryParams.forceProxy = false //disable proxy
   141  					expectedURLStr := fmt.Sprintf("https://%s:%s/wapi/v%s/%s",
   142  						host, port, version, ref)
   143  					urlStr := wrb.BuildUrl(DELETE, objType, ref, returnFields, queryParams)
   144  					Expect(urlStr).To(Equal(expectedURLStr))
   145  				})
   146  				It("should return expected url string for DELETE request when forceProxy is true", func() {
   147  					queryParams.forceProxy = true //proxy enabled
   148  					expectedURLStr := fmt.Sprintf("https://%s:%s/wapi/v%s/%s",
   149  						host, port, version, ref)
   150  					urlStr := wrb.BuildUrl(DELETE, objType, ref, returnFields, queryParams)
   151  					Expect(urlStr).To(Equal(expectedURLStr))
   152  				})
   153  			})
   154  
   155  		})
   156  
   157  		Describe("BuildBody", func() {
   158  			It("should return expected body string for CREATE request", func() {
   159  				networkView := "private-view"
   160  				cidr := "172.22.18.0/24"
   161  				eaKey := "Network Name"
   162  				eaVal := "yellow-net"
   163  				ea := EA{eaKey: eaVal}
   164  				nw := NewNetwork(Network{NetviewName: networkView, Cidr: cidr, Ea: ea})
   165  
   166  				netviewStr := `"network_view":"` + networkView + `"`
   167  				networkStr := `"network":"` + cidr + `"`
   168  				eaStr := `"extattrs":{"` + eaKey + `":{"value":"` + eaVal + `"}}`
   169  				expectedBodyStr := "{" + strings.Join([]string{netviewStr, networkStr, eaStr}, ",") + "}"
   170  
   171  				bodyStr := wrb.BuildBody(CREATE, nw)
   172  				Expect(string(bodyStr)).To(Equal(expectedBodyStr))
   173  			})
   174  		})
   175  
   176  		Describe("BuildBody", func() {
   177  			It("should return expected body for GET by EA request", func() {
   178  				networkView := "private-view"
   179  				cidr := "172.22.18.0/24"
   180  				eaKey := "Network Name"
   181  				eaVal := "yellow-net"
   182  				eaSearch := EASearch{eaKey: eaVal}
   183  				nw := NewNetwork(Network{NetviewName: networkView, Cidr: cidr})
   184  				nw.eaSearch = eaSearch
   185  
   186  				netviewStr := `"network_view":"` + networkView + `"`
   187  				networkStr := `"network":"` + cidr + `"`
   188  				eaSearchStr := `"*` + eaKey + `":"` + eaVal + `"`
   189  				expectedBodyStr := "{" + strings.Join([]string{netviewStr, networkStr, eaSearchStr}, ",") + "}"
   190  				bodyStr := wrb.BuildBody(GET, nw)
   191  
   192  				Expect(string(bodyStr)).To(Equal(expectedBodyStr))
   193  			})
   194  		})
   195  
   196  		Describe("BuildRequest", func() {
   197  			Context("for CREATE request", func() {
   198  				networkView := "private-view"
   199  				cidr := "172.22.18.0/24"
   200  				eaKey := "Network Name"
   201  				eaVal := "yellow-net"
   202  				ea := EA{eaKey: eaVal}
   203  				nw := NewNetwork(Network{NetviewName: networkView, Cidr: cidr, Ea: ea})
   204  				netviewStr := `"network_view":"` + networkView + `"`
   205  				networkStr := `"network":"` + cidr + `"`
   206  				eaStr := `"extattrs":{"` + eaKey + `":{"value":"` + eaVal + `"}}`
   207  				expectedBodyStr := "{" + strings.Join([]string{netviewStr, networkStr, eaStr}, ",") + "}"
   208  				var queryParams QueryParams
   209  				It("should return expected Http Request for CREATE request when forceProxy is false", func() {
   210  					queryParams.forceProxy = false //disable proxy
   211  					hostStr := fmt.Sprintf("%s:%s", host, port)
   212  					req, err := wrb.BuildRequest(CREATE, nw, "", queryParams)
   213  					Expect(err).To(BeNil())
   214  					Expect(req.Method).To(Equal("POST"))
   215  					Expect(req.URL.Host).To(Equal(hostStr))
   216  					Expect(req.URL.Path).To(Equal(fmt.Sprintf("/wapi/v%s/%s", version, nw.ObjectType())))
   217  					Expect(req.Header["Content-Type"]).To(Equal([]string{"application/json"}))
   218  					Expect(req.Host).To(Equal(hostStr))
   219  					actualUsername, actualPassword, ok := req.BasicAuth()
   220  					Expect(ok).To(BeTrue())
   221  					Expect(actualUsername).To(Equal(username))
   222  					Expect(actualPassword).To(Equal(password))
   223  					bodyLen := 1000
   224  					actualBody := make([]byte, bodyLen)
   225  					n, rderr := req.Body.Read(actualBody)
   226  					_ = req.Body.Close()
   227  					Expect(rderr).To(BeNil())
   228  					Expect(n < bodyLen).To(BeTrue())
   229  					actualBodyStr := string(actualBody[:n])
   230  					Expect(actualBodyStr).To(Equal(expectedBodyStr))
   231  				})
   232  				It("should return expected Http Request for CREATE request when forceProxy is true", func() {
   233  					queryParams.forceProxy = true //proxy enabled
   234  					hostStr := fmt.Sprintf("%s:%s", host, port)
   235  					req, err := wrb.BuildRequest(CREATE, nw, "", queryParams)
   236  					Expect(err).To(BeNil())
   237  					Expect(req.Method).To(Equal("POST"))
   238  					Expect(req.URL.Host).To(Equal(hostStr))
   239  					Expect(req.URL.Path).To(Equal(fmt.Sprintf("/wapi/v%s/%s", version, nw.ObjectType())))
   240  					Expect(req.Header["Content-Type"]).To(Equal([]string{"application/json"}))
   241  					Expect(req.Host).To(Equal(hostStr))
   242  					actualUsername, actualPassword, ok := req.BasicAuth()
   243  					Expect(ok).To(BeTrue())
   244  					Expect(actualUsername).To(Equal(username))
   245  					Expect(actualPassword).To(Equal(password))
   246  					bodyLen := 1000
   247  					actualBody := make([]byte, bodyLen)
   248  					n, rderr := req.Body.Read(actualBody)
   249  					_ = req.Body.Close()
   250  					Expect(rderr).To(BeNil())
   251  					Expect(n < bodyLen).To(BeTrue())
   252  					actualBodyStr := string(actualBody[:n])
   253  					Expect(actualBodyStr).To(Equal(expectedBodyStr))
   254  				})
   255  			})
   256  
   257  		})
   258  	})
   259  
   260  	Describe("Connector Object Methods", func() {
   261  
   262  		host := "172.22.18.66"
   263  		version := "2.2"
   264  		port := "443"
   265  		username := "myname"
   266  		password := "mysecrete!"
   267  		httpRequestTimeout := 120
   268  		httpPoolConnections := 100
   269  
   270  		hostConfig := HostConfig{
   271  			Host:     host,
   272  			Version:  version,
   273  			Port:     port,
   274  			Username: username,
   275  			Password: password,
   276  		}
   277  		transportConfig := NewTransportConfig("false", httpRequestTimeout, httpPoolConnections)
   278  
   279  		Describe("CreateObject", func() {
   280  			netviewName := "private-view"
   281  			eaKey := "CMP Type"
   282  			eaVal := "OpenStack"
   283  			netViewObj := NewNetworkView(NetworkView{
   284  				Name: netviewName,
   285  				Ea:   EA{eaKey: eaVal},
   286  			})
   287  
   288  			requestType := RequestType(CREATE)
   289  			eaStr := `"extattrs":{"` + eaKey + `":{"value":"` + eaVal + `"}}`
   290  			netviewStr := `"network_view":"` + netviewName + `"`
   291  			urlStr := fmt.Sprintf("https://%s:%s/wapi/v%s/%s",
   292  				host, port, version, netViewObj.ObjectType())
   293  			bodyStr := []byte("{" + strings.Join([]string{netviewStr, eaStr}, ",") + "}")
   294  			httpReq, _ := http.NewRequest(requestType.toMethod(), urlStr, bytes.NewBuffer(bodyStr))
   295  			frb := &FakeRequestBuilder{
   296  				r:   requestType,
   297  				obj: netViewObj,
   298  				ref: "",
   299  
   300  				urlStr:  urlStr,
   301  				bodyStr: bodyStr,
   302  				req:     httpReq,
   303  			}
   304  
   305  			expectRef := "networkview/ZG5zLm5ldHdvcmtfdmlldyQyMw:global_view/false"
   306  			fakeref := `"` + expectRef + `"`
   307  			fhr := &FakeHttpRequestor{
   308  				config: transportConfig,
   309  
   310  				req: httpReq,
   311  				res: []byte(fakeref),
   312  			}
   313  
   314  			OrigValidateConnector := ValidateConnector
   315  			ValidateConnector = MockValidateConnector
   316  			defer func() { ValidateConnector = OrigValidateConnector }()
   317  			conn, err := NewConnector(hostConfig, transportConfig,
   318  				frb, fhr)
   319  
   320  			if err != nil {
   321  				Fail("Error creating Connector")
   322  			}
   323  			It("should return expected object", func() {
   324  				actualRef, err := conn.CreateObject(netViewObj)
   325  
   326  				Expect(err).To(BeNil())
   327  				Expect(actualRef).To(Equal(expectRef))
   328  			})
   329  		})
   330  
   331  		Describe("DeleteObject", func() {
   332  			ref := "fixedaddress/ZG5zLmJpbmRfY25h:12.0.10.1/external"
   333  
   334  			requestType := RequestType(DELETE)
   335  			urlStr := fmt.Sprintf("https://%s:%s/wapi/v%s/%s",
   336  				host, port, version, ref)
   337  			bodyStr := []byte{}
   338  			httpReq, _ := http.NewRequest(requestType.toMethod(), urlStr, bytes.NewBuffer(bodyStr))
   339  			frb := &FakeRequestBuilder{
   340  				r:   requestType,
   341  				obj: nil,
   342  				ref: ref,
   343  
   344  				urlStr:  urlStr,
   345  				bodyStr: bodyStr,
   346  				req:     httpReq,
   347  			}
   348  
   349  			expectRef := ref
   350  			fakeref := `"` + expectRef + `"`
   351  			fhr := &FakeHttpRequestor{
   352  				config: transportConfig,
   353  
   354  				req: httpReq,
   355  				res: []byte(fakeref),
   356  			}
   357  
   358  			OrigValidateConnector := ValidateConnector
   359  			ValidateConnector = MockValidateConnector
   360  			defer func() { ValidateConnector = OrigValidateConnector }()
   361  			conn, err := NewConnector(hostConfig, transportConfig,
   362  				frb, fhr)
   363  
   364  			if err != nil {
   365  				Fail("Error creating Connector")
   366  			}
   367  			It("should return expected object ref", func() {
   368  				actualRef, err := conn.DeleteObject(ref)
   369  
   370  				Expect(err).To(BeNil())
   371  				Expect(actualRef).To(Equal(expectRef))
   372  			})
   373  
   374  		})
   375  
   376  		Describe("GetObject", func() {
   377  			netviewName := "private-view"
   378  			eaKey := "CMP Type"
   379  			eaVal := "OpenStack"
   380  			netViewObj := NewNetworkView(NetworkView{
   381  				Name: netviewName,
   382  				Ea:   EA{eaKey: eaVal},
   383  			})
   384  
   385  			requestType := RequestType(GET)
   386  			eaStr := `"extattrs":{"` + eaKey + `":{"value":"` + eaVal + `"}}`
   387  			netviewStr := `"network_view":"` + netviewName + `"`
   388  			urlStr := fmt.Sprintf("https://%s:%s/wapi/v%s/%s",
   389  				host, port, version, netViewObj.ObjectType())
   390  			bodyStr := []byte("{" + strings.Join([]string{netviewStr, eaStr}, ",") + "}")
   391  			httpReq, _ := http.NewRequest(requestType.toMethod(), urlStr, bytes.NewBuffer(bodyStr))
   392  			frb := &FakeRequestBuilder{
   393  				r:   requestType,
   394  				obj: netViewObj,
   395  				ref: "",
   396  
   397  				urlStr:  urlStr,
   398  				bodyStr: bodyStr,
   399  				req:     httpReq,
   400  			}
   401  
   402  			expectRef := "networkview/ZG5zLm5ldHdvcmtfdmlldyQyMw:global_view/false"
   403  			expectObj := NewNetworkView(NetworkView{
   404  				Ref:  expectRef,
   405  				Name: netviewName,
   406  				Ea:   EA{eaKey: eaVal},
   407  			})
   408  			expectRes, _ := json.Marshal(expectObj)
   409  
   410  			fhr := &FakeHttpRequestor{
   411  				config: transportConfig,
   412  
   413  				req: httpReq,
   414  				res: expectRes,
   415  			}
   416  
   417  			OrigValidateConnector := ValidateConnector
   418  			ValidateConnector = MockValidateConnector
   419  			defer func() { ValidateConnector = OrigValidateConnector }()
   420  
   421  			conn, err := NewConnector(hostConfig, transportConfig,
   422  				frb, fhr)
   423  
   424  			if err != nil {
   425  				Fail("Error creating Connector")
   426  			}
   427  			It("should return expected object", func() {
   428  				actual := &NetworkView{}
   429  				err := conn.GetObject(netViewObj, "", actual)
   430  				Expect(err).To(BeNil())
   431  				Expect(NewNetworkView(*actual)).To(Equal(expectObj))
   432  			})
   433  		})
   434  		Describe("makeRequest", func() {
   435  			Context("for GET request", func() {
   436  				netviewName := "private-view"
   437  				eaKey := "CMP Type"
   438  				eaVal := "OpenStack"
   439  				ref := ""
   440  				var queryParams QueryParams
   441  				netViewObj := NewNetworkView(NetworkView{
   442  					Name: netviewName,
   443  					Ea:   EA{eaKey: eaVal},
   444  				})
   445  
   446  				requestType := RequestType(GET)
   447  				eaStr := `"extattrs":{"` + eaKey + `":{"value":"` + eaVal + `"}}`
   448  				netviewStr := `"network_view":"` + netviewName + `"`
   449  				urlStr := fmt.Sprintf("https://%s:%s/wapi/v%s/%s",
   450  					host, port, version, netViewObj.ObjectType())
   451  
   452  				bodyStr := []byte("{" + strings.Join([]string{netviewStr, eaStr}, ",") + "}")
   453  				httpReq, _ := http.NewRequest(requestType.toMethod(), urlStr, bytes.NewBuffer(bodyStr))
   454  				frb := &FakeRequestBuilder{
   455  					r:   requestType,
   456  					obj: netViewObj,
   457  					ref: "",
   458  
   459  					urlStr:  urlStr,
   460  					bodyStr: bodyStr,
   461  					req:     httpReq,
   462  				}
   463  
   464  				expectRef := "networkview/ZG5zLm5ldHdvcmtfdmlldyQyMw:global_view/false"
   465  				expectObj := NewNetworkView(NetworkView{
   466  					Ref:  expectRef,
   467  					Name: netviewName,
   468  					Ea:   EA{eaKey: eaVal},
   469  				})
   470  				expectRes, _ := json.Marshal(expectObj)
   471  
   472  				fhr := &FakeHttpRequestor{
   473  					config: transportConfig,
   474  
   475  					req: httpReq,
   476  					res: expectRes,
   477  				}
   478  
   479  				OrigValidateConnector := ValidateConnector
   480  				ValidateConnector = MockValidateConnector
   481  				defer func() { ValidateConnector = OrigValidateConnector }()
   482  
   483  				conn, err := NewConnector(hostConfig, transportConfig,
   484  					frb, fhr)
   485  
   486  				if err != nil {
   487  					Fail("Error creating Connector")
   488  				}
   489  				actual := &NetworkView{}
   490  				It("should return expected object when forceProxy is false", func() {
   491  					queryParams.forceProxy = false //disable proxy
   492  					res, err := conn.makeRequest(GET, netViewObj, ref, queryParams)
   493  					err = json.Unmarshal(res, &actual)
   494  					Expect(err).To(BeNil())
   495  					Expect(NewNetworkView(*actual)).To(Equal(expectObj))
   496  				})
   497  				It("should return expected object when forceProxy is true", func() {
   498  					queryParams.forceProxy = true //disable proxy
   499  					res, err := conn.makeRequest(GET, netViewObj, ref, queryParams)
   500  					err = json.Unmarshal(res, &actual)
   501  					Expect(err).To(BeNil())
   502  					Expect(NewNetworkView(*actual)).To(Equal(expectObj))
   503  				})
   504  			})
   505  
   506  		})
   507  
   508  	})
   509  })