github.com/franc20/ayesa_sap@v7.0.0-beta.28.0.20200124003224-302d4d52fa6c+incompatible/actor/v7action/package.go (about)

     1  package v7action
     2  
     3  import (
     4  	"io"
     5  	"os"
     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 ccv3.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 := ccv3.Package{
    30  		Type: constant.PackageTypeDocker,
    31  		Relationships: ccv3.Relationships{
    32  			constant.RelationshipTypeApplication: ccv3.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  func (actor Actor) CreateAndUploadBitsPackageByApplicationNameAndSpace(appName string, spaceGUID string, bitsPath string) (Package, Warnings, error) {
    52  	app, allWarnings, err := actor.GetApplicationByNameAndSpace(appName, spaceGUID)
    53  	if err != nil {
    54  		return Package{}, allWarnings, err
    55  	}
    56  
    57  	if bitsPath == "" {
    58  		bitsPath, err = os.Getwd()
    59  		if err != nil {
    60  			return Package{}, allWarnings, err
    61  		}
    62  	}
    63  
    64  	info, err := os.Stat(bitsPath)
    65  	if err != nil {
    66  		return Package{}, allWarnings, err
    67  	}
    68  
    69  	var resources []sharedaction.Resource
    70  	if info.IsDir() {
    71  		resources, err = actor.SharedActor.GatherDirectoryResources(bitsPath)
    72  	} else {
    73  		resources, err = actor.SharedActor.GatherArchiveResources(bitsPath)
    74  	}
    75  	if err != nil {
    76  		return Package{}, allWarnings, err
    77  	}
    78  
    79  	// potentially match resources here in the future
    80  
    81  	var archivePath string
    82  	if info.IsDir() {
    83  		archivePath, err = actor.SharedActor.ZipDirectoryResources(bitsPath, resources)
    84  	} else {
    85  		archivePath, err = actor.SharedActor.ZipArchiveResources(bitsPath, resources)
    86  	}
    87  	if err != nil {
    88  		os.RemoveAll(archivePath)
    89  		return Package{}, allWarnings, err
    90  	}
    91  	defer os.RemoveAll(archivePath)
    92  
    93  	inputPackage := ccv3.Package{
    94  		Type: constant.PackageTypeBits,
    95  		Relationships: ccv3.Relationships{
    96  			constant.RelationshipTypeApplication: ccv3.Relationship{GUID: app.GUID},
    97  		},
    98  	}
    99  
   100  	pkg, warnings, err := actor.CloudControllerClient.CreatePackage(inputPackage)
   101  	allWarnings = append(allWarnings, warnings...)
   102  	if err != nil {
   103  		return Package{}, allWarnings, err
   104  	}
   105  
   106  	_, warnings, err = actor.CloudControllerClient.UploadPackage(pkg, archivePath)
   107  	allWarnings = append(allWarnings, warnings...)
   108  	if err != nil {
   109  		return Package{}, allWarnings, err
   110  	}
   111  
   112  	for pkg.State != constant.PackageReady &&
   113  		pkg.State != constant.PackageFailed &&
   114  		pkg.State != constant.PackageExpired {
   115  		time.Sleep(actor.Config.PollingInterval())
   116  		pkg, warnings, err = actor.CloudControllerClient.GetPackage(pkg.GUID)
   117  		allWarnings = append(allWarnings, warnings...)
   118  		if err != nil {
   119  			return Package{}, allWarnings, err
   120  		}
   121  	}
   122  
   123  	if pkg.State == constant.PackageFailed {
   124  		return Package{}, allWarnings, actionerror.PackageProcessingFailedError{}
   125  	} else if pkg.State == constant.PackageExpired {
   126  		return Package{}, allWarnings, actionerror.PackageProcessingExpiredError{}
   127  	}
   128  
   129  	updatedPackage, updatedWarnings, err := actor.PollPackage(Package(pkg))
   130  	return updatedPackage, append(allWarnings, updatedWarnings...), err
   131  }
   132  
   133  func (actor Actor) GetNewestReadyPackageForApplication(appGUID string) (Package, Warnings, error) {
   134  	ccv3Packages, warnings, err := actor.CloudControllerClient.GetPackages(
   135  		ccv3.Query{
   136  			Key:    ccv3.AppGUIDFilter,
   137  			Values: []string{appGUID},
   138  		},
   139  		ccv3.Query{
   140  			Key:    ccv3.StatesFilter,
   141  			Values: []string{string(constant.PackageReady)},
   142  		},
   143  		ccv3.Query{
   144  			Key:    ccv3.OrderBy,
   145  			Values: []string{ccv3.CreatedAtDescendingOrder},
   146  		},
   147  	)
   148  
   149  	if err != nil {
   150  		return Package{}, Warnings(warnings), err
   151  	}
   152  
   153  	if len(ccv3Packages) == 0 {
   154  		return Package{}, Warnings(warnings), actionerror.PackageNotFoundInAppError{}
   155  	}
   156  
   157  	return Package(ccv3Packages[0]), Warnings(warnings), nil
   158  }
   159  
   160  // GetApplicationPackages returns a list of package of an app.
   161  func (actor *Actor) GetApplicationPackages(appName string, spaceGUID string) ([]Package, Warnings, error) {
   162  	app, allWarnings, err := actor.GetApplicationByNameAndSpace(appName, spaceGUID)
   163  	if err != nil {
   164  		return nil, allWarnings, err
   165  	}
   166  
   167  	ccv3Packages, warnings, err := actor.CloudControllerClient.GetPackages(
   168  		ccv3.Query{Key: ccv3.AppGUIDFilter, Values: []string{app.GUID}},
   169  	)
   170  	allWarnings = append(allWarnings, warnings...)
   171  	if err != nil {
   172  		return nil, allWarnings, err
   173  	}
   174  
   175  	var packages []Package
   176  	for _, ccv3Package := range ccv3Packages {
   177  		packages = append(packages, Package(ccv3Package))
   178  	}
   179  
   180  	return packages, allWarnings, nil
   181  }
   182  
   183  func (actor Actor) CreateBitsPackageByApplication(appGUID string) (Package, Warnings, error) {
   184  	inputPackage := ccv3.Package{
   185  		Type: constant.PackageTypeBits,
   186  		Relationships: ccv3.Relationships{
   187  			constant.RelationshipTypeApplication: ccv3.Relationship{GUID: appGUID},
   188  		},
   189  	}
   190  
   191  	pkg, warnings, err := actor.CloudControllerClient.CreatePackage(inputPackage)
   192  	if err != nil {
   193  		return Package{}, Warnings(warnings), err
   194  	}
   195  
   196  	return Package(pkg), Warnings(warnings), err
   197  }
   198  
   199  func (actor Actor) UploadBitsPackage(pkg Package, matchedResources []sharedaction.V3Resource, newResources io.Reader, newResourcesLength int64) (Package, Warnings, error) {
   200  	apiResources := make([]ccv3.Resource, 0, len(matchedResources)) // Explicitly done to prevent nils
   201  
   202  	for _, resource := range matchedResources {
   203  		apiResources = append(apiResources, ccv3.Resource(resource))
   204  	}
   205  
   206  	appPkg, warnings, err := actor.CloudControllerClient.UploadBitsPackage(ccv3.Package(pkg), apiResources, newResources, newResourcesLength)
   207  	return Package(appPkg), Warnings(warnings), err
   208  }
   209  
   210  // PollPackage returns a package of an app.
   211  func (actor Actor) PollPackage(pkg Package) (Package, Warnings, error) {
   212  	var allWarnings Warnings
   213  
   214  	for pkg.State != constant.PackageReady && pkg.State != constant.PackageFailed && pkg.State != constant.PackageExpired {
   215  		time.Sleep(actor.Config.PollingInterval())
   216  		ccPkg, warnings, err := actor.CloudControllerClient.GetPackage(pkg.GUID)
   217  		log.WithFields(log.Fields{
   218  			"package_guid": pkg.GUID,
   219  			"state":        pkg.State,
   220  		}).Debug("polling package state")
   221  
   222  		allWarnings = append(allWarnings, warnings...)
   223  		if err != nil {
   224  			return Package{}, allWarnings, err
   225  		}
   226  
   227  		pkg = Package(ccPkg)
   228  	}
   229  
   230  	if pkg.State == constant.PackageFailed {
   231  		return Package{}, allWarnings, actionerror.PackageProcessingFailedError{}
   232  	} else if pkg.State == constant.PackageExpired {
   233  		return Package{}, allWarnings, actionerror.PackageProcessingExpiredError{}
   234  	}
   235  
   236  	return pkg, allWarnings, nil
   237  }