blob: 5f719b495fe0a00b2ce957de54bc02063aa51bb6 [file] [log] [blame]
package impl
import (
"io/ioutil"
"os"
"path/filepath"
"time"
"veyron.io/veyron/veyron/services/mgmt/lib/binary"
"veyron.io/veyron/veyron2/context"
"veyron.io/veyron/veyron2/services/mgmt/application"
"veyron.io/veyron/veyron2/services/mgmt/repository"
"veyron.io/veyron/veyron2/vlog"
)
func downloadBinary(workspace, fileName, name string) error {
data, err := binary.Download(name)
if err != nil {
vlog.Errorf("Download(%v) failed: %v", name, err)
return errOperationFailed
}
path, perm := filepath.Join(workspace, fileName), os.FileMode(755)
if err := ioutil.WriteFile(path, data, perm); err != nil {
vlog.Errorf("WriteFile(%v, %v) failed: %v", path, perm, err)
return errOperationFailed
}
return nil
}
func fetchEnvelope(ctx context.T, origin string) (*application.Envelope, error) {
stub, err := repository.BindApplication(origin)
if err != nil {
vlog.Errorf("BindRepository(%v) failed: %v", origin, err)
return nil, errOperationFailed
}
// TODO(jsimsa): Include logic that computes the set of supported
// profiles.
profiles := []string{"test"}
envelope, err := stub.Match(ctx, profiles)
if err != nil {
vlog.Errorf("Match(%v) failed: %v", profiles, err)
return nil, errOperationFailed
}
return &envelope, nil
}
// linkSelf creates a link to the current binary.
func linkSelf(workspace, fileName string) error {
path := filepath.Join(workspace, fileName)
self := os.Args[0]
if err := os.Link(self, path); err != nil {
vlog.Errorf("Link(%v, %v) failed: %v", self, path, err)
return errOperationFailed
}
return nil
}
func generateVersionDirName() string {
return time.Now().Format(time.RFC3339Nano)
}
func updateLink(target, link string) error {
newLink := link + ".new"
fi, err := os.Lstat(newLink)
if err == nil {
if err := os.Remove(fi.Name()); err != nil {
vlog.Errorf("Remove(%v) failed: %v", fi.Name(), err)
return errOperationFailed
}
}
if err := os.Symlink(target, newLink); err != nil {
vlog.Errorf("Symlink(%v, %v) failed: %v", target, newLink, err)
return errOperationFailed
}
if err := os.Rename(newLink, link); err != nil {
vlog.Errorf("Rename(%v, %v) failed: %v", newLink, link, err)
return errOperationFailed
}
return nil
}
// cleanupDir is defined like this so we can override its implementation for
// tests.
var cleanupDir = func(dir string) {
if err := os.RemoveAll(dir); err != nil {
vlog.Errorf("RemoveAll(%v) failed: %v", dir, err)
}
}