|
...
|
...
|
@@ -64,19 +64,14 @@ type Server struct {
|
|
64
|
64
|
}
|
|
65
|
65
|
|
|
66
|
66
|
func New(cfg *ServerConfig, eng *engine.Engine) *Server {
|
|
67
|
|
- r := createRouter(
|
|
68
|
|
- eng,
|
|
69
|
|
- cfg.Logging,
|
|
70
|
|
- cfg.EnableCors,
|
|
71
|
|
- cfg.CorsHeaders,
|
|
72
|
|
- cfg.Version,
|
|
73
|
|
- )
|
|
74
|
|
- return &Server{
|
|
75
|
|
- cfg: cfg,
|
|
76
|
|
- router: r,
|
|
77
|
|
- start: make(chan struct{}),
|
|
78
|
|
- eng: eng,
|
|
|
67
|
+ srv := &Server{
|
|
|
68
|
+ cfg: cfg,
|
|
|
69
|
+ start: make(chan struct{}),
|
|
|
70
|
+ eng: eng,
|
|
79
|
71
|
}
|
|
|
72
|
+ r := createRouter(srv, eng)
|
|
|
73
|
+ srv.router = r
|
|
|
74
|
+ return srv
|
|
80
|
75
|
}
|
|
81
|
76
|
|
|
82
|
77
|
func (s *Server) SetDaemon(d *daemon.Daemon) {
|
|
...
|
...
|
@@ -250,19 +245,14 @@ func streamJSON(job *engine.Job, w http.ResponseWriter, flush bool) {
|
|
250
|
250
|
}
|
|
251
|
251
|
}
|
|
252
|
252
|
|
|
253
|
|
-func getDaemon(eng *engine.Engine) *daemon.Daemon {
|
|
254
|
|
- return eng.HackGetGlobalVar("httpapi.daemon").(*daemon.Daemon)
|
|
255
|
|
-}
|
|
256
|
|
-
|
|
257
|
|
-func postAuth(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
253
|
+func (s *Server) postAuth(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
258
|
254
|
var config *registry.AuthConfig
|
|
259
|
255
|
err := json.NewDecoder(r.Body).Decode(&config)
|
|
260
|
256
|
r.Body.Close()
|
|
261
|
257
|
if err != nil {
|
|
262
|
258
|
return err
|
|
263
|
259
|
}
|
|
264
|
|
- d := getDaemon(eng)
|
|
265
|
|
- status, err := d.RegistryService.Auth(config)
|
|
|
260
|
+ status, err := s.daemon.RegistryService.Auth(config)
|
|
266
|
261
|
if err != nil {
|
|
267
|
262
|
return err
|
|
268
|
263
|
}
|
|
...
|
...
|
@@ -271,7 +261,7 @@ func postAuth(eng *engine.Engine, version version.Version, w http.ResponseWriter
|
|
271
|
271
|
})
|
|
272
|
272
|
}
|
|
273
|
273
|
|
|
274
|
|
-func getVersion(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
274
|
+func (s *Server) getVersion(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
275
|
275
|
w.Header().Set("Content-Type", "application/json")
|
|
276
|
276
|
|
|
277
|
277
|
v := &types.Version{
|
|
...
|
...
|
@@ -289,7 +279,7 @@ func getVersion(eng *engine.Engine, version version.Version, w http.ResponseWrit
|
|
289
|
289
|
return writeJSON(w, http.StatusOK, v)
|
|
290
|
290
|
}
|
|
291
|
291
|
|
|
292
|
|
-func postContainersKill(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
292
|
+func (s *Server) postContainersKill(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
293
|
293
|
if vars == nil {
|
|
294
|
294
|
return fmt.Errorf("Missing parameter")
|
|
295
|
295
|
}
|
|
...
|
...
|
@@ -317,7 +307,7 @@ func postContainersKill(eng *engine.Engine, version version.Version, w http.Resp
|
|
317
|
317
|
}
|
|
318
|
318
|
}
|
|
319
|
319
|
|
|
320
|
|
- if err = getDaemon(eng).ContainerKill(name, sig); err != nil {
|
|
|
320
|
+ if err = s.daemon.ContainerKill(name, sig); err != nil {
|
|
321
|
321
|
return err
|
|
322
|
322
|
}
|
|
323
|
323
|
|
|
...
|
...
|
@@ -325,7 +315,7 @@ func postContainersKill(eng *engine.Engine, version version.Version, w http.Resp
|
|
325
|
325
|
return nil
|
|
326
|
326
|
}
|
|
327
|
327
|
|
|
328
|
|
-func postContainersPause(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
328
|
+func (s *Server) postContainersPause(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
329
|
329
|
if vars == nil {
|
|
330
|
330
|
return fmt.Errorf("Missing parameter")
|
|
331
|
331
|
}
|
|
...
|
...
|
@@ -334,8 +324,7 @@ func postContainersPause(eng *engine.Engine, version version.Version, w http.Res
|
|
334
|
334
|
}
|
|
335
|
335
|
|
|
336
|
336
|
name := vars["name"]
|
|
337
|
|
- d := getDaemon(eng)
|
|
338
|
|
- cont, err := d.Get(name)
|
|
|
337
|
+ cont, err := s.daemon.Get(name)
|
|
339
|
338
|
if err != nil {
|
|
340
|
339
|
return err
|
|
341
|
340
|
}
|
|
...
|
...
|
@@ -350,7 +339,7 @@ func postContainersPause(eng *engine.Engine, version version.Version, w http.Res
|
|
350
|
350
|
return nil
|
|
351
|
351
|
}
|
|
352
|
352
|
|
|
353
|
|
-func postContainersUnpause(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
353
|
+func (s *Server) postContainersUnpause(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
354
|
354
|
if vars == nil {
|
|
355
|
355
|
return fmt.Errorf("Missing parameter")
|
|
356
|
356
|
}
|
|
...
|
...
|
@@ -359,8 +348,7 @@ func postContainersUnpause(eng *engine.Engine, version version.Version, w http.R
|
|
359
|
359
|
}
|
|
360
|
360
|
|
|
361
|
361
|
name := vars["name"]
|
|
362
|
|
- d := getDaemon(eng)
|
|
363
|
|
- cont, err := d.Get(name)
|
|
|
362
|
+ cont, err := s.daemon.Get(name)
|
|
364
|
363
|
if err != nil {
|
|
365
|
364
|
return err
|
|
366
|
365
|
}
|
|
...
|
...
|
@@ -375,17 +363,15 @@ func postContainersUnpause(eng *engine.Engine, version version.Version, w http.R
|
|
375
|
375
|
return nil
|
|
376
|
376
|
}
|
|
377
|
377
|
|
|
378
|
|
-func getContainersExport(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
378
|
+func (s *Server) getContainersExport(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
379
|
379
|
if vars == nil {
|
|
380
|
380
|
return fmt.Errorf("Missing parameter")
|
|
381
|
381
|
}
|
|
382
|
382
|
|
|
383
|
|
- d := getDaemon(eng)
|
|
384
|
|
-
|
|
385
|
|
- return d.ContainerExport(vars["name"], w)
|
|
|
383
|
+ return s.daemon.ContainerExport(vars["name"], w)
|
|
386
|
384
|
}
|
|
387
|
385
|
|
|
388
|
|
-func getImagesJSON(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
386
|
+func (s *Server) getImagesJSON(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
389
|
387
|
if err := parseForm(r); err != nil {
|
|
390
|
388
|
return err
|
|
391
|
389
|
}
|
|
...
|
...
|
@@ -397,7 +383,7 @@ func getImagesJSON(eng *engine.Engine, version version.Version, w http.ResponseW
|
|
397
|
397
|
All: toBool(r.Form.Get("all")),
|
|
398
|
398
|
}
|
|
399
|
399
|
|
|
400
|
|
- images, err := getDaemon(eng).Repositories().Images(&imagesConfig)
|
|
|
400
|
+ images, err := s.daemon.Repositories().Images(&imagesConfig)
|
|
401
|
401
|
if err != nil {
|
|
402
|
402
|
return err
|
|
403
|
403
|
}
|
|
...
|
...
|
@@ -426,7 +412,7 @@ func getImagesJSON(eng *engine.Engine, version version.Version, w http.ResponseW
|
|
426
|
426
|
return writeJSON(w, http.StatusOK, legacyImages)
|
|
427
|
427
|
}
|
|
428
|
428
|
|
|
429
|
|
-func getImagesViz(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
429
|
+func (s *Server) getImagesViz(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
430
|
430
|
if version.GreaterThan("1.6") {
|
|
431
|
431
|
w.WriteHeader(http.StatusNotFound)
|
|
432
|
432
|
return fmt.Errorf("This is now implemented in the client.")
|
|
...
|
...
|
@@ -435,10 +421,10 @@ func getImagesViz(eng *engine.Engine, version version.Version, w http.ResponseWr
|
|
435
|
435
|
return nil
|
|
436
|
436
|
}
|
|
437
|
437
|
|
|
438
|
|
-func getInfo(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
438
|
+func (s *Server) getInfo(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
439
|
439
|
w.Header().Set("Content-Type", "application/json")
|
|
440
|
440
|
|
|
441
|
|
- info, err := getDaemon(eng).SystemInfo()
|
|
|
441
|
+ info, err := s.daemon.SystemInfo()
|
|
442
|
442
|
if err != nil {
|
|
443
|
443
|
return err
|
|
444
|
444
|
}
|
|
...
|
...
|
@@ -446,7 +432,7 @@ func getInfo(eng *engine.Engine, version version.Version, w http.ResponseWriter,
|
|
446
|
446
|
return writeJSON(w, http.StatusOK, info)
|
|
447
|
447
|
}
|
|
448
|
448
|
|
|
449
|
|
-func getEvents(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
449
|
+func (s *Server) getEvents(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
450
|
450
|
if err := parseForm(r); err != nil {
|
|
451
|
451
|
return err
|
|
452
|
452
|
}
|
|
...
|
...
|
@@ -497,7 +483,7 @@ func getEvents(eng *engine.Engine, version version.Version, w http.ResponseWrite
|
|
497
|
497
|
return true
|
|
498
|
498
|
}
|
|
499
|
499
|
|
|
500
|
|
- d := getDaemon(eng)
|
|
|
500
|
+ d := s.daemon
|
|
501
|
501
|
es := d.EventsService
|
|
502
|
502
|
w.Header().Set("Content-Type", "application/json")
|
|
503
|
503
|
enc := json.NewEncoder(utils.NewWriteFlusher(w))
|
|
...
|
...
|
@@ -550,13 +536,13 @@ func getEvents(eng *engine.Engine, version version.Version, w http.ResponseWrite
|
|
550
|
550
|
}
|
|
551
|
551
|
}
|
|
552
|
552
|
|
|
553
|
|
-func getImagesHistory(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
553
|
+func (s *Server) getImagesHistory(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
554
|
554
|
if vars == nil {
|
|
555
|
555
|
return fmt.Errorf("Missing parameter")
|
|
556
|
556
|
}
|
|
557
|
557
|
|
|
558
|
558
|
name := vars["name"]
|
|
559
|
|
- history, err := getDaemon(eng).Repositories().History(name)
|
|
|
559
|
+ history, err := s.daemon.Repositories().History(name)
|
|
560
|
560
|
if err != nil {
|
|
561
|
561
|
return err
|
|
562
|
562
|
}
|
|
...
|
...
|
@@ -564,14 +550,13 @@ func getImagesHistory(eng *engine.Engine, version version.Version, w http.Respon
|
|
564
|
564
|
return writeJSON(w, http.StatusOK, history)
|
|
565
|
565
|
}
|
|
566
|
566
|
|
|
567
|
|
-func getContainersChanges(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
567
|
+func (s *Server) getContainersChanges(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
568
|
568
|
if vars == nil {
|
|
569
|
569
|
return fmt.Errorf("Missing parameter")
|
|
570
|
570
|
}
|
|
571
|
571
|
|
|
572
|
572
|
name := vars["name"]
|
|
573
|
|
- d := getDaemon(eng)
|
|
574
|
|
- cont, err := d.Get(name)
|
|
|
573
|
+ cont, err := s.daemon.Get(name)
|
|
575
|
574
|
if err != nil {
|
|
576
|
575
|
return err
|
|
577
|
576
|
}
|
|
...
|
...
|
@@ -584,7 +569,7 @@ func getContainersChanges(eng *engine.Engine, version version.Version, w http.Re
|
|
584
|
584
|
return writeJSON(w, http.StatusOK, changes)
|
|
585
|
585
|
}
|
|
586
|
586
|
|
|
587
|
|
-func getContainersTop(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
587
|
+func (s *Server) getContainersTop(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
588
|
588
|
if version.LessThan("1.4") {
|
|
589
|
589
|
return fmt.Errorf("top was improved a lot since 1.3, Please upgrade your docker client.")
|
|
590
|
590
|
}
|
|
...
|
...
|
@@ -597,7 +582,7 @@ func getContainersTop(eng *engine.Engine, version version.Version, w http.Respon
|
|
597
|
597
|
return err
|
|
598
|
598
|
}
|
|
599
|
599
|
|
|
600
|
|
- procList, err := getDaemon(eng).ContainerTop(vars["name"], r.Form.Get("ps_args"))
|
|
|
600
|
+ procList, err := s.daemon.ContainerTop(vars["name"], r.Form.Get("ps_args"))
|
|
601
|
601
|
if err != nil {
|
|
602
|
602
|
return err
|
|
603
|
603
|
}
|
|
...
|
...
|
@@ -605,7 +590,7 @@ func getContainersTop(eng *engine.Engine, version version.Version, w http.Respon
|
|
605
|
605
|
return writeJSON(w, http.StatusOK, procList)
|
|
606
|
606
|
}
|
|
607
|
607
|
|
|
608
|
|
-func getContainersJSON(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
608
|
+func (s *Server) getContainersJSON(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
609
|
609
|
if err := parseForm(r); err != nil {
|
|
610
|
610
|
return err
|
|
611
|
611
|
}
|
|
...
|
...
|
@@ -626,7 +611,7 @@ func getContainersJSON(eng *engine.Engine, version version.Version, w http.Respo
|
|
626
|
626
|
config.Limit = limit
|
|
627
|
627
|
}
|
|
628
|
628
|
|
|
629
|
|
- containers, err := getDaemon(eng).Containers(config)
|
|
|
629
|
+ containers, err := s.daemon.Containers(config)
|
|
630
|
630
|
if err != nil {
|
|
631
|
631
|
return err
|
|
632
|
632
|
}
|
|
...
|
...
|
@@ -634,7 +619,7 @@ func getContainersJSON(eng *engine.Engine, version version.Version, w http.Respo
|
|
634
|
634
|
return writeJSON(w, http.StatusOK, containers)
|
|
635
|
635
|
}
|
|
636
|
636
|
|
|
637
|
|
-func getContainersStats(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
637
|
+func (s *Server) getContainersStats(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
638
|
638
|
if err := parseForm(r); err != nil {
|
|
639
|
639
|
return err
|
|
640
|
640
|
}
|
|
...
|
...
|
@@ -642,12 +627,10 @@ func getContainersStats(eng *engine.Engine, version version.Version, w http.Resp
|
|
642
|
642
|
return fmt.Errorf("Missing parameter")
|
|
643
|
643
|
}
|
|
644
|
644
|
|
|
645
|
|
- d := getDaemon(eng)
|
|
646
|
|
-
|
|
647
|
|
- return d.ContainerStats(vars["name"], utils.NewWriteFlusher(w))
|
|
|
645
|
+ return s.daemon.ContainerStats(vars["name"], utils.NewWriteFlusher(w))
|
|
648
|
646
|
}
|
|
649
|
647
|
|
|
650
|
|
-func getContainersLogs(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
648
|
+func (s *Server) getContainersLogs(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
651
|
649
|
if err := parseForm(r); err != nil {
|
|
652
|
650
|
return err
|
|
653
|
651
|
}
|
|
...
|
...
|
@@ -670,15 +653,14 @@ func getContainersLogs(eng *engine.Engine, version version.Version, w http.Respo
|
|
670
|
670
|
OutStream: utils.NewWriteFlusher(w),
|
|
671
|
671
|
}
|
|
672
|
672
|
|
|
673
|
|
- d := getDaemon(eng)
|
|
674
|
|
- if err := d.ContainerLogs(vars["name"], logsConfig); err != nil {
|
|
|
673
|
+ if err := s.daemon.ContainerLogs(vars["name"], logsConfig); err != nil {
|
|
675
|
674
|
fmt.Fprintf(w, "Error running logs job: %s\n", err)
|
|
676
|
675
|
}
|
|
677
|
676
|
|
|
678
|
677
|
return nil
|
|
679
|
678
|
}
|
|
680
|
679
|
|
|
681
|
|
-func postImagesTag(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
680
|
+func (s *Server) postImagesTag(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
682
|
681
|
if err := parseForm(r); err != nil {
|
|
683
|
682
|
return err
|
|
684
|
683
|
}
|
|
...
|
...
|
@@ -686,18 +668,17 @@ func postImagesTag(eng *engine.Engine, version version.Version, w http.ResponseW
|
|
686
|
686
|
return fmt.Errorf("Missing parameter")
|
|
687
|
687
|
}
|
|
688
|
688
|
|
|
689
|
|
- d := getDaemon(eng)
|
|
690
|
689
|
repo := r.Form.Get("repo")
|
|
691
|
690
|
tag := r.Form.Get("tag")
|
|
692
|
691
|
force := toBool(r.Form.Get("force"))
|
|
693
|
|
- if err := d.Repositories().Tag(repo, tag, vars["name"], force); err != nil {
|
|
|
692
|
+ if err := s.daemon.Repositories().Tag(repo, tag, vars["name"], force); err != nil {
|
|
694
|
693
|
return err
|
|
695
|
694
|
}
|
|
696
|
695
|
w.WriteHeader(http.StatusCreated)
|
|
697
|
696
|
return nil
|
|
698
|
697
|
}
|
|
699
|
698
|
|
|
700
|
|
-func postCommit(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
699
|
+func (s *Server) postCommit(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
701
|
700
|
if err := parseForm(r); err != nil {
|
|
702
|
701
|
return err
|
|
703
|
702
|
}
|
|
...
|
...
|
@@ -723,9 +704,7 @@ func postCommit(eng *engine.Engine, version version.Version, w http.ResponseWrit
|
|
723
|
723
|
Config: r.Body,
|
|
724
|
724
|
}
|
|
725
|
725
|
|
|
726
|
|
- d := getDaemon(eng)
|
|
727
|
|
-
|
|
728
|
|
- imgID, err := d.ContainerCommit(cont, containerCommitConfig)
|
|
|
726
|
+ imgID, err := s.daemon.ContainerCommit(cont, containerCommitConfig)
|
|
729
|
727
|
if err != nil {
|
|
730
|
728
|
return err
|
|
731
|
729
|
}
|
|
...
|
...
|
@@ -736,7 +715,7 @@ func postCommit(eng *engine.Engine, version version.Version, w http.ResponseWrit
|
|
736
|
736
|
}
|
|
737
|
737
|
|
|
738
|
738
|
// Creates an image from Pull or from Import
|
|
739
|
|
-func postImagesCreate(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
739
|
+func (s *Server) postImagesCreate(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
740
|
740
|
if err := parseForm(r); err != nil {
|
|
741
|
741
|
return err
|
|
742
|
742
|
}
|
|
...
|
...
|
@@ -757,8 +736,6 @@ func postImagesCreate(eng *engine.Engine, version version.Version, w http.Respon
|
|
757
|
757
|
}
|
|
758
|
758
|
}
|
|
759
|
759
|
|
|
760
|
|
- d := getDaemon(eng)
|
|
761
|
|
-
|
|
762
|
760
|
if image != "" { //pull
|
|
763
|
761
|
if tag == "" {
|
|
764
|
762
|
image, tag = parsers.ParseRepositoryTag(image)
|
|
...
|
...
|
@@ -783,7 +760,7 @@ func postImagesCreate(eng *engine.Engine, version version.Version, w http.Respon
|
|
783
|
783
|
imagePullConfig.Json = false
|
|
784
|
784
|
}
|
|
785
|
785
|
|
|
786
|
|
- if err := d.Repositories().Pull(image, tag, imagePullConfig, eng); err != nil {
|
|
|
786
|
+ if err := s.daemon.Repositories().Pull(image, tag, imagePullConfig, eng); err != nil {
|
|
787
|
787
|
return err
|
|
788
|
788
|
}
|
|
789
|
789
|
} else { //import
|
|
...
|
...
|
@@ -804,7 +781,7 @@ func postImagesCreate(eng *engine.Engine, version version.Version, w http.Respon
|
|
804
|
804
|
imageImportConfig.Json = false
|
|
805
|
805
|
}
|
|
806
|
806
|
|
|
807
|
|
- if err := d.Repositories().Import(src, repo, tag, imageImportConfig, eng); err != nil {
|
|
|
807
|
+ if err := s.daemon.Repositories().Import(src, repo, tag, imageImportConfig, eng); err != nil {
|
|
808
|
808
|
return err
|
|
809
|
809
|
}
|
|
810
|
810
|
|
|
...
|
...
|
@@ -813,7 +790,7 @@ func postImagesCreate(eng *engine.Engine, version version.Version, w http.Respon
|
|
813
|
813
|
return nil
|
|
814
|
814
|
}
|
|
815
|
815
|
|
|
816
|
|
-func getImagesSearch(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
816
|
+func (s *Server) getImagesSearch(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
817
|
817
|
if err := parseForm(r); err != nil {
|
|
818
|
818
|
return err
|
|
819
|
819
|
}
|
|
...
|
...
|
@@ -836,15 +813,14 @@ func getImagesSearch(eng *engine.Engine, version version.Version, w http.Respons
|
|
836
|
836
|
headers[k] = v
|
|
837
|
837
|
}
|
|
838
|
838
|
}
|
|
839
|
|
- d := getDaemon(eng)
|
|
840
|
|
- query, err := d.RegistryService.Search(r.Form.Get("term"), config, headers)
|
|
|
839
|
+ query, err := s.daemon.RegistryService.Search(r.Form.Get("term"), config, headers)
|
|
841
|
840
|
if err != nil {
|
|
842
|
841
|
return err
|
|
843
|
842
|
}
|
|
844
|
843
|
return json.NewEncoder(w).Encode(query.Results)
|
|
845
|
844
|
}
|
|
846
|
845
|
|
|
847
|
|
-func postImagesPush(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
846
|
+func (s *Server) postImagesPush(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
848
|
847
|
if vars == nil {
|
|
849
|
848
|
return fmt.Errorf("Missing parameter")
|
|
850
|
849
|
}
|
|
...
|
...
|
@@ -896,7 +872,7 @@ func postImagesPush(eng *engine.Engine, version version.Version, w http.Response
|
|
896
|
896
|
return nil
|
|
897
|
897
|
}
|
|
898
|
898
|
|
|
899
|
|
-func getImagesGet(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
899
|
+func (s *Server) getImagesGet(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
900
|
900
|
if vars == nil {
|
|
901
|
901
|
return fmt.Errorf("Missing parameter")
|
|
902
|
902
|
}
|
|
...
|
...
|
@@ -916,14 +892,14 @@ func getImagesGet(eng *engine.Engine, version version.Version, w http.ResponseWr
|
|
916
|
916
|
return job.Run()
|
|
917
|
917
|
}
|
|
918
|
918
|
|
|
919
|
|
-func postImagesLoad(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
919
|
+func (s *Server) postImagesLoad(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
920
|
920
|
job := eng.Job("load")
|
|
921
|
921
|
job.Stdin.Add(r.Body)
|
|
922
|
922
|
job.Stdout.Add(w)
|
|
923
|
923
|
return job.Run()
|
|
924
|
924
|
}
|
|
925
|
925
|
|
|
926
|
|
-func postContainersCreate(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
926
|
+func (s *Server) postContainersCreate(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
927
|
927
|
if err := parseForm(r); err != nil {
|
|
928
|
928
|
return nil
|
|
929
|
929
|
}
|
|
...
|
...
|
@@ -940,7 +916,7 @@ func postContainersCreate(eng *engine.Engine, version version.Version, w http.Re
|
|
940
|
940
|
return err
|
|
941
|
941
|
}
|
|
942
|
942
|
|
|
943
|
|
- containerId, warnings, err := getDaemon(eng).ContainerCreate(name, config, hostConfig)
|
|
|
943
|
+ containerId, warnings, err := s.daemon.ContainerCreate(name, config, hostConfig)
|
|
944
|
944
|
if err != nil {
|
|
945
|
945
|
return err
|
|
946
|
946
|
}
|
|
...
|
...
|
@@ -951,7 +927,7 @@ func postContainersCreate(eng *engine.Engine, version version.Version, w http.Re
|
|
951
|
951
|
})
|
|
952
|
952
|
}
|
|
953
|
953
|
|
|
954
|
|
-func postContainersRestart(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
954
|
+func (s *Server) postContainersRestart(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
955
|
955
|
if err := parseForm(r); err != nil {
|
|
956
|
956
|
return err
|
|
957
|
957
|
}
|
|
...
|
...
|
@@ -959,13 +935,12 @@ func postContainersRestart(eng *engine.Engine, version version.Version, w http.R
|
|
959
|
959
|
return fmt.Errorf("Missing parameter")
|
|
960
|
960
|
}
|
|
961
|
961
|
|
|
962
|
|
- s, err := strconv.Atoi(r.Form.Get("t"))
|
|
|
962
|
+ timeout, err := strconv.Atoi(r.Form.Get("t"))
|
|
963
|
963
|
if err != nil {
|
|
964
|
964
|
return err
|
|
965
|
965
|
}
|
|
966
|
966
|
|
|
967
|
|
- d := getDaemon(eng)
|
|
968
|
|
- if err := d.ContainerRestart(vars["name"], s); err != nil {
|
|
|
967
|
+ if err := s.daemon.ContainerRestart(vars["name"], timeout); err != nil {
|
|
969
|
968
|
return err
|
|
970
|
969
|
}
|
|
971
|
970
|
|
|
...
|
...
|
@@ -974,7 +949,7 @@ func postContainersRestart(eng *engine.Engine, version version.Version, w http.R
|
|
974
|
974
|
return nil
|
|
975
|
975
|
}
|
|
976
|
976
|
|
|
977
|
|
-func postContainerRename(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
977
|
+func (s *Server) postContainerRename(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
978
|
978
|
if err := parseForm(r); err != nil {
|
|
979
|
979
|
return err
|
|
980
|
980
|
}
|
|
...
|
...
|
@@ -982,17 +957,16 @@ func postContainerRename(eng *engine.Engine, version version.Version, w http.Res
|
|
982
|
982
|
return fmt.Errorf("Missing parameter")
|
|
983
|
983
|
}
|
|
984
|
984
|
|
|
985
|
|
- d := getDaemon(eng)
|
|
986
|
985
|
name := vars["name"]
|
|
987
|
986
|
newName := r.Form.Get("name")
|
|
988
|
|
- if err := d.ContainerRename(name, newName); err != nil {
|
|
|
987
|
+ if err := s.daemon.ContainerRename(name, newName); err != nil {
|
|
989
|
988
|
return err
|
|
990
|
989
|
}
|
|
991
|
990
|
w.WriteHeader(http.StatusNoContent)
|
|
992
|
991
|
return nil
|
|
993
|
992
|
}
|
|
994
|
993
|
|
|
995
|
|
-func deleteContainers(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
994
|
+func (s *Server) deleteContainers(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
996
|
995
|
if err := parseForm(r); err != nil {
|
|
997
|
996
|
return err
|
|
998
|
997
|
}
|
|
...
|
...
|
@@ -1001,14 +975,13 @@ func deleteContainers(eng *engine.Engine, version version.Version, w http.Respon
|
|
1001
|
1001
|
}
|
|
1002
|
1002
|
|
|
1003
|
1003
|
name := vars["name"]
|
|
1004
|
|
- d := getDaemon(eng)
|
|
1005
|
1004
|
config := &daemon.ContainerRmConfig{
|
|
1006
|
1005
|
ForceRemove: toBool(r.Form.Get("force")),
|
|
1007
|
1006
|
RemoveVolume: toBool(r.Form.Get("v")),
|
|
1008
|
1007
|
RemoveLink: toBool(r.Form.Get("link")),
|
|
1009
|
1008
|
}
|
|
1010
|
1009
|
|
|
1011
|
|
- if err := d.ContainerRm(name, config); err != nil {
|
|
|
1010
|
+ if err := s.daemon.ContainerRm(name, config); err != nil {
|
|
1012
|
1011
|
// Force a 404 for the empty string
|
|
1013
|
1012
|
if strings.Contains(strings.ToLower(err.Error()), "prefix can't be empty") {
|
|
1014
|
1013
|
return fmt.Errorf("no such id: \"\"")
|
|
...
|
...
|
@@ -1021,7 +994,7 @@ func deleteContainers(eng *engine.Engine, version version.Version, w http.Respon
|
|
1021
|
1021
|
return nil
|
|
1022
|
1022
|
}
|
|
1023
|
1023
|
|
|
1024
|
|
-func deleteImages(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
1024
|
+func (s *Server) deleteImages(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
1025
|
1025
|
if err := parseForm(r); err != nil {
|
|
1026
|
1026
|
return err
|
|
1027
|
1027
|
}
|
|
...
|
...
|
@@ -1029,12 +1002,11 @@ func deleteImages(eng *engine.Engine, version version.Version, w http.ResponseWr
|
|
1029
|
1029
|
return fmt.Errorf("Missing parameter")
|
|
1030
|
1030
|
}
|
|
1031
|
1031
|
|
|
1032
|
|
- d := getDaemon(eng)
|
|
1033
|
1032
|
name := vars["name"]
|
|
1034
|
1033
|
force := toBool(r.Form.Get("force"))
|
|
1035
|
1034
|
noprune := toBool(r.Form.Get("noprune"))
|
|
1036
|
1035
|
|
|
1037
|
|
- list, err := d.ImageDelete(name, force, noprune)
|
|
|
1036
|
+ list, err := s.daemon.ImageDelete(name, force, noprune)
|
|
1038
|
1037
|
if err != nil {
|
|
1039
|
1038
|
return err
|
|
1040
|
1039
|
}
|
|
...
|
...
|
@@ -1042,7 +1014,7 @@ func deleteImages(eng *engine.Engine, version version.Version, w http.ResponseWr
|
|
1042
|
1042
|
return writeJSON(w, http.StatusOK, list)
|
|
1043
|
1043
|
}
|
|
1044
|
1044
|
|
|
1045
|
|
-func postContainersStart(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
1045
|
+func (s *Server) postContainersStart(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
1046
|
1046
|
if vars == nil {
|
|
1047
|
1047
|
return fmt.Errorf("Missing parameter")
|
|
1048
|
1048
|
}
|
|
...
|
...
|
@@ -1067,7 +1039,7 @@ func postContainersStart(eng *engine.Engine, version version.Version, w http.Res
|
|
1067
|
1067
|
hostConfig = c
|
|
1068
|
1068
|
}
|
|
1069
|
1069
|
|
|
1070
|
|
- if err := getDaemon(eng).ContainerStart(vars["name"], hostConfig); err != nil {
|
|
|
1070
|
+ if err := s.daemon.ContainerStart(vars["name"], hostConfig); err != nil {
|
|
1071
|
1071
|
if err.Error() == "Container already started" {
|
|
1072
|
1072
|
w.WriteHeader(http.StatusNotModified)
|
|
1073
|
1073
|
return nil
|
|
...
|
...
|
@@ -1078,7 +1050,7 @@ func postContainersStart(eng *engine.Engine, version version.Version, w http.Res
|
|
1078
|
1078
|
return nil
|
|
1079
|
1079
|
}
|
|
1080
|
1080
|
|
|
1081
|
|
-func postContainersStop(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
1081
|
+func (s *Server) postContainersStop(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
1082
|
1082
|
if err := parseForm(r); err != nil {
|
|
1083
|
1083
|
return err
|
|
1084
|
1084
|
}
|
|
...
|
...
|
@@ -1086,13 +1058,12 @@ func postContainersStop(eng *engine.Engine, version version.Version, w http.Resp
|
|
1086
|
1086
|
return fmt.Errorf("Missing parameter")
|
|
1087
|
1087
|
}
|
|
1088
|
1088
|
|
|
1089
|
|
- d := getDaemon(eng)
|
|
1090
|
1089
|
seconds, err := strconv.Atoi(r.Form.Get("t"))
|
|
1091
|
1090
|
if err != nil {
|
|
1092
|
1091
|
return err
|
|
1093
|
1092
|
}
|
|
1094
|
1093
|
|
|
1095
|
|
- if err := d.ContainerStop(vars["name"], seconds); err != nil {
|
|
|
1094
|
+ if err := s.daemon.ContainerStop(vars["name"], seconds); err != nil {
|
|
1096
|
1095
|
if err.Error() == "Container already stopped" {
|
|
1097
|
1096
|
w.WriteHeader(http.StatusNotModified)
|
|
1098
|
1097
|
return nil
|
|
...
|
...
|
@@ -1104,14 +1075,13 @@ func postContainersStop(eng *engine.Engine, version version.Version, w http.Resp
|
|
1104
|
1104
|
return nil
|
|
1105
|
1105
|
}
|
|
1106
|
1106
|
|
|
1107
|
|
-func postContainersWait(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
1107
|
+func (s *Server) postContainersWait(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
1108
|
1108
|
if vars == nil {
|
|
1109
|
1109
|
return fmt.Errorf("Missing parameter")
|
|
1110
|
1110
|
}
|
|
1111
|
1111
|
|
|
1112
|
1112
|
name := vars["name"]
|
|
1113
|
|
- d := getDaemon(eng)
|
|
1114
|
|
- cont, err := d.Get(name)
|
|
|
1113
|
+ cont, err := s.daemon.Get(name)
|
|
1115
|
1114
|
if err != nil {
|
|
1116
|
1115
|
return err
|
|
1117
|
1116
|
}
|
|
...
|
...
|
@@ -1123,7 +1093,7 @@ func postContainersWait(eng *engine.Engine, version version.Version, w http.Resp
|
|
1123
|
1123
|
})
|
|
1124
|
1124
|
}
|
|
1125
|
1125
|
|
|
1126
|
|
-func postContainersResize(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
1126
|
+func (s *Server) postContainersResize(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
1127
|
1127
|
if err := parseForm(r); err != nil {
|
|
1128
|
1128
|
return err
|
|
1129
|
1129
|
}
|
|
...
|
...
|
@@ -1140,8 +1110,7 @@ func postContainersResize(eng *engine.Engine, version version.Version, w http.Re
|
|
1140
|
1140
|
return err
|
|
1141
|
1141
|
}
|
|
1142
|
1142
|
|
|
1143
|
|
- d := getDaemon(eng)
|
|
1144
|
|
- cont, err := d.Get(vars["name"])
|
|
|
1143
|
+ cont, err := s.daemon.Get(vars["name"])
|
|
1145
|
1144
|
if err != nil {
|
|
1146
|
1145
|
return err
|
|
1147
|
1146
|
}
|
|
...
|
...
|
@@ -1149,7 +1118,7 @@ func postContainersResize(eng *engine.Engine, version version.Version, w http.Re
|
|
1149
|
1149
|
return cont.Resize(height, width)
|
|
1150
|
1150
|
}
|
|
1151
|
1151
|
|
|
1152
|
|
-func postContainersAttach(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
1152
|
+func (s *Server) postContainersAttach(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
1153
|
1153
|
if err := parseForm(r); err != nil {
|
|
1154
|
1154
|
return err
|
|
1155
|
1155
|
}
|
|
...
|
...
|
@@ -1157,9 +1126,7 @@ func postContainersAttach(eng *engine.Engine, version version.Version, w http.Re
|
|
1157
|
1157
|
return fmt.Errorf("Missing parameter")
|
|
1158
|
1158
|
}
|
|
1159
|
1159
|
|
|
1160
|
|
- d := getDaemon(eng)
|
|
1161
|
|
-
|
|
1162
|
|
- cont, err := d.Get(vars["name"])
|
|
|
1160
|
+ cont, err := s.daemon.Get(vars["name"])
|
|
1163
|
1161
|
if err != nil {
|
|
1164
|
1162
|
return err
|
|
1165
|
1163
|
}
|
|
...
|
...
|
@@ -1206,16 +1173,14 @@ func postContainersAttach(eng *engine.Engine, version version.Version, w http.Re
|
|
1206
|
1206
|
return nil
|
|
1207
|
1207
|
}
|
|
1208
|
1208
|
|
|
1209
|
|
-func wsContainersAttach(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
1209
|
+func (s *Server) wsContainersAttach(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
1210
|
1210
|
if err := parseForm(r); err != nil {
|
|
1211
|
1211
|
return err
|
|
1212
|
1212
|
}
|
|
1213
|
1213
|
if vars == nil {
|
|
1214
|
1214
|
return fmt.Errorf("Missing parameter")
|
|
1215
|
1215
|
}
|
|
1216
|
|
- d := getDaemon(eng)
|
|
1217
|
|
-
|
|
1218
|
|
- cont, err := d.Get(vars["name"])
|
|
|
1216
|
+ cont, err := s.daemon.Get(vars["name"])
|
|
1219
|
1217
|
if err != nil {
|
|
1220
|
1218
|
return err
|
|
1221
|
1219
|
}
|
|
...
|
...
|
@@ -1234,7 +1199,7 @@ func wsContainersAttach(eng *engine.Engine, version version.Version, w http.Resp
|
|
1234
|
1234
|
return nil
|
|
1235
|
1235
|
}
|
|
1236
|
1236
|
|
|
1237
|
|
-func getContainersByName(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
1237
|
+func (s *Server) getContainersByName(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
1238
|
1238
|
if vars == nil {
|
|
1239
|
1239
|
return fmt.Errorf("Missing parameter")
|
|
1240
|
1240
|
}
|
|
...
|
...
|
@@ -1246,13 +1211,12 @@ func getContainersByName(eng *engine.Engine, version version.Version, w http.Res
|
|
1246
|
1246
|
return job.Run()
|
|
1247
|
1247
|
}
|
|
1248
|
1248
|
|
|
1249
|
|
-func getExecByID(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
1249
|
+func (s *Server) getExecByID(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
1250
|
1250
|
if vars == nil {
|
|
1251
|
1251
|
return fmt.Errorf("Missing parameter 'id'")
|
|
1252
|
1252
|
}
|
|
1253
|
1253
|
|
|
1254
|
|
- d := getDaemon(eng)
|
|
1255
|
|
- eConfig, err := d.ContainerExecInspect(vars["id"])
|
|
|
1254
|
+ eConfig, err := s.daemon.ContainerExecInspect(vars["id"])
|
|
1256
|
1255
|
if err != nil {
|
|
1257
|
1256
|
return err
|
|
1258
|
1257
|
}
|
|
...
|
...
|
@@ -1260,7 +1224,7 @@ func getExecByID(eng *engine.Engine, version version.Version, w http.ResponseWri
|
|
1260
|
1260
|
return writeJSON(w, http.StatusOK, eConfig)
|
|
1261
|
1261
|
}
|
|
1262
|
1262
|
|
|
1263
|
|
-func getImagesByName(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
1263
|
+func (s *Server) getImagesByName(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
1264
|
1264
|
if vars == nil {
|
|
1265
|
1265
|
return fmt.Errorf("Missing parameter")
|
|
1266
|
1266
|
}
|
|
...
|
...
|
@@ -1272,7 +1236,7 @@ func getImagesByName(eng *engine.Engine, version version.Version, w http.Respons
|
|
1272
|
1272
|
return job.Run()
|
|
1273
|
1273
|
}
|
|
1274
|
1274
|
|
|
1275
|
|
-func postBuild(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
1275
|
+func (s *Server) postBuild(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
1276
|
1276
|
if version.LessThan("1.3") {
|
|
1277
|
1277
|
return fmt.Errorf("Multipart upload for build is no longer supported. Please upgrade your docker client.")
|
|
1278
|
1278
|
}
|
|
...
|
...
|
@@ -1362,7 +1326,7 @@ func postBuild(eng *engine.Engine, version version.Version, w http.ResponseWrite
|
|
1362
|
1362
|
return nil
|
|
1363
|
1363
|
}
|
|
1364
|
1364
|
|
|
1365
|
|
-func postContainersCopy(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
1365
|
+func (s *Server) postContainersCopy(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
1366
|
1366
|
if vars == nil {
|
|
1367
|
1367
|
return fmt.Errorf("Missing parameter")
|
|
1368
|
1368
|
}
|
|
...
|
...
|
@@ -1386,7 +1350,7 @@ func postContainersCopy(eng *engine.Engine, version version.Version, w http.Resp
|
|
1386
|
1386
|
res = res[1:]
|
|
1387
|
1387
|
}
|
|
1388
|
1388
|
|
|
1389
|
|
- cont, err := getDaemon(eng).Get(vars["name"])
|
|
|
1389
|
+ cont, err := s.daemon.Get(vars["name"])
|
|
1390
|
1390
|
if err != nil {
|
|
1391
|
1391
|
logrus.Errorf("%v", err)
|
|
1392
|
1392
|
if strings.Contains(strings.ToLower(err.Error()), "no such id") {
|
|
...
|
...
|
@@ -1412,7 +1376,7 @@ func postContainersCopy(eng *engine.Engine, version version.Version, w http.Resp
|
|
1412
|
1412
|
return nil
|
|
1413
|
1413
|
}
|
|
1414
|
1414
|
|
|
1415
|
|
-func postContainerExecCreate(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
1415
|
+func (s *Server) postContainerExecCreate(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
1416
|
1416
|
if err := parseForm(r); err != nil {
|
|
1417
|
1417
|
return nil
|
|
1418
|
1418
|
}
|
|
...
|
...
|
@@ -1449,7 +1413,7 @@ func postContainerExecCreate(eng *engine.Engine, version version.Version, w http
|
|
1449
|
1449
|
}
|
|
1450
|
1450
|
|
|
1451
|
1451
|
// TODO(vishh): Refactor the code to avoid having to specify stream config as part of both create and start.
|
|
1452
|
|
-func postContainerExecStart(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
1452
|
+func (s *Server) postContainerExecStart(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
1453
|
1453
|
if err := parseForm(r); err != nil {
|
|
1454
|
1454
|
return nil
|
|
1455
|
1455
|
}
|
|
...
|
...
|
@@ -1500,7 +1464,7 @@ func postContainerExecStart(eng *engine.Engine, version version.Version, w http.
|
|
1500
|
1500
|
return nil
|
|
1501
|
1501
|
}
|
|
1502
|
1502
|
|
|
1503
|
|
-func postContainerExecResize(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
1503
|
+func (s *Server) postContainerExecResize(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
1504
|
1504
|
if err := parseForm(r); err != nil {
|
|
1505
|
1505
|
return err
|
|
1506
|
1506
|
}
|
|
...
|
...
|
@@ -1517,12 +1481,10 @@ func postContainerExecResize(eng *engine.Engine, version version.Version, w http
|
|
1517
|
1517
|
return err
|
|
1518
|
1518
|
}
|
|
1519
|
1519
|
|
|
1520
|
|
- d := getDaemon(eng)
|
|
1521
|
|
-
|
|
1522
|
|
- return d.ContainerExecResize(vars["name"], height, width)
|
|
|
1520
|
+ return s.daemon.ContainerExecResize(vars["name"], height, width)
|
|
1523
|
1521
|
}
|
|
1524
|
1522
|
|
|
1525
|
|
-func optionsHandler(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
1523
|
+func (s *Server) optionsHandler(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
1526
|
1524
|
w.WriteHeader(http.StatusOK)
|
|
1527
|
1525
|
return nil
|
|
1528
|
1526
|
}
|
|
...
|
...
|
@@ -1533,7 +1495,7 @@ func writeCorsHeaders(w http.ResponseWriter, r *http.Request, corsHeaders string
|
|
1533
|
1533
|
w.Header().Add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS")
|
|
1534
|
1534
|
}
|
|
1535
|
1535
|
|
|
1536
|
|
-func ping(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
|
1536
|
+func (s *Server) ping(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
1537
|
1537
|
_, err := w.Write([]byte{'O', 'K'})
|
|
1538
|
1538
|
return err
|
|
1539
|
1539
|
}
|
|
...
|
...
|
@@ -1574,71 +1536,72 @@ func makeHttpHandler(eng *engine.Engine, logging bool, localMethod string, local
|
|
1574
|
1574
|
}
|
|
1575
|
1575
|
|
|
1576
|
1576
|
// we keep enableCors just for legacy usage, need to be removed in the future
|
|
1577
|
|
-func createRouter(eng *engine.Engine, logging, enableCors bool, corsHeaders string, dockerVersion string) *mux.Router {
|
|
|
1577
|
+func createRouter(s *Server, eng *engine.Engine) *mux.Router {
|
|
1578
|
1578
|
r := mux.NewRouter()
|
|
1579
|
1579
|
if os.Getenv("DEBUG") != "" {
|
|
1580
|
1580
|
ProfilerSetup(r, "/debug/")
|
|
1581
|
1581
|
}
|
|
1582
|
1582
|
m := map[string]map[string]HttpApiFunc{
|
|
1583
|
1583
|
"GET": {
|
|
1584
|
|
- "/_ping": ping,
|
|
1585
|
|
- "/events": getEvents,
|
|
1586
|
|
- "/info": getInfo,
|
|
1587
|
|
- "/version": getVersion,
|
|
1588
|
|
- "/images/json": getImagesJSON,
|
|
1589
|
|
- "/images/viz": getImagesViz,
|
|
1590
|
|
- "/images/search": getImagesSearch,
|
|
1591
|
|
- "/images/get": getImagesGet,
|
|
1592
|
|
- "/images/{name:.*}/get": getImagesGet,
|
|
1593
|
|
- "/images/{name:.*}/history": getImagesHistory,
|
|
1594
|
|
- "/images/{name:.*}/json": getImagesByName,
|
|
1595
|
|
- "/containers/ps": getContainersJSON,
|
|
1596
|
|
- "/containers/json": getContainersJSON,
|
|
1597
|
|
- "/containers/{name:.*}/export": getContainersExport,
|
|
1598
|
|
- "/containers/{name:.*}/changes": getContainersChanges,
|
|
1599
|
|
- "/containers/{name:.*}/json": getContainersByName,
|
|
1600
|
|
- "/containers/{name:.*}/top": getContainersTop,
|
|
1601
|
|
- "/containers/{name:.*}/logs": getContainersLogs,
|
|
1602
|
|
- "/containers/{name:.*}/stats": getContainersStats,
|
|
1603
|
|
- "/containers/{name:.*}/attach/ws": wsContainersAttach,
|
|
1604
|
|
- "/exec/{id:.*}/json": getExecByID,
|
|
|
1584
|
+ "/_ping": s.ping,
|
|
|
1585
|
+ "/events": s.getEvents,
|
|
|
1586
|
+ "/info": s.getInfo,
|
|
|
1587
|
+ "/version": s.getVersion,
|
|
|
1588
|
+ "/images/json": s.getImagesJSON,
|
|
|
1589
|
+ "/images/viz": s.getImagesViz,
|
|
|
1590
|
+ "/images/search": s.getImagesSearch,
|
|
|
1591
|
+ "/images/get": s.getImagesGet,
|
|
|
1592
|
+ "/images/{name:.*}/get": s.getImagesGet,
|
|
|
1593
|
+ "/images/{name:.*}/history": s.getImagesHistory,
|
|
|
1594
|
+ "/images/{name:.*}/json": s.getImagesByName,
|
|
|
1595
|
+ "/containers/ps": s.getContainersJSON,
|
|
|
1596
|
+ "/containers/json": s.getContainersJSON,
|
|
|
1597
|
+ "/containers/{name:.*}/export": s.getContainersExport,
|
|
|
1598
|
+ "/containers/{name:.*}/changes": s.getContainersChanges,
|
|
|
1599
|
+ "/containers/{name:.*}/json": s.getContainersByName,
|
|
|
1600
|
+ "/containers/{name:.*}/top": s.getContainersTop,
|
|
|
1601
|
+ "/containers/{name:.*}/logs": s.getContainersLogs,
|
|
|
1602
|
+ "/containers/{name:.*}/stats": s.getContainersStats,
|
|
|
1603
|
+ "/containers/{name:.*}/attach/ws": s.wsContainersAttach,
|
|
|
1604
|
+ "/exec/{id:.*}/json": s.getExecByID,
|
|
1605
|
1605
|
},
|
|
1606
|
1606
|
"POST": {
|
|
1607
|
|
- "/auth": postAuth,
|
|
1608
|
|
- "/commit": postCommit,
|
|
1609
|
|
- "/build": postBuild,
|
|
1610
|
|
- "/images/create": postImagesCreate,
|
|
1611
|
|
- "/images/load": postImagesLoad,
|
|
1612
|
|
- "/images/{name:.*}/push": postImagesPush,
|
|
1613
|
|
- "/images/{name:.*}/tag": postImagesTag,
|
|
1614
|
|
- "/containers/create": postContainersCreate,
|
|
1615
|
|
- "/containers/{name:.*}/kill": postContainersKill,
|
|
1616
|
|
- "/containers/{name:.*}/pause": postContainersPause,
|
|
1617
|
|
- "/containers/{name:.*}/unpause": postContainersUnpause,
|
|
1618
|
|
- "/containers/{name:.*}/restart": postContainersRestart,
|
|
1619
|
|
- "/containers/{name:.*}/start": postContainersStart,
|
|
1620
|
|
- "/containers/{name:.*}/stop": postContainersStop,
|
|
1621
|
|
- "/containers/{name:.*}/wait": postContainersWait,
|
|
1622
|
|
- "/containers/{name:.*}/resize": postContainersResize,
|
|
1623
|
|
- "/containers/{name:.*}/attach": postContainersAttach,
|
|
1624
|
|
- "/containers/{name:.*}/copy": postContainersCopy,
|
|
1625
|
|
- "/containers/{name:.*}/exec": postContainerExecCreate,
|
|
1626
|
|
- "/exec/{name:.*}/start": postContainerExecStart,
|
|
1627
|
|
- "/exec/{name:.*}/resize": postContainerExecResize,
|
|
1628
|
|
- "/containers/{name:.*}/rename": postContainerRename,
|
|
|
1607
|
+ "/auth": s.postAuth,
|
|
|
1608
|
+ "/commit": s.postCommit,
|
|
|
1609
|
+ "/build": s.postBuild,
|
|
|
1610
|
+ "/images/create": s.postImagesCreate,
|
|
|
1611
|
+ "/images/load": s.postImagesLoad,
|
|
|
1612
|
+ "/images/{name:.*}/push": s.postImagesPush,
|
|
|
1613
|
+ "/images/{name:.*}/tag": s.postImagesTag,
|
|
|
1614
|
+ "/containers/create": s.postContainersCreate,
|
|
|
1615
|
+ "/containers/{name:.*}/kill": s.postContainersKill,
|
|
|
1616
|
+ "/containers/{name:.*}/pause": s.postContainersPause,
|
|
|
1617
|
+ "/containers/{name:.*}/unpause": s.postContainersUnpause,
|
|
|
1618
|
+ "/containers/{name:.*}/restart": s.postContainersRestart,
|
|
|
1619
|
+ "/containers/{name:.*}/start": s.postContainersStart,
|
|
|
1620
|
+ "/containers/{name:.*}/stop": s.postContainersStop,
|
|
|
1621
|
+ "/containers/{name:.*}/wait": s.postContainersWait,
|
|
|
1622
|
+ "/containers/{name:.*}/resize": s.postContainersResize,
|
|
|
1623
|
+ "/containers/{name:.*}/attach": s.postContainersAttach,
|
|
|
1624
|
+ "/containers/{name:.*}/copy": s.postContainersCopy,
|
|
|
1625
|
+ "/containers/{name:.*}/exec": s.postContainerExecCreate,
|
|
|
1626
|
+ "/exec/{name:.*}/start": s.postContainerExecStart,
|
|
|
1627
|
+ "/exec/{name:.*}/resize": s.postContainerExecResize,
|
|
|
1628
|
+ "/containers/{name:.*}/rename": s.postContainerRename,
|
|
1629
|
1629
|
},
|
|
1630
|
1630
|
"DELETE": {
|
|
1631
|
|
- "/containers/{name:.*}": deleteContainers,
|
|
1632
|
|
- "/images/{name:.*}": deleteImages,
|
|
|
1631
|
+ "/containers/{name:.*}": s.deleteContainers,
|
|
|
1632
|
+ "/images/{name:.*}": s.deleteImages,
|
|
1633
|
1633
|
},
|
|
1634
|
1634
|
"OPTIONS": {
|
|
1635
|
|
- "": optionsHandler,
|
|
|
1635
|
+ "": s.optionsHandler,
|
|
1636
|
1636
|
},
|
|
1637
|
1637
|
}
|
|
1638
|
1638
|
|
|
1639
|
1639
|
// If "api-cors-header" is not given, but "api-enable-cors" is true, we set cors to "*"
|
|
1640
|
1640
|
// otherwise, all head values will be passed to HTTP handler
|
|
1641
|
|
- if corsHeaders == "" && enableCors {
|
|
|
1641
|
+ corsHeaders := s.cfg.CorsHeaders
|
|
|
1642
|
+ if corsHeaders == "" && s.cfg.EnableCors {
|
|
1642
|
1643
|
corsHeaders = "*"
|
|
1643
|
1644
|
}
|
|
1644
|
1645
|
|
|
...
|
...
|
@@ -1651,7 +1614,7 @@ func createRouter(eng *engine.Engine, logging, enableCors bool, corsHeaders stri
|
|
1651
|
1651
|
localMethod := method
|
|
1652
|
1652
|
|
|
1653
|
1653
|
// build the handler function
|
|
1654
|
|
- f := makeHttpHandler(eng, logging, localMethod, localRoute, localFct, corsHeaders, version.Version(dockerVersion))
|
|
|
1654
|
+ f := makeHttpHandler(eng, s.cfg.Logging, localMethod, localRoute, localFct, corsHeaders, version.Version(s.cfg.Version))
|
|
1655
|
1655
|
|
|
1656
|
1656
|
// add the new route
|
|
1657
|
1657
|
if localRoute == "" {
|
|
...
|
...
|
@@ -1670,7 +1633,14 @@ func createRouter(eng *engine.Engine, logging, enableCors bool, corsHeaders stri
|
|
1670
|
1670
|
// FIXME: refactor this to be part of Server and not require re-creating a new
|
|
1671
|
1671
|
// router each time. This requires first moving ListenAndServe into Server.
|
|
1672
|
1672
|
func ServeRequest(eng *engine.Engine, apiversion version.Version, w http.ResponseWriter, req *http.Request) {
|
|
1673
|
|
- router := createRouter(eng, false, true, "", "")
|
|
|
1673
|
+ cfg := &ServerConfig{
|
|
|
1674
|
+ EnableCors: true,
|
|
|
1675
|
+ Version: string(apiversion),
|
|
|
1676
|
+ }
|
|
|
1677
|
+ api := New(cfg, eng)
|
|
|
1678
|
+ daemon, _ := eng.HackGetGlobalVar("httpapi.daemon").(*daemon.Daemon)
|
|
|
1679
|
+ api.AcceptConnections(daemon)
|
|
|
1680
|
+ router := createRouter(api, eng)
|
|
1674
|
1681
|
// Insert APIVERSION into the request as a convenience
|
|
1675
|
1682
|
req.URL.Path = fmt.Sprintf("/v%s%s", apiversion, req.URL.Path)
|
|
1676
|
1683
|
router.ServeHTTP(w, req)
|