Exemplo n.º 1
0
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
		}
	}()
}
Exemplo n.º 2
0
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)
	}
}
Exemplo n.º 3
0
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
}
Exemplo n.º 4
0
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
}
Exemplo n.º 5
0
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
}
Exemplo n.º 6
0
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
}
Exemplo n.º 7
0
func s3Client() *s3.Client {
	client := s3.NewFromEnv()
	client.CustomEndpointHost = "s3-eu-west-1.amazonaws.com"
	return client
}
Exemplo n.º 8
0
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
}