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

     1  package v3action
     2  
     3  import (
     4  	"fmt"
     5  	"sort"
     6  	"strings"
     7  
     8  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant"
     9  )
    10  
    11  // ProcessSummary represents a process with instance details.
    12  type ProcessSummary struct {
    13  	Process
    14  
    15  	InstanceDetails []ProcessInstance
    16  }
    17  
    18  type ProcessSummaries []ProcessSummary
    19  
    20  func (p ProcessSummary) TotalInstanceCount() int {
    21  	return len(p.InstanceDetails)
    22  }
    23  
    24  func (p ProcessSummary) HealthyInstanceCount() int {
    25  	count := 0
    26  	for _, instance := range p.InstanceDetails {
    27  		if instance.State == constant.ProcessInstanceRunning {
    28  			count++
    29  		}
    30  	}
    31  	return count
    32  }
    33  
    34  func (ps ProcessSummaries) Sort() {
    35  	sort.Slice(ps, func(i int, j int) bool {
    36  		var iScore int
    37  		var jScore int
    38  
    39  		switch ps[i].Type {
    40  		case constant.ProcessTypeWeb:
    41  			iScore = 0
    42  		default:
    43  			iScore = 1
    44  		}
    45  
    46  		switch ps[j].Type {
    47  		case constant.ProcessTypeWeb:
    48  			jScore = 0
    49  		default:
    50  			jScore = 1
    51  		}
    52  
    53  		if iScore == 1 && jScore == 1 {
    54  			return ps[i].Type < ps[j].Type
    55  		}
    56  		return iScore < jScore
    57  	})
    58  }
    59  
    60  func (ps ProcessSummaries) String() string {
    61  	ps.Sort()
    62  
    63  	var summaries []string
    64  	for _, p := range ps {
    65  		summaries = append(summaries, fmt.Sprintf("%s:%d/%d", p.Type, p.HealthyInstanceCount(), p.TotalInstanceCount()))
    66  	}
    67  
    68  	return strings.Join(summaries, ", ")
    69  }
    70  
    71  func (actor Actor) getProcessSummariesForApp(appGUID string) (ProcessSummaries, Warnings, error) {
    72  	var allWarnings Warnings
    73  
    74  	ccv3Processes, warnings, err := actor.CloudControllerClient.GetApplicationProcesses(appGUID)
    75  	allWarnings = Warnings(warnings)
    76  	if err != nil {
    77  		return nil, allWarnings, err
    78  	}
    79  
    80  	var processSummaries ProcessSummaries
    81  	for _, ccv3Process := range ccv3Processes {
    82  		processGUID := ccv3Process.GUID
    83  		instances, warnings, err := actor.CloudControllerClient.GetProcessInstances(processGUID)
    84  		allWarnings = append(allWarnings, Warnings(warnings)...)
    85  		if err != nil {
    86  			return nil, allWarnings, err
    87  		}
    88  
    89  		processSummary := ProcessSummary{
    90  			Process: Process(ccv3Process),
    91  		}
    92  		for _, instance := range instances {
    93  			processSummary.InstanceDetails = append(processSummary.InstanceDetails, ProcessInstance(instance))
    94  		}
    95  
    96  		processSummaries = append(processSummaries, processSummary)
    97  	}
    98  
    99  	return processSummaries, allWarnings, nil
   100  }