github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/imagebuilder/client/impl.go (about)

     1  package client
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  
     7  	"github.com/Cloud-Foundations/Dominator/lib/errors"
     8  	"github.com/Cloud-Foundations/Dominator/lib/srpc"
     9  	proto "github.com/Cloud-Foundations/Dominator/proto/imaginator"
    10  )
    11  
    12  func buildImage(client *srpc.Client, request proto.BuildImageRequest,
    13  	response *proto.BuildImageResponse, logWriter io.Writer) error {
    14  	conn, err := client.Call("Imaginator.BuildImage")
    15  	if err != nil {
    16  		return err
    17  	}
    18  	defer conn.Close()
    19  	if err := conn.Encode(request); err != nil {
    20  		return err
    21  	}
    22  	if err := conn.Flush(); err != nil {
    23  		return err
    24  	}
    25  	str, err := conn.ReadString('\n')
    26  	if err != nil {
    27  		return err
    28  	}
    29  	if str != "\n" {
    30  		return errors.New(str[:len(str)-1])
    31  	}
    32  	for {
    33  		var reply proto.BuildImageResponse
    34  		if err := conn.Decode(&reply); err != nil {
    35  			return fmt.Errorf("error reading reply: %s", err)
    36  		}
    37  		if err := errors.New(reply.ErrorString); err != nil {
    38  			return err
    39  		}
    40  		logWriter.Write(reply.BuildLog)
    41  		reply.BuildLog = nil
    42  		if reply.Image != nil || reply.ImageName != "" {
    43  			*response = reply
    44  			return nil
    45  		}
    46  	}
    47  }