This repository has been archived by the owner on Nov 4, 2019. It is now read-only.
/
admin.go
98 lines (89 loc) · 2.01 KB
/
admin.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
// Package admin provides convenience function for interacting with the admin
// service. The admin service is used for managing Lever OS itself.
package admin
import (
"bufio"
"fmt"
"io"
"os"
"github.com/leveros/leveros/api"
"github.com/leveros/leveros/core"
"github.com/leveros/leveros/leverutil"
)
// DeployServiceDir deploys provided dir onto Lever, as a Lever service.
func DeployServiceDir(
adminEnv string, host string, env string, srcDir string) error {
client, err := api.NewClient()
if err != nil {
return err
}
if host != "" {
client.ForceHost = host
}
info, err := os.Lstat(srcDir)
if err != nil {
return fmt.Errorf("Error getting info about source dir: %v", err)
}
if !info.IsDir() {
return fmt.Errorf("Source is not a directory")
}
_, err = core.ReadLeverConfig(srcDir)
if err != nil {
return fmt.Errorf("Error reading lever.json: %v", err)
}
pipeReader, pipeWriter := io.Pipe()
bufReader := bufio.NewReader(pipeReader)
errCh := make(chan error)
go func() {
tarErr := leverutil.Tar(pipeWriter, srcDir)
if tarErr != nil {
errCh <- fmt.Errorf("Error trying to tar dir: %v", tarErr)
return
}
tarErr = pipeWriter.Close()
if tarErr != nil {
errCh <- tarErr
}
close(errCh)
}()
endpoint := client.Service(adminEnv, "admin")
stream, err := endpoint.InvokeChan("DeployServiceChan", env)
if err != nil {
return fmt.Errorf("Error invoking DeployServiceChan: %v", err)
}
chunk := make([]byte, 32*1024)
for {
var size int
size, err = bufReader.Read(chunk)
if err == io.EOF {
break
}
if err != nil {
stream.Close()
return err
}
err = stream.Send(chunk[:size])
if err != nil {
stream.Close()
return err
}
}
err = stream.Close()
if err != nil {
return err
}
err, hasErr := <-errCh
if hasErr && err != nil {
return err
}
// Wait for remote to close stream.
var msg interface{}
err = stream.Receive(&msg)
if err == nil {
return fmt.Errorf("Unexpected message received")
}
if err != nil && err != io.EOF {
return err
}
return nil
}