api_test.go 59 KB

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