diff --git a/cmd/up.go b/cmd/up.go index a5d7c2b..03ebaf3 100644 --- a/cmd/up.go +++ b/cmd/up.go @@ -2,16 +2,18 @@ package cmd import ( "fmt" - "github.com/pkg/errors" "io/ioutil" "log" "os" "os/signal" "path" + "strings" "sync" "syscall" "time" + "github.com/pkg/errors" + "github.com/alexellis/faasd/pkg" "github.com/alexellis/k3sup/pkg/env" "github.com/sethvargo/go-password/password" @@ -94,10 +96,30 @@ func runUp(_ *cobra.Command, _ []string) error { }) }() + gatewayURLChan := make(chan string, 1) + proxy := pkg.NewProxy(timeout) + go proxy.Start(gatewayURLChan) + go func() { wd, _ := os.Getwd() - proxy := pkg.NewProxy(path.Join(wd, "hosts"), timeout) - proxy.Start() + + time.Sleep(3 * time.Second) + + fileData, fileErr := ioutil.ReadFile(path.Join(wd, "hosts")) + if fileErr != nil { + log.Println(fileErr) + return + } + host := "" + lines := strings.Split(string(fileData), "\n") + for _, line := range lines { + if strings.Index(line, "gateway") > -1 { + host = line[:strings.Index(line, "\t")] + } + } + log.Printf("[up] Sending %s to proxy\n", host) + gatewayURLChan <- host + close(gatewayURLChan) }() wg.Wait() @@ -130,10 +152,10 @@ func makeBasicAuthFiles() error { func makeFile(filePath, fileContents string) error { _, err := os.Stat(filePath) if err == nil { - log.Printf("File exists: %q, Using data from this file",filePath) + log.Printf("File exists: %q\n", filePath) return nil } else if os.IsNotExist(err) { - log.Printf("Writing file: %q", filePath) + log.Printf("Writing to: %q\n", filePath) return ioutil.WriteFile(filePath, []byte(fileContents), 0644) } else { return err @@ -143,12 +165,12 @@ func makeFile(filePath, fileContents string) error { func makeServiceDefinitions(archSuffix string) []pkg.Service { wd, _ := os.Getwd() - secretMountDir := "/run/secrets/" + secretMountDir := "/run/secrets" return []pkg.Service{ pkg.Service{ - Name: "basic-auth-plugin", - Image: "docker.io/openfaas/basic-auth-plugin:0.18.10" + archSuffix, + Name: "basic-auth-plugin", + Image: "docker.io/openfaas/basic-auth-plugin:0.18.10" + archSuffix, Env: []string{ "port=8080", "secret_mount_path=" + secretMountDir, @@ -157,16 +179,16 @@ func makeServiceDefinitions(archSuffix string) []pkg.Service { }, Mounts: []pkg.Mount{ pkg.Mount{ - Src:path.Join(wd, "/basic-auth-password"), - Dest:secretMountDir + "basic-auth-password", + Src: path.Join(wd, "basic-auth-password"), + Dest: path.Join(secretMountDir, "basic-auth-password"), }, pkg.Mount{ - Src: path.Join(wd, "/basic-auth-user"), - Dest: secretMountDir + "basic-auth-user", + Src: path.Join(wd, "basic-auth-user"), + Dest: path.Join(secretMountDir, "basic-auth-user"), }, }, Caps: []string{"CAP_NET_RAW"}, - Args: nil, + Args: nil, }, pkg.Service{ Name: "nats", @@ -202,18 +224,18 @@ func makeServiceDefinitions(archSuffix string) []pkg.Service { "auth_proxy_pass_body=false", "secret_mount_path=" + secretMountDir, }, - Image: "docker.io/openfaas/gateway:0.18.8" + archSuffix, + Image: "docker.io/openfaas/gateway:0.18.8" + archSuffix, Mounts: []pkg.Mount{ pkg.Mount{ - Src:path.Join(wd, "/basic-auth-password"), - Dest:secretMountDir + "basic-auth-password", + Src: path.Join(wd, "basic-auth-password"), + Dest: path.Join(secretMountDir, "basic-auth-password"), }, pkg.Mount{ - Src: path.Join(wd, "/basic-auth-user"), - Dest: secretMountDir + "basic-auth-user", + Src: path.Join(wd, "basic-auth-user"), + Dest: path.Join(secretMountDir, "basic-auth-user"), }, }, - Caps: []string{"CAP_NET_RAW"}, + Caps: []string{"CAP_NET_RAW"}, }, pkg.Service{ Name: "queue-worker", @@ -228,18 +250,18 @@ func makeServiceDefinitions(archSuffix string) []pkg.Service { "basic_auth=true", "secret_mount_path=" + secretMountDir, }, - Image: "docker.io/openfaas/queue-worker:0.9.0", + Image: "docker.io/openfaas/queue-worker:0.9.0", Mounts: []pkg.Mount{ pkg.Mount{ - Src:path.Join(wd, "/basic-auth-password"), - Dest:secretMountDir + "basic-auth-password", + Src: path.Join(wd, "basic-auth-password"), + Dest: path.Join(secretMountDir, "basic-auth-password"), }, pkg.Mount{ - Src: path.Join(wd, "/basic-auth-user"), - Dest: secretMountDir + "basic-auth-user", + Src: path.Join(wd, "basic-auth-user"), + Dest: path.Join(secretMountDir, "basic-auth-user"), }, }, - Caps: []string{"CAP_NET_RAW"}, + Caps: []string{"CAP_NET_RAW"}, }, } } diff --git a/pkg/proxy.go b/pkg/proxy.go index 71bcdb8..cf0ad9f 100644 --- a/pkg/proxy.go +++ b/pkg/proxy.go @@ -6,48 +6,36 @@ import ( "io/ioutil" "log" "net/http" - "strings" "time" ) -func NewProxy(hosts string, timeout time.Duration) *Proxy { +func NewProxy(timeout time.Duration) *Proxy { return &Proxy{ - Hosts: hosts, Timeout: timeout, } } type Proxy struct { - Hosts string Timeout time.Duration } -func (p *Proxy) Start() error { +func (p *Proxy) Start(gatewayChan chan string) error { tcp := 8080 http.DefaultClient.CheckRedirect = func(req *http.Request, via []*http.Request) error { return http.ErrUseLastResponse } - time.Sleep(3 * time.Second) - log.Printf("Starting faasd proxy on %d\n", tcp) data := struct{ host string }{ host: "", } - fileData, fileErr := ioutil.ReadFile(p.Hosts) - if fileErr != nil { - return fileErr - } + data.host = <-gatewayChan + + log.Printf("Starting faasd proxy on %d\n", tcp) - lines := strings.Split(string(fileData), "\n") - for _, line := range lines { - if strings.Index(line, "gateway") > -1 { - data.host = line[:strings.Index(line, "\t")] - } - } fmt.Printf("Gateway: %s\n", data.host) s := &http.Server{ @@ -72,6 +60,8 @@ func (p *Proxy) Start() error { wrapper := ioutil.NopCloser(r.Body) upReq, upErr := http.NewRequest(r.Method, upstream, wrapper) + copyHeaders(upReq.Header, &r.Header) + if upErr != nil { log.Println(upErr) @@ -88,9 +78,7 @@ func (p *Proxy) Start() error { return } - for k, v := range upRes.Header { - w.Header().Set(k, v[0]) - } + copyHeaders(w.Header(), &upRes.Header) w.WriteHeader(upRes.StatusCode) io.Copy(w, upRes.Body) @@ -100,3 +88,12 @@ func (p *Proxy) Start() error { return s.ListenAndServe() } + +// copyHeaders clones the header values from the source into the destination. +func copyHeaders(destination http.Header, source *http.Header) { + for k, v := range *source { + vClone := make([]string, len(v)) + copy(vClone, v) + destination[k] = vClone + } +} diff --git a/pkg/supervisor.go b/pkg/supervisor.go index f25bc3c..9140184 100644 --- a/pkg/supervisor.go +++ b/pkg/supervisor.go @@ -153,7 +153,7 @@ func (s *Supervisor) Start(svcs []Service) error { ) if containerCreateErr != nil { - log.Println(containerCreateErr) + log.Printf("Error creating container %s\n", containerCreateErr) return containerCreateErr } @@ -161,7 +161,7 @@ func (s *Supervisor) Start(svcs []Service) error { task, err := newContainer.NewTask(ctx, cio.NewCreator(cio.WithStdio)) if err != nil { - log.Println(err) + log.Printf("Error creating task: %s\n", err) return err } @@ -175,19 +175,21 @@ func (s *Supervisor) Start(svcs []Service) error { writeErr := ioutil.WriteFile("hosts", hosts, 0644) if writeErr != nil { - log.Println("Error writing hosts file") + log.Printf("Error writing file %s %s\n", "hosts", writeErr) } // os.Chown("hosts", 101, 101) - exitStatusC, err := task.Wait(ctx) + _, err = task.Wait(ctx) if err != nil { - log.Println(err) + log.Printf("Wait err: %s\n", err) return err } - log.Println("Exited: ", exitStatusC) - if err := task.Start(ctx); err != nil { - log.Println("Task err: ", err) + log.Printf("Task: %s\tContainer: %s\n", task.ID(), newContainer.ID()) + // log.Println("Exited: ", exitStatusC) + + if err = task.Start(ctx); err != nil { + log.Printf("Task err: %s\n", err) return err } }