github.com/cloudfoundry/cli@v7.1.0+incompatible/actor/v3action/droplet.go (about)

     1  package v3action
     2  
     3  import (
     4  	"code.cloudfoundry.org/cli/actor/actionerror"
     5  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccerror"
     6  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3"
     7  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant"
     8  	"code.cloudfoundry.org/cli/resources"
     9  )
    10  
    11  // Droplet represents a Cloud Controller droplet.
    12  type Droplet struct {
    13  	GUID       string
    14  	State      constant.DropletState
    15  	CreatedAt  string
    16  	Stack      string
    17  	Image      string
    18  	Buildpacks []Buildpack
    19  }
    20  
    21  type Buildpack resources.DropletBuildpack
    22  
    23  // SetApplicationDropletByApplicationNameAndSpace sets the droplet for an application.
    24  func (actor Actor) SetApplicationDropletByApplicationNameAndSpace(appName string, spaceGUID string, dropletGUID string) (Warnings, error) {
    25  	allWarnings := Warnings{}
    26  	application, warnings, err := actor.GetApplicationByNameAndSpace(appName, spaceGUID)
    27  	allWarnings = append(allWarnings, warnings...)
    28  	if err != nil {
    29  		return allWarnings, err
    30  	}
    31  	_, apiWarnings, err := actor.CloudControllerClient.SetApplicationDroplet(application.GUID, dropletGUID)
    32  	actorWarnings := Warnings(apiWarnings)
    33  	allWarnings = append(allWarnings, actorWarnings...)
    34  
    35  	if newErr, ok := err.(ccerror.UnprocessableEntityError); ok {
    36  		return allWarnings, actionerror.AssignDropletError{Message: newErr.Message}
    37  	}
    38  
    39  	return allWarnings, err
    40  }
    41  
    42  func (actor Actor) SetApplicationDroplet(appGUID string, dropletGUID string) (Warnings, error) {
    43  	_, warnings, err := actor.CloudControllerClient.SetApplicationDroplet(appGUID, dropletGUID)
    44  
    45  	if newErr, ok := err.(ccerror.UnprocessableEntityError); ok {
    46  		return Warnings(warnings), actionerror.AssignDropletError{Message: newErr.Message}
    47  	}
    48  
    49  	return Warnings(warnings), err
    50  }
    51  
    52  // GetApplicationDroplets returns the list of droplets that belong to applicaiton.
    53  func (actor Actor) GetApplicationDroplets(appName string, spaceGUID string) ([]Droplet, Warnings, error) {
    54  	allWarnings := Warnings{}
    55  	application, warnings, err := actor.GetApplicationByNameAndSpace(appName, spaceGUID)
    56  	allWarnings = append(allWarnings, warnings...)
    57  	if err != nil {
    58  		return nil, allWarnings, err
    59  	}
    60  
    61  	ccv3Droplets, apiWarnings, err := actor.CloudControllerClient.GetDroplets(
    62  		ccv3.Query{Key: ccv3.AppGUIDFilter, Values: []string{application.GUID}},
    63  	)
    64  	actorWarnings := Warnings(apiWarnings)
    65  	allWarnings = append(allWarnings, actorWarnings...)
    66  	if err != nil {
    67  		return nil, allWarnings, err
    68  	}
    69  
    70  	var droplets []Droplet
    71  	for _, ccv3Droplet := range ccv3Droplets {
    72  		droplets = append(droplets, actor.convertCCToActorDroplet(ccv3Droplet))
    73  	}
    74  
    75  	return droplets, allWarnings, err
    76  }
    77  
    78  func (actor Actor) GetCurrentDropletByApplication(appGUID string) (Droplet, Warnings, error) {
    79  	droplet, warnings, err := actor.CloudControllerClient.GetApplicationDropletCurrent(appGUID)
    80  	switch err.(type) {
    81  	case ccerror.ApplicationNotFoundError:
    82  		return Droplet{}, Warnings(warnings), actionerror.ApplicationNotFoundError{GUID: appGUID}
    83  	case ccerror.DropletNotFoundError:
    84  		return Droplet{}, Warnings(warnings), actionerror.DropletNotFoundError{AppGUID: appGUID}
    85  	}
    86  	return actor.convertCCToActorDroplet(droplet), Warnings(warnings), err
    87  }
    88  
    89  func (actor Actor) convertCCToActorDroplet(ccDroplet resources.Droplet) Droplet {
    90  	var buildpacks []Buildpack
    91  	for _, ccBuildpack := range ccDroplet.Buildpacks {
    92  		buildpacks = append(buildpacks, Buildpack(ccBuildpack))
    93  	}
    94  
    95  	return Droplet{
    96  		GUID:       ccDroplet.GUID,
    97  		State:      constant.DropletState(ccDroplet.State),
    98  		CreatedAt:  ccDroplet.CreatedAt,
    99  		Stack:      ccDroplet.Stack,
   100  		Buildpacks: buildpacks,
   101  		Image:      ccDroplet.Image,
   102  	}
   103  }