api_test.go 54 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130
  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 i2cL(i interface{}) []*containerResource {
  64. s, ok := i.([]*containerResource)
  65. if !ok {
  66. panic(fmt.Sprintf("Failed i2cL for %v", i))
  67. }
  68. return s
  69. }
  70. func createTestNetwork(t *testing.T, network string) (libnetwork.NetworkController, libnetwork.Network) {
  71. c, err := libnetwork.New("")
  72. if err != nil {
  73. t.Fatal(err)
  74. }
  75. err = c.ConfigureNetworkDriver(bridgeNetType, nil)
  76. if err != nil {
  77. t.Fatal(err)
  78. }
  79. netOption := options.Generic{
  80. netlabel.GenericData: options.Generic{
  81. "BridgeName": network,
  82. "AllowNonDefaultBridge": true,
  83. },
  84. }
  85. netGeneric := libnetwork.NetworkOptionGeneric(netOption)
  86. nw, err := c.NewNetwork(bridgeNetType, network, netGeneric)
  87. if err != nil {
  88. t.Fatal(err)
  89. }
  90. return c, nw
  91. }
  92. func TestMain(m *testing.M) {
  93. if reexec.Init() {
  94. return
  95. }
  96. os.Exit(m.Run())
  97. }
  98. func TestJoinOptionParser(t *testing.T) {
  99. hn := "host1"
  100. dn := "docker.com"
  101. hp := "/etc/hosts"
  102. rc := "/etc/resolv.conf"
  103. dnss := []string{"8.8.8.8", "172.28.34.5"}
  104. ehs := []endpointExtraHost{endpointExtraHost{Name: "extra1", Address: "172.28.9.1"}, endpointExtraHost{Name: "extra2", Address: "172.28.9.2"}}
  105. pus := []endpointParentUpdate{endpointParentUpdate{EndpointID: "abc123def456", Name: "serv1", Address: "172.28.30.123"}}
  106. ej := endpointJoin{
  107. HostName: hn,
  108. DomainName: dn,
  109. HostsPath: hp,
  110. ResolvConfPath: rc,
  111. DNS: dnss,
  112. ExtraHosts: ehs,
  113. ParentUpdates: pus,
  114. UseDefaultSandbox: true,
  115. }
  116. if len(ej.parseOptions()) != 10 {
  117. t.Fatalf("Failed to generate all libnetwork.EndpointJoinOption methods libnetwork.EndpointJoinOption method")
  118. }
  119. }
  120. func TestJson(t *testing.T) {
  121. nc := networkCreate{NetworkType: bridgeNetType}
  122. b, err := json.Marshal(nc)
  123. if err != nil {
  124. t.Fatal(err)
  125. }
  126. var ncp networkCreate
  127. err = json.Unmarshal(b, &ncp)
  128. if err != nil {
  129. t.Fatal(err)
  130. }
  131. if nc.NetworkType != ncp.NetworkType {
  132. t.Fatalf("Incorrect networkCreate after json encoding/deconding: %v", ncp)
  133. }
  134. jl := endpointJoin{ContainerID: "abcdef456789"}
  135. b, err = json.Marshal(jl)
  136. if err != nil {
  137. t.Fatal(err)
  138. }
  139. var jld endpointJoin
  140. err = json.Unmarshal(b, &jld)
  141. if err != nil {
  142. t.Fatal(err)
  143. }
  144. if jl.ContainerID != jld.ContainerID {
  145. t.Fatalf("Incorrect endpointJoin after json encoding/deconding: %v", jld)
  146. }
  147. }
  148. func TestCreateDeleteNetwork(t *testing.T) {
  149. defer netutils.SetupTestNetNS(t)()
  150. c, err := libnetwork.New("")
  151. if err != nil {
  152. t.Fatal(err)
  153. }
  154. err = c.ConfigureNetworkDriver(bridgeNetType, nil)
  155. if err != nil {
  156. t.Fatal(err)
  157. }
  158. badBody, err := json.Marshal("bad body")
  159. if err != nil {
  160. t.Fatal(err)
  161. }
  162. vars := make(map[string]string)
  163. _, errRsp := procCreateNetwork(c, nil, badBody)
  164. if errRsp == &createdResponse {
  165. t.Fatalf("Expected to fail but succeeded")
  166. }
  167. if errRsp.StatusCode != http.StatusBadRequest {
  168. t.Fatalf("Expected StatusBadRequest status code, got: %v", errRsp)
  169. }
  170. incompleteBody, err := json.Marshal(networkCreate{})
  171. if err != nil {
  172. t.Fatal(err)
  173. }
  174. _, errRsp = procCreateNetwork(c, vars, incompleteBody)
  175. if errRsp == &createdResponse {
  176. t.Fatalf("Expected to fail but succeeded")
  177. }
  178. if errRsp.StatusCode != http.StatusBadRequest {
  179. t.Fatalf("Expected StatusBadRequest status code, got: %v", errRsp)
  180. }
  181. ops := options.Generic{
  182. netlabel.EnableIPv6: true,
  183. netlabel.GenericData: map[string]string{
  184. "BridgeName": "abc",
  185. "AllowNonDefaultBridge": "true",
  186. "FixedCIDRv6": "fe80::1/64",
  187. "AddressIP": "172.28.30.254/24",
  188. },
  189. }
  190. nc := networkCreate{Name: "network_1", NetworkType: bridgeNetType, Options: ops}
  191. goodBody, err := json.Marshal(nc)
  192. if err != nil {
  193. t.Fatal(err)
  194. }
  195. _, errRsp = procCreateNetwork(c, vars, goodBody)
  196. if errRsp != &createdResponse {
  197. t.Fatalf("Unexepected failure: %v", errRsp)
  198. }
  199. vars[urlNwName] = ""
  200. _, errRsp = procDeleteNetwork(c, vars, nil)
  201. if errRsp == &successResponse {
  202. t.Fatalf("Expected to fail but succeeded")
  203. }
  204. vars[urlNwName] = "abc"
  205. _, errRsp = procDeleteNetwork(c, vars, nil)
  206. if errRsp == &successResponse {
  207. t.Fatalf("Expected to fail but succeeded")
  208. }
  209. vars[urlNwName] = "network_1"
  210. _, errRsp = procDeleteNetwork(c, vars, nil)
  211. if errRsp != &successResponse {
  212. t.Fatalf("Unexepected failure: %v", errRsp)
  213. }
  214. }
  215. func TestGetNetworksAndEndpoints(t *testing.T) {
  216. defer netutils.SetupTestNetNS(t)()
  217. c, err := libnetwork.New("")
  218. if err != nil {
  219. t.Fatal(err)
  220. }
  221. err = c.ConfigureNetworkDriver(bridgeNetType, nil)
  222. if err != nil {
  223. t.Fatal(err)
  224. }
  225. ops := options.Generic{
  226. netlabel.GenericData: map[string]string{
  227. "BridgeName": "api_test_nw",
  228. "AllowNonDefaultBridge": "true",
  229. },
  230. }
  231. nc := networkCreate{Name: "sh", NetworkType: bridgeNetType, Options: ops}
  232. body, err := json.Marshal(nc)
  233. if err != nil {
  234. t.Fatal(err)
  235. }
  236. vars := make(map[string]string)
  237. inid, errRsp := procCreateNetwork(c, vars, body)
  238. if errRsp != &createdResponse {
  239. t.Fatalf("Unexepected failure: %v", errRsp)
  240. }
  241. nid, ok := inid.(string)
  242. if !ok {
  243. t.FailNow()
  244. }
  245. ec1 := endpointCreate{
  246. Name: "ep1",
  247. ExposedPorts: []types.TransportPort{
  248. types.TransportPort{Proto: types.TCP, Port: uint16(5000)},
  249. types.TransportPort{Proto: types.UDP, Port: uint16(400)},
  250. types.TransportPort{Proto: types.TCP, Port: uint16(600)},
  251. },
  252. PortMapping: []types.PortBinding{
  253. types.PortBinding{Proto: types.TCP, Port: uint16(230), HostPort: uint16(23000)},
  254. types.PortBinding{Proto: types.UDP, Port: uint16(200), HostPort: uint16(22000)},
  255. types.PortBinding{Proto: types.TCP, Port: uint16(120), HostPort: uint16(12000)},
  256. },
  257. }
  258. b1, err := json.Marshal(ec1)
  259. if err != nil {
  260. t.Fatal(err)
  261. }
  262. ec2 := endpointCreate{Name: "ep2"}
  263. b2, err := json.Marshal(ec2)
  264. if err != nil {
  265. t.Fatal(err)
  266. }
  267. vars[urlNwName] = "sh"
  268. vars[urlEpName] = "ep1"
  269. ieid1, errRsp := procCreateEndpoint(c, vars, b1)
  270. if errRsp != &createdResponse {
  271. t.Fatalf("Unexepected failure: %v", errRsp)
  272. }
  273. eid1 := i2s(ieid1)
  274. vars[urlEpName] = "ep2"
  275. ieid2, errRsp := procCreateEndpoint(c, vars, b2)
  276. if errRsp != &createdResponse {
  277. t.Fatalf("Unexepected failure: %v", errRsp)
  278. }
  279. eid2 := i2s(ieid2)
  280. vars[urlNwName] = ""
  281. vars[urlEpName] = "ep1"
  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. vars = make(map[string]string)
  290. vars[urlNwName] = "sh"
  291. vars[urlEpID] = ""
  292. _, errRsp = procGetEndpoint(c, vars, nil)
  293. if errRsp == &successResponse {
  294. t.Fatalf("Expected failure but succeeded: %v", errRsp)
  295. }
  296. if errRsp.StatusCode != http.StatusBadRequest {
  297. t.Fatalf("Expected to fail with http.StatusBadRequest, but got: %d", errRsp.StatusCode)
  298. }
  299. vars = make(map[string]string)
  300. vars[urlNwID] = ""
  301. vars[urlEpID] = eid1
  302. _, errRsp = procGetEndpoint(c, vars, nil)
  303. if errRsp == &successResponse {
  304. t.Fatalf("Expected failure but succeeded: %v", errRsp)
  305. }
  306. if errRsp.StatusCode != http.StatusBadRequest {
  307. t.Fatalf("Expected to fail with http.StatusBadRequest, but got: %d", errRsp.StatusCode)
  308. }
  309. // nw by name and ep by id
  310. vars[urlNwName] = "sh"
  311. i1, errRsp := procGetEndpoint(c, vars, nil)
  312. if errRsp != &successResponse {
  313. t.Fatalf("Unexepected failure: %v", errRsp)
  314. }
  315. // nw by name and ep by name
  316. delete(vars, urlEpID)
  317. vars[urlEpName] = "ep1"
  318. i2, errRsp := procGetEndpoint(c, vars, nil)
  319. if errRsp != &successResponse {
  320. t.Fatalf("Unexepected failure: %v", errRsp)
  321. }
  322. // nw by id and ep by name
  323. delete(vars, urlNwName)
  324. vars[urlNwID] = nid
  325. i3, errRsp := procGetEndpoint(c, vars, nil)
  326. if errRsp != &successResponse {
  327. t.Fatalf("Unexepected failure: %v", errRsp)
  328. }
  329. // nw by id and ep by id
  330. delete(vars, urlEpName)
  331. vars[urlEpID] = eid1
  332. i4, errRsp := procGetEndpoint(c, vars, nil)
  333. if errRsp != &successResponse {
  334. t.Fatalf("Unexepected failure: %v", errRsp)
  335. }
  336. id1 := i2e(i1).ID
  337. if id1 != i2e(i2).ID || id1 != i2e(i3).ID || id1 != i2e(i4).ID {
  338. t.Fatalf("Endpoints retireved via different query parameters differ: %v, %v, %v, %v", i1, i2, i3, i4)
  339. }
  340. vars[urlNwName] = ""
  341. _, errRsp = procGetEndpoints(c, vars, nil)
  342. if errRsp == &successResponse {
  343. t.Fatalf("Expected failure, got: %v", errRsp)
  344. }
  345. delete(vars, urlNwName)
  346. vars[urlNwID] = "fakeID"
  347. _, errRsp = procGetEndpoints(c, vars, nil)
  348. if errRsp == &successResponse {
  349. t.Fatalf("Expected failure, got: %v", errRsp)
  350. }
  351. vars[urlNwID] = nid
  352. _, errRsp = procGetEndpoints(c, vars, nil)
  353. if errRsp != &successResponse {
  354. t.Fatalf("Unexepected failure: %v", errRsp)
  355. }
  356. vars[urlNwName] = "sh"
  357. iepList, errRsp := procGetEndpoints(c, vars, nil)
  358. if errRsp != &successResponse {
  359. t.Fatalf("Unexepected failure: %v", errRsp)
  360. }
  361. epList := i2eL(iepList)
  362. if len(epList) != 2 {
  363. t.Fatalf("Did not return the expected number (2) of endpoint resources: %d", len(epList))
  364. }
  365. if "sh" != epList[0].Network || "sh" != epList[1].Network {
  366. t.Fatalf("Did not find expected network name in endpoint resources")
  367. }
  368. vars = make(map[string]string)
  369. vars[urlNwName] = ""
  370. _, errRsp = procGetNetwork(c, vars, nil)
  371. if errRsp == &successResponse {
  372. t.Fatalf("Exepected failure, got: %v", errRsp)
  373. }
  374. vars[urlNwName] = "shhhhh"
  375. _, errRsp = procGetNetwork(c, vars, nil)
  376. if errRsp == &successResponse {
  377. t.Fatalf("Exepected failure, got: %v", errRsp)
  378. }
  379. vars[urlNwName] = "sh"
  380. inr1, errRsp := procGetNetwork(c, vars, nil)
  381. if errRsp != &successResponse {
  382. t.Fatalf("Unexepected failure: %v", errRsp)
  383. }
  384. nr1 := i2n(inr1)
  385. delete(vars, urlNwName)
  386. vars[urlNwID] = "cacca"
  387. _, errRsp = procGetNetwork(c, vars, nil)
  388. if errRsp == &successResponse {
  389. t.Fatalf("Unexepected failure: %v", errRsp)
  390. }
  391. vars[urlNwID] = nid
  392. inr2, errRsp := procGetNetwork(c, vars, nil)
  393. if errRsp != &successResponse {
  394. t.Fatalf("procgetNetworkByName() != procgetNetworkById(), %v vs %v", inr1, inr2)
  395. }
  396. nr2 := i2n(inr2)
  397. if nr1.Name != nr2.Name || nr1.Type != nr2.Type || nr1.ID != nr2.ID || len(nr1.Endpoints) != len(nr2.Endpoints) {
  398. t.Fatalf("Get by name and Get failure: %v", errRsp)
  399. }
  400. if len(nr1.Endpoints) != 2 {
  401. t.Fatalf("Did not find the expected number (2) of endpoint resources in the network resource: %d", len(nr1.Endpoints))
  402. }
  403. for _, er := range nr1.Endpoints {
  404. if er.ID != eid1 && er.ID != eid2 {
  405. t.Fatalf("Did not find the expected endpoint resources in the network resource: %v", nr1.Endpoints)
  406. }
  407. }
  408. iList, errRsp := procGetNetworks(c, nil, nil)
  409. if errRsp != &successResponse {
  410. t.Fatalf("Unexepected failure: %v", errRsp)
  411. }
  412. netList := i2nL(iList)
  413. if len(netList) != 1 {
  414. t.Fatalf("Did not return the expected number of network resources")
  415. }
  416. if nid != netList[0].ID {
  417. t.Fatalf("Did not find expected network %s: %v", nid, netList)
  418. }
  419. _, errRsp = procDeleteNetwork(c, vars, nil)
  420. if errRsp == &successResponse {
  421. t.Fatalf("Exepected failure, got: %v", errRsp)
  422. }
  423. vars[urlEpName] = "ep1"
  424. _, errRsp = procDeleteEndpoint(c, vars, nil)
  425. if errRsp != &successResponse {
  426. t.Fatalf("Unexepected failure: %v", errRsp)
  427. }
  428. delete(vars, urlEpName)
  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) != 1 {
  435. t.Fatalf("Did not return the expected number (1) of endpoint resources: %d", len(epList))
  436. }
  437. vars[urlEpName] = "ep2"
  438. _, errRsp = procDeleteEndpoint(c, vars, nil)
  439. if errRsp != &successResponse {
  440. t.Fatalf("Unexepected failure: %v", errRsp)
  441. }
  442. iepList, errRsp = procGetEndpoints(c, vars, nil)
  443. if errRsp != &successResponse {
  444. t.Fatalf("Unexepected failure: %v", errRsp)
  445. }
  446. epList = i2eL(iepList)
  447. if len(epList) != 0 {
  448. t.Fatalf("Did not return the expected number (0) of endpoint resources: %d", len(epList))
  449. }
  450. _, errRsp = procDeleteNetwork(c, vars, nil)
  451. if errRsp != &successResponse {
  452. t.Fatalf("Unexepected failure: %v", errRsp)
  453. }
  454. iList, errRsp = procGetNetworks(c, nil, nil)
  455. if errRsp != &successResponse {
  456. t.Fatalf("Unexepected failure: %v", errRsp)
  457. }
  458. netList = i2nL(iList)
  459. if len(netList) != 0 {
  460. t.Fatalf("Did not return the expected number of network resources")
  461. }
  462. }
  463. func TestProcGetServices(t *testing.T) {
  464. defer netutils.SetupTestNetNS(t)()
  465. c, err := libnetwork.New("")
  466. if err != nil {
  467. t.Fatal(err)
  468. }
  469. err = c.ConfigureNetworkDriver(bridgeNetType, nil)
  470. if err != nil {
  471. t.Fatal(err)
  472. }
  473. // Create 2 networks
  474. netName1 := "production"
  475. netOption := options.Generic{
  476. netlabel.GenericData: options.Generic{
  477. "BridgeName": netName1,
  478. "AllowNonDefaultBridge": true,
  479. },
  480. }
  481. nw1, err := c.NewNetwork(bridgeNetType, netName1, libnetwork.NetworkOptionGeneric(netOption))
  482. if err != nil {
  483. t.Fatal(err)
  484. }
  485. netName2 := "work-dev"
  486. netOption = options.Generic{
  487. netlabel.GenericData: options.Generic{
  488. "BridgeName": netName2,
  489. "AllowNonDefaultBridge": true,
  490. },
  491. }
  492. nw2, err := c.NewNetwork(bridgeNetType, netName2, libnetwork.NetworkOptionGeneric(netOption))
  493. if err != nil {
  494. t.Fatal(err)
  495. }
  496. vars := make(map[string]string)
  497. li, errRsp := procGetServices(c, vars, nil)
  498. if !errRsp.isOK() {
  499. t.Fatalf("Unexpected failure: %v", errRsp)
  500. }
  501. list := i2eL(li)
  502. if len(list) != 0 {
  503. t.Fatalf("Unexpected services in response: %v", list)
  504. }
  505. // Add a couple of services on one network and one on the other network
  506. ep11, err := nw1.CreateEndpoint("db-prod")
  507. if err != nil {
  508. t.Fatal(err)
  509. }
  510. ep12, err := nw1.CreateEndpoint("web-prod")
  511. if err != nil {
  512. t.Fatal(err)
  513. }
  514. ep21, err := nw2.CreateEndpoint("db-dev")
  515. if err != nil {
  516. t.Fatal(err)
  517. }
  518. li, errRsp = procGetServices(c, vars, nil)
  519. if !errRsp.isOK() {
  520. t.Fatalf("Unexpected failure: %v", errRsp)
  521. }
  522. list = i2eL(li)
  523. if len(list) != 3 {
  524. t.Fatalf("Unexpected services in response: %v", list)
  525. }
  526. // Filter by network
  527. vars[urlNwName] = netName1
  528. li, errRsp = procGetServices(c, vars, nil)
  529. if !errRsp.isOK() {
  530. t.Fatalf("Unexpected failure: %v", errRsp)
  531. }
  532. list = i2eL(li)
  533. if len(list) != 2 {
  534. t.Fatalf("Unexpected services in response: %v", list)
  535. }
  536. vars[urlNwName] = netName2
  537. li, errRsp = procGetServices(c, vars, nil)
  538. if !errRsp.isOK() {
  539. t.Fatalf("Unexpected failure: %v", errRsp)
  540. }
  541. list = i2eL(li)
  542. if len(list) != 1 {
  543. t.Fatalf("Unexpected services in response: %v", list)
  544. }
  545. vars[urlNwName] = "unknown-network"
  546. li, errRsp = procGetServices(c, vars, nil)
  547. if !errRsp.isOK() {
  548. t.Fatalf("Unexpected failure: %v", errRsp)
  549. }
  550. list = i2eL(li)
  551. if len(list) != 0 {
  552. t.Fatalf("Unexpected services in response: %v", list)
  553. }
  554. // Query by name
  555. delete(vars, urlNwName)
  556. vars[urlEpName] = "db-prod"
  557. li, errRsp = procGetServices(c, vars, nil)
  558. if !errRsp.isOK() {
  559. t.Fatalf("Unexpected failure: %v", errRsp)
  560. }
  561. list = i2eL(li)
  562. if len(list) != 1 {
  563. t.Fatalf("Unexpected services in response: %v", list)
  564. }
  565. vars[urlEpName] = "no-service"
  566. li, errRsp = procGetServices(c, vars, nil)
  567. if !errRsp.isOK() {
  568. t.Fatalf("Unexpected failure: %v", errRsp)
  569. }
  570. list = i2eL(li)
  571. if len(list) != 0 {
  572. t.Fatalf("Unexpected services in response: %v", list)
  573. }
  574. // Query by id or partial id
  575. delete(vars, urlEpName)
  576. vars[urlEpPID] = ep12.ID()
  577. li, errRsp = procGetServices(c, vars, nil)
  578. if !errRsp.isOK() {
  579. t.Fatalf("Unexpected failure: %v", errRsp)
  580. }
  581. list = i2eL(li)
  582. if len(list) != 1 {
  583. t.Fatalf("Unexpected services in response: %v", list)
  584. }
  585. if list[0].ID != ep12.ID() {
  586. t.Fatalf("Unexpected element in response: %v", list)
  587. }
  588. vars[urlEpPID] = "non-id"
  589. li, errRsp = procGetServices(c, vars, nil)
  590. if !errRsp.isOK() {
  591. t.Fatalf("Unexpected failure: %v", errRsp)
  592. }
  593. list = i2eL(li)
  594. if len(list) != 0 {
  595. t.Fatalf("Unexpected services in response: %v", list)
  596. }
  597. delete(vars, urlEpPID)
  598. err = ep11.Delete()
  599. if err != nil {
  600. t.Fatal(err)
  601. }
  602. err = ep12.Delete()
  603. if err != nil {
  604. t.Fatal(err)
  605. }
  606. err = ep21.Delete()
  607. if err != nil {
  608. t.Fatal(err)
  609. }
  610. li, errRsp = procGetServices(c, vars, nil)
  611. if !errRsp.isOK() {
  612. t.Fatalf("Unexpected failure: %v", errRsp)
  613. }
  614. list = i2eL(li)
  615. if len(list) != 0 {
  616. t.Fatalf("Unexpected services in response: %v", list)
  617. }
  618. }
  619. func TestProcGetService(t *testing.T) {
  620. defer netutils.SetupTestNetNS(t)()
  621. c, nw := createTestNetwork(t, "network")
  622. ep1, err := nw.CreateEndpoint("db")
  623. if err != nil {
  624. t.Fatal(err)
  625. }
  626. ep2, err := nw.CreateEndpoint("web")
  627. if err != nil {
  628. t.Fatal(err)
  629. }
  630. vars := map[string]string{urlEpID: ""}
  631. _, errRsp := procGetService(c, vars, nil)
  632. if errRsp.isOK() {
  633. t.Fatalf("Expected failure, but suceeded")
  634. }
  635. if errRsp.StatusCode != http.StatusBadRequest {
  636. t.Fatalf("Expected %d, but got: %d", http.StatusBadRequest, errRsp.StatusCode)
  637. }
  638. vars[urlEpID] = "unknown-service-id"
  639. _, errRsp = procGetService(c, vars, nil)
  640. if errRsp.isOK() {
  641. t.Fatalf("Expected failure, but suceeded")
  642. }
  643. if errRsp.StatusCode != http.StatusNotFound {
  644. t.Fatalf("Expected %d, but got: %d. (%v)", http.StatusNotFound, errRsp.StatusCode, errRsp)
  645. }
  646. vars[urlEpID] = ep1.ID()
  647. si, errRsp := procGetService(c, vars, nil)
  648. if !errRsp.isOK() {
  649. t.Fatalf("Unexpected failure: %v", errRsp)
  650. }
  651. sv := i2e(si)
  652. if sv.ID != ep1.ID() {
  653. t.Fatalf("Unexpected service resource returned: %v", sv)
  654. }
  655. vars[urlEpID] = ep2.ID()
  656. si, errRsp = procGetService(c, vars, nil)
  657. if !errRsp.isOK() {
  658. t.Fatalf("Unexpected failure: %v", errRsp)
  659. }
  660. sv = i2e(si)
  661. if sv.ID != ep2.ID() {
  662. t.Fatalf("Unexpected service resource returned: %v", sv)
  663. }
  664. }
  665. func TestProcPublishUnpublishService(t *testing.T) {
  666. defer netutils.SetupTestNetNS(t)()
  667. c, _ := createTestNetwork(t, "network")
  668. vars := make(map[string]string)
  669. vbad, err := json.Marshal("bad service create data")
  670. if err != nil {
  671. t.Fatal(err)
  672. }
  673. _, errRsp := procPublishService(c, vars, vbad)
  674. if errRsp == &createdResponse {
  675. t.Fatalf("Expected to fail but succeeded")
  676. }
  677. if errRsp.StatusCode != http.StatusBadRequest {
  678. t.Fatalf("Expected %d. Got: %v", http.StatusBadRequest, errRsp)
  679. }
  680. b, err := json.Marshal(servicePublish{Name: ""})
  681. if err != nil {
  682. t.Fatal(err)
  683. }
  684. _, errRsp = procPublishService(c, vars, b)
  685. if errRsp == &createdResponse {
  686. t.Fatalf("Expected to fail but succeeded")
  687. }
  688. if errRsp.StatusCode != http.StatusBadRequest {
  689. t.Fatalf("Expected %d. Got: %v", http.StatusBadRequest, errRsp)
  690. }
  691. b, err = json.Marshal(servicePublish{Name: "db"})
  692. if err != nil {
  693. t.Fatal(err)
  694. }
  695. _, errRsp = procPublishService(c, vars, b)
  696. if errRsp == &createdResponse {
  697. t.Fatalf("Expected to fail but succeeded")
  698. }
  699. if errRsp.StatusCode != http.StatusBadRequest {
  700. t.Fatalf("Expected %d. Got: %v", http.StatusBadRequest, errRsp)
  701. }
  702. b, err = json.Marshal(servicePublish{Name: "db", Network: "unknown-network"})
  703. if err != nil {
  704. t.Fatal(err)
  705. }
  706. _, errRsp = procPublishService(c, vars, b)
  707. if errRsp == &createdResponse {
  708. t.Fatalf("Expected to fail but succeeded")
  709. }
  710. if errRsp.StatusCode != http.StatusNotFound {
  711. t.Fatalf("Expected %d. Got: %v", http.StatusNotFound, errRsp)
  712. }
  713. b, err = json.Marshal(servicePublish{Name: "", Network: "network"})
  714. if err != nil {
  715. t.Fatal(err)
  716. }
  717. _, errRsp = procPublishService(c, vars, b)
  718. if errRsp == &createdResponse {
  719. t.Fatalf("Expected to fail but succeeded")
  720. }
  721. if errRsp.StatusCode != http.StatusBadRequest {
  722. t.Fatalf("Expected %d. Got: %v", http.StatusBadRequest, errRsp)
  723. }
  724. b, err = json.Marshal(servicePublish{Name: "db", Network: "network"})
  725. if err != nil {
  726. t.Fatal(err)
  727. }
  728. _, errRsp = procPublishService(c, vars, b)
  729. if errRsp != &createdResponse {
  730. t.Fatalf("Unexpected failure: %v", errRsp)
  731. }
  732. sp := servicePublish{
  733. Name: "web",
  734. Network: "network",
  735. ExposedPorts: []types.TransportPort{
  736. types.TransportPort{Proto: types.TCP, Port: uint16(6000)},
  737. types.TransportPort{Proto: types.UDP, Port: uint16(500)},
  738. types.TransportPort{Proto: types.TCP, Port: uint16(700)},
  739. },
  740. PortMapping: []types.PortBinding{
  741. types.PortBinding{Proto: types.TCP, Port: uint16(1230), HostPort: uint16(37000)},
  742. types.PortBinding{Proto: types.UDP, Port: uint16(1200), HostPort: uint16(36000)},
  743. types.PortBinding{Proto: types.TCP, Port: uint16(1120), HostPort: uint16(35000)},
  744. },
  745. }
  746. b, err = json.Marshal(sp)
  747. if err != nil {
  748. t.Fatal(err)
  749. }
  750. si, errRsp := procPublishService(c, vars, b)
  751. if errRsp != &createdResponse {
  752. t.Fatalf("Unexpected failure: %v", errRsp)
  753. }
  754. sid := i2s(si)
  755. vars[urlEpID] = ""
  756. _, errRsp = procUnpublishService(c, vars, nil)
  757. if errRsp.isOK() {
  758. t.Fatalf("Expected failure but succeeded")
  759. }
  760. if errRsp.StatusCode != http.StatusBadRequest {
  761. t.Fatalf("Expected %d. Got: %v", http.StatusBadRequest, errRsp)
  762. }
  763. vars[urlEpID] = "unknown-service-id"
  764. _, errRsp = procUnpublishService(c, vars, nil)
  765. if errRsp.isOK() {
  766. t.Fatalf("Expected failure but succeeded")
  767. }
  768. if errRsp.StatusCode != http.StatusNotFound {
  769. t.Fatalf("Expected %d. Got: %v", http.StatusNotFound, errRsp)
  770. }
  771. vars[urlEpID] = sid
  772. _, errRsp = procUnpublishService(c, vars, nil)
  773. if !errRsp.isOK() {
  774. t.Fatalf("Unexpected failure: %v", errRsp)
  775. }
  776. _, errRsp = procGetService(c, vars, nil)
  777. if errRsp.isOK() {
  778. t.Fatalf("Expected failure, but suceeded")
  779. }
  780. if errRsp.StatusCode != http.StatusNotFound {
  781. t.Fatalf("Expected %d, but got: %d. (%v)", http.StatusNotFound, errRsp.StatusCode, errRsp)
  782. }
  783. }
  784. func TestAttachDetachBackend(t *testing.T) {
  785. defer netutils.SetupTestNetNS(t)()
  786. c, nw := createTestNetwork(t, "network")
  787. ep1, err := nw.CreateEndpoint("db")
  788. if err != nil {
  789. t.Fatal(err)
  790. }
  791. vars := make(map[string]string)
  792. vbad, err := json.Marshal("bad data")
  793. if err != nil {
  794. t.Fatal(err)
  795. }
  796. _, errRsp := procAttachBackend(c, vars, vbad)
  797. if errRsp == &successResponse {
  798. t.Fatalf("Expected failure, got: %v", errRsp)
  799. }
  800. vars[urlEpName] = "endpoint"
  801. bad, err := json.Marshal(endpointJoin{})
  802. if err != nil {
  803. t.Fatal(err)
  804. }
  805. _, errRsp = procAttachBackend(c, vars, bad)
  806. if errRsp == &successResponse {
  807. t.Fatalf("Expected failure, got: %v", errRsp)
  808. }
  809. if errRsp.StatusCode != http.StatusNotFound {
  810. t.Fatalf("Expected %d. Got: %v", http.StatusNotFound, errRsp)
  811. }
  812. _, errRsp = procGetContainers(c, vars, nil)
  813. if errRsp.isOK() {
  814. t.Fatalf("Expected failure. Got %v", errRsp)
  815. }
  816. if errRsp.StatusCode != http.StatusNotFound {
  817. t.Fatalf("Expected %d. Got: %v", http.StatusNotFound, errRsp)
  818. }
  819. vars[urlEpName] = "db"
  820. _, errRsp = procAttachBackend(c, vars, bad)
  821. if errRsp == &successResponse {
  822. t.Fatalf("Expected failure, got: %v", errRsp)
  823. }
  824. if errRsp.StatusCode != http.StatusBadRequest {
  825. t.Fatalf("Expected %d. Got: %v", http.StatusBadRequest, errRsp)
  826. }
  827. cid := "abcdefghi"
  828. jl := endpointJoin{ContainerID: cid}
  829. jlb, err := json.Marshal(jl)
  830. if err != nil {
  831. t.Fatal(err)
  832. }
  833. _, errRsp = procAttachBackend(c, vars, jlb)
  834. if errRsp != &successResponse {
  835. t.Fatalf("Unexpected failure, got: %v", errRsp)
  836. }
  837. cli, errRsp := procGetContainers(c, vars, nil)
  838. if errRsp != &successResponse {
  839. t.Fatalf("Unexpected failure, got: %v", errRsp)
  840. }
  841. cl := i2cL(cli)
  842. if len(cl) != 1 {
  843. t.Fatalf("Did not find expected number of containers attached to the service: %d", len(cl))
  844. }
  845. if cl[0].ID != cid {
  846. t.Fatalf("Did not find expected container attached to the service: %v", cl[0])
  847. }
  848. _, errRsp = procUnpublishService(c, vars, nil)
  849. if errRsp.isOK() {
  850. t.Fatalf("Expected failure but succeeded")
  851. }
  852. if errRsp.StatusCode != http.StatusForbidden {
  853. t.Fatalf("Expected %d. Got: %v", http.StatusForbidden, errRsp)
  854. }
  855. vars[urlEpName] = "endpoint"
  856. _, errRsp = procDetachBackend(c, vars, nil)
  857. if errRsp == &successResponse {
  858. t.Fatalf("Expected failure, got: %v", errRsp)
  859. }
  860. if errRsp.StatusCode != http.StatusNotFound {
  861. t.Fatalf("Expected %d. Got: %v", http.StatusNotFound, errRsp)
  862. }
  863. vars[urlEpName] = "db"
  864. _, errRsp = procDetachBackend(c, vars, nil)
  865. if errRsp == &successResponse {
  866. t.Fatalf("Expected failure, got: %v", errRsp)
  867. }
  868. if errRsp.StatusCode != http.StatusBadRequest {
  869. t.Fatalf("Expected %d. Got: %v", http.StatusBadRequest, errRsp)
  870. }
  871. vars[urlCnID] = cid
  872. _, errRsp = procDetachBackend(c, vars, nil)
  873. if errRsp != &successResponse {
  874. t.Fatalf("Unexpected failure, got: %v", errRsp)
  875. }
  876. cli, errRsp = procGetContainers(c, vars, nil)
  877. if errRsp != &successResponse {
  878. t.Fatalf("Unexpected failure, got: %v", errRsp)
  879. }
  880. cl = i2cL(cli)
  881. if len(cl) != 0 {
  882. t.Fatalf("Did not find expected number of containers attached to the service: %d", len(cl))
  883. }
  884. err = ep1.Delete()
  885. if err != nil {
  886. t.Fatal(err)
  887. }
  888. }
  889. func TestDetectGetNetworksInvalidQueryComposition(t *testing.T) {
  890. c, err := libnetwork.New("")
  891. if err != nil {
  892. t.Fatal(err)
  893. }
  894. vars := map[string]string{urlNwName: "x", urlNwPID: "y"}
  895. _, errRsp := procGetNetworks(c, vars, nil)
  896. if errRsp.StatusCode != http.StatusBadRequest {
  897. t.Fatalf("Expected %d. Got: %v", http.StatusBadRequest, errRsp)
  898. }
  899. }
  900. func TestDetectGetEndpointsInvalidQueryComposition(t *testing.T) {
  901. defer netutils.SetupTestNetNS(t)()
  902. c, _ := createTestNetwork(t, "network")
  903. vars := map[string]string{urlNwName: "network", urlEpName: "x", urlEpPID: "y"}
  904. _, errRsp := procGetEndpoints(c, vars, nil)
  905. if errRsp.StatusCode != http.StatusBadRequest {
  906. t.Fatalf("Expected %d. Got: %v", http.StatusBadRequest, errRsp)
  907. }
  908. }
  909. func TestDetectGetServicesInvalidQueryComposition(t *testing.T) {
  910. defer netutils.SetupTestNetNS(t)()
  911. c, _ := createTestNetwork(t, "network")
  912. vars := map[string]string{urlNwName: "network", urlEpName: "x", urlEpPID: "y"}
  913. _, errRsp := procGetServices(c, vars, nil)
  914. if errRsp.StatusCode != http.StatusBadRequest {
  915. t.Fatalf("Expected %d. Got: %v", http.StatusBadRequest, errRsp)
  916. }
  917. }
  918. func TestFindNetworkUtilPanic(t *testing.T) {
  919. defer checkPanic(t)
  920. findNetwork(nil, "", -1)
  921. }
  922. func TestFindNetworkUtil(t *testing.T) {
  923. defer netutils.SetupTestNetNS(t)()
  924. c, nw := createTestNetwork(t, "network")
  925. nid := nw.ID()
  926. _, errRsp := findNetwork(c, "", byName)
  927. if errRsp == &successResponse {
  928. t.Fatalf("Expected to fail but succeeded")
  929. }
  930. if errRsp.StatusCode != http.StatusBadRequest {
  931. t.Fatalf("Expected %d, but got: %d", http.StatusBadRequest, errRsp.StatusCode)
  932. }
  933. n, errRsp := findNetwork(c, nid, byID)
  934. if errRsp != &successResponse {
  935. t.Fatalf("Unexpected failure: %v", errRsp)
  936. }
  937. if n == nil {
  938. t.Fatalf("Unexpected nil libnetwork.Network")
  939. }
  940. if nid != n.ID() {
  941. t.Fatalf("Incorrect libnetwork.Network resource. It has different id: %v", n)
  942. }
  943. if "network" != n.Name() {
  944. t.Fatalf("Incorrect libnetwork.Network resource. It has different name: %v", n)
  945. }
  946. n, errRsp = findNetwork(c, "network", byName)
  947. if errRsp != &successResponse {
  948. t.Fatalf("Unexpected failure: %v", errRsp)
  949. }
  950. if n == nil {
  951. t.Fatalf("Unexpected nil libnetwork.Network")
  952. }
  953. if nid != n.ID() {
  954. t.Fatalf("Incorrect libnetwork.Network resource. It has different id: %v", n)
  955. }
  956. if "network" != n.Name() {
  957. t.Fatalf("Incorrect libnetwork.Network resource. It has different name: %v", n)
  958. }
  959. if err := n.Delete(); err != nil {
  960. t.Fatalf("Failed to delete the network: %s", err.Error())
  961. }
  962. _, errRsp = findNetwork(c, nid, byID)
  963. if errRsp == &successResponse {
  964. t.Fatalf("Expected to fail but succeeded")
  965. }
  966. if errRsp.StatusCode != http.StatusNotFound {
  967. t.Fatalf("Expected %d, but got: %d", http.StatusNotFound, errRsp.StatusCode)
  968. }
  969. _, errRsp = findNetwork(c, "network", byName)
  970. if errRsp == &successResponse {
  971. t.Fatalf("Expected to fail but succeeded")
  972. }
  973. if errRsp.StatusCode != http.StatusNotFound {
  974. t.Fatalf("Expected %d, but got: %d", http.StatusNotFound, errRsp.StatusCode)
  975. }
  976. }
  977. func TestCreateDeleteEndpoints(t *testing.T) {
  978. defer netutils.SetupTestNetNS(t)()
  979. c, err := libnetwork.New("")
  980. if err != nil {
  981. t.Fatal(err)
  982. }
  983. err = c.ConfigureNetworkDriver(bridgeNetType, nil)
  984. if err != nil {
  985. t.Fatal(err)
  986. }
  987. nc := networkCreate{Name: "firstNet", NetworkType: bridgeNetType}
  988. body, err := json.Marshal(nc)
  989. if err != nil {
  990. t.Fatal(err)
  991. }
  992. vars := make(map[string]string)
  993. i, errRsp := procCreateNetwork(c, vars, body)
  994. if errRsp != &createdResponse {
  995. t.Fatalf("Unexepected failure: %v", errRsp)
  996. }
  997. nid := i2s(i)
  998. vbad, err := json.Marshal("bad endppoint create data")
  999. if err != nil {
  1000. t.Fatal(err)
  1001. }
  1002. vars[urlNwName] = "firstNet"
  1003. _, errRsp = procCreateEndpoint(c, vars, vbad)
  1004. if errRsp == &createdResponse {
  1005. t.Fatalf("Expected to fail but succeeded")
  1006. }
  1007. b, err := json.Marshal(endpointCreate{Name: ""})
  1008. if err != nil {
  1009. t.Fatal(err)
  1010. }
  1011. vars[urlNwName] = "secondNet"
  1012. _, errRsp = procCreateEndpoint(c, vars, b)
  1013. if errRsp == &createdResponse {
  1014. t.Fatalf("Expected to fail but succeeded")
  1015. }
  1016. vars[urlNwName] = "firstNet"
  1017. _, errRsp = procCreateEndpoint(c, vars, b)
  1018. if errRsp == &successResponse {
  1019. t.Fatalf("Expected failure but succeeded: %v", errRsp)
  1020. }
  1021. b, err = json.Marshal(endpointCreate{Name: "firstEp"})
  1022. if err != nil {
  1023. t.Fatal(err)
  1024. }
  1025. i, errRsp = procCreateEndpoint(c, vars, b)
  1026. if errRsp != &createdResponse {
  1027. t.Fatalf("Unexepected failure: %v", errRsp)
  1028. }
  1029. eid := i2s(i)
  1030. _, errRsp = findEndpoint(c, "myNet", "firstEp", byName, byName)
  1031. if errRsp == &successResponse {
  1032. t.Fatalf("Expected failure but succeeded: %v", errRsp)
  1033. }
  1034. ep0, errRsp := findEndpoint(c, nid, "firstEp", byID, byName)
  1035. if errRsp != &successResponse {
  1036. t.Fatalf("Unexepected failure: %v", errRsp)
  1037. }
  1038. ep1, errRsp := findEndpoint(c, "firstNet", "firstEp", byName, byName)
  1039. if errRsp != &successResponse {
  1040. t.Fatalf("Unexepected failure: %v", errRsp)
  1041. }
  1042. ep2, errRsp := findEndpoint(c, nid, eid, byID, byID)
  1043. if errRsp != &successResponse {
  1044. t.Fatalf("Unexepected failure: %v", errRsp)
  1045. }
  1046. ep3, errRsp := findEndpoint(c, "firstNet", eid, byName, byID)
  1047. if errRsp != &successResponse {
  1048. t.Fatalf("Unexepected failure: %v", errRsp)
  1049. }
  1050. if ep0.ID() != ep1.ID() || ep0.ID() != ep2.ID() || ep0.ID() != ep3.ID() {
  1051. t.Fatalf("Diffenrent queries returned different endpoints: \nep0: %v\nep1: %v\nep2: %v\nep3: %v", ep0, ep1, ep2, ep3)
  1052. }
  1053. vars = make(map[string]string)
  1054. vars[urlNwName] = ""
  1055. vars[urlEpName] = "ep1"
  1056. _, errRsp = procDeleteEndpoint(c, vars, nil)
  1057. if errRsp == &successResponse {
  1058. t.Fatalf("Expected failure, got: %v", errRsp)
  1059. }
  1060. vars[urlNwName] = "firstNet"
  1061. vars[urlEpName] = ""
  1062. _, errRsp = procDeleteEndpoint(c, vars, nil)
  1063. if errRsp == &successResponse {
  1064. t.Fatalf("Expected failure, got: %v", errRsp)
  1065. }
  1066. vars[urlEpName] = "ep2"
  1067. _, errRsp = procDeleteEndpoint(c, vars, nil)
  1068. if errRsp == &successResponse {
  1069. t.Fatalf("Expected failure, got: %v", errRsp)
  1070. }
  1071. vars[urlEpName] = "firstEp"
  1072. _, errRsp = procDeleteEndpoint(c, vars, nil)
  1073. if errRsp != &successResponse {
  1074. t.Fatalf("Unexepected failure: %v", errRsp)
  1075. }
  1076. _, errRsp = findEndpoint(c, "firstNet", "firstEp", byName, byName)
  1077. if errRsp == &successResponse {
  1078. t.Fatalf("Expected failure, got: %v", errRsp)
  1079. }
  1080. }
  1081. func TestJoinLeave(t *testing.T) {
  1082. defer netutils.SetupTestNetNS(t)()
  1083. c, err := libnetwork.New("")
  1084. if err != nil {
  1085. t.Fatal(err)
  1086. }
  1087. err = c.ConfigureNetworkDriver(bridgeNetType, nil)
  1088. if err != nil {
  1089. t.Fatal(err)
  1090. }
  1091. nb, err := json.Marshal(networkCreate{Name: "network", NetworkType: bridgeNetType})
  1092. if err != nil {
  1093. t.Fatal(err)
  1094. }
  1095. vars := make(map[string]string)
  1096. _, errRsp := procCreateNetwork(c, vars, nb)
  1097. if errRsp != &createdResponse {
  1098. t.Fatalf("Unexepected failure: %v", errRsp)
  1099. }
  1100. eb, err := json.Marshal(endpointCreate{Name: "endpoint"})
  1101. if err != nil {
  1102. t.Fatal(err)
  1103. }
  1104. vars[urlNwName] = "network"
  1105. _, errRsp = procCreateEndpoint(c, vars, eb)
  1106. if errRsp != &createdResponse {
  1107. t.Fatalf("Unexepected failure: %v", errRsp)
  1108. }
  1109. vbad, err := json.Marshal("bad data")
  1110. if err != nil {
  1111. t.Fatal(err)
  1112. }
  1113. _, errRsp = procJoinEndpoint(c, vars, vbad)
  1114. if errRsp == &successResponse {
  1115. t.Fatalf("Expected failure, got: %v", errRsp)
  1116. }
  1117. vars[urlEpName] = "endpoint"
  1118. bad, err := json.Marshal(endpointJoin{})
  1119. if err != nil {
  1120. t.Fatal(err)
  1121. }
  1122. _, errRsp = procJoinEndpoint(c, vars, bad)
  1123. if errRsp == &successResponse {
  1124. t.Fatalf("Expected failure, got: %v", errRsp)
  1125. }
  1126. cid := "abcdefghi"
  1127. jl := endpointJoin{ContainerID: cid}
  1128. jlb, err := json.Marshal(jl)
  1129. if err != nil {
  1130. t.Fatal(err)
  1131. }
  1132. vars = make(map[string]string)
  1133. vars[urlNwName] = ""
  1134. vars[urlEpName] = ""
  1135. _, errRsp = procJoinEndpoint(c, vars, jlb)
  1136. if errRsp == &successResponse {
  1137. t.Fatalf("Expected failure, got: %v", errRsp)
  1138. }
  1139. vars[urlNwName] = "network"
  1140. vars[urlEpName] = ""
  1141. _, errRsp = procJoinEndpoint(c, vars, jlb)
  1142. if errRsp == &successResponse {
  1143. t.Fatalf("Expected failure, got: %v", errRsp)
  1144. }
  1145. vars[urlEpName] = "epoint"
  1146. _, errRsp = procJoinEndpoint(c, vars, jlb)
  1147. if errRsp == &successResponse {
  1148. t.Fatalf("Expected failure, got: %v", errRsp)
  1149. }
  1150. vars[urlEpName] = "endpoint"
  1151. key, errRsp := procJoinEndpoint(c, vars, jlb)
  1152. if errRsp != &successResponse {
  1153. t.Fatalf("Expected failure, got: %v", errRsp)
  1154. }
  1155. keyStr := i2s(key)
  1156. if keyStr == "" {
  1157. t.Fatalf("Empty sandbox key")
  1158. }
  1159. _, errRsp = procDeleteEndpoint(c, vars, nil)
  1160. if errRsp == &successResponse {
  1161. t.Fatalf("Expected failure, got: %v", errRsp)
  1162. }
  1163. vars[urlNwName] = "network2"
  1164. _, errRsp = procLeaveEndpoint(c, vars, vbad)
  1165. if errRsp == &successResponse {
  1166. t.Fatalf("Expected failure, got: %v", errRsp)
  1167. }
  1168. _, errRsp = procLeaveEndpoint(c, vars, bad)
  1169. if errRsp == &successResponse {
  1170. t.Fatalf("Expected failure, got: %v", errRsp)
  1171. }
  1172. _, errRsp = procLeaveEndpoint(c, vars, jlb)
  1173. if errRsp == &successResponse {
  1174. t.Fatalf("Expected failure, got: %v", errRsp)
  1175. }
  1176. vars = make(map[string]string)
  1177. vars[urlNwName] = ""
  1178. vars[urlEpName] = ""
  1179. _, errRsp = procLeaveEndpoint(c, vars, jlb)
  1180. if errRsp == &successResponse {
  1181. t.Fatalf("Expected failure, got: %v", errRsp)
  1182. }
  1183. vars[urlNwName] = "network"
  1184. vars[urlEpName] = ""
  1185. _, errRsp = procLeaveEndpoint(c, vars, jlb)
  1186. if errRsp == &successResponse {
  1187. t.Fatalf("Expected failure, got: %v", errRsp)
  1188. }
  1189. vars[urlEpName] = "2epoint"
  1190. _, errRsp = procLeaveEndpoint(c, vars, jlb)
  1191. if errRsp == &successResponse {
  1192. t.Fatalf("Expected failure, got: %v", errRsp)
  1193. }
  1194. vars[urlEpName] = "epoint"
  1195. vars[urlCnID] = "who"
  1196. _, errRsp = procLeaveEndpoint(c, vars, jlb)
  1197. if errRsp == &successResponse {
  1198. t.Fatalf("Expected failure, got: %v", errRsp)
  1199. }
  1200. delete(vars, urlCnID)
  1201. vars[urlEpName] = "endpoint"
  1202. _, errRsp = procLeaveEndpoint(c, vars, jlb)
  1203. if errRsp == &successResponse {
  1204. t.Fatalf("Expected failure, got: %v", errRsp)
  1205. }
  1206. vars[urlCnID] = cid
  1207. _, errRsp = procLeaveEndpoint(c, vars, jlb)
  1208. if errRsp != &successResponse {
  1209. t.Fatalf("Unexepected failure: %v", errRsp)
  1210. }
  1211. _, errRsp = procLeaveEndpoint(c, vars, jlb)
  1212. if errRsp == &successResponse {
  1213. t.Fatalf("Expected failure, got: %v", errRsp)
  1214. }
  1215. _, errRsp = procDeleteEndpoint(c, vars, nil)
  1216. if errRsp != &successResponse {
  1217. t.Fatalf("Unexepected failure: %v", errRsp)
  1218. }
  1219. }
  1220. func TestFindEndpointUtilPanic(t *testing.T) {
  1221. defer netutils.SetupTestNetNS(t)()
  1222. defer checkPanic(t)
  1223. c, nw := createTestNetwork(t, "network")
  1224. nid := nw.ID()
  1225. findEndpoint(c, nid, "", byID, -1)
  1226. }
  1227. func TestFindServiceUtilPanic(t *testing.T) {
  1228. defer netutils.SetupTestNetNS(t)()
  1229. defer checkPanic(t)
  1230. c, _ := createTestNetwork(t, "network")
  1231. findService(c, "random_service", -1)
  1232. }
  1233. func TestFindEndpointUtil(t *testing.T) {
  1234. defer netutils.SetupTestNetNS(t)()
  1235. c, nw := createTestNetwork(t, "network")
  1236. nid := nw.ID()
  1237. ep, err := nw.CreateEndpoint("secondEp", nil)
  1238. if err != nil {
  1239. t.Fatal(err)
  1240. }
  1241. eid := ep.ID()
  1242. _, errRsp := findEndpoint(c, nid, "", byID, byName)
  1243. if errRsp == &successResponse {
  1244. t.Fatalf("Expected failure, but got: %v", errRsp)
  1245. }
  1246. if errRsp.StatusCode != http.StatusBadRequest {
  1247. t.Fatalf("Expected %d, but got: %d", http.StatusBadRequest, errRsp.StatusCode)
  1248. }
  1249. ep0, errRsp := findEndpoint(c, nid, "secondEp", byID, byName)
  1250. if errRsp != &successResponse {
  1251. t.Fatalf("Unexepected failure: %v", errRsp)
  1252. }
  1253. ep1, errRsp := findEndpoint(c, "network", "secondEp", byName, byName)
  1254. if errRsp != &successResponse {
  1255. t.Fatalf("Unexepected failure: %v", errRsp)
  1256. }
  1257. ep2, errRsp := findEndpoint(c, nid, eid, byID, byID)
  1258. if errRsp != &successResponse {
  1259. t.Fatalf("Unexepected failure: %v", errRsp)
  1260. }
  1261. ep3, errRsp := findEndpoint(c, "network", eid, byName, byID)
  1262. if errRsp != &successResponse {
  1263. t.Fatalf("Unexepected failure: %v", errRsp)
  1264. }
  1265. ep4, errRsp := findService(c, "secondEp", byName)
  1266. if errRsp != &successResponse {
  1267. t.Fatalf("Unexepected failure: %v", errRsp)
  1268. }
  1269. ep5, errRsp := findService(c, eid, byID)
  1270. if errRsp != &successResponse {
  1271. t.Fatalf("Unexepected failure: %v", errRsp)
  1272. }
  1273. if ep0 != ep1 || ep0 != ep2 || ep0 != ep3 || ep0 != ep4 || ep0 != ep5 {
  1274. t.Fatalf("Diffenrent queries returned different endpoints")
  1275. }
  1276. ep.Delete()
  1277. _, errRsp = findEndpoint(c, nid, "secondEp", byID, byName)
  1278. if errRsp == &successResponse {
  1279. t.Fatalf("Expected failure, but got: %v", errRsp)
  1280. }
  1281. if errRsp.StatusCode != http.StatusNotFound {
  1282. t.Fatalf("Expected %d, but got: %d", http.StatusNotFound, errRsp.StatusCode)
  1283. }
  1284. _, errRsp = findEndpoint(c, "network", "secondEp", byName, byName)
  1285. if errRsp == &successResponse {
  1286. t.Fatalf("Expected failure, but got: %v", errRsp)
  1287. }
  1288. if errRsp.StatusCode != http.StatusNotFound {
  1289. t.Fatalf("Expected %d, but got: %d", http.StatusNotFound, errRsp.StatusCode)
  1290. }
  1291. _, errRsp = findEndpoint(c, nid, eid, byID, byID)
  1292. if errRsp == &successResponse {
  1293. t.Fatalf("Expected failure, but got: %v", errRsp)
  1294. }
  1295. if errRsp.StatusCode != http.StatusNotFound {
  1296. t.Fatalf("Expected %d, but got: %d", http.StatusNotFound, errRsp.StatusCode)
  1297. }
  1298. _, errRsp = findEndpoint(c, "network", eid, byName, byID)
  1299. if errRsp == &successResponse {
  1300. t.Fatalf("Expected failure, but got: %v", errRsp)
  1301. }
  1302. if errRsp.StatusCode != http.StatusNotFound {
  1303. t.Fatalf("Expected %d, but got: %d", http.StatusNotFound, errRsp.StatusCode)
  1304. }
  1305. _, errRsp = findService(c, "secondEp", byName)
  1306. if errRsp == &successResponse {
  1307. t.Fatalf("Expected failure, but got: %v", errRsp)
  1308. }
  1309. if errRsp.StatusCode != http.StatusNotFound {
  1310. t.Fatalf("Expected %d, but got: %d", http.StatusNotFound, errRsp.StatusCode)
  1311. }
  1312. _, errRsp = findService(c, eid, byID)
  1313. if errRsp == &successResponse {
  1314. t.Fatalf("Expected failure, but got: %v", errRsp)
  1315. }
  1316. if errRsp.StatusCode != http.StatusNotFound {
  1317. t.Fatalf("Expected %d, but got: %d", http.StatusNotFound, errRsp.StatusCode)
  1318. }
  1319. }
  1320. func TestEndpointToService(t *testing.T) {
  1321. r := &responseStatus{Status: "this is one endpoint", StatusCode: http.StatusOK}
  1322. r = endpointToService(r)
  1323. if r.Status != "this is one service" {
  1324. t.Fatalf("endpointToService returned unexpected status string: %s", r.Status)
  1325. }
  1326. r = &responseStatus{Status: "this is one network", StatusCode: http.StatusOK}
  1327. r = endpointToService(r)
  1328. if r.Status != "this is one network" {
  1329. t.Fatalf("endpointToService returned unexpected status string: %s", r.Status)
  1330. }
  1331. }
  1332. func checkPanic(t *testing.T) {
  1333. if r := recover(); r != nil {
  1334. if _, ok := r.(runtime.Error); ok {
  1335. panic(r)
  1336. }
  1337. } else {
  1338. t.Fatalf("Expected to panic, but suceeded")
  1339. }
  1340. }
  1341. func TestDetectNetworkTargetPanic(t *testing.T) {
  1342. defer checkPanic(t)
  1343. vars := make(map[string]string)
  1344. detectNetworkTarget(vars)
  1345. }
  1346. func TestDetectEndpointTargetPanic(t *testing.T) {
  1347. defer checkPanic(t)
  1348. vars := make(map[string]string)
  1349. detectEndpointTarget(vars)
  1350. }
  1351. func TestResponseStatus(t *testing.T) {
  1352. list := []int{
  1353. http.StatusBadGateway,
  1354. http.StatusBadRequest,
  1355. http.StatusConflict,
  1356. http.StatusContinue,
  1357. http.StatusExpectationFailed,
  1358. http.StatusForbidden,
  1359. http.StatusFound,
  1360. http.StatusGatewayTimeout,
  1361. http.StatusGone,
  1362. http.StatusHTTPVersionNotSupported,
  1363. http.StatusInternalServerError,
  1364. http.StatusLengthRequired,
  1365. http.StatusMethodNotAllowed,
  1366. http.StatusMovedPermanently,
  1367. http.StatusMultipleChoices,
  1368. http.StatusNoContent,
  1369. http.StatusNonAuthoritativeInfo,
  1370. http.StatusNotAcceptable,
  1371. http.StatusNotFound,
  1372. http.StatusNotModified,
  1373. http.StatusPartialContent,
  1374. http.StatusPaymentRequired,
  1375. http.StatusPreconditionFailed,
  1376. http.StatusProxyAuthRequired,
  1377. http.StatusRequestEntityTooLarge,
  1378. http.StatusRequestTimeout,
  1379. http.StatusRequestURITooLong,
  1380. http.StatusRequestedRangeNotSatisfiable,
  1381. http.StatusResetContent,
  1382. http.StatusServiceUnavailable,
  1383. http.StatusSwitchingProtocols,
  1384. http.StatusTemporaryRedirect,
  1385. http.StatusUnauthorized,
  1386. http.StatusUnsupportedMediaType,
  1387. http.StatusUseProxy,
  1388. }
  1389. for _, c := range list {
  1390. r := responseStatus{StatusCode: c}
  1391. if r.isOK() {
  1392. t.Fatalf("isOK() returned true for code% d", c)
  1393. }
  1394. }
  1395. r := responseStatus{StatusCode: http.StatusOK}
  1396. if !r.isOK() {
  1397. t.Fatalf("isOK() failed")
  1398. }
  1399. r = responseStatus{StatusCode: http.StatusCreated}
  1400. if !r.isOK() {
  1401. t.Fatalf("isOK() failed")
  1402. }
  1403. }
  1404. // Local structs for end to end testing of api.go
  1405. type localReader struct {
  1406. data []byte
  1407. beBad bool
  1408. }
  1409. func newLocalReader(data []byte) *localReader {
  1410. lr := &localReader{data: make([]byte, len(data))}
  1411. copy(lr.data, data)
  1412. return lr
  1413. }
  1414. func (l *localReader) Read(p []byte) (n int, err error) {
  1415. if l.beBad {
  1416. return 0, errors.New("I am a bad reader")
  1417. }
  1418. if p == nil {
  1419. return -1, fmt.Errorf("nil buffer passed")
  1420. }
  1421. if l.data == nil || len(l.data) == 0 {
  1422. return 0, io.EOF
  1423. }
  1424. copy(p[:], l.data[:])
  1425. return len(l.data), io.EOF
  1426. }
  1427. type localResponseWriter struct {
  1428. body []byte
  1429. statusCode int
  1430. }
  1431. func newWriter() *localResponseWriter {
  1432. return &localResponseWriter{}
  1433. }
  1434. func (f *localResponseWriter) Header() http.Header {
  1435. return make(map[string][]string, 0)
  1436. }
  1437. func (f *localResponseWriter) Write(data []byte) (int, error) {
  1438. if data == nil {
  1439. return -1, fmt.Errorf("nil data passed")
  1440. }
  1441. f.body = make([]byte, len(data))
  1442. copy(f.body, data)
  1443. return len(f.body), nil
  1444. }
  1445. func (f *localResponseWriter) WriteHeader(c int) {
  1446. f.statusCode = c
  1447. }
  1448. func TestwriteJSON(t *testing.T) {
  1449. testCode := 55
  1450. testData, err := json.Marshal("test data")
  1451. if err != nil {
  1452. t.Fatal(err)
  1453. }
  1454. rsp := newWriter()
  1455. writeJSON(rsp, testCode, testData)
  1456. if rsp.statusCode != testCode {
  1457. t.Fatalf("writeJSON() failed to set the status code. Expected %d. Got %d", testCode, rsp.statusCode)
  1458. }
  1459. if !bytes.Equal(testData, rsp.body) {
  1460. t.Fatalf("writeJSON() failed to set the body. Expected %s. Got %s", testData, rsp.body)
  1461. }
  1462. }
  1463. func TestHttpHandlerUninit(t *testing.T) {
  1464. defer netutils.SetupTestNetNS(t)()
  1465. c, err := libnetwork.New("")
  1466. if err != nil {
  1467. t.Fatal(err)
  1468. }
  1469. h := &httpHandler{c: c}
  1470. h.initRouter()
  1471. if h.r == nil {
  1472. t.Fatalf("initRouter() did not initialize the router")
  1473. }
  1474. rsp := newWriter()
  1475. req, err := http.NewRequest("GET", "/v1.19/networks", nil)
  1476. if err != nil {
  1477. t.Fatal(err)
  1478. }
  1479. handleRequest := NewHTTPHandler(nil)
  1480. handleRequest(rsp, req)
  1481. if rsp.statusCode != http.StatusServiceUnavailable {
  1482. t.Fatalf("Expected (%d). Got (%d): %s", http.StatusServiceUnavailable, rsp.statusCode, rsp.body)
  1483. }
  1484. handleRequest = NewHTTPHandler(c)
  1485. handleRequest(rsp, req)
  1486. if rsp.statusCode != http.StatusOK {
  1487. t.Fatalf("Expected (%d). Got: (%d): %s", http.StatusOK, rsp.statusCode, rsp.body)
  1488. }
  1489. var list []*networkResource
  1490. err = json.Unmarshal(rsp.body, &list)
  1491. if err != nil {
  1492. t.Fatal(err)
  1493. }
  1494. if len(list) != 0 {
  1495. t.Fatalf("Expected empty list. Got %v", list)
  1496. }
  1497. n, err := c.NewNetwork(bridgeNetType, "didietro", nil)
  1498. if err != nil {
  1499. t.Fatal(err)
  1500. }
  1501. nwr := buildNetworkResource(n)
  1502. expected, err := json.Marshal([]*networkResource{nwr})
  1503. if err != nil {
  1504. t.Fatal(err)
  1505. }
  1506. handleRequest(rsp, req)
  1507. if rsp.statusCode != http.StatusOK {
  1508. t.Fatalf("Unexpectded failure: (%d): %s", rsp.statusCode, rsp.body)
  1509. }
  1510. if len(rsp.body) == 0 {
  1511. t.Fatalf("Empty list of networks")
  1512. }
  1513. if bytes.Equal(rsp.body, expected) {
  1514. t.Fatalf("Incorrect list of networks in response's body")
  1515. }
  1516. }
  1517. func TestHttpHandlerBadBody(t *testing.T) {
  1518. defer netutils.SetupTestNetNS(t)()
  1519. rsp := newWriter()
  1520. c, err := libnetwork.New("")
  1521. if err != nil {
  1522. t.Fatal(err)
  1523. }
  1524. handleRequest := NewHTTPHandler(c)
  1525. req, err := http.NewRequest("POST", "/v1.19/networks", &localReader{beBad: true})
  1526. if err != nil {
  1527. t.Fatal(err)
  1528. }
  1529. handleRequest(rsp, req)
  1530. if rsp.statusCode != http.StatusBadRequest {
  1531. t.Fatalf("Unexpected status code. Expected (%d). Got (%d): %s.", http.StatusBadRequest, rsp.statusCode, string(rsp.body))
  1532. }
  1533. body := []byte{}
  1534. lr := newLocalReader(body)
  1535. req, err = http.NewRequest("POST", "/v1.19/networks", lr)
  1536. if err != nil {
  1537. t.Fatal(err)
  1538. }
  1539. handleRequest(rsp, req)
  1540. if rsp.statusCode != http.StatusBadRequest {
  1541. t.Fatalf("Unexpected status code. Expected (%d). Got (%d): %s.", http.StatusBadRequest, rsp.statusCode, string(rsp.body))
  1542. }
  1543. }
  1544. func TestEndToEnd(t *testing.T) {
  1545. defer netutils.SetupTestNetNS(t)()
  1546. rsp := newWriter()
  1547. c, err := libnetwork.New("")
  1548. if err != nil {
  1549. t.Fatal(err)
  1550. }
  1551. handleRequest := NewHTTPHandler(c)
  1552. ops := options.Generic{
  1553. netlabel.EnableIPv6: true,
  1554. netlabel.GenericData: map[string]string{
  1555. "BridgeName": "cdef",
  1556. "FixedCIDRv6": "fe80:2000::1/64",
  1557. "EnableIPv6": "true",
  1558. "Mtu": "1460",
  1559. "EnableIPTables": "true",
  1560. "AddressIP": "172.28.30.254/16",
  1561. "EnableUserlandProxy": "true",
  1562. "AllowNonDefaultBridge": "true",
  1563. },
  1564. }
  1565. // Create network
  1566. nc := networkCreate{Name: "network-fiftyfive", NetworkType: bridgeNetType, Options: ops}
  1567. body, err := json.Marshal(nc)
  1568. if err != nil {
  1569. t.Fatal(err)
  1570. }
  1571. lr := newLocalReader(body)
  1572. req, err := http.NewRequest("POST", "/v1.19/networks", lr)
  1573. if err != nil {
  1574. t.Fatal(err)
  1575. }
  1576. handleRequest(rsp, req)
  1577. if rsp.statusCode != http.StatusCreated {
  1578. t.Fatalf("Unexpectded status code. Expected (%d). Got (%d): %s.", http.StatusCreated, rsp.statusCode, string(rsp.body))
  1579. }
  1580. if len(rsp.body) == 0 {
  1581. t.Fatalf("Empty response body")
  1582. }
  1583. var nid string
  1584. err = json.Unmarshal(rsp.body, &nid)
  1585. if err != nil {
  1586. t.Fatal(err)
  1587. }
  1588. // Query networks collection
  1589. req, err = http.NewRequest("GET", "/v1.19/networks", nil)
  1590. if err != nil {
  1591. t.Fatal(err)
  1592. }
  1593. handleRequest(rsp, req)
  1594. if rsp.statusCode != http.StatusOK {
  1595. t.Fatalf("Expected StatusOK. Got (%d): %s", rsp.statusCode, rsp.body)
  1596. }
  1597. b0 := make([]byte, len(rsp.body))
  1598. copy(b0, rsp.body)
  1599. req, err = http.NewRequest("GET", "/v1.19/networks?name=network-fiftyfive", nil)
  1600. if err != nil {
  1601. t.Fatal(err)
  1602. }
  1603. handleRequest(rsp, req)
  1604. if rsp.statusCode != http.StatusOK {
  1605. t.Fatalf("Expected StatusOK. Got (%d): %s", rsp.statusCode, rsp.body)
  1606. }
  1607. if !bytes.Equal(b0, rsp.body) {
  1608. t.Fatalf("Expected same body from GET /networks and GET /networks?name=<nw> when only network <nw> exist.")
  1609. }
  1610. // Query network by name
  1611. req, err = http.NewRequest("GET", "/v1.19/networks?name=culo", nil)
  1612. if err != nil {
  1613. t.Fatal(err)
  1614. }
  1615. handleRequest(rsp, req)
  1616. if rsp.statusCode != http.StatusOK {
  1617. t.Fatalf("Expected StatusOK. Got (%d): %s", rsp.statusCode, rsp.body)
  1618. }
  1619. var list []*networkResource
  1620. err = json.Unmarshal(rsp.body, &list)
  1621. if err != nil {
  1622. t.Fatal(err)
  1623. }
  1624. if len(list) != 0 {
  1625. t.Fatalf("Expected empty list. Got %v", list)
  1626. }
  1627. req, err = http.NewRequest("GET", "/v1.19/networks?name=network-fiftyfive", nil)
  1628. if err != nil {
  1629. t.Fatal(err)
  1630. }
  1631. handleRequest(rsp, req)
  1632. if rsp.statusCode != http.StatusOK {
  1633. t.Fatalf("Unexpectded failure: (%d): %s", rsp.statusCode, rsp.body)
  1634. }
  1635. err = json.Unmarshal(rsp.body, &list)
  1636. if err != nil {
  1637. t.Fatal(err)
  1638. }
  1639. if len(list) == 0 {
  1640. t.Fatalf("Expected non empty list")
  1641. }
  1642. if list[0].Name != "network-fiftyfive" || nid != list[0].ID {
  1643. t.Fatalf("Incongruent resource found: %v", list[0])
  1644. }
  1645. // Query network by partial id
  1646. chars := []byte(nid)
  1647. partial := string(chars[0 : len(chars)/2])
  1648. req, err = http.NewRequest("GET", "/v1.19/networks?partial-id="+partial, nil)
  1649. if err != nil {
  1650. t.Fatal(err)
  1651. }
  1652. handleRequest(rsp, req)
  1653. if rsp.statusCode != http.StatusOK {
  1654. t.Fatalf("Unexpectded failure: (%d): %s", rsp.statusCode, rsp.body)
  1655. }
  1656. err = json.Unmarshal(rsp.body, &list)
  1657. if err != nil {
  1658. t.Fatal(err)
  1659. }
  1660. if len(list) == 0 {
  1661. t.Fatalf("Expected non empty list")
  1662. }
  1663. if list[0].Name != "network-fiftyfive" || nid != list[0].ID {
  1664. t.Fatalf("Incongruent resource found: %v", list[0])
  1665. }
  1666. // Get network by id
  1667. req, err = http.NewRequest("GET", "/v1.19/networks/"+nid, nil)
  1668. if err != nil {
  1669. t.Fatal(err)
  1670. }
  1671. handleRequest(rsp, req)
  1672. if rsp.statusCode != http.StatusOK {
  1673. t.Fatalf("Unexpectded failure: (%d): %s", rsp.statusCode, rsp.body)
  1674. }
  1675. var nwr networkResource
  1676. err = json.Unmarshal(rsp.body, &nwr)
  1677. if err != nil {
  1678. t.Fatal(err)
  1679. }
  1680. if nwr.Name != "network-fiftyfive" || nid != nwr.ID {
  1681. t.Fatalf("Incongruent resource found: %v", nwr)
  1682. }
  1683. // Create endpoint
  1684. eb, err := json.Marshal(endpointCreate{Name: "ep-TwentyTwo"})
  1685. if err != nil {
  1686. t.Fatal(err)
  1687. }
  1688. lr = newLocalReader(eb)
  1689. req, err = http.NewRequest("POST", "/v1.19/networks/"+nid+"/endpoints", lr)
  1690. if err != nil {
  1691. t.Fatal(err)
  1692. }
  1693. handleRequest(rsp, req)
  1694. if rsp.statusCode != http.StatusCreated {
  1695. t.Fatalf("Unexpectded status code. Expected (%d). Got (%d): %s.", http.StatusCreated, rsp.statusCode, string(rsp.body))
  1696. }
  1697. if len(rsp.body) == 0 {
  1698. t.Fatalf("Empty response body")
  1699. }
  1700. var eid string
  1701. err = json.Unmarshal(rsp.body, &eid)
  1702. if err != nil {
  1703. t.Fatal(err)
  1704. }
  1705. // Query endpoint(s)
  1706. req, err = http.NewRequest("GET", "/v1.19/networks/"+nid+"/endpoints", nil)
  1707. if err != nil {
  1708. t.Fatal(err)
  1709. }
  1710. handleRequest(rsp, req)
  1711. if rsp.statusCode != http.StatusOK {
  1712. t.Fatalf("Expected StatusOK. Got (%d): %s", rsp.statusCode, rsp.body)
  1713. }
  1714. req, err = http.NewRequest("GET", "/v1.19/networks/"+nid+"/endpoints?name=bla", nil)
  1715. if err != nil {
  1716. t.Fatal(err)
  1717. }
  1718. handleRequest(rsp, req)
  1719. if rsp.statusCode != http.StatusOK {
  1720. t.Fatalf("Unexpectded failure: (%d): %s", rsp.statusCode, rsp.body)
  1721. }
  1722. var epList []*endpointResource
  1723. err = json.Unmarshal(rsp.body, &epList)
  1724. if err != nil {
  1725. t.Fatal(err)
  1726. }
  1727. if len(epList) != 0 {
  1728. t.Fatalf("Expected empty list. Got %v", epList)
  1729. }
  1730. // Query endpoint by name
  1731. req, err = http.NewRequest("GET", "/v1.19/networks/"+nid+"/endpoints?name=ep-TwentyTwo", nil)
  1732. if err != nil {
  1733. t.Fatal(err)
  1734. }
  1735. handleRequest(rsp, req)
  1736. if rsp.statusCode != http.StatusOK {
  1737. t.Fatalf("Unexpectded failure: (%d): %s", rsp.statusCode, rsp.body)
  1738. }
  1739. err = json.Unmarshal(rsp.body, &epList)
  1740. if err != nil {
  1741. t.Fatal(err)
  1742. }
  1743. if len(epList) == 0 {
  1744. t.Fatalf("Empty response body")
  1745. }
  1746. if epList[0].Name != "ep-TwentyTwo" || eid != epList[0].ID {
  1747. t.Fatalf("Incongruent resource found: %v", epList[0])
  1748. }
  1749. // Query endpoint by partial id
  1750. chars = []byte(eid)
  1751. partial = string(chars[0 : len(chars)/2])
  1752. req, err = http.NewRequest("GET", "/v1.19/networks/"+nid+"/endpoints?partial-id="+partial, nil)
  1753. if err != nil {
  1754. t.Fatal(err)
  1755. }
  1756. handleRequest(rsp, req)
  1757. if rsp.statusCode != http.StatusOK {
  1758. t.Fatalf("Unexpectded failure: (%d): %s", rsp.statusCode, rsp.body)
  1759. }
  1760. err = json.Unmarshal(rsp.body, &epList)
  1761. if err != nil {
  1762. t.Fatal(err)
  1763. }
  1764. if len(epList) == 0 {
  1765. t.Fatalf("Empty response body")
  1766. }
  1767. if epList[0].Name != "ep-TwentyTwo" || eid != epList[0].ID {
  1768. t.Fatalf("Incongruent resource found: %v", epList[0])
  1769. }
  1770. // Get endpoint by id
  1771. req, err = http.NewRequest("GET", "/v1.19/networks/"+nid+"/endpoints/"+eid, nil)
  1772. if err != nil {
  1773. t.Fatal(err)
  1774. }
  1775. handleRequest(rsp, req)
  1776. if rsp.statusCode != http.StatusOK {
  1777. t.Fatalf("Unexpectded failure: (%d): %s", rsp.statusCode, rsp.body)
  1778. }
  1779. var epr endpointResource
  1780. err = json.Unmarshal(rsp.body, &epr)
  1781. if err != nil {
  1782. t.Fatal(err)
  1783. }
  1784. if epr.Name != "ep-TwentyTwo" || epr.ID != eid {
  1785. t.Fatalf("Incongruent resource found: %v", epr)
  1786. }
  1787. }
  1788. type bre struct{}
  1789. func (b *bre) Error() string {
  1790. return "I am a bad request error"
  1791. }
  1792. func (b *bre) BadRequest() {}
  1793. type nfe struct{}
  1794. func (n *nfe) Error() string {
  1795. return "I am a not found error"
  1796. }
  1797. func (n *nfe) NotFound() {}
  1798. type forb struct{}
  1799. func (f *forb) Error() string {
  1800. return "I am a bad request error"
  1801. }
  1802. func (f *forb) Forbidden() {}
  1803. type notimpl struct{}
  1804. func (nip *notimpl) Error() string {
  1805. return "I am a not implemented error"
  1806. }
  1807. func (nip *notimpl) NotImplemented() {}
  1808. type inter struct{}
  1809. func (it *inter) Error() string {
  1810. return "I am a internal error"
  1811. }
  1812. func (it *inter) Internal() {}
  1813. type tout struct{}
  1814. func (to *tout) Error() string {
  1815. return "I am a timeout error"
  1816. }
  1817. func (to *tout) Timeout() {}
  1818. type noserv struct{}
  1819. func (nos *noserv) Error() string {
  1820. return "I am a no service error"
  1821. }
  1822. func (nos *noserv) NoService() {}
  1823. type notclassified struct{}
  1824. func (noc *notclassified) Error() string {
  1825. return "I am a non classified error"
  1826. }
  1827. func TestErrorConversion(t *testing.T) {
  1828. if convertNetworkError(new(bre)).StatusCode != http.StatusBadRequest {
  1829. t.Fatalf("Failed to recognize BadRequest error")
  1830. }
  1831. if convertNetworkError(new(nfe)).StatusCode != http.StatusNotFound {
  1832. t.Fatalf("Failed to recognize NotFound error")
  1833. }
  1834. if convertNetworkError(new(forb)).StatusCode != http.StatusForbidden {
  1835. t.Fatalf("Failed to recognize Forbidden error")
  1836. }
  1837. if convertNetworkError(new(notimpl)).StatusCode != http.StatusNotImplemented {
  1838. t.Fatalf("Failed to recognize NotImplemented error")
  1839. }
  1840. if convertNetworkError(new(inter)).StatusCode != http.StatusInternalServerError {
  1841. t.Fatalf("Failed to recognize Internal error")
  1842. }
  1843. if convertNetworkError(new(tout)).StatusCode != http.StatusRequestTimeout {
  1844. t.Fatalf("Failed to recognize Timeout error")
  1845. }
  1846. if convertNetworkError(new(noserv)).StatusCode != http.StatusServiceUnavailable {
  1847. t.Fatalf("Failed to recognize No Service error")
  1848. }
  1849. if convertNetworkError(new(notclassified)).StatusCode != http.StatusInternalServerError {
  1850. t.Fatalf("Failed to recognize not classified error as Internal error")
  1851. }
  1852. }