api_test.go 34 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391
  1. package api
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "io"
  8. "net/http"
  9. "os"
  10. "runtime"
  11. "testing"
  12. "github.com/docker/docker/pkg/reexec"
  13. "github.com/docker/libnetwork"
  14. "github.com/docker/libnetwork/netlabel"
  15. "github.com/docker/libnetwork/netutils"
  16. "github.com/docker/libnetwork/options"
  17. "github.com/docker/libnetwork/types"
  18. )
  19. const (
  20. bridgeNetType = "bridge"
  21. bridgeName = "docker0"
  22. )
  23. func getEmptyGenericOption() map[string]interface{} {
  24. genericOption := make(map[string]interface{})
  25. genericOption[netlabel.GenericData] = options.Generic{}
  26. return genericOption
  27. }
  28. func i2s(i interface{}) string {
  29. s, ok := i.(string)
  30. if !ok {
  31. panic(fmt.Sprintf("Failed i2s for %v", i))
  32. }
  33. return s
  34. }
  35. func i2e(i interface{}) *endpointResource {
  36. s, ok := i.(*endpointResource)
  37. if !ok {
  38. panic(fmt.Sprintf("Failed i2e for %v", i))
  39. }
  40. return s
  41. }
  42. func i2c(i interface{}) *libnetwork.ContainerData {
  43. s, ok := i.(*libnetwork.ContainerData)
  44. if !ok {
  45. panic(fmt.Sprintf("Failed i2c for %v", i))
  46. }
  47. return s
  48. }
  49. func i2eL(i interface{}) []*endpointResource {
  50. s, ok := i.([]*endpointResource)
  51. if !ok {
  52. panic(fmt.Sprintf("Failed i2eL for %v", i))
  53. }
  54. return s
  55. }
  56. func i2n(i interface{}) *networkResource {
  57. s, ok := i.(*networkResource)
  58. if !ok {
  59. panic(fmt.Sprintf("Failed i2n for %v", i))
  60. }
  61. return s
  62. }
  63. func i2nL(i interface{}) []*networkResource {
  64. s, ok := i.([]*networkResource)
  65. if !ok {
  66. panic(fmt.Sprintf("Failed i2nL for %v", i))
  67. }
  68. return s
  69. }
  70. func TestMain(m *testing.M) {
  71. if reexec.Init() {
  72. return
  73. }
  74. os.Exit(m.Run())
  75. }
  76. func TestJoinOptionParser(t *testing.T) {
  77. hn := "host1"
  78. dn := "docker.com"
  79. hp := "/etc/hosts"
  80. rc := "/etc/resolv.conf"
  81. dnss := []string{"8.8.8.8", "172.28.34.5"}
  82. ehs := []endpointExtraHost{endpointExtraHost{Name: "extra1", Address: "172.28.9.1"}, endpointExtraHost{Name: "extra2", Address: "172.28.9.2"}}
  83. pus := []endpointParentUpdate{endpointParentUpdate{EndpointID: "abc123def456", Name: "serv1", Address: "172.28.30.123"}}
  84. ej := endpointJoin{
  85. HostName: hn,
  86. DomainName: dn,
  87. HostsPath: hp,
  88. ResolvConfPath: rc,
  89. DNS: dnss,
  90. ExtraHosts: ehs,
  91. ParentUpdates: pus,
  92. UseDefaultSandbox: true,
  93. }
  94. if len(ej.parseOptions()) != 10 {
  95. t.Fatalf("Failed to generate all libnetwork.EndpointJoinOption methods libnetwork.EndpointJoinOption method")
  96. }
  97. }
  98. func TestJson(t *testing.T) {
  99. nc := networkCreate{NetworkType: bridgeNetType}
  100. b, err := json.Marshal(nc)
  101. if err != nil {
  102. t.Fatal(err)
  103. }
  104. var ncp networkCreate
  105. err = json.Unmarshal(b, &ncp)
  106. if err != nil {
  107. t.Fatal(err)
  108. }
  109. if nc.NetworkType != ncp.NetworkType {
  110. t.Fatalf("Incorrect networkCreate after json encoding/deconding: %v", ncp)
  111. }
  112. jl := endpointJoin{ContainerID: "abcdef456789"}
  113. b, err = json.Marshal(jl)
  114. if err != nil {
  115. t.Fatal(err)
  116. }
  117. var jld endpointJoin
  118. err = json.Unmarshal(b, &jld)
  119. if err != nil {
  120. t.Fatal(err)
  121. }
  122. if jl.ContainerID != jld.ContainerID {
  123. t.Fatalf("Incorrect endpointJoin after json encoding/deconding: %v", jld)
  124. }
  125. }
  126. func TestCreateDeleteNetwork(t *testing.T) {
  127. defer netutils.SetupTestNetNS(t)()
  128. c, err := libnetwork.New()
  129. if err != nil {
  130. t.Fatal(err)
  131. }
  132. err = c.ConfigureNetworkDriver(bridgeNetType, nil)
  133. if err != nil {
  134. t.Fatal(err)
  135. }
  136. badBody, err := json.Marshal("bad body")
  137. if err != nil {
  138. t.Fatal(err)
  139. }
  140. vars := make(map[string]string)
  141. _, errRsp := procCreateNetwork(c, nil, badBody)
  142. if errRsp == &createdResponse {
  143. t.Fatalf("Expected to fail but succeeded")
  144. }
  145. incompleteBody, err := json.Marshal(networkCreate{})
  146. if err != nil {
  147. t.Fatal(err)
  148. }
  149. _, errRsp = procCreateNetwork(c, vars, incompleteBody)
  150. if errRsp == &createdResponse {
  151. t.Fatalf("Expected to fail but succeeded")
  152. }
  153. if errRsp.StatusCode != http.StatusBadRequest {
  154. t.Fatalf("Expected StatusBadRequest status code, got: %v", errRsp.StatusCode)
  155. }
  156. ops := make(map[string]interface{})
  157. ops[netlabel.GenericData] = options.Generic{}
  158. nc := networkCreate{Name: "network_1", NetworkType: bridgeNetType, Options: ops}
  159. goodBody, err := json.Marshal(nc)
  160. if err != nil {
  161. t.Fatal(err)
  162. }
  163. _, errRsp = procCreateNetwork(c, vars, goodBody)
  164. if errRsp != &createdResponse {
  165. t.Fatalf("Unexepected failure: %v", errRsp)
  166. }
  167. vars[urlNwName] = ""
  168. _, errRsp = procDeleteNetwork(c, vars, nil)
  169. if errRsp == &successResponse {
  170. t.Fatalf("Expected to fail but succeeded")
  171. }
  172. vars[urlNwName] = "abc"
  173. _, errRsp = procDeleteNetwork(c, vars, nil)
  174. if errRsp == &successResponse {
  175. t.Fatalf("Expected to fail but succeeded")
  176. }
  177. vars[urlNwName] = "network_1"
  178. _, errRsp = procDeleteNetwork(c, vars, nil)
  179. if errRsp != &successResponse {
  180. t.Fatalf("Unexepected failure: %v", errRsp)
  181. }
  182. }
  183. func TestGetNetworksAndEndpoints(t *testing.T) {
  184. defer netutils.SetupTestNetNS(t)()
  185. c, err := libnetwork.New()
  186. if err != nil {
  187. t.Fatal(err)
  188. }
  189. err = c.ConfigureNetworkDriver(bridgeNetType, nil)
  190. if err != nil {
  191. t.Fatal(err)
  192. }
  193. nc := networkCreate{Name: "sh", NetworkType: bridgeNetType}
  194. body, err := json.Marshal(nc)
  195. if err != nil {
  196. t.Fatal(err)
  197. }
  198. vars := make(map[string]string)
  199. inid, errRsp := procCreateNetwork(c, vars, body)
  200. if errRsp != &createdResponse {
  201. t.Fatalf("Unexepected failure: %v", errRsp)
  202. }
  203. nid, ok := inid.(string)
  204. if !ok {
  205. t.FailNow()
  206. }
  207. ec1 := endpointCreate{
  208. Name: "ep1",
  209. ExposedPorts: []types.TransportPort{
  210. types.TransportPort{Proto: types.TCP, Port: uint16(5000)},
  211. types.TransportPort{Proto: types.UDP, Port: uint16(400)},
  212. types.TransportPort{Proto: types.TCP, Port: uint16(600)},
  213. },
  214. PortMapping: []types.PortBinding{
  215. types.PortBinding{Proto: types.TCP, Port: uint16(230), HostPort: uint16(23000)},
  216. types.PortBinding{Proto: types.UDP, Port: uint16(200), HostPort: uint16(22000)},
  217. types.PortBinding{Proto: types.TCP, Port: uint16(120), HostPort: uint16(12000)},
  218. },
  219. }
  220. b1, err := json.Marshal(ec1)
  221. if err != nil {
  222. t.Fatal(err)
  223. }
  224. ec2 := endpointCreate{Name: "ep2"}
  225. b2, err := json.Marshal(ec2)
  226. if err != nil {
  227. t.Fatal(err)
  228. }
  229. vars[urlNwName] = "sh"
  230. vars[urlEpName] = "ep1"
  231. ieid1, errRsp := procCreateEndpoint(c, vars, b1)
  232. if errRsp != &createdResponse {
  233. t.Fatalf("Unexepected failure: %v", errRsp)
  234. }
  235. eid1 := i2s(ieid1)
  236. vars[urlEpName] = "ep2"
  237. ieid2, errRsp := procCreateEndpoint(c, vars, b2)
  238. if errRsp != &createdResponse {
  239. t.Fatalf("Unexepected failure: %v", errRsp)
  240. }
  241. eid2 := i2s(ieid2)
  242. vars[urlNwName] = ""
  243. vars[urlEpName] = "ep1"
  244. _, errRsp = procGetEndpoint(c, vars, nil)
  245. if errRsp == &successResponse {
  246. t.Fatalf("Expected failure but succeeded: %v", errRsp)
  247. }
  248. if errRsp.StatusCode != http.StatusBadRequest {
  249. t.Fatalf("Expected to fail with http.StatusBadRequest, but got: %d", errRsp.StatusCode)
  250. }
  251. vars = make(map[string]string)
  252. vars[urlNwName] = "sh"
  253. vars[urlEpID] = ""
  254. _, errRsp = procGetEndpoint(c, vars, nil)
  255. if errRsp == &successResponse {
  256. t.Fatalf("Expected failure but succeeded: %v", errRsp)
  257. }
  258. if errRsp.StatusCode != http.StatusBadRequest {
  259. t.Fatalf("Expected to fail with http.StatusBadRequest, but got: %d", errRsp.StatusCode)
  260. }
  261. vars = make(map[string]string)
  262. vars[urlNwID] = ""
  263. vars[urlEpID] = eid1
  264. _, errRsp = procGetEndpoint(c, vars, nil)
  265. if errRsp == &successResponse {
  266. t.Fatalf("Expected failure but succeeded: %v", errRsp)
  267. }
  268. if errRsp.StatusCode != http.StatusBadRequest {
  269. t.Fatalf("Expected to fail with http.StatusBadRequest, but got: %d", errRsp.StatusCode)
  270. }
  271. // nw by name and ep by id
  272. vars[urlNwName] = "sh"
  273. i1, errRsp := procGetEndpoint(c, vars, nil)
  274. if errRsp != &successResponse {
  275. t.Fatalf("Unexepected failure: %v", errRsp)
  276. }
  277. // nw by name and ep by name
  278. delete(vars, urlEpID)
  279. vars[urlEpName] = "ep1"
  280. i2, errRsp := procGetEndpoint(c, vars, nil)
  281. if errRsp != &successResponse {
  282. t.Fatalf("Unexepected failure: %v", errRsp)
  283. }
  284. // nw by id and ep by name
  285. delete(vars, urlNwName)
  286. vars[urlNwID] = nid
  287. i3, errRsp := procGetEndpoint(c, vars, nil)
  288. if errRsp != &successResponse {
  289. t.Fatalf("Unexepected failure: %v", errRsp)
  290. }
  291. // nw by id and ep by id
  292. delete(vars, urlEpName)
  293. vars[urlEpID] = eid1
  294. i4, errRsp := procGetEndpoint(c, vars, nil)
  295. if errRsp != &successResponse {
  296. t.Fatalf("Unexepected failure: %v", errRsp)
  297. }
  298. id1 := i2e(i1).ID
  299. if id1 != i2e(i2).ID || id1 != i2e(i3).ID || id1 != i2e(i4).ID {
  300. t.Fatalf("Endpoints retireved via different query parameters differ: %v, %v, %v, %v", i1, i2, i3, i4)
  301. }
  302. vars[urlNwName] = ""
  303. _, errRsp = procGetEndpoints(c, vars, nil)
  304. if errRsp == &successResponse {
  305. t.Fatalf("Expected failure, got: %v", errRsp)
  306. }
  307. delete(vars, urlNwName)
  308. vars[urlNwID] = "fakeID"
  309. _, errRsp = procGetEndpoints(c, vars, nil)
  310. if errRsp == &successResponse {
  311. t.Fatalf("Expected failure, got: %v", errRsp)
  312. }
  313. vars[urlNwID] = nid
  314. _, errRsp = procGetEndpoints(c, vars, nil)
  315. if errRsp != &successResponse {
  316. t.Fatalf("Unexepected failure: %v", errRsp)
  317. }
  318. vars[urlNwName] = "sh"
  319. iepList, errRsp := procGetEndpoints(c, vars, nil)
  320. if errRsp != &successResponse {
  321. t.Fatalf("Unexepected failure: %v", errRsp)
  322. }
  323. epList := i2eL(iepList)
  324. if len(epList) != 2 {
  325. t.Fatalf("Did not return the expected number (2) of endpoint resources: %d", len(epList))
  326. }
  327. if "sh" != epList[0].Network || "sh" != epList[1].Network {
  328. t.Fatalf("Did not find expected network name in endpoint resources")
  329. }
  330. vars = make(map[string]string)
  331. vars[urlNwName] = ""
  332. _, errRsp = procGetNetwork(c, vars, nil)
  333. if errRsp == &successResponse {
  334. t.Fatalf("Exepected failure, got: %v", errRsp)
  335. }
  336. vars[urlNwName] = "shhhhh"
  337. _, errRsp = procGetNetwork(c, vars, nil)
  338. if errRsp == &successResponse {
  339. t.Fatalf("Exepected failure, got: %v", errRsp)
  340. }
  341. vars[urlNwName] = "sh"
  342. inr1, errRsp := procGetNetwork(c, vars, nil)
  343. if errRsp != &successResponse {
  344. t.Fatalf("Unexepected failure: %v", errRsp)
  345. }
  346. nr1 := i2n(inr1)
  347. delete(vars, urlNwName)
  348. vars[urlNwID] = "cacca"
  349. _, errRsp = procGetNetwork(c, vars, nil)
  350. if errRsp == &successResponse {
  351. t.Fatalf("Unexepected failure: %v", errRsp)
  352. }
  353. vars[urlNwID] = nid
  354. inr2, errRsp := procGetNetwork(c, vars, nil)
  355. if errRsp != &successResponse {
  356. t.Fatalf("procgetNetworkByName() != procgetNetworkById(), %v vs %v", inr1, inr2)
  357. }
  358. nr2 := i2n(inr2)
  359. if nr1.Name != nr2.Name || nr1.Type != nr2.Type || nr1.ID != nr2.ID || len(nr1.Endpoints) != len(nr2.Endpoints) {
  360. t.Fatalf("Get by name and Get failure: %v", errRsp)
  361. }
  362. if len(nr1.Endpoints) != 2 {
  363. t.Fatalf("Did not find the expected number (2) of endpoint resources in the network resource: %d", len(nr1.Endpoints))
  364. }
  365. for _, er := range nr1.Endpoints {
  366. if er.ID != eid1 && er.ID != eid2 {
  367. t.Fatalf("Did not find the expected endpoint resources in the network resource: %v", nr1.Endpoints)
  368. }
  369. }
  370. iList, errRsp := procGetNetworks(c, nil, nil)
  371. if errRsp != &successResponse {
  372. t.Fatalf("Unexepected failure: %v", errRsp)
  373. }
  374. netList := i2nL(iList)
  375. if len(netList) != 1 {
  376. t.Fatalf("Did not return the expected number of network resources")
  377. }
  378. if nid != netList[0].ID {
  379. t.Fatalf("Did not find expected network %s: %v", nid, netList)
  380. }
  381. _, errRsp = procDeleteNetwork(c, vars, nil)
  382. if errRsp == &successResponse {
  383. t.Fatalf("Exepected failure, got: %v", errRsp)
  384. }
  385. vars[urlEpName] = "ep1"
  386. _, errRsp = procDeleteEndpoint(c, vars, nil)
  387. if errRsp != &successResponse {
  388. t.Fatalf("Unexepected failure: %v", errRsp)
  389. }
  390. delete(vars, urlEpName)
  391. iepList, errRsp = procGetEndpoints(c, vars, nil)
  392. if errRsp != &successResponse {
  393. t.Fatalf("Unexepected failure: %v", errRsp)
  394. }
  395. epList = i2eL(iepList)
  396. if len(epList) != 1 {
  397. t.Fatalf("Did not return the expected number (1) of endpoint resources: %d", len(epList))
  398. }
  399. vars[urlEpName] = "ep2"
  400. _, errRsp = procDeleteEndpoint(c, vars, nil)
  401. if errRsp != &successResponse {
  402. t.Fatalf("Unexepected failure: %v", errRsp)
  403. }
  404. iepList, errRsp = procGetEndpoints(c, vars, nil)
  405. if errRsp != &successResponse {
  406. t.Fatalf("Unexepected failure: %v", errRsp)
  407. }
  408. epList = i2eL(iepList)
  409. if len(epList) != 0 {
  410. t.Fatalf("Did not return the expected number (0) of endpoint resources: %d", len(epList))
  411. }
  412. _, errRsp = procDeleteNetwork(c, vars, nil)
  413. if errRsp != &successResponse {
  414. t.Fatalf("Unexepected failure: %v", errRsp)
  415. }
  416. iList, errRsp = procGetNetworks(c, nil, nil)
  417. if errRsp != &successResponse {
  418. t.Fatalf("Unexepected failure: %v", errRsp)
  419. }
  420. netList = i2nL(iList)
  421. if len(netList) != 0 {
  422. t.Fatalf("Did not return the expected number of network resources")
  423. }
  424. }
  425. func TestFindNetworkUtil(t *testing.T) {
  426. defer netutils.SetupTestNetNS(t)()
  427. c, err := libnetwork.New()
  428. if err != nil {
  429. t.Fatal(err)
  430. }
  431. err = c.ConfigureNetworkDriver(bridgeNetType, nil)
  432. if err != nil {
  433. t.Fatal(err)
  434. }
  435. nw, err := c.NewNetwork(bridgeNetType, "network", nil)
  436. if err != nil {
  437. t.Fatal(err)
  438. }
  439. nid := nw.ID()
  440. defer checkPanic(t)
  441. findNetwork(c, "", -1)
  442. _, errRsp := findNetwork(c, "", byName)
  443. if errRsp == &successResponse {
  444. t.Fatalf("Expected to fail but succeeded")
  445. }
  446. if errRsp.StatusCode != http.StatusBadRequest {
  447. t.Fatalf("Expected %d, but got: %d", http.StatusBadRequest, errRsp.StatusCode)
  448. }
  449. n, errRsp := findNetwork(c, nid, byID)
  450. if errRsp != &successResponse {
  451. t.Fatalf("Unexpected failure: %v", errRsp)
  452. }
  453. if n == nil {
  454. t.Fatalf("Unexpected nil libnetwork.Network")
  455. }
  456. if nid != n.ID() {
  457. t.Fatalf("Incorrect libnetwork.Network resource. It has different id: %v", n)
  458. }
  459. if "network" != n.Name() {
  460. t.Fatalf("Incorrect libnetwork.Network resource. It has different name: %v", n)
  461. }
  462. n, errRsp = findNetwork(c, "network", byName)
  463. if errRsp != &successResponse {
  464. t.Fatalf("Unexpected failure: %v", errRsp)
  465. }
  466. if n == nil {
  467. t.Fatalf("Unexpected nil libnetwork.Network")
  468. }
  469. if nid != n.ID() {
  470. t.Fatalf("Incorrect libnetwork.Network resource. It has different id: %v", n)
  471. }
  472. if "network" != n.Name() {
  473. t.Fatalf("Incorrect libnetwork.Network resource. It has different name: %v", n)
  474. }
  475. n.Delete()
  476. _, errRsp = findNetwork(c, nid, byID)
  477. if errRsp == &successResponse {
  478. t.Fatalf("Expected to fail but succeeded")
  479. }
  480. if errRsp.StatusCode != http.StatusNotFound {
  481. t.Fatalf("Expected %d, but got: %d", http.StatusNotFound, errRsp.StatusCode)
  482. }
  483. _, errRsp = findNetwork(c, "network", byName)
  484. if errRsp == &successResponse {
  485. t.Fatalf("Expected to fail but succeeded")
  486. }
  487. if errRsp.StatusCode != http.StatusNotFound {
  488. t.Fatalf("Expected %d, but got: %d", http.StatusNotFound, errRsp.StatusCode)
  489. }
  490. }
  491. func TestCreateDeleteEndpoints(t *testing.T) {
  492. defer netutils.SetupTestNetNS(t)()
  493. c, err := libnetwork.New()
  494. if err != nil {
  495. t.Fatal(err)
  496. }
  497. err = c.ConfigureNetworkDriver(bridgeNetType, nil)
  498. if err != nil {
  499. t.Fatal(err)
  500. }
  501. nc := networkCreate{Name: "firstNet", NetworkType: bridgeNetType}
  502. body, err := json.Marshal(nc)
  503. if err != nil {
  504. t.Fatal(err)
  505. }
  506. vars := make(map[string]string)
  507. i, errRsp := procCreateNetwork(c, vars, body)
  508. if errRsp != &createdResponse {
  509. t.Fatalf("Unexepected failure: %v", errRsp)
  510. }
  511. nid := i2s(i)
  512. vbad, err := json.Marshal("bad endppoint create data")
  513. if err != nil {
  514. t.Fatal(err)
  515. }
  516. vars[urlNwName] = "firstNet"
  517. _, errRsp = procCreateEndpoint(c, vars, vbad)
  518. if errRsp == &createdResponse {
  519. t.Fatalf("Expected to fail but succeeded")
  520. }
  521. b, err := json.Marshal(endpointCreate{Name: ""})
  522. if err != nil {
  523. t.Fatal(err)
  524. }
  525. vars[urlNwName] = "secondNet"
  526. _, errRsp = procCreateEndpoint(c, vars, b)
  527. if errRsp == &createdResponse {
  528. t.Fatalf("Expected to fail but succeeded")
  529. }
  530. vars[urlNwName] = "firstNet"
  531. _, errRsp = procCreateEndpoint(c, vars, b)
  532. if errRsp == &successResponse {
  533. t.Fatalf("Expected failure but succeeded: %v", errRsp)
  534. }
  535. b, err = json.Marshal(endpointCreate{Name: "firstEp"})
  536. if err != nil {
  537. t.Fatal(err)
  538. }
  539. i, errRsp = procCreateEndpoint(c, vars, b)
  540. if errRsp != &createdResponse {
  541. t.Fatalf("Unexepected failure: %v", errRsp)
  542. }
  543. eid := i2s(i)
  544. _, errRsp = findEndpoint(c, "myNet", "firstEp", byName, byName)
  545. if errRsp == &successResponse {
  546. t.Fatalf("Expected failure but succeeded: %v", errRsp)
  547. }
  548. ep0, errRsp := findEndpoint(c, nid, "firstEp", byID, byName)
  549. if errRsp != &successResponse {
  550. t.Fatalf("Unexepected failure: %v", errRsp)
  551. }
  552. ep1, errRsp := findEndpoint(c, "firstNet", "firstEp", byName, byName)
  553. if errRsp != &successResponse {
  554. t.Fatalf("Unexepected failure: %v", errRsp)
  555. }
  556. ep2, errRsp := findEndpoint(c, nid, eid, byID, byID)
  557. if errRsp != &successResponse {
  558. t.Fatalf("Unexepected failure: %v", errRsp)
  559. }
  560. ep3, errRsp := findEndpoint(c, "firstNet", eid, byName, byID)
  561. if errRsp != &successResponse {
  562. t.Fatalf("Unexepected failure: %v", errRsp)
  563. }
  564. if ep0.ID() != ep1.ID() || ep0.ID() != ep2.ID() || ep0.ID() != ep3.ID() {
  565. t.Fatalf("Diffenrent queries returned different endpoints: \nep0: %v\nep1: %v\nep2: %v\nep3: %v", ep0, ep1, ep2, ep3)
  566. }
  567. vars = make(map[string]string)
  568. vars[urlNwName] = ""
  569. vars[urlEpName] = "ep1"
  570. _, errRsp = procDeleteEndpoint(c, vars, nil)
  571. if errRsp == &successResponse {
  572. t.Fatalf("Expected failure, got: %v", errRsp)
  573. }
  574. vars[urlNwName] = "firstNet"
  575. vars[urlEpName] = ""
  576. _, errRsp = procDeleteEndpoint(c, vars, nil)
  577. if errRsp == &successResponse {
  578. t.Fatalf("Expected failure, got: %v", errRsp)
  579. }
  580. vars[urlEpName] = "ep2"
  581. _, errRsp = procDeleteEndpoint(c, vars, nil)
  582. if errRsp == &successResponse {
  583. t.Fatalf("Expected failure, got: %v", errRsp)
  584. }
  585. vars[urlEpName] = "firstEp"
  586. _, errRsp = procDeleteEndpoint(c, vars, nil)
  587. if errRsp != &successResponse {
  588. t.Fatalf("Unexepected failure: %v", errRsp)
  589. }
  590. _, errRsp = findEndpoint(c, "firstNet", "firstEp", byName, byName)
  591. if errRsp == &successResponse {
  592. t.Fatalf("Expected failure, got: %v", errRsp)
  593. }
  594. }
  595. func TestJoinLeave(t *testing.T) {
  596. defer netutils.SetupTestNetNS(t)()
  597. c, err := libnetwork.New()
  598. if err != nil {
  599. t.Fatal(err)
  600. }
  601. err = c.ConfigureNetworkDriver(bridgeNetType, nil)
  602. if err != nil {
  603. t.Fatal(err)
  604. }
  605. nb, err := json.Marshal(networkCreate{Name: "network", NetworkType: bridgeNetType})
  606. if err != nil {
  607. t.Fatal(err)
  608. }
  609. vars := make(map[string]string)
  610. _, errRsp := procCreateNetwork(c, vars, nb)
  611. if errRsp != &createdResponse {
  612. t.Fatalf("Unexepected failure: %v", errRsp)
  613. }
  614. eb, err := json.Marshal(endpointCreate{Name: "endpoint"})
  615. if err != nil {
  616. t.Fatal(err)
  617. }
  618. vars[urlNwName] = "network"
  619. _, errRsp = procCreateEndpoint(c, vars, eb)
  620. if errRsp != &createdResponse {
  621. t.Fatalf("Unexepected failure: %v", errRsp)
  622. }
  623. vbad, err := json.Marshal("bad data")
  624. if err != nil {
  625. t.Fatal(err)
  626. }
  627. _, errRsp = procJoinEndpoint(c, vars, vbad)
  628. if errRsp == &successResponse {
  629. t.Fatalf("Expected failure, got: %v", errRsp)
  630. }
  631. vars[urlEpName] = "endpoint"
  632. bad, err := json.Marshal(endpointJoin{})
  633. if err != nil {
  634. t.Fatal(err)
  635. }
  636. _, errRsp = procJoinEndpoint(c, vars, bad)
  637. if errRsp == &successResponse {
  638. t.Fatalf("Expected failure, got: %v", errRsp)
  639. }
  640. cid := "abcdefghi"
  641. jl := endpointJoin{ContainerID: cid}
  642. jlb, err := json.Marshal(jl)
  643. if err != nil {
  644. t.Fatal(err)
  645. }
  646. vars = make(map[string]string)
  647. vars[urlNwName] = ""
  648. vars[urlEpName] = ""
  649. _, errRsp = procJoinEndpoint(c, vars, jlb)
  650. if errRsp == &successResponse {
  651. t.Fatalf("Expected failure, got: %v", errRsp)
  652. }
  653. vars[urlNwName] = "network"
  654. vars[urlEpName] = ""
  655. _, errRsp = procJoinEndpoint(c, vars, jlb)
  656. if errRsp == &successResponse {
  657. t.Fatalf("Expected failure, got: %v", errRsp)
  658. }
  659. vars[urlEpName] = "epoint"
  660. _, errRsp = procJoinEndpoint(c, vars, jlb)
  661. if errRsp == &successResponse {
  662. t.Fatalf("Expected failure, got: %v", errRsp)
  663. }
  664. vars[urlEpName] = "endpoint"
  665. cdi, errRsp := procJoinEndpoint(c, vars, jlb)
  666. if errRsp != &successResponse {
  667. t.Fatalf("Expected failure, got: %v", errRsp)
  668. }
  669. cd := i2c(cdi)
  670. if cd.SandboxKey == "" {
  671. t.Fatalf("Empty sandbox key")
  672. }
  673. _, errRsp = procDeleteEndpoint(c, vars, nil)
  674. if errRsp == &successResponse {
  675. t.Fatalf("Expected failure, got: %v", errRsp)
  676. }
  677. vars[urlNwName] = "network2"
  678. _, errRsp = procLeaveEndpoint(c, vars, vbad)
  679. if errRsp == &successResponse {
  680. t.Fatalf("Expected failure, got: %v", errRsp)
  681. }
  682. _, errRsp = procLeaveEndpoint(c, vars, bad)
  683. if errRsp == &successResponse {
  684. t.Fatalf("Expected failure, got: %v", errRsp)
  685. }
  686. _, errRsp = procLeaveEndpoint(c, vars, jlb)
  687. if errRsp == &successResponse {
  688. t.Fatalf("Expected failure, got: %v", errRsp)
  689. }
  690. vars = make(map[string]string)
  691. vars[urlNwName] = ""
  692. vars[urlEpName] = ""
  693. _, errRsp = procLeaveEndpoint(c, vars, jlb)
  694. if errRsp == &successResponse {
  695. t.Fatalf("Expected failure, got: %v", errRsp)
  696. }
  697. vars[urlNwName] = "network"
  698. vars[urlEpName] = ""
  699. _, errRsp = procLeaveEndpoint(c, vars, jlb)
  700. if errRsp == &successResponse {
  701. t.Fatalf("Expected failure, got: %v", errRsp)
  702. }
  703. vars[urlEpName] = "2epoint"
  704. _, errRsp = procLeaveEndpoint(c, vars, jlb)
  705. if errRsp == &successResponse {
  706. t.Fatalf("Expected failure, got: %v", errRsp)
  707. }
  708. vars[urlEpName] = "epoint"
  709. vars[urlCnID] = "who"
  710. _, errRsp = procLeaveEndpoint(c, vars, jlb)
  711. if errRsp == &successResponse {
  712. t.Fatalf("Expected failure, got: %v", errRsp)
  713. }
  714. delete(vars, urlCnID)
  715. vars[urlEpName] = "endpoint"
  716. _, errRsp = procLeaveEndpoint(c, vars, jlb)
  717. if errRsp == &successResponse {
  718. t.Fatalf("Expected failure, got: %v", errRsp)
  719. }
  720. vars[urlCnID] = cid
  721. _, errRsp = procLeaveEndpoint(c, vars, jlb)
  722. if errRsp != &successResponse {
  723. t.Fatalf("Unexepected failure: %v", errRsp)
  724. }
  725. _, errRsp = procLeaveEndpoint(c, vars, jlb)
  726. if errRsp == &successResponse {
  727. t.Fatalf("Expected failure, got: %v", errRsp)
  728. }
  729. _, errRsp = procDeleteEndpoint(c, vars, nil)
  730. if errRsp != &successResponse {
  731. t.Fatalf("Unexepected failure: %v", errRsp)
  732. }
  733. }
  734. func TestFindEndpointUtil(t *testing.T) {
  735. defer netutils.SetupTestNetNS(t)()
  736. c, err := libnetwork.New()
  737. if err != nil {
  738. t.Fatal(err)
  739. }
  740. err = c.ConfigureNetworkDriver(bridgeNetType, nil)
  741. if err != nil {
  742. t.Fatal(err)
  743. }
  744. nw, err := c.NewNetwork(bridgeNetType, "second", nil)
  745. if err != nil {
  746. t.Fatal(err)
  747. }
  748. nid := nw.ID()
  749. ep, err := nw.CreateEndpoint("secondEp", nil)
  750. if err != nil {
  751. t.Fatal(err)
  752. }
  753. eid := ep.ID()
  754. defer checkPanic(t)
  755. findEndpoint(c, nid, "", byID, -1)
  756. _, errRsp := findEndpoint(c, nid, "", byID, byName)
  757. if errRsp == &successResponse {
  758. t.Fatalf("Expected failure, but got: %v", errRsp)
  759. }
  760. if errRsp.StatusCode != http.StatusBadRequest {
  761. t.Fatalf("Expected %d, but got: %d", http.StatusBadRequest, errRsp.StatusCode)
  762. }
  763. ep0, errRsp := findEndpoint(c, nid, "secondEp", byID, byName)
  764. if errRsp != &successResponse {
  765. t.Fatalf("Unexepected failure: %v", errRsp)
  766. }
  767. ep1, errRsp := findEndpoint(c, "second", "secondEp", byName, byName)
  768. if errRsp != &successResponse {
  769. t.Fatalf("Unexepected failure: %v", errRsp)
  770. }
  771. ep2, errRsp := findEndpoint(c, nid, eid, byID, byID)
  772. if errRsp != &successResponse {
  773. t.Fatalf("Unexepected failure: %v", errRsp)
  774. }
  775. ep3, errRsp := findEndpoint(c, "second", eid, byName, byID)
  776. if errRsp != &successResponse {
  777. t.Fatalf("Unexepected failure: %v", errRsp)
  778. }
  779. if ep0 != ep1 || ep0 != ep2 || ep0 != ep3 {
  780. t.Fatalf("Diffenrent queries returned different endpoints")
  781. }
  782. ep.Delete()
  783. _, errRsp = findEndpoint(c, nid, "secondEp", byID, byName)
  784. if errRsp == &successResponse {
  785. t.Fatalf("Expected failure, but got: %v", errRsp)
  786. }
  787. if errRsp.StatusCode != http.StatusNotFound {
  788. t.Fatalf("Expected %d, but got: %d", http.StatusNotFound, errRsp.StatusCode)
  789. }
  790. _, errRsp = findEndpoint(c, "second", "secondEp", byName, byName)
  791. if errRsp == &successResponse {
  792. t.Fatalf("Expected failure, but got: %v", errRsp)
  793. }
  794. if errRsp.StatusCode != http.StatusNotFound {
  795. t.Fatalf("Expected %d, but got: %d", http.StatusNotFound, errRsp.StatusCode)
  796. }
  797. _, errRsp = findEndpoint(c, nid, eid, byID, byID)
  798. if errRsp == &successResponse {
  799. t.Fatalf("Expected failure, but got: %v", errRsp)
  800. }
  801. if errRsp.StatusCode != http.StatusNotFound {
  802. t.Fatalf("Expected %d, but got: %d", http.StatusNotFound, errRsp.StatusCode)
  803. }
  804. _, errRsp = findEndpoint(c, "second", eid, byName, byID)
  805. if errRsp == &successResponse {
  806. t.Fatalf("Expected failure, but got: %v", errRsp)
  807. }
  808. if errRsp.StatusCode != http.StatusNotFound {
  809. t.Fatalf("Expected %d, but got: %d", http.StatusNotFound, errRsp.StatusCode)
  810. }
  811. }
  812. func checkPanic(t *testing.T) {
  813. if r := recover(); r != nil {
  814. if _, ok := r.(runtime.Error); ok {
  815. panic(r)
  816. }
  817. } else {
  818. t.Fatalf("Expected to panic, but suceeded")
  819. }
  820. }
  821. func TestDetectNetworkTargetPanic(t *testing.T) {
  822. defer checkPanic(t)
  823. vars := make(map[string]string)
  824. detectNetworkTarget(vars)
  825. }
  826. func TestDetectEndpointTargetPanic(t *testing.T) {
  827. defer checkPanic(t)
  828. vars := make(map[string]string)
  829. detectEndpointTarget(vars)
  830. }
  831. func TestResponseStatus(t *testing.T) {
  832. list := []int{
  833. http.StatusBadGateway,
  834. http.StatusBadRequest,
  835. http.StatusConflict,
  836. http.StatusContinue,
  837. http.StatusExpectationFailed,
  838. http.StatusForbidden,
  839. http.StatusFound,
  840. http.StatusGatewayTimeout,
  841. http.StatusGone,
  842. http.StatusHTTPVersionNotSupported,
  843. http.StatusInternalServerError,
  844. http.StatusLengthRequired,
  845. http.StatusMethodNotAllowed,
  846. http.StatusMovedPermanently,
  847. http.StatusMultipleChoices,
  848. http.StatusNoContent,
  849. http.StatusNonAuthoritativeInfo,
  850. http.StatusNotAcceptable,
  851. http.StatusNotFound,
  852. http.StatusNotModified,
  853. http.StatusPartialContent,
  854. http.StatusPaymentRequired,
  855. http.StatusPreconditionFailed,
  856. http.StatusProxyAuthRequired,
  857. http.StatusRequestEntityTooLarge,
  858. http.StatusRequestTimeout,
  859. http.StatusRequestURITooLong,
  860. http.StatusRequestedRangeNotSatisfiable,
  861. http.StatusResetContent,
  862. http.StatusServiceUnavailable,
  863. http.StatusSwitchingProtocols,
  864. http.StatusTemporaryRedirect,
  865. http.StatusUnauthorized,
  866. http.StatusUnsupportedMediaType,
  867. http.StatusUseProxy,
  868. }
  869. for _, c := range list {
  870. r := responseStatus{StatusCode: c}
  871. if r.isOK() {
  872. t.Fatalf("isOK() returned true for code% d", c)
  873. }
  874. }
  875. r := responseStatus{StatusCode: http.StatusOK}
  876. if !r.isOK() {
  877. t.Fatalf("isOK() failed")
  878. }
  879. r = responseStatus{StatusCode: http.StatusCreated}
  880. if !r.isOK() {
  881. t.Fatalf("isOK() failed")
  882. }
  883. }
  884. // Local structs for end to end testing of api.go
  885. type localReader struct {
  886. data []byte
  887. beBad bool
  888. }
  889. func newLocalReader(data []byte) *localReader {
  890. lr := &localReader{data: make([]byte, len(data))}
  891. copy(lr.data, data)
  892. return lr
  893. }
  894. func (l *localReader) Read(p []byte) (n int, err error) {
  895. if l.beBad {
  896. return 0, errors.New("I am a bad reader")
  897. }
  898. if p == nil {
  899. return -1, fmt.Errorf("nil buffer passed")
  900. }
  901. if l.data == nil || len(l.data) == 0 {
  902. return 0, io.EOF
  903. }
  904. copy(p[:], l.data[:])
  905. return len(l.data), io.EOF
  906. }
  907. type localResponseWriter struct {
  908. body []byte
  909. statusCode int
  910. }
  911. func newWriter() *localResponseWriter {
  912. return &localResponseWriter{}
  913. }
  914. func (f *localResponseWriter) Header() http.Header {
  915. return make(map[string][]string, 0)
  916. }
  917. func (f *localResponseWriter) Write(data []byte) (int, error) {
  918. if data == nil {
  919. return -1, fmt.Errorf("nil data passed")
  920. }
  921. f.body = make([]byte, len(data))
  922. copy(f.body, data)
  923. return len(f.body), nil
  924. }
  925. func (f *localResponseWriter) WriteHeader(c int) {
  926. f.statusCode = c
  927. }
  928. func TestwriteJSON(t *testing.T) {
  929. testCode := 55
  930. testData, err := json.Marshal("test data")
  931. if err != nil {
  932. t.Fatal(err)
  933. }
  934. rsp := newWriter()
  935. writeJSON(rsp, testCode, testData)
  936. if rsp.statusCode != testCode {
  937. t.Fatalf("writeJSON() failed to set the status code. Expected %d. Got %d", testCode, rsp.statusCode)
  938. }
  939. if !bytes.Equal(testData, rsp.body) {
  940. t.Fatalf("writeJSON() failed to set the body. Expected %s. Got %s", testData, rsp.body)
  941. }
  942. }
  943. func TestHttpHandlerUninit(t *testing.T) {
  944. defer netutils.SetupTestNetNS(t)()
  945. c, err := libnetwork.New()
  946. if err != nil {
  947. t.Fatal(err)
  948. }
  949. h := &httpHandler{c: c}
  950. h.initRouter()
  951. if h.r == nil {
  952. t.Fatalf("initRouter() did not initialize the router")
  953. }
  954. rsp := newWriter()
  955. req, err := http.NewRequest("GET", "/networks", nil)
  956. if err != nil {
  957. t.Fatal(err)
  958. }
  959. handleRequest := NewHTTPHandler(nil)
  960. handleRequest(rsp, req)
  961. if rsp.statusCode != http.StatusServiceUnavailable {
  962. t.Fatalf("Expected (%d). Got (%d): %s", http.StatusServiceUnavailable, rsp.statusCode, rsp.body)
  963. }
  964. handleRequest = NewHTTPHandler(c)
  965. handleRequest(rsp, req)
  966. if rsp.statusCode != http.StatusOK {
  967. t.Fatalf("Expected (%d). Got: (%d): %s", http.StatusOK, rsp.statusCode, rsp.body)
  968. }
  969. var list []*networkResource
  970. err = json.Unmarshal(rsp.body, &list)
  971. if err != nil {
  972. t.Fatal(err)
  973. }
  974. if len(list) != 0 {
  975. t.Fatalf("Expected empty list. Got %v", list)
  976. }
  977. n, err := c.NewNetwork(bridgeNetType, "didietro", nil)
  978. if err != nil {
  979. t.Fatal(err)
  980. }
  981. nwr := buildNetworkResource(n)
  982. expected, err := json.Marshal([]*networkResource{nwr})
  983. if err != nil {
  984. t.Fatal(err)
  985. }
  986. handleRequest(rsp, req)
  987. if rsp.statusCode != http.StatusOK {
  988. t.Fatalf("Unexpectded failure: (%d): %s", rsp.statusCode, rsp.body)
  989. }
  990. if len(rsp.body) == 0 {
  991. t.Fatalf("Empty list of networks")
  992. }
  993. if bytes.Equal(rsp.body, expected) {
  994. t.Fatalf("Incorrect list of networks in response's body")
  995. }
  996. }
  997. func TestHttpHandlerBadBody(t *testing.T) {
  998. defer netutils.SetupTestNetNS(t)()
  999. rsp := newWriter()
  1000. c, err := libnetwork.New()
  1001. if err != nil {
  1002. t.Fatal(err)
  1003. }
  1004. handleRequest := NewHTTPHandler(c)
  1005. req, err := http.NewRequest("POST", "/networks", &localReader{beBad: true})
  1006. if err != nil {
  1007. t.Fatal(err)
  1008. }
  1009. handleRequest(rsp, req)
  1010. if rsp.statusCode != http.StatusBadRequest {
  1011. t.Fatalf("Unexpected status code. Expected (%d). Got (%d): %s.", http.StatusBadRequest, rsp.statusCode, string(rsp.body))
  1012. }
  1013. body := []byte{}
  1014. lr := newLocalReader(body)
  1015. req, err = http.NewRequest("POST", "/networks", lr)
  1016. if err != nil {
  1017. t.Fatal(err)
  1018. }
  1019. handleRequest(rsp, req)
  1020. if rsp.statusCode != http.StatusBadRequest {
  1021. t.Fatalf("Unexpected status code. Expected (%d). Got (%d): %s.", http.StatusBadRequest, rsp.statusCode, string(rsp.body))
  1022. }
  1023. }
  1024. func TestEndToEnd(t *testing.T) {
  1025. defer netutils.SetupTestNetNS(t)()
  1026. rsp := newWriter()
  1027. c, err := libnetwork.New()
  1028. if err != nil {
  1029. t.Fatal(err)
  1030. }
  1031. handleRequest := NewHTTPHandler(c)
  1032. // Create network
  1033. nc := networkCreate{Name: "network-fiftyfive", NetworkType: bridgeNetType}
  1034. body, err := json.Marshal(nc)
  1035. if err != nil {
  1036. t.Fatal(err)
  1037. }
  1038. lr := newLocalReader(body)
  1039. req, err := http.NewRequest("POST", "/networks", lr)
  1040. if err != nil {
  1041. t.Fatal(err)
  1042. }
  1043. handleRequest(rsp, req)
  1044. if rsp.statusCode != http.StatusCreated {
  1045. t.Fatalf("Unexpectded status code. Expected (%d). Got (%d): %s.", http.StatusCreated, rsp.statusCode, string(rsp.body))
  1046. }
  1047. if len(rsp.body) == 0 {
  1048. t.Fatalf("Empty response body")
  1049. }
  1050. var nid string
  1051. err = json.Unmarshal(rsp.body, &nid)
  1052. if err != nil {
  1053. t.Fatal(err)
  1054. }
  1055. // Query networks collection
  1056. req, err = http.NewRequest("GET", "/networks", nil)
  1057. if err != nil {
  1058. t.Fatal(err)
  1059. }
  1060. handleRequest(rsp, req)
  1061. if rsp.statusCode != http.StatusOK {
  1062. t.Fatalf("Expected StatusOK. Got (%d): %s", rsp.statusCode, rsp.body)
  1063. }
  1064. b0 := make([]byte, len(rsp.body))
  1065. copy(b0, rsp.body)
  1066. req, err = http.NewRequest("GET", "/networks?name=network-fiftyfive", nil)
  1067. if err != nil {
  1068. t.Fatal(err)
  1069. }
  1070. handleRequest(rsp, req)
  1071. if rsp.statusCode != http.StatusOK {
  1072. t.Fatalf("Expected StatusOK. Got (%d): %s", rsp.statusCode, rsp.body)
  1073. }
  1074. if !bytes.Equal(b0, rsp.body) {
  1075. t.Fatalf("Expected same body from GET /networks and GET /networks?name=<nw> when only network <nw> exist.")
  1076. }
  1077. // Query network by name
  1078. req, err = http.NewRequest("GET", "/networks?name=culo", nil)
  1079. if err != nil {
  1080. t.Fatal(err)
  1081. }
  1082. handleRequest(rsp, req)
  1083. if rsp.statusCode != http.StatusOK {
  1084. t.Fatalf("Expected StatusOK. Got (%d): %s", rsp.statusCode, rsp.body)
  1085. }
  1086. var list []*networkResource
  1087. err = json.Unmarshal(rsp.body, &list)
  1088. if err != nil {
  1089. t.Fatal(err)
  1090. }
  1091. if len(list) != 0 {
  1092. t.Fatalf("Expected empty list. Got %v", list)
  1093. }
  1094. req, err = http.NewRequest("GET", "/networks?name=network-fiftyfive", nil)
  1095. if err != nil {
  1096. t.Fatal(err)
  1097. }
  1098. handleRequest(rsp, req)
  1099. if rsp.statusCode != http.StatusOK {
  1100. t.Fatalf("Unexpectded failure: (%d): %s", rsp.statusCode, rsp.body)
  1101. }
  1102. err = json.Unmarshal(rsp.body, &list)
  1103. if err != nil {
  1104. t.Fatal(err)
  1105. }
  1106. if len(list) == 0 {
  1107. t.Fatalf("Expected non empty list")
  1108. }
  1109. if list[0].Name != "network-fiftyfive" || nid != list[0].ID {
  1110. t.Fatalf("Incongruent resource found: %v", list[0])
  1111. }
  1112. // Get network by id
  1113. req, err = http.NewRequest("GET", "/networks/"+nid, nil)
  1114. if err != nil {
  1115. t.Fatal(err)
  1116. }
  1117. handleRequest(rsp, req)
  1118. if rsp.statusCode != http.StatusOK {
  1119. t.Fatalf("Unexpectded failure: (%d): %s", rsp.statusCode, rsp.body)
  1120. }
  1121. var nwr networkResource
  1122. err = json.Unmarshal(rsp.body, &nwr)
  1123. if err != nil {
  1124. t.Fatal(err)
  1125. }
  1126. if nwr.Name != "network-fiftyfive" || nid != nwr.ID {
  1127. t.Fatalf("Incongruent resource found: %v", nwr)
  1128. }
  1129. // Create endpoint
  1130. eb, err := json.Marshal(endpointCreate{Name: "ep-TwentyTwo"})
  1131. if err != nil {
  1132. t.Fatal(err)
  1133. }
  1134. lr = newLocalReader(eb)
  1135. req, err = http.NewRequest("POST", "/networks/"+nid+"/endpoints", lr)
  1136. if err != nil {
  1137. t.Fatal(err)
  1138. }
  1139. handleRequest(rsp, req)
  1140. if rsp.statusCode != http.StatusCreated {
  1141. t.Fatalf("Unexpectded status code. Expected (%d). Got (%d): %s.", http.StatusCreated, rsp.statusCode, string(rsp.body))
  1142. }
  1143. if len(rsp.body) == 0 {
  1144. t.Fatalf("Empty response body")
  1145. }
  1146. var eid string
  1147. err = json.Unmarshal(rsp.body, &eid)
  1148. if err != nil {
  1149. t.Fatal(err)
  1150. }
  1151. // Query endpoint(s)
  1152. req, err = http.NewRequest("GET", "/networks/"+nid+"/endpoints", nil)
  1153. if err != nil {
  1154. t.Fatal(err)
  1155. }
  1156. handleRequest(rsp, req)
  1157. if rsp.statusCode != http.StatusNotFound {
  1158. t.Fatalf("Expected StatusNotFound. Got (%d): %s", rsp.statusCode, rsp.body)
  1159. }
  1160. req, err = http.NewRequest("GET", "/networks/"+nid+"/endpoints?name=bla", nil)
  1161. if err != nil {
  1162. t.Fatal(err)
  1163. }
  1164. handleRequest(rsp, req)
  1165. if rsp.statusCode != http.StatusOK {
  1166. t.Fatalf("Unexpectded failure: (%d): %s", rsp.statusCode, rsp.body)
  1167. }
  1168. var epList []*endpointResource
  1169. err = json.Unmarshal(rsp.body, &epList)
  1170. if err != nil {
  1171. t.Fatal(err)
  1172. }
  1173. if len(epList) != 0 {
  1174. t.Fatalf("Expected empty list. Got %v", epList)
  1175. }
  1176. // Query endpoint by name
  1177. req, err = http.NewRequest("GET", "/networks/"+nid+"/endpoints?name=ep-TwentyTwo", nil)
  1178. if err != nil {
  1179. t.Fatal(err)
  1180. }
  1181. handleRequest(rsp, req)
  1182. if rsp.statusCode != http.StatusOK {
  1183. t.Fatalf("Unexpectded failure: (%d): %s", rsp.statusCode, rsp.body)
  1184. }
  1185. err = json.Unmarshal(rsp.body, &epList)
  1186. if err != nil {
  1187. t.Fatal(err)
  1188. }
  1189. if len(epList) == 0 {
  1190. t.Fatalf("Empty response body")
  1191. }
  1192. if epList[0].Name != "ep-TwentyTwo" || eid != epList[0].ID {
  1193. t.Fatalf("Incongruent resource found: %v", epList[0])
  1194. }
  1195. // Get endpoint by id
  1196. req, err = http.NewRequest("GET", "/networks/"+nid+"/endpoints/"+eid, nil)
  1197. if err != nil {
  1198. t.Fatal(err)
  1199. }
  1200. handleRequest(rsp, req)
  1201. if rsp.statusCode != http.StatusOK {
  1202. t.Fatalf("Unexpectded failure: (%d): %s", rsp.statusCode, rsp.body)
  1203. }
  1204. var epr endpointResource
  1205. err = json.Unmarshal(rsp.body, &epr)
  1206. if err != nil {
  1207. t.Fatal(err)
  1208. }
  1209. if epr.Name != "ep-TwentyTwo" || epr.ID != eid {
  1210. t.Fatalf("Incongruent resource found: %v", epr)
  1211. }
  1212. }