controller: refactor progress api
Refactor the progress printer creation to the caller-side of the controller api. Then, instead of passing around status channels, we can simply pass around the higher level interface progress.Writer, which allows us to correctly pull warnings out of the remote controller. Signed-off-by: Justin Chadwell <me@jedevc.com>pull/1750/head
							parent
							
								
									3d49bbd23a
								
							
						
					
					
						commit
						1fd23933c2
					
				@ -0,0 +1,122 @@
 | 
			
		||||
package pb
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/docker/buildx/util/progress"
 | 
			
		||||
	control "github.com/moby/buildkit/api/services/control"
 | 
			
		||||
	"github.com/moby/buildkit/client"
 | 
			
		||||
	"github.com/opencontainers/go-digest"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type writer struct {
 | 
			
		||||
	ch chan<- *StatusResponse
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewProgressWriter(ch chan<- *StatusResponse) progress.Writer {
 | 
			
		||||
	return &writer{ch: ch}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (w *writer) Write(status *client.SolveStatus) {
 | 
			
		||||
	w.ch <- ToControlStatus(status)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (w *writer) ValidateLogSource(digest.Digest, interface{}) bool {
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (w *writer) ClearLogSource(interface{}) {}
 | 
			
		||||
 | 
			
		||||
func ToControlStatus(s *client.SolveStatus) *StatusResponse {
 | 
			
		||||
	resp := StatusResponse{}
 | 
			
		||||
	for _, v := range s.Vertexes {
 | 
			
		||||
		resp.Vertexes = append(resp.Vertexes, &control.Vertex{
 | 
			
		||||
			Digest:        v.Digest,
 | 
			
		||||
			Inputs:        v.Inputs,
 | 
			
		||||
			Name:          v.Name,
 | 
			
		||||
			Started:       v.Started,
 | 
			
		||||
			Completed:     v.Completed,
 | 
			
		||||
			Error:         v.Error,
 | 
			
		||||
			Cached:        v.Cached,
 | 
			
		||||
			ProgressGroup: v.ProgressGroup,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	for _, v := range s.Statuses {
 | 
			
		||||
		resp.Statuses = append(resp.Statuses, &control.VertexStatus{
 | 
			
		||||
			ID:        v.ID,
 | 
			
		||||
			Vertex:    v.Vertex,
 | 
			
		||||
			Name:      v.Name,
 | 
			
		||||
			Total:     v.Total,
 | 
			
		||||
			Current:   v.Current,
 | 
			
		||||
			Timestamp: v.Timestamp,
 | 
			
		||||
			Started:   v.Started,
 | 
			
		||||
			Completed: v.Completed,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	for _, v := range s.Logs {
 | 
			
		||||
		resp.Logs = append(resp.Logs, &control.VertexLog{
 | 
			
		||||
			Vertex:    v.Vertex,
 | 
			
		||||
			Stream:    int64(v.Stream),
 | 
			
		||||
			Msg:       v.Data,
 | 
			
		||||
			Timestamp: v.Timestamp,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	for _, v := range s.Warnings {
 | 
			
		||||
		resp.Warnings = append(resp.Warnings, &control.VertexWarning{
 | 
			
		||||
			Vertex: v.Vertex,
 | 
			
		||||
			Level:  int64(v.Level),
 | 
			
		||||
			Short:  v.Short,
 | 
			
		||||
			Detail: v.Detail,
 | 
			
		||||
			Url:    v.URL,
 | 
			
		||||
			Info:   v.SourceInfo,
 | 
			
		||||
			Ranges: v.Range,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	return &resp
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func FromControlStatus(resp *StatusResponse) *client.SolveStatus {
 | 
			
		||||
	s := client.SolveStatus{}
 | 
			
		||||
	for _, v := range resp.Vertexes {
 | 
			
		||||
		s.Vertexes = append(s.Vertexes, &client.Vertex{
 | 
			
		||||
			Digest:        v.Digest,
 | 
			
		||||
			Inputs:        v.Inputs,
 | 
			
		||||
			Name:          v.Name,
 | 
			
		||||
			Started:       v.Started,
 | 
			
		||||
			Completed:     v.Completed,
 | 
			
		||||
			Error:         v.Error,
 | 
			
		||||
			Cached:        v.Cached,
 | 
			
		||||
			ProgressGroup: v.ProgressGroup,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	for _, v := range resp.Statuses {
 | 
			
		||||
		s.Statuses = append(s.Statuses, &client.VertexStatus{
 | 
			
		||||
			ID:        v.ID,
 | 
			
		||||
			Vertex:    v.Vertex,
 | 
			
		||||
			Name:      v.Name,
 | 
			
		||||
			Total:     v.Total,
 | 
			
		||||
			Current:   v.Current,
 | 
			
		||||
			Timestamp: v.Timestamp,
 | 
			
		||||
			Started:   v.Started,
 | 
			
		||||
			Completed: v.Completed,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	for _, v := range resp.Logs {
 | 
			
		||||
		s.Logs = append(s.Logs, &client.VertexLog{
 | 
			
		||||
			Vertex:    v.Vertex,
 | 
			
		||||
			Stream:    int(v.Stream),
 | 
			
		||||
			Data:      v.Msg,
 | 
			
		||||
			Timestamp: v.Timestamp,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	for _, v := range resp.Warnings {
 | 
			
		||||
		s.Warnings = append(s.Warnings, &client.VertexWarning{
 | 
			
		||||
			Vertex:     v.Vertex,
 | 
			
		||||
			Level:      int(v.Level),
 | 
			
		||||
			Short:      v.Short,
 | 
			
		||||
			Detail:     v.Detail,
 | 
			
		||||
			URL:        v.Url,
 | 
			
		||||
			SourceInfo: v.Info,
 | 
			
		||||
			Range:      v.Ranges,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	return &s
 | 
			
		||||
}
 | 
			
		||||
					Loading…
					
					
				
		Reference in New Issue