api_test.go 39 KB

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