github.com/replicatedhq/ship@v0.55.0/pkg/images/progress.go (about)

     1  package images
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"io"
     7  
     8  	"github.com/docker/docker/pkg/jsonmessage"
     9  	"github.com/go-kit/kit/log"
    10  	"github.com/pkg/errors"
    11  )
    12  
    13  // TODO: This only supports json messages like this one:
    14  // {"status":"Waiting","progressDetail":{},"id":"462d60a56b09"}
    15  
    16  type Progress struct {
    17  	ID             string      `json:"id"` // this will be layer ID
    18  	Status         string      `json:"status"`
    19  	Image          string      `json:"image"`
    20  	ProgressDetail interface{} `json:"progressDetail"`
    21  }
    22  
    23  func copyDockerProgress(debug log.Logger, image string, reader io.ReadCloser, ch chan interface{}) error {
    24  	dec := json.NewDecoder(reader)
    25  	for {
    26  		var jm jsonmessage.JSONMessage
    27  		if err := dec.Decode(&jm); err == io.EOF {
    28  			return nil
    29  		} else if err != nil {
    30  			return errors.Wrap(err, "copy docker progress")
    31  		} else if jm.Error != nil {
    32  			return jm.Error
    33  		}
    34  
    35  		debug.Log("event", "docker.JSONMessage.receive", "JSONMessage", fmt.Sprintf("%+v", jm))
    36  
    37  		ch <- Progress{
    38  			ID:             jm.ID,
    39  			Status:         jm.Status,
    40  			Image:          image,
    41  			ProgressDetail: jm.Progress,
    42  		}
    43  	}
    44  }