github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/cmd/builder-tool/buildImage.go (about) 1 package main 2 3 import ( 4 "bufio" 5 "bytes" 6 "encoding/gob" 7 "fmt" 8 "io" 9 "os" 10 11 "github.com/Cloud-Foundations/Dominator/imagebuilder/client" 12 "github.com/Cloud-Foundations/Dominator/lib/errors" 13 "github.com/Cloud-Foundations/Dominator/lib/fsutil" 14 "github.com/Cloud-Foundations/Dominator/lib/image" 15 "github.com/Cloud-Foundations/Dominator/lib/log" 16 proto "github.com/Cloud-Foundations/Dominator/proto/imaginator" 17 ) 18 19 func buildImageSubcommand(args []string, logger log.DebugLogger) error { 20 if err := buildImage(args, logger); err != nil { 21 return fmt.Errorf("Error building image: %s", err) 22 } 23 return nil 24 } 25 26 func buildImage(args []string, logger log.Logger) error { 27 srpcClient := getImaginatorClient() 28 request := proto.BuildImageRequest{ 29 StreamName: args[0], 30 ExpiresIn: *expiresIn, 31 MaxSourceAge: *maxSourceAge, 32 StreamBuildLog: true, 33 } 34 if len(args) > 1 { 35 request.GitBranch = args[1] 36 } 37 if *imageFilename != "" { 38 request.ReturnImage = true 39 } 40 logBuffer := &bytes.Buffer{} 41 var logWriter io.Writer 42 if *alwaysShowBuildLog { 43 fmt.Fprintln(os.Stderr, "Start of build log ==========================") 44 logWriter = os.Stderr 45 } else { 46 logWriter = logBuffer 47 } 48 var reply proto.BuildImageResponse 49 err := client.BuildImage(srpcClient, request, &reply, logWriter) 50 if err != nil { 51 if !*alwaysShowBuildLog { 52 os.Stderr.Write(logBuffer.Bytes()) 53 } 54 fmt.Fprintln(os.Stderr, "End of build log ============================") 55 return err 56 } 57 if *alwaysShowBuildLog { 58 fmt.Fprintln(os.Stderr, "End of build log ============================") 59 } 60 if *imageFilename != "" { 61 if reply.Image == nil { 62 if reply.ImageName == "" { 63 return errors.New("no image returned: upgrade the Imaginator") 64 } 65 return fmt.Errorf( 66 "image: %s uploaded, not returned: upgrade the Imaginator", 67 reply.ImageName) 68 } 69 return writeImage(reply.Image, *imageFilename) 70 } 71 fmt.Println(reply.ImageName) 72 return nil 73 } 74 75 func writeImage(img *image.Image, filename string) error { 76 file, err := fsutil.CreateRenamingWriter(filename, fsutil.PublicFilePerms) 77 if err != nil { 78 return err 79 } 80 defer file.Close() 81 writer := bufio.NewWriter(file) 82 defer writer.Flush() 83 encoder := gob.NewEncoder(writer) 84 return encoder.Encode(img) 85 }