code.cloudfoundry.org/cli@v7.1.0+incompatible/actor/v2action/resource.go (about)

     1  package v2action
     2  
     3  import (
     4  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv2"
     5  	log "github.com/sirupsen/logrus"
     6  )
     7  
     8  const (
     9  	DefaultFolderPermissions      = 0755
    10  	DefaultArchiveFilePermissions = 0744
    11  	MaxResourceMatchChunkSize     = 1000
    12  )
    13  
    14  var DefaultIgnoreLines = []string{
    15  	".cfignore",
    16  	".DS_Store",
    17  	".git",
    18  	".gitignore",
    19  	".hg",
    20  	".svn",
    21  	"_darcs",
    22  	"manifest.yaml",
    23  	"manifest.yml",
    24  }
    25  
    26  type Resource ccv2.Resource
    27  
    28  // ResourceMatch returns a set of matched resources and unmatched resources in
    29  // the order they were given in allResources.
    30  func (actor Actor) ResourceMatch(allResources []Resource) ([]Resource, []Resource, Warnings, error) {
    31  	resourcesToSend := [][]ccv2.Resource{{}}
    32  	var currentList, sendCount int
    33  	for _, resource := range allResources {
    34  		// Skip if resource is a directory, symlink, or empty file.
    35  		if resource.Size == 0 {
    36  			continue
    37  		}
    38  
    39  		resourcesToSend[currentList] = append(
    40  			resourcesToSend[currentList],
    41  			ccv2.Resource(resource),
    42  		)
    43  		sendCount++
    44  
    45  		if len(resourcesToSend[currentList]) == MaxResourceMatchChunkSize {
    46  			currentList++
    47  			resourcesToSend = append(resourcesToSend, []ccv2.Resource{})
    48  		}
    49  	}
    50  
    51  	log.WithFields(log.Fields{
    52  		"total_resources":    len(allResources),
    53  		"resources_to_match": sendCount,
    54  		"chunks":             len(resourcesToSend),
    55  	}).Debug("sending resource match stats")
    56  
    57  	matchedCCResources := map[string]ccv2.Resource{}
    58  	var allWarnings Warnings
    59  	for _, chunk := range resourcesToSend {
    60  		if len(chunk) == 0 {
    61  			log.Debug("chunk size 0, stopping resource match requests")
    62  			break
    63  		}
    64  
    65  		returnedResources, warnings, err := actor.CloudControllerClient.UpdateResourceMatch(chunk)
    66  		allWarnings = append(allWarnings, warnings...)
    67  
    68  		if err != nil {
    69  			log.Errorln("during resource matching", err)
    70  			return nil, nil, allWarnings, err
    71  		}
    72  
    73  		for _, resource := range returnedResources {
    74  			matchedCCResources[resource.SHA1] = resource
    75  		}
    76  	}
    77  	log.WithField("matched_resource_count", len(matchedCCResources)).Debug("total number of matched resources")
    78  
    79  	var matchedResources, unmatchedResources []Resource
    80  	for _, resource := range allResources {
    81  		if _, ok := matchedCCResources[resource.SHA1]; ok {
    82  			matchedResources = append(matchedResources, resource)
    83  		} else {
    84  			unmatchedResources = append(unmatchedResources, resource)
    85  		}
    86  	}
    87  
    88  	return matchedResources, unmatchedResources, allWarnings, nil
    89  }
    90  
    91  func (Actor) actorToCCResources(resources []Resource) []ccv2.Resource {
    92  	apiResources := make([]ccv2.Resource, 0, len(resources)) // Explicitly done to prevent nils
    93  
    94  	for _, resource := range resources {
    95  		apiResources = append(apiResources, ccv2.Resource(resource))
    96  	}
    97  
    98  	return apiResources
    99  }