github.com/cloudfoundry-community/cloudfoundry-cli@v6.44.1-0.20240130060226-cda5ed8e89a5+incompatible/actor/v7action/package.go (about)

     1  package v7action
     2  
     3  import (
     4  	"code.cloudfoundry.org/cli/resources"
     5  	"io"
     6  	"time"
     7  
     8  	"code.cloudfoundry.org/cli/actor/actionerror"
     9  	"code.cloudfoundry.org/cli/actor/sharedaction"
    10  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3"
    11  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant"
    12  	log "github.com/sirupsen/logrus"
    13  )
    14  
    15  const (
    16  	DefaultFolderPermissions      = 0755
    17  	DefaultArchiveFilePermissions = 0744
    18  )
    19  
    20  type Package resources.Package
    21  
    22  type DockerImageCredentials struct {
    23  	Path     string
    24  	Username string
    25  	Password string
    26  }
    27  
    28  func (actor Actor) CreateDockerPackageByApplication(appGUID string, dockerImageCredentials DockerImageCredentials) (Package, Warnings, error) {
    29  	inputPackage := resources.Package{
    30  		Type: constant.PackageTypeDocker,
    31  		Relationships: resources.Relationships{
    32  			constant.RelationshipTypeApplication: resources.Relationship{GUID: appGUID},
    33  		},
    34  		DockerImage:    dockerImageCredentials.Path,
    35  		DockerUsername: dockerImageCredentials.Username,
    36  		DockerPassword: dockerImageCredentials.Password,
    37  	}
    38  	pkg, warnings, err := actor.CloudControllerClient.CreatePackage(inputPackage)
    39  	return Package(pkg), Warnings(warnings), err
    40  }
    41  
    42  func (actor Actor) CreateDockerPackageByApplicationNameAndSpace(appName string, spaceGUID string, dockerImageCredentials DockerImageCredentials) (Package, Warnings, error) {
    43  	app, getWarnings, err := actor.GetApplicationByNameAndSpace(appName, spaceGUID)
    44  	if err != nil {
    45  		return Package{}, getWarnings, err
    46  	}
    47  	pkg, warnings, err := actor.CreateDockerPackageByApplication(app.GUID, dockerImageCredentials)
    48  	return pkg, append(getWarnings, warnings...), err
    49  }
    50  
    51  // GetApplicationPackages returns a list of package of an app.
    52  func (actor *Actor) GetApplicationPackages(appName string, spaceGUID string) ([]Package, Warnings, error) {
    53  	app, allWarnings, err := actor.GetApplicationByNameAndSpace(appName, spaceGUID)
    54  	if err != nil {
    55  		return nil, allWarnings, err
    56  	}
    57  
    58  	ccv3Packages, warnings, err := actor.CloudControllerClient.GetPackages(
    59  		ccv3.Query{Key: ccv3.AppGUIDFilter, Values: []string{app.GUID}},
    60  	)
    61  	allWarnings = append(allWarnings, warnings...)
    62  	if err != nil {
    63  		return nil, allWarnings, err
    64  	}
    65  
    66  	var packages []Package
    67  	for _, ccv3Package := range ccv3Packages {
    68  		packages = append(packages, Package(ccv3Package))
    69  	}
    70  
    71  	return packages, allWarnings, nil
    72  }
    73  
    74  func (actor Actor) CreateBitsPackageByApplication(appGUID string) (Package, Warnings, error) {
    75  	inputPackage := resources.Package{
    76  		Type: constant.PackageTypeBits,
    77  		Relationships: resources.Relationships{
    78  			constant.RelationshipTypeApplication: resources.Relationship{GUID: appGUID},
    79  		},
    80  	}
    81  
    82  	pkg, warnings, err := actor.CloudControllerClient.CreatePackage(inputPackage)
    83  	if err != nil {
    84  		return Package{}, Warnings(warnings), err
    85  	}
    86  
    87  	return Package(pkg), Warnings(warnings), err
    88  }
    89  
    90  func (actor Actor) UploadBitsPackage(pkg Package, matchedResources []sharedaction.V3Resource, newResources io.Reader, newResourcesLength int64) (Package, Warnings, error) {
    91  	apiResources := make([]ccv3.Resource, 0, len(matchedResources)) // Explicitly done to prevent nils
    92  
    93  	for _, resource := range matchedResources {
    94  		apiResources = append(apiResources, ccv3.Resource(resource))
    95  	}
    96  
    97  	appPkg, warnings, err := actor.CloudControllerClient.UploadBitsPackage(resources.Package(pkg), apiResources, newResources, newResourcesLength)
    98  	return Package(appPkg), Warnings(warnings), err
    99  }
   100  
   101  // PollPackage returns a package of an app.
   102  func (actor Actor) PollPackage(pkg Package) (Package, Warnings, error) {
   103  	var allWarnings Warnings
   104  
   105  	for pkg.State != constant.PackageReady && pkg.State != constant.PackageFailed && pkg.State != constant.PackageExpired {
   106  		time.Sleep(actor.Config.PollingInterval())
   107  		ccPkg, warnings, err := actor.CloudControllerClient.GetPackage(pkg.GUID)
   108  		log.WithFields(log.Fields{
   109  			"package_guid": pkg.GUID,
   110  			"state":        pkg.State,
   111  		}).Debug("polling package state")
   112  
   113  		allWarnings = append(allWarnings, warnings...)
   114  		if err != nil {
   115  			return Package{}, allWarnings, err
   116  		}
   117  
   118  		pkg = Package(ccPkg)
   119  	}
   120  
   121  	if pkg.State == constant.PackageFailed {
   122  		return Package{}, allWarnings, actionerror.PackageProcessingFailedError{}
   123  	} else if pkg.State == constant.PackageExpired {
   124  		return Package{}, allWarnings, actionerror.PackageProcessingExpiredError{}
   125  	}
   126  
   127  	return pkg, allWarnings, nil
   128  }