api_test.go 33 KB

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