Skip to content

Commit a066905

Browse files
arschlesAaron Schlesinger
authored andcommitted
fix(build.go,builder_key.go,etcd.go,run.go): add etcd read functionality
to read the builder key
1 parent 92494c5 commit a066905

4 files changed

Lines changed: 103 additions & 4 deletions

File tree

pkg/gitreceive/build.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"time"
1212

1313
"code.google.com/p/go-uuid/uuid"
14+
"github.com/coreos/go-etcd/etcd"
1415
"github.com/deis/builder/pkg"
1516
"github.com/deis/builder/pkg/log"
1617
"gopkg.in/yaml.v2"
@@ -28,7 +29,13 @@ func (e errGitShaTooShort) Error() string {
2829
return fmt.Sprintf("git sha %s was too short", e.sha)
2930
}
3031

31-
func build(conf *Config, newRev string) error {
32+
func build(conf *Config, etcdClient *etcd.Client) error {
33+
// TODO: replace etcd usage here with something else. See https://github.com/deis/builder/issues/81
34+
builderKey, err := getBuilderKey(etcdClient)
35+
if err != nil {
36+
return fmt.Errorf("couldn't get builder key %s (%s)", builderKey, err)
37+
}
38+
3239
// HTTP_PREFIX="http"
3340
// REMOTE_STORAGE="0"
3441
// # if minio is in the cluster, use it. otherwise use fetcher
@@ -431,7 +438,7 @@ func build(conf *Config, newRev string) error {
431438

432439
cfg, err := getAppConfig(
433440
conf,
434-
getBuilderKey(),
441+
builderKey,
435442
conf.Username,
436443
conf.App,
437444
)
@@ -464,7 +471,7 @@ func build(conf *Config, newRev string) error {
464471
}
465472
buildHookResp, err := publishRelease(
466473
conf,
467-
getBuilderKey(),
474+
builderKey,
468475
buildHook,
469476
)
470477
if err != nil {

pkg/gitreceive/builder_key.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package gitreceive
2+
3+
import (
4+
"errors"
5+
6+
"github.com/coreos/go-etcd/etcd"
7+
)
8+
9+
const (
10+
builderKey = "/deis/controller/builderKey"
11+
)
12+
13+
var (
14+
errNoNode = errors.New("no etcd node")
15+
)
16+
17+
func getBuilderKey(etcdClient *etcd.Client) (string, error) {
18+
resp, err := etcdClient.Get(builderKey, false, false)
19+
if err != nil {
20+
return "", err
21+
}
22+
if resp.Node == nil {
23+
return "", errNoNode
24+
}
25+
return resp.Node.Value, nil
26+
}

pkg/gitreceive/etcd/etcd.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package etcd
2+
3+
import (
4+
"fmt"
5+
"net/http"
6+
"os"
7+
"time"
8+
9+
"github.com/coreos/go-etcd/etcd"
10+
)
11+
12+
const (
13+
hostEnvVar = "DEIS_ETCD_1_SERVICE_HOST"
14+
portEnvVar = "DEIS_ETCD_1_SERVICE_PORT_CLIENT"
15+
defaultHost = "localhost"
16+
defaultPort = "4001"
17+
defaultRetryCycles = 2
18+
)
19+
20+
var (
21+
defaultRetrySleep = 200 * time.Millisecond
22+
)
23+
24+
func CreateClientFromEnv() (*etcd.Client, error) {
25+
host := os.Getenv(hostEnvVar)
26+
port := os.Getenv(portEnvVar)
27+
if host == "" {
28+
host = defaultHost
29+
}
30+
if port == "" {
31+
port = defaultPort
32+
}
33+
hosts := []string{
34+
fmt.Sprintf("http://%s:%s", host, port),
35+
}
36+
client := etcd.NewClient(hosts)
37+
client.CheckRetry = getCheckRetryFunc(defaultRetryCycles, defaultRetrySleep)
38+
39+
return client, nil
40+
}
41+
42+
func getCheckRetryFunc(retryCycles int, retrySleep time.Duration) func(*etcd.Cluster, int, http.Response, error) error {
43+
return func(c *etcd.Cluster, numReqs int, last http.Response, err error) error {
44+
if numReqs > retryCycles*len(c.Machines) {
45+
return fmt.Errorf("Tried and failed %d cluster connections: %s", retryCycles, err)
46+
}
47+
48+
switch last.StatusCode {
49+
case 0:
50+
return nil
51+
case 500:
52+
time.Sleep(retrySleep)
53+
return nil
54+
case 200:
55+
return nil
56+
default:
57+
return fmt.Errorf("Unhandled HTTP Error: %s %d", last.Status, last.StatusCode)
58+
}
59+
}
60+
}

pkg/gitreceive/run.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import (
55
"fmt"
66
"os"
77
"strings"
8+
9+
"github.com/deis/builder/pkg/gitreceive/etcd"
810
)
911

1012
// #!/bin/bash
@@ -49,6 +51,10 @@ func readLine(line string) (string, string, string, error) {
4951
}
5052

5153
func Run(conf *Config) error {
54+
etcdClient, err := etcd.CreateClientFromEnv()
55+
if err != nil {
56+
return err
57+
}
5258
scanner := bufio.NewScanner(os.Stdin)
5359
for scanner.Scan() {
5460
line := scanner.Text()
@@ -60,7 +66,7 @@ func Run(conf *Config) error {
6066
if err := receive(conf, newRev); err != nil {
6167
return err
6268
}
63-
if err := build(conf, newRev); err != nil {
69+
if err := build(conf, etcdClient); err != nil {
6470
return err
6571
}
6672
}

0 commit comments

Comments
 (0)