-
Notifications
You must be signed in to change notification settings - Fork 112
Expand file tree
/
Copy pathbuilder_test.go
More file actions
143 lines (126 loc) · 3.99 KB
/
builder_test.go
File metadata and controls
143 lines (126 loc) · 3.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package tests
import (
"fmt"
"net/http"
"strings"
"testing"
"time"
"github.com/deis/deis/tests/dockercli"
"github.com/deis/deis/tests/etcdutils"
"github.com/deis/deis/tests/utils"
"io/ioutil"
"os"
)
func TestBuilder(t *testing.T) {
var err error
var errfile error
setkeys := []string{
"/deis/registry/protocol",
"/deis/registry/host",
"/deis/registry/port",
"/deis/cache/host",
"/deis/cache/port",
"/deis/controller/protocol",
"/deis/controller/host",
"/deis/controller/port",
"/deis/controller/builderKey",
}
setdir := []string{
"/deis/controller",
"/deis/cache",
"/deis/database",
"/deis/registry",
"/deis/domains",
"/deis/services",
}
setproxy := []byte("HTTP_PROXY=\nhttp_proxy=\n")
tmpfile, errfile := ioutil.TempFile("/tmp", "deis-test-")
if errfile != nil {
t.Fatal(errfile)
}
ioutil.WriteFile(tmpfile.Name(), setproxy, 0644)
defer os.Remove(tmpfile.Name())
tag, etcdPort := utils.BuildTag(), utils.RandomPort()
imageName := utils.ImagePrefix() + "builder:" + tag
etcdName := "deis-etcd-" + tag
cli, stdout, stdoutPipe := dockercli.NewClient()
dockercli.RunTestEtcd(t, etcdName, etcdPort)
defer cli.CmdRm("-f", etcdName)
handler := etcdutils.InitEtcd(setdir, setkeys, etcdPort)
etcdutils.PublishEtcd(t, handler)
host, port := utils.HostAddress(), utils.RandomPort()
fmt.Printf("--- Run %s at %s:%s\n", imageName, host, port)
// Run a mock registry to test whether the builder can push its initial
// images.
regport := utils.RandomPort()
mockRegistry(host, regport, t)
setupRegistry("http", host, regport, t, handler)
// When we switch to Registry v2, we probably want to uncomment this
// and then remove mockRegistry.
// dockercli.RunTestRegistry(t, "registry", host, regport)
name := "deis-builder-" + tag
defer cli.CmdRm("-f", "-v", name)
go func() {
_ = cli.CmdRm("-f", "-v", name)
err = dockercli.RunContainer(cli,
"--name", name,
"--rm",
"-p", port+":2223",
"-e", "PORT=2223",
"-e", "HOST="+host,
"-e", "ETCD_PORT="+etcdPort,
"-e", "EXTERNAL_PORT="+port,
"--privileged",
"-v", tmpfile.Name()+":/etc/environment_proxy",
imageName)
}()
dockercli.PrintToStdout(t, stdout, stdoutPipe, "Builder is running")
if err != nil {
t.Fatal(err)
}
time.Sleep(5000 * time.Millisecond)
dockercli.DeisServiceTest(t, name, port, "tcp")
etcdutils.VerifyEtcdValue(t, "/deis/builder/host", host, etcdPort)
etcdutils.VerifyEtcdValue(t, "/deis/builder/port", port, etcdPort)
}
// mockRegistry mocks a Docker v1 registry.
//
// This is largely derived from the Docker repo's mock:
// https://github.com/docker/docker/blob/84e917b8767c749b9bd1400a5a2253d972635bcf/registry/registry_mock_test.go
func mockRegistry(host, port string, t *testing.T) {
addr := host + ":" + port
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Printf("Mock Registry request: %s %s\n", r.Method, r.RequestURI)
if strings.Contains(r.RequestURI, "v2") {
fmt.Println("**WARNING: mockRegistry does not support the v2 API**")
}
switch r.RequestURI {
case "/v2/", "/v1/_ping":
w.WriteHeader(200)
case "/v1/repositories/deis/slugrunner/", "/v1/repositories/deis/slugbuilder/":
w.Header().Add("X-Docker-Endpoints", addr)
w.Header().Add("X-Docker-Token", fmt.Sprintf("FAKE-SESSION-%d", time.Now().UnixNano()))
w.WriteHeader(200)
case "/v1/repositories/deis/slugrunner/images", "/v1/repositories/deis/slugbuilder/images":
w.WriteHeader(204)
default:
w.Header().Add("X-Docker-Size", "2000")
w.WriteHeader(200)
}
})
fmt.Printf("Starting mock registry on %s\n", addr)
go http.ListenAndServe(addr, nil)
}
func setupRegistry(proto, host, port string, t *testing.T, handler *etcdutils.EtcdHandle) {
vals := map[string]string{
"/deis/registry/protocol": proto,
"/deis/registry/port": port,
"/deis/registry/host": host,
}
for k, v := range vals {
fmt.Printf("Setting etcd key %s to %s\n", k, v)
if _, err := handler.C.Set(k, v, 0); err != nil {
t.Fatalf("Error setting %s to %s: %s\n", k, v, err)
}
}
}