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  }