github.com/nimakaviani/cli@v6.37.1-0.20180619223813-e734901a73fa+incompatible/actor/v3action/package.go (about)

     1  package v3action
     2  
     3  import (
     4  	"os"
     5  	"time"
     6  
     7  	"code.cloudfoundry.org/cli/actor/actionerror"
     8  	"code.cloudfoundry.org/cli/actor/sharedaction"
     9  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3"
    10  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant"
    11  )
    12  
    13  const (
    14  	DefaultFolderPermissions      = 0755
    15  	DefaultArchiveFilePermissions = 0744
    16  )
    17  
    18  type Package ccv3.Package
    19  
    20  type DockerImageCredentials struct {
    21  	Path     string
    22  	Username string
    23  	Password string
    24  }
    25  
    26  func (actor Actor) CreateDockerPackageByApplicationNameAndSpace(appName string, spaceGUID string, dockerImageCredentials DockerImageCredentials) (Package, Warnings, error) {
    27  	app, allWarnings, err := actor.GetApplicationByNameAndSpace(appName, spaceGUID)
    28  	if err != nil {
    29  		return Package{}, allWarnings, err
    30  	}
    31  	inputPackage := ccv3.Package{
    32  		Type: constant.PackageTypeDocker,
    33  		Relationships: ccv3.Relationships{
    34  			constant.RelationshipTypeApplication: ccv3.Relationship{GUID: app.GUID},
    35  		},
    36  		DockerImage:    dockerImageCredentials.Path,
    37  		DockerUsername: dockerImageCredentials.Username,
    38  		DockerPassword: dockerImageCredentials.Password,
    39  	}
    40  	pkg, warnings, err := actor.CloudControllerClient.CreatePackage(inputPackage)
    41  	allWarnings = append(allWarnings, warnings...)
    42  	if err != nil {
    43  		return Package{}, allWarnings, err
    44  	}
    45  	return Package(pkg), allWarnings, err
    46  }
    47  
    48  func (actor Actor) CreateAndUploadBitsPackageByApplicationNameAndSpace(appName string, spaceGUID string, bitsPath string) (Package, Warnings, error) {
    49  	app, allWarnings, err := actor.GetApplicationByNameAndSpace(appName, spaceGUID)
    50  	if err != nil {
    51  		return Package{}, allWarnings, err
    52  	}
    53  
    54  	if bitsPath == "" {
    55  		bitsPath, err = os.Getwd()
    56  		if err != nil {
    57  			return Package{}, allWarnings, err
    58  		}
    59  	}
    60  
    61  	info, err := os.Stat(bitsPath)
    62  	if err != nil {
    63  		return Package{}, allWarnings, err
    64  	}
    65  
    66  	var resources []sharedaction.Resource
    67  	if info.IsDir() {
    68  		resources, err = actor.SharedActor.GatherDirectoryResources(bitsPath)
    69  	} else {
    70  		resources, err = actor.SharedActor.GatherArchiveResources(bitsPath)
    71  	}
    72  	if err != nil {
    73  		return Package{}, allWarnings, err
    74  	}
    75  
    76  	// potentially match resources here in the future
    77  
    78  	var archivePath string
    79  	if info.IsDir() {
    80  		archivePath, err = actor.SharedActor.ZipDirectoryResources(bitsPath, resources)
    81  	} else {
    82  		archivePath, err = actor.SharedActor.ZipArchiveResources(bitsPath, resources)
    83  	}
    84  	if err != nil {
    85  		os.RemoveAll(archivePath)
    86  		return Package{}, allWarnings, err
    87  	}
    88  	defer os.RemoveAll(archivePath)
    89  
    90  	inputPackage := ccv3.Package{
    91  		Type: constant.PackageTypeBits,
    92  		Relationships: ccv3.Relationships{
    93  			constant.RelationshipTypeApplication: ccv3.Relationship{GUID: app.GUID},
    94  		},
    95  	}
    96  
    97  	pkg, warnings, err := actor.CloudControllerClient.CreatePackage(inputPackage)
    98  	allWarnings = append(allWarnings, warnings...)
    99  	if err != nil {
   100  		return Package{}, allWarnings, err
   101  	}
   102  
   103  	_, warnings, err = actor.CloudControllerClient.UploadPackage(pkg, archivePath)
   104  	allWarnings = append(allWarnings, warnings...)
   105  	if err != nil {
   106  		return Package{}, allWarnings, err
   107  	}
   108  
   109  	for pkg.State != constant.PackageReady &&
   110  		pkg.State != constant.PackageFailed &&
   111  		pkg.State != constant.PackageExpired {
   112  		time.Sleep(actor.Config.PollingInterval())
   113  		pkg, warnings, err = actor.CloudControllerClient.GetPackage(pkg.GUID)
   114  		allWarnings = append(allWarnings, warnings...)
   115  		if err != nil {
   116  			return Package{}, allWarnings, err
   117  		}
   118  	}
   119  
   120  	if pkg.State == constant.PackageFailed {
   121  		return Package{}, allWarnings, actionerror.PackageProcessingFailedError{}
   122  	} else if pkg.State == constant.PackageExpired {
   123  		return Package{}, allWarnings, actionerror.PackageProcessingExpiredError{}
   124  	}
   125  
   126  	return Package(pkg), allWarnings, err
   127  }
   128  
   129  // GetApplicationPackages returns a list of package of an app.
   130  func (actor *Actor) GetApplicationPackages(appName string, spaceGUID string) ([]Package, Warnings, error) {
   131  	app, allWarnings, err := actor.GetApplicationByNameAndSpace(appName, spaceGUID)
   132  	if err != nil {
   133  		return nil, allWarnings, err
   134  	}
   135  
   136  	ccv3Packages, warnings, err := actor.CloudControllerClient.GetPackages(
   137  		ccv3.Query{Key: ccv3.AppGUIDFilter, Values: []string{app.GUID}},
   138  	)
   139  	allWarnings = append(allWarnings, warnings...)
   140  	if err != nil {
   141  		return nil, allWarnings, err
   142  	}
   143  
   144  	var packages []Package
   145  	for _, ccv3Package := range ccv3Packages {
   146  		packages = append(packages, Package(ccv3Package))
   147  	}
   148  
   149  	return packages, allWarnings, nil
   150  }