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