forked from Cloud-Foundations/Dominator
/
buildImage.go
85 lines (80 loc) · 2.19 KB
/
buildImage.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
package main
import (
"bufio"
"bytes"
"encoding/gob"
"fmt"
"io"
"os"
"github.com/Cloud-Foundations/Dominator/imagebuilder/client"
"github.com/Cloud-Foundations/Dominator/lib/errors"
"github.com/Cloud-Foundations/Dominator/lib/fsutil"
"github.com/Cloud-Foundations/Dominator/lib/image"
"github.com/Cloud-Foundations/Dominator/lib/log"
proto "github.com/Cloud-Foundations/Dominator/proto/imaginator"
)
func buildImageSubcommand(args []string, logger log.DebugLogger) error {
if err := buildImage(args, logger); err != nil {
return fmt.Errorf("error building image: %s", err)
}
return nil
}
func buildImage(args []string, logger log.Logger) error {
srpcClient := getImaginatorClient()
request := proto.BuildImageRequest{
StreamName: args[0],
ExpiresIn: *expiresIn,
MaxSourceAge: *maxSourceAge,
StreamBuildLog: true,
}
if len(args) > 1 {
request.GitBranch = args[1]
}
if *imageFilename != "" {
request.ReturnImage = true
}
logBuffer := &bytes.Buffer{}
var logWriter io.Writer
if *alwaysShowBuildLog {
fmt.Fprintln(os.Stderr, "Start of build log ==========================")
logWriter = os.Stderr
} else {
logWriter = logBuffer
}
var reply proto.BuildImageResponse
err := client.BuildImage(srpcClient, request, &reply, logWriter)
if err != nil {
if !*alwaysShowBuildLog {
os.Stderr.Write(logBuffer.Bytes())
}
fmt.Fprintln(os.Stderr, "End of build log ============================")
return err
}
if *alwaysShowBuildLog {
fmt.Fprintln(os.Stderr, "End of build log ============================")
}
if *imageFilename != "" {
if reply.Image == nil {
if reply.ImageName == "" {
return errors.New("no image returned: upgrade the Imaginator")
}
return fmt.Errorf(
"image: %s uploaded, not returned: upgrade the Imaginator",
reply.ImageName)
}
return writeImage(reply.Image, *imageFilename)
}
fmt.Println(reply.ImageName)
return nil
}
func writeImage(img *image.Image, filename string) error {
file, err := fsutil.CreateRenamingWriter(filename, fsutil.PublicFilePerms)
if err != nil {
return err
}
defer file.Close()
writer := bufio.NewWriter(file)
defer writer.Flush()
encoder := gob.NewEncoder(writer)
return encoder.Encode(img)
}