Skip to content

Commit 85ccea6

Browse files
committed
in progress support for docker auth
1 parent 6ffa4e8 commit 85ccea6

File tree

7 files changed

+82
-11
lines changed

7 files changed

+82
-11
lines changed

go.mod

+1-2
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,9 @@ require (
1818
github.com/sirupsen/logrus v1.4.2 // indirect
1919
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 // indirect
2020
google.golang.org/grpc v1.20.1 // indirect
21-
gopkg.in/src-d/go-billy.v4 v4.3.2
2221
gopkg.in/src-d/go-git.v4 v4.13.1
2322
gopkg.in/yaml.v2 v2.2.2
24-
gotest.tools v2.2.0+incompatible
23+
gotest.tools v2.2.0+incompatible // indirect
2524
)
2625

2726
// docker 18.06.1-ce

go.sum

+5
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEV
1010
github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk=
1111
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs=
1212
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs=
13+
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA=
1314
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
15+
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
1416
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
1517
github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI=
1618
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
@@ -28,7 +30,9 @@ github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw
2830
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
2931
github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg=
3032
github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
33+
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ=
3134
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
35+
github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0=
3236
github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
3337
github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE=
3438
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
@@ -107,6 +111,7 @@ golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be h1:vEDujvNQGv4jgYKudGeI/+
107111
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
108112
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA=
109113
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
114+
golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
110115
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
111116
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
112117
golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=

internal/app/bridgr/workers/docker.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,12 @@ func (d *Docker) Run() error {
5252
outFile := re.ReplaceAllString(reference.Path(img), "_") + ".tar"
5353
out, err := os.Create(path.Join(d.Config.BaseDir(), outFile))
5454
if err != nil {
55-
bridgr.Print(err)
55+
bridgr.Printf("error creating %s for saving Docker image %s - %s", outFile, img.String(), err)
5656
continue
5757
}
5858
err = d.writeLocal(out, img)
5959
if err != nil {
60-
bridgr.Print(err)
60+
bridgr.Printf("error saving %s - %s", img.String(), err)
6161
os.Remove(out.Name())
6262
continue
6363
}
@@ -71,10 +71,10 @@ func (d *Docker) Run() error {
7171
func (d *Docker) Setup() error {
7272
bridgr.Print("Called Docker.Setup()")
7373
for _, img := range d.Config.Items {
74-
bridgr.Printf("pulling image %s", img.String())
75-
err := pullImage(d.Cli, img.String())
74+
bridgr.Debugf("pulling image %s", img.String())
75+
err := pullImage(d.Cli, img)
7676
if err != nil {
77-
bridgr.Printf("Error fetching Docker image `%s`: %s", img.String(), err)
77+
bridgr.Printf("Error pulling Docker image `%s`: %s", img.String(), err)
7878
}
7979
}
8080
return nil

internal/app/bridgr/workers/ruby.go

+1
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ func (r *Ruby) Setup() error {
7373

7474
// Run fetches all artifacts for the Python configuration
7575
func (r *Ruby) Run() error {
76+
bridgr.Debug("Called Ruby.Setup()")
7677
err := r.Setup()
7778
if err != nil {
7879
return err

internal/app/bridgr/workers/worker.go

+48-3
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,15 @@ import (
55
"bridgr/internal/app/bridgr/assets"
66
"bytes"
77
"context"
8+
"encoding/base64"
9+
"encoding/json"
810
"io"
911
"io/ioutil"
12+
"net/url"
1013
"os"
14+
"strings"
1115

16+
"github.com/docker/distribution/reference"
1217
"github.com/docker/docker/api/types"
1318
"github.com/docker/docker/api/types/container"
1419
"github.com/docker/docker/client"
@@ -39,8 +44,25 @@ func cleanContainer(cli client.ContainerAPIClient, name string) error {
3944
return cli.ContainerRemove(context.Background(), name, types.ContainerRemoveOptions{Force: true})
4045
}
4146

42-
func pullImage(cli client.ImageAPIClient, image string) error {
43-
output, err := cli.ImagePull(context.Background(), image, types.ImagePullOptions{})
47+
func pullImage(cli client.ImageAPIClient, image reference.Named) error {
48+
imgDomain := "https://" + reference.Domain(image) // by putting scheme in front, it forces url.Parse to correctly identify the host portion
49+
bridgr.Debugf("Got image domain of %s", imgDomain)
50+
url, err := url.Parse(imgDomain)
51+
bridgr.Debugf("Parsed URL: %s", url)
52+
encodedAuth := ""
53+
if err == nil {
54+
username, password := credentials(url)
55+
if username != "" && password != "" {
56+
imgAuth := types.AuthConfig{
57+
Username: username,
58+
Password: password,
59+
}
60+
bridgr.Debugf("Docker: Found credentials for %s", url.Hostname())
61+
jsonAuth, _ := json.Marshal(imgAuth)
62+
encodedAuth = base64.URLEncoding.EncodeToString(jsonAuth)
63+
}
64+
}
65+
output, err := cli.ImagePull(context.Background(), image.String(), types.ImagePullOptions{RegistryAuth: encodedAuth})
4466
writer := ioutil.Discard
4567
if err != nil {
4668
return err
@@ -56,9 +78,10 @@ func pullImage(cli client.ImageAPIClient, image string) error {
5678
func runContainer(name string, containerConfig *container.Config, hostConfig *container.HostConfig, script string) error {
5779
ctx := context.Background()
5880
cli, _ := client.NewClientWithOpts(client.FromEnv)
81+
img, _ := reference.ParseNormalizedNamed(containerConfig.Image)
5982
// log.Printf("%+v", cli)
6083
_ = cleanContainer(cli, name)
61-
_ = pullImage(cli, "docker.io/"+containerConfig.Image)
84+
_ = pullImage(cli, img)
6285

6386
resp, err := cli.ContainerCreate(ctx, containerConfig, hostConfig, nil, name)
6487
if err != nil {
@@ -88,3 +111,25 @@ func runContainer(name string, containerConfig *container.Config, hostConfig *co
88111

89112
return nil
90113
}
114+
115+
func credentials(url *url.URL) (string, string) {
116+
basename := "BRIDGR_" + strings.ToUpper(strings.ReplaceAll(url.Hostname(), ".", "_"))
117+
uservar := basename + "_USER"
118+
passwdvar := basename + "_PASS"
119+
bridgr.Debugf("Looking for env var: %s", uservar)
120+
if value, ok := os.LookupEnv(uservar); ok {
121+
return value, os.Getenv(passwdvar)
122+
}
123+
bridgr.Debugf("Env Var %s was not found :(", uservar)
124+
return "", ""
125+
}
126+
127+
func credentialsConjoined(url *url.URL) string {
128+
u, p := credentials(url)
129+
return u + ":" + p
130+
}
131+
132+
func credentialsBase64(url *url.URL) string {
133+
v := credentialsConjoined(url)
134+
return base64.StdEncoding.EncodeToString([]byte(v))
135+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package workers
2+
3+
import "net/url"
4+
import "testing"
5+
import "os"
6+
7+
func TestCredentials(t *testing.T) {
8+
url, _ := url.Parse("https://test.docker.org")
9+
u, p := credentials(url)
10+
if u != "" {
11+
t.Errorf("Expected user to be blank for %s", url)
12+
}
13+
14+
os.Setenv("BRIDGR_TEST_DOCKER_ORG_USER", "myuser")
15+
os.Setenv("BRIDGR_TEST_DOCKER_ORG_PASS", "mypassword")
16+
u, p = credentials(url)
17+
if u == "" {
18+
t.Errorf("Expected a value for BRIDGR_TEST_DOCKER_ORG_USER")
19+
}
20+
t.Logf("User: %s, Pass: %s", u, p)
21+
}

internal/app/bridgr/workers/yum.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ func (y *Yum) Run() error {
8383

8484
// Setup only does the setup step of the YUM worker
8585
func (y *Yum) Setup() error {
86-
bridgr.Print("Called Yum.Setup()")
86+
bridgr.Debug("Called Yum.Setup()")
8787

8888
err := y.writeRepos()
8989
if err != nil {

0 commit comments

Comments
 (0)