github.com/loggregator/cli@v6.33.1-0.20180224010324-82334f081791+incompatible/actor/v3action/build.go (about)

     1  package v3action
     2  
     3  import (
     4  	"errors"
     5  	"time"
     6  
     7  	"code.cloudfoundry.org/cli/actor/actionerror"
     8  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3"
     9  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant"
    10  )
    11  
    12  func (actor Actor) StagePackage(packageGUID string, appName string) (<-chan Droplet, <-chan Warnings, <-chan error) {
    13  	dropletStream := make(chan Droplet)
    14  	warningsStream := make(chan Warnings)
    15  	errorStream := make(chan error)
    16  
    17  	go func() {
    18  		defer close(dropletStream)
    19  		defer close(warningsStream)
    20  		defer close(errorStream)
    21  
    22  		build := ccv3.Build{PackageGUID: packageGUID}
    23  		build, allWarnings, err := actor.CloudControllerClient.CreateBuild(build)
    24  		warningsStream <- Warnings(allWarnings)
    25  
    26  		if err != nil {
    27  			errorStream <- err
    28  			return
    29  		}
    30  
    31  		timeout := time.Now().Add(actor.Config.StagingTimeout())
    32  
    33  		for time.Now().Before(timeout) {
    34  			var warnings ccv3.Warnings
    35  			build, warnings, err = actor.CloudControllerClient.GetBuild(build.GUID)
    36  			warningsStream <- Warnings(warnings)
    37  			if err != nil {
    38  				errorStream <- err
    39  				return
    40  			}
    41  
    42  			switch build.State {
    43  			case constant.BuildFailed:
    44  				errorStream <- errors.New(build.Error)
    45  				return
    46  			case constant.BuildStaging:
    47  				time.Sleep(actor.Config.PollingInterval())
    48  			default:
    49  
    50  				//TODO: uncommend after #150569020
    51  				// ccv3Droplet, warnings, err := actor.CloudControllerClient.GetDroplet(build.DropletGUID)
    52  				// warningsStream <- Warnings(warnings)
    53  				// if err != nil {
    54  				// 	errorStream <- err
    55  				// 	return
    56  				// }
    57  
    58  				ccv3Droplet := ccv3.Droplet{
    59  					GUID:      build.DropletGUID,
    60  					State:     constant.DropletState(build.State),
    61  					CreatedAt: build.CreatedAt,
    62  				}
    63  
    64  				dropletStream <- actor.convertCCToActorDroplet(ccv3Droplet)
    65  				return
    66  			}
    67  		}
    68  
    69  		errorStream <- actionerror.StagingTimeoutError{AppName: appName, Timeout: actor.Config.StagingTimeout()}
    70  	}()
    71  
    72  	return dropletStream, warningsStream, errorStream
    73  }