func NewContainerManager(s3Bucket, s3Prefix, appname string, proxy *Proxy, cfgFile string, rport int) (*ContainerManager, error) { cm := &ContainerManager{ S3Bucket: s3Bucket, S3Prefix: s3Prefix, AppName: appname, Proxy: proxy, RegistryPort: rport, s3client: s3.NewFromEnv(), containers: map[string]int{}, containerEnv: map[string]string{}, } if cfgFile != "" { err := cm.readConfigFile(cfgFile) if err != nil { return nil, err } } cm.dockerHost = dockerclient.New("http://127.0.0.1:4243") return cm, func() error { err := cm.runLatest() switch err { case nil, ErrorLaunchConfigNotFound: return nil default: return err } }() }
func (server *Server) newResource(r *http.Request) Resource { if server.Bucket != "" { client := s3.NewFromEnv() return &S3Resource{Request: r, Bucket: server.Bucket, Prefix: server.Prefix, Client: client} } else { return NewFileResource(server.DataRoot, r) } }
func (cc *currentEnv) Run() error { s3client := s3.NewFromEnv() cfg, err := wunderproxy.LoadCurrentLaunchConfig(s3client, cc.S3Bucket, cc.S3Prefix) if err != nil { return err } fmt.Println(strings.Join(cfg.ContainerConfig.Env, "\n")) return nil }
func (cm *ContainerManager) StartContainer(hash string) (string, int, error) { cm.s3client = s3.NewFromEnv() cfg, e := LoadLaunchConfig(cm.s3client, cm.S3Bucket, cm.S3Prefix, hash) if e != nil { return "", -1, e } containerId, port, err := cm.execute(cfg) if err != nil { return "", -1, err } cm.currentContainer = containerId cm.containers[hash] = port return containerId, port, nil }
func (cm *ContainerManager) SwitchContainer(hash string) (string, int, error) { cm.s3client = s3.NewFromEnv() port, ok := cm.containers[hash] if !ok { return "", -1, fmt.Errorf("don't know about a container with revision %q", hash) } cm.Proxy.Update(fmt.Sprintf("localhost:%d", port)) // Stop old containers. Ignore errors ... they'll get visible soon enough. go func() { logger.Printf("stopping old containers") err := cm.StopOldContainers() if err != nil { logger.Printf("error stopping old containers: %s", err) } }() return cm.currentContainer, port, nil }
func run() error { var dir = flag.String("d", ".", "Path to project") var s3Bucket = flag.String("bucket", "", "S3 Bucket to upload binary to") flag.Parse() p, e := build(*dir) if *s3Bucket != "" { client := s3.NewFromEnv() e := func() error { f, e := os.Open(p) if e != nil { return e } defer f.Close() log.Printf("uploading %q to %q", p, *s3Bucket) client.PutStream("bucket", path.Base(p), f, nil) return nil }() if e != nil { return e } } return e }
func s3Client() *s3.Client { client := s3.NewFromEnv() client.CustomEndpointHost = "s3-eu-west-1.amazonaws.com" return client }
func (b *build) Run() error { defer benchmark("build")() currentPkg, e := b.currentPackage() if e != nil { return e } cfg, e := parseConfig(b.Host) if e != nil { return e } dbg.Printf("using config %#v", cfg) con, e := cfg.Connection() if e != nil { return e } defer con.Close() name, e := b.createArchive() if e != nil { return e } dbg.Printf("created archive at %q", name) defer os.RemoveAll(name) f, e := os.Open(name) if e != nil { return e } defer f.Close() ses, e := con.NewSession() if e != nil { return e } ses.Stdin = f ses.Stdout = os.Stdout ses.Stderr = os.Stderr buildCfg := &buildConfig{ Current: currentPkg, Sudo: cfg.User != "root", Verbose: b.verbose, Version: b.GoVersion, } if buildCfg.Version == "" { buildCfg.Version = "1.3.3" } cmd := renderRecursive(buildCmd, buildCfg) e = ses.Run(cmd) if e != nil { return e } name = path.Base(currentPkg) var binPath string if b.Bucket != "" || b.DeployTo != "" { defer os.RemoveAll(binPath) e = func() error { ses, e := con.NewSession() if e != nil { return e } defer ses.Close() f, e := ioutil.TempFile("/tmp", "gobuild-bin-") if e != nil { return e } binPath = f.Name() defer f.Close() ses.Stdout = f ses.Stderr = os.Stderr cmd := renderRecursive("cat {{ .Gopath }}/bin/{{ .BinName }}", buildCfg) e = ses.Run(cmd) if e != nil { return e } return nil }() if e != nil { return e } } if name != "" { defer os.RemoveAll(binPath) } if b.Bucket != "" { e = func() error { f, e := os.Open(binPath) if e != nil { return e } defer f.Close() client := s3.NewFromEnv() client.CustomEndpointHost = "s3-eu-west-1.amazonaws.com" bucket, key := bucketAndKey(b.Bucket, name) logger.Printf("uploading to bucket=%q key=%q", bucket, key) opts := &s3.PutOptions{} if b.Public { opts.AmzAcl = "public-read" } return client.PutStream(bucket, key, f, opts) }() if e != nil { return e } logger.Printf("uploaded to bucket %q", b.Bucket) } if b.DeployTo != "" { e := func() error { cfg, e := parseConfig(b.DeployTo) if e != nil { return e } con, e := cfg.Connection() if e != nil { return e } defer con.Close() ses, e := con.NewSession() if e != nil { return e } defer ses.Close() f, e := os.Open(binPath) if e != nil { return e } defer f.Close() ses.Stdin = f ses.Stdout = os.Stdout ses.Stderr = os.Stderr s := struct { Name string Sudo bool DeployDir string }{ Name: name, Sudo: cfg.User != "root", DeployDir: b.DeployDir, } cmd := renderRecursive("cd {{ .DeployDir }} && cat - | {{ if .Sudo }}sudo {{ end}}tee {{ .Name }}.tmp > /dev/null && {{ if .Sudo }}sudo {{ end }}chmod 0755 {{ .Name }}.tmp && {{ if .Sudo }}sudo {{ end }}mv {{ .Name }}.tmp {{ .Name }}", s) dbg.Printf("%s", cmd) return ses.Run(cmd) }() if e != nil { return e } } return nil }