github.com/liamawhite/cli-with-i18n@v6.32.1-0.20171122084555-dede0a5c3448+incompatible/actor/v3action/package.go (about)

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