Browse code

Remove builtins

Signed-off-by: Antonio Murdaca <me@runcom.ninja>

Antonio Murdaca authored on 2015/04/17 04:48:04
Showing 12 changed files
... ...
@@ -3,6 +3,7 @@ package server
3 3
 import (
4 4
 	"bufio"
5 5
 	"bytes"
6
+	"runtime"
6 7
 	"time"
7 8
 
8 9
 	"encoding/base64"
... ...
@@ -21,6 +22,7 @@ import (
21 21
 	"github.com/Sirupsen/logrus"
22 22
 	"github.com/docker/docker/api"
23 23
 	"github.com/docker/docker/api/types"
24
+	"github.com/docker/docker/autogen/dockerversion"
24 25
 	"github.com/docker/docker/daemon"
25 26
 	"github.com/docker/docker/daemon/networkdriver/bridge"
26 27
 	"github.com/docker/docker/engine"
... ...
@@ -28,6 +30,7 @@ import (
28 28
 	"github.com/docker/docker/pkg/jsonmessage"
29 29
 	"github.com/docker/docker/pkg/parsers"
30 30
 	"github.com/docker/docker/pkg/parsers/filters"
31
+	"github.com/docker/docker/pkg/parsers/kernel"
31 32
 	"github.com/docker/docker/pkg/signal"
32 33
 	"github.com/docker/docker/pkg/stdcopy"
33 34
 	"github.com/docker/docker/pkg/streamformatter"
... ...
@@ -41,6 +44,19 @@ var (
41 41
 	activationLock = make(chan struct{})
42 42
 )
43 43
 
44
+type ServerConfig struct {
45
+	Logging     bool
46
+	EnableCors  bool
47
+	CorsHeaders string
48
+	Version     string
49
+	SocketGroup string
50
+	Tls         bool
51
+	TlsVerify   bool
52
+	TlsCa       string
53
+	TlsCert     string
54
+	TlsKey      string
55
+}
56
+
44 57
 type HttpServer struct {
45 58
 	srv *http.Server
46 59
 	l   net.Listener
... ...
@@ -187,8 +203,20 @@ func postAuth(eng *engine.Engine, version version.Version, w http.ResponseWriter
187 187
 
188 188
 func getVersion(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
189 189
 	w.Header().Set("Content-Type", "application/json")
190
-	eng.ServeHTTP(w, r)
191
-	return nil
190
+
191
+	v := &types.Version{
192
+		Version:    dockerversion.VERSION,
193
+		ApiVersion: api.APIVERSION,
194
+		GitCommit:  dockerversion.GITCOMMIT,
195
+		GoVersion:  runtime.Version(),
196
+		Os:         runtime.GOOS,
197
+		Arch:       runtime.GOARCH,
198
+	}
199
+	if kernelVersion, err := kernel.GetKernelVersion(); err == nil {
200
+		v.KernelVersion = kernelVersion.String()
201
+	}
202
+
203
+	return writeJSON(w, http.StatusOK, v)
192 204
 }
193 205
 
194 206
 func postContainersKill(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
... ...
@@ -1588,28 +1616,22 @@ type Server interface {
1588 1588
 
1589 1589
 // ServeApi loops through all of the protocols sent in to docker and spawns
1590 1590
 // off a go routine to setup a serving http.Server for each.
1591
-func ServeApi(job *engine.Job) error {
1592
-	if len(job.Args) == 0 {
1593
-		return fmt.Errorf("usage: %s PROTO://ADDR [PROTO://ADDR ...]", job.Name)
1594
-	}
1595
-	var (
1596
-		protoAddrs = job.Args
1597
-		chErrors   = make(chan error, len(protoAddrs))
1598
-	)
1591
+func ServeApi(protoAddrs []string, conf *ServerConfig, eng *engine.Engine) error {
1592
+	var chErrors = make(chan error, len(protoAddrs))
1599 1593
 
1600 1594
 	for _, protoAddr := range protoAddrs {
1601 1595
 		protoAddrParts := strings.SplitN(protoAddr, "://", 2)
1602 1596
 		if len(protoAddrParts) != 2 {
1603
-			return fmt.Errorf("usage: %s PROTO://ADDR [PROTO://ADDR ...]", job.Name)
1597
+			return fmt.Errorf("bad format, expected PROTO://ADDR")
1604 1598
 		}
1605 1599
 		go func() {
1606 1600
 			logrus.Infof("Listening for HTTP on %s (%s)", protoAddrParts[0], protoAddrParts[1])
1607
-			srv, err := NewServer(protoAddrParts[0], protoAddrParts[1], job)
1601
+			srv, err := NewServer(protoAddrParts[0], protoAddrParts[1], conf, eng)
1608 1602
 			if err != nil {
1609 1603
 				chErrors <- err
1610 1604
 				return
1611 1605
 			}
1612
-			job.Eng.OnShutdown(func() {
1606
+			eng.OnShutdown(func() {
1613 1607
 				if err := srv.Close(); err != nil {
1614 1608
 					logrus.Error(err)
1615 1609
 				}
... ...
@@ -13,16 +13,16 @@ import (
13 13
 )
14 14
 
15 15
 // NewServer sets up the required Server and does protocol specific checking.
16
-func NewServer(proto, addr string, job *engine.Job) (Server, error) {
16
+func NewServer(proto, addr string, conf *ServerConfig, eng *engine.Engine) (Server, error) {
17 17
 	var (
18 18
 		err error
19 19
 		l   net.Listener
20 20
 		r   = createRouter(
21
-			job.Eng,
22
-			job.GetenvBool("Logging"),
23
-			job.GetenvBool("EnableCors"),
24
-			job.Getenv("CorsHeaders"),
25
-			job.Getenv("Version"),
21
+			eng,
22
+			conf.Logging,
23
+			conf.EnableCors,
24
+			conf.CorsHeaders,
25
+			conf.Version,
26 26
 		)
27 27
 	)
28 28
 	switch proto {
... ...
@@ -52,17 +52,17 @@ func NewServer(proto, addr string, job *engine.Job) (Server, error) {
52 52
 		}
53 53
 		return nil, nil
54 54
 	case "tcp":
55
-		if !job.GetenvBool("TlsVerify") {
55
+		if !conf.TlsVerify {
56 56
 			logrus.Warn("/!\\ DON'T BIND ON ANY IP ADDRESS WITHOUT setting -tlsverify IF YOU DON'T KNOW WHAT YOU'RE DOING /!\\")
57 57
 		}
58
-		if l, err = NewTcpSocket(addr, tlsConfigFromJob(job)); err != nil {
58
+		if l, err = NewTcpSocket(addr, tlsConfigFromServerConfig(conf)); err != nil {
59 59
 			return nil, err
60 60
 		}
61 61
 		if err := allocateDaemonPort(addr); err != nil {
62 62
 			return nil, err
63 63
 		}
64 64
 	case "unix":
65
-		if l, err = NewUnixSocket(addr, job.Getenv("SocketGroup")); err != nil {
65
+		if l, err = NewUnixSocket(addr, conf.SocketGroup); err != nil {
66 66
 			return nil, err
67 67
 		}
68 68
 	default:
... ...
@@ -77,8 +77,7 @@ func NewServer(proto, addr string, job *engine.Job) (Server, error) {
77 77
 	}, nil
78 78
 }
79 79
 
80
-// Called through eng.Job("acceptconnections")
81
-func AcceptConnections(job *engine.Job) error {
80
+func AcceptConnections() {
82 81
 	// Tell the init daemon we are accepting requests
83 82
 	go systemd.SdNotify("READY=1")
84 83
 	// close the lock so the listeners start accepting connections
... ...
@@ -87,5 +86,4 @@ func AcceptConnections(job *engine.Job) error {
87 87
 	default:
88 88
 		close(activationLock)
89 89
 	}
90
-	return nil
91 90
 }
... ...
@@ -34,35 +34,6 @@ func TesthttpError(t *testing.T) {
34 34
 	}
35 35
 }
36 36
 
37
-func TestGetVersion(t *testing.T) {
38
-	eng := engine.New()
39
-	var called bool
40
-	eng.Register("version", func(job *engine.Job) error {
41
-		called = true
42
-		v := &engine.Env{}
43
-		v.SetJson("Version", "42.1")
44
-		v.Set("ApiVersion", "1.1.1.1.1")
45
-		v.Set("GoVersion", "2.42")
46
-		v.Set("Os", "Linux")
47
-		v.Set("Arch", "x86_64")
48
-		if _, err := v.WriteTo(job.Stdout); err != nil {
49
-			return err
50
-		}
51
-		return nil
52
-	})
53
-	r := serveRequest("GET", "/version", nil, eng, t)
54
-	if !called {
55
-		t.Fatalf("handler was not called")
56
-	}
57
-	v := readEnv(r.Body, t)
58
-	if v.Get("Version") != "42.1" {
59
-		t.Fatalf("%#v\n", v)
60
-	}
61
-	if r.HeaderMap.Get("Content-Type") != "application/json" {
62
-		t.Fatalf("%#v\n", r)
63
-	}
64
-}
65
-
66 37
 func TestGetInfo(t *testing.T) {
67 38
 	eng := engine.New()
68 39
 	var called bool
... ...
@@ -39,13 +39,11 @@ func NewServer(proto, addr string, job *engine.Job) (Server, error) {
39 39
 	}
40 40
 }
41 41
 
42
-// Called through eng.Job("acceptconnections")
43
-func AcceptConnections(job *engine.Job) error {
42
+func AcceptConnections() {
44 43
 	// close the lock so the listeners start accepting connections
45 44
 	select {
46 45
 	case <-activationLock:
47 46
 	default:
48 47
 		close(activationLock)
49 48
 	}
50
-	return nil
51 49
 }
... ...
@@ -8,7 +8,6 @@ import (
8 8
 	"net"
9 9
 	"os"
10 10
 
11
-	"github.com/docker/docker/engine"
12 11
 	"github.com/docker/docker/pkg/listenbuffer"
13 12
 )
14 13
 
... ...
@@ -19,16 +18,16 @@ type tlsConfig struct {
19 19
 	Verify      bool
20 20
 }
21 21
 
22
-func tlsConfigFromJob(job *engine.Job) *tlsConfig {
23
-	verify := job.GetenvBool("TlsVerify")
24
-	if !job.GetenvBool("Tls") && !verify {
22
+func tlsConfigFromServerConfig(conf *ServerConfig) *tlsConfig {
23
+	verify := conf.TlsVerify
24
+	if !conf.Tls && !conf.TlsVerify {
25 25
 		return nil
26 26
 	}
27 27
 	return &tlsConfig{
28 28
 		Verify:      verify,
29
-		Certificate: job.Getenv("TlsCert"),
30
-		Key:         job.Getenv("TlsKey"),
31
-		CA:          job.Getenv("TlsCa"),
29
+		Certificate: conf.TlsCert,
30
+		Key:         conf.TlsKey,
31
+		CA:          conf.TlsCa,
32 32
 	}
33 33
 }
34 34
 
... ...
@@ -1,5 +1,7 @@
1 1
 package types
2 2
 
3
+import "github.com/docker/docker/pkg/version"
4
+
3 5
 // ContainerCreateResponse contains the information returned to a client on the
4 6
 // creation of a new container.
5 7
 type ContainerCreateResponse struct {
... ...
@@ -110,3 +112,13 @@ type ContainerProcessList struct {
110 110
 	Processes [][]string
111 111
 	Titles    []string
112 112
 }
113
+
114
+type Version struct {
115
+	Version       string
116
+	ApiVersion    version.Version
117
+	GitCommit     string
118
+	GoVersion     string
119
+	Os            string
120
+	Arch          string
121
+	KernelVersion string `json:",omitempty"`
122
+}
113 123
deleted file mode 100644
... ...
@@ -1,48 +0,0 @@
1
-package builtins
2
-
3
-import (
4
-	"runtime"
5
-
6
-	"github.com/docker/docker/api"
7
-	apiserver "github.com/docker/docker/api/server"
8
-	"github.com/docker/docker/autogen/dockerversion"
9
-	"github.com/docker/docker/engine"
10
-	"github.com/docker/docker/pkg/parsers/kernel"
11
-)
12
-
13
-func Register(eng *engine.Engine) error {
14
-	if err := remote(eng); err != nil {
15
-		return err
16
-	}
17
-	if err := eng.Register("version", dockerVersion); err != nil {
18
-		return err
19
-	}
20
-
21
-	return nil
22
-}
23
-
24
-// remote: a RESTful api for cross-docker communication
25
-func remote(eng *engine.Engine) error {
26
-	if err := eng.Register("serveapi", apiserver.ServeApi); err != nil {
27
-		return err
28
-	}
29
-	return eng.Register("acceptconnections", apiserver.AcceptConnections)
30
-}
31
-
32
-// builtins jobs independent of any subsystem
33
-func dockerVersion(job *engine.Job) error {
34
-	v := &engine.Env{}
35
-	v.SetJson("Version", dockerversion.VERSION)
36
-	v.SetJson("ApiVersion", api.APIVERSION)
37
-	v.SetJson("GitCommit", dockerversion.GITCOMMIT)
38
-	v.Set("GoVersion", runtime.Version())
39
-	v.Set("Os", runtime.GOOS)
40
-	v.Set("Arch", runtime.GOARCH)
41
-	if kernelVersion, err := kernel.GetKernelVersion(); err == nil {
42
-		v.Set("KernelVersion", kernelVersion.String())
43
-	}
44
-	if _, err := v.WriteTo(job.Stdout); err != nil {
45
-		return err
46
-	}
47
-	return nil
48
-}
... ...
@@ -10,9 +10,9 @@ import (
10 10
 	"strings"
11 11
 
12 12
 	"github.com/Sirupsen/logrus"
13
+	apiserver "github.com/docker/docker/api/server"
13 14
 	"github.com/docker/docker/autogen/dockerversion"
14 15
 	"github.com/docker/docker/builder"
15
-	"github.com/docker/docker/builtins"
16 16
 	"github.com/docker/docker/daemon"
17 17
 	_ "github.com/docker/docker/daemon/execdriver/lxc"
18 18
 	_ "github.com/docker/docker/daemon/execdriver/native"
... ...
@@ -93,11 +93,6 @@ func mainDaemon() {
93 93
 	}
94 94
 	daemonCfg.TrustKeyPath = *flTrustKey
95 95
 
96
-	// Load builtins
97
-	if err := builtins.Register(eng); err != nil {
98
-		logrus.Fatal(err)
99
-	}
100
-
101 96
 	registryService := registry.NewService(registryCfg)
102 97
 	// load the daemon in the background so we can immediately start
103 98
 	// the http api so that connections don't fail while the daemon
... ...
@@ -127,33 +122,30 @@ func mainDaemon() {
127 127
 
128 128
 		// after the daemon is done setting up we can tell the api to start
129 129
 		// accepting connections
130
-		if err := eng.Job("acceptconnections").Run(); err != nil {
131
-			daemonInitWait <- err
132
-			return
133
-		}
130
+		apiserver.AcceptConnections()
131
+
134 132
 		daemonInitWait <- nil
135 133
 	}()
136 134
 
137
-	// Serve api
138
-	job := eng.Job("serveapi", flHosts...)
139
-	job.SetenvBool("Logging", true)
140
-	job.SetenvBool("EnableCors", daemonCfg.EnableCors)
141
-	job.Setenv("CorsHeaders", daemonCfg.CorsHeaders)
142
-	job.Setenv("Version", dockerversion.VERSION)
143
-	job.Setenv("SocketGroup", daemonCfg.SocketGroup)
144
-
145
-	job.SetenvBool("Tls", *flTls)
146
-	job.SetenvBool("TlsVerify", *flTlsVerify)
147
-	job.Setenv("TlsCa", *flCa)
148
-	job.Setenv("TlsCert", *flCert)
149
-	job.Setenv("TlsKey", *flKey)
150
-
151
-	// The serve API job never exits unless an error occurs
135
+	serverConfig := &apiserver.ServerConfig{
136
+		Logging:     true,
137
+		EnableCors:  daemonCfg.EnableCors,
138
+		CorsHeaders: daemonCfg.CorsHeaders,
139
+		Version:     dockerversion.VERSION,
140
+		SocketGroup: daemonCfg.SocketGroup,
141
+		Tls:         *flTls,
142
+		TlsVerify:   *flTlsVerify,
143
+		TlsCa:       *flCa,
144
+		TlsCert:     *flCert,
145
+		TlsKey:      *flKey,
146
+	}
147
+
148
+	// The serve API routine never exits unless an error occurs
152 149
 	// We need to start it as a goroutine and wait on it so
153 150
 	// daemon doesn't exit
154 151
 	serveAPIWait := make(chan error)
155 152
 	go func() {
156
-		if err := job.Run(); err != nil {
153
+		if err := apiserver.ServeApi(flHosts, serverConfig, eng); err != nil {
157 154
 			logrus.Errorf("ServeAPI error: %v", err)
158 155
 			serveAPIWait <- err
159 156
 			return
160 157
new file mode 100644
... ...
@@ -0,0 +1,24 @@
0
+package main
1
+
2
+import (
3
+	"encoding/json"
4
+	"testing"
5
+
6
+	"github.com/docker/docker/api/types"
7
+	"github.com/docker/docker/autogen/dockerversion"
8
+)
9
+
10
+func TestGetVersion(t *testing.T) {
11
+	_, body, err := sockRequest("GET", "/version", nil)
12
+	if err != nil {
13
+		t.Fatal(err)
14
+	}
15
+	var v types.Version
16
+	if err := json.Unmarshal(body, &v); err != nil {
17
+		t.Fatal(err)
18
+	}
19
+
20
+	if v.Version != dockerversion.VERSION {
21
+		t.Fatal("Version mismatch")
22
+	}
23
+}
... ...
@@ -3363,7 +3363,7 @@ func TestRunRestartMaxRetries(t *testing.T) {
3363 3363
 		t.Fatal(string(out), err)
3364 3364
 	}
3365 3365
 	id := strings.TrimSpace(string(out))
3366
-	if err := waitInspect(id, "{{ .State.Restarting }} {{ .State.Running }}", "false false", 5); err != nil {
3366
+	if err := waitInspect(id, "{{ .State.Restarting }} {{ .State.Running }}", "false false", 10); err != nil {
3367 3367
 		t.Fatal(err)
3368 3368
 	}
3369 3369
 	count, err := inspectField(id, "RestartCount")
... ...
@@ -17,6 +17,7 @@ import (
17 17
 	"time"
18 18
 
19 19
 	"github.com/Sirupsen/logrus"
20
+	apiserver "github.com/docker/docker/api/server"
20 21
 	"github.com/docker/docker/daemon"
21 22
 	"github.com/docker/docker/daemon/execdriver"
22 23
 	"github.com/docker/docker/engine"
... ...
@@ -157,9 +158,9 @@ func spawnGlobalDaemon() {
157 157
 			Scheme: testDaemonProto,
158 158
 			Host:   testDaemonAddr,
159 159
 		}
160
-		job := eng.Job("serveapi", listenURL.String())
161
-		job.SetenvBool("Logging", true)
162
-		if err := job.Run(); err != nil {
160
+
161
+		serverConfig := &apiserver.ServerConfig{Logging: true}
162
+		if err := apiserver.ServeApi([]string{listenURL.String()}, serverConfig, eng); err != nil {
163 163
 			logrus.Fatalf("Unable to spawn the test daemon: %s", err)
164 164
 		}
165 165
 	}()
... ...
@@ -168,9 +169,7 @@ func spawnGlobalDaemon() {
168 168
 	// FIXME: use inmem transports instead of tcp
169 169
 	time.Sleep(time.Second)
170 170
 
171
-	if err := eng.Job("acceptconnections").Run(); err != nil {
172
-		logrus.Fatalf("Unable to accept connections for test api: %s", err)
173
-	}
171
+	apiserver.AcceptConnections()
174 172
 }
175 173
 
176 174
 func spawnLegitHttpsDaemon() {
... ...
@@ -207,14 +206,15 @@ func spawnHttpsDaemon(addr, cacert, cert, key string) *engine.Engine {
207 207
 			Scheme: testDaemonHttpsProto,
208 208
 			Host:   addr,
209 209
 		}
210
-		job := eng.Job("serveapi", listenURL.String())
211
-		job.SetenvBool("Logging", true)
212
-		job.SetenvBool("Tls", true)
213
-		job.SetenvBool("TlsVerify", true)
214
-		job.Setenv("TlsCa", cacert)
215
-		job.Setenv("TlsCert", cert)
216
-		job.Setenv("TlsKey", key)
217
-		if err := job.Run(); err != nil {
210
+		serverConfig := &apiserver.ServerConfig{
211
+			Logging:   true,
212
+			Tls:       true,
213
+			TlsVerify: true,
214
+			TlsCa:     cacert,
215
+			TlsCert:   cert,
216
+			TlsKey:    key,
217
+		}
218
+		if err := apiserver.ServeApi([]string{listenURL.String()}, serverConfig, eng); err != nil {
218 219
 			logrus.Fatalf("Unable to spawn the test daemon: %s", err)
219 220
 		}
220 221
 	}()
... ...
@@ -222,9 +222,8 @@ func spawnHttpsDaemon(addr, cacert, cert, key string) *engine.Engine {
222 222
 	// Give some time to ListenAndServer to actually start
223 223
 	time.Sleep(time.Second)
224 224
 
225
-	if err := eng.Job("acceptconnections").Run(); err != nil {
226
-		logrus.Fatalf("Unable to accept connections for test api: %s", err)
227
-	}
225
+	apiserver.AcceptConnections()
226
+
228 227
 	return eng
229 228
 }
230 229
 
... ...
@@ -17,7 +17,6 @@ import (
17 17
 	"github.com/docker/docker/vendor/src/code.google.com/p/go/src/pkg/archive/tar"
18 18
 
19 19
 	"github.com/docker/docker/api/types"
20
-	"github.com/docker/docker/builtins"
21 20
 	"github.com/docker/docker/daemon"
22 21
 	"github.com/docker/docker/daemon/networkdriver/bridge"
23 22
 	"github.com/docker/docker/engine"
... ...
@@ -170,10 +169,6 @@ func newTestEngine(t Fataler, autorestart bool, root string) *engine.Engine {
170 170
 
171 171
 	eng := engine.New()
172 172
 	eng.Logging = false
173
-	// Load default plugins
174
-	if err := builtins.Register(eng); err != nil {
175
-		t.Fatal(err)
176
-	}
177 173
 
178 174
 	// (This is manually copied and modified from main() until we have a more generic plugin system)
179 175
 	cfg := &daemon.Config{