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 }