in internal/pkg/term/selector/selector.go [621:738]
func (s *DeploySelector) deployedWorkload(workloadType string, msg, help string, app string, opts ...GetDeployedWorkloadOpts) (*DeployedWorkload, error) {
for _, opt := range opts {
opt(s)
}
var isWorkloadDeployed func(string, string, string) (bool, error)
var listDeployedWorkloads func(string, string) ([]string, error)
var finalMessage string
switch workloadType {
case svcWorkloadType:
isWorkloadDeployed = s.deployStoreSvc.IsServiceDeployed
listDeployedWorkloads = s.deployStoreSvc.ListDeployedServices
finalMessage = deployedSvcFinalMsg
case jobWorkloadType:
isWorkloadDeployed = s.deployStoreSvc.IsJobDeployed
listDeployedWorkloads = s.deployStoreSvc.ListDeployedJobs
finalMessage = deployedJobFinalMsg
case anyWorkloadType:
isWorkloadDeployed = s.deployStoreSvc.IsWorkloadDeployed
listDeployedWorkloads = s.deployStoreSvc.ListDeployedWorkloads
finalMessage = deployedWkldFinalMsg
default:
return nil, fmt.Errorf("unrecognized workload type %s", workloadType)
}
var err error
var envNames []string
wkldTypes := map[string]string{}
workloads, err := s.workloadLister.ListWorkloads(app)
if err != nil {
return nil, fmt.Errorf("list %ss: %w", workloadType, err)
}
for _, wkld := range workloads {
wkldTypes[wkld.Name] = wkld.Type
}
if s.env != "" {
envNames = append(envNames, s.env)
} else {
envNames, err = s.retrieveEnvironments(app)
if err != nil {
return nil, fmt.Errorf("list environments: %w", err)
}
}
wkldEnvs := []*DeployedWorkload{}
for _, envName := range envNames {
var wkldNames []string
if s.name != "" {
deployed, err := isWorkloadDeployed(app, envName, s.name)
if err != nil {
return nil, fmt.Errorf("check if %s %s is deployed in environment %s: %w", workloadType, s.name, envName, err)
}
if !deployed {
continue
}
wkldNames = append(wkldNames, s.name)
} else {
wkldNames, err = listDeployedWorkloads(app, envName)
if err != nil {
return nil, fmt.Errorf("list deployed %ss for environment %s: %w", workloadType, envName, err)
}
}
for _, wkldName := range wkldNames {
wkldEnv := &DeployedWorkload{
Name: wkldName,
Env: envName,
Type: wkldTypes[wkldName],
}
wkldEnvs = append(wkldEnvs, wkldEnv)
}
}
if len(wkldEnvs) == 0 {
return nil, fmt.Errorf("no deployed %ss found in application %s", workloadType, color.HighlightUserInput(app))
}
if wkldEnvs, err = s.filterWorkloads(wkldEnvs); err != nil {
return nil, err
}
if len(wkldEnvs) == 0 {
return nil, fmt.Errorf("no matching deployed %ss found in application %s", workloadType, color.HighlightUserInput(app))
}
// return if only one deployed workload found
var deployedWkld *DeployedWorkload
if len(wkldEnvs) == 1 {
deployedWkld = wkldEnvs[0]
switch {
case s.name == "" && s.env == "":
log.Infof("Found only one deployed %s %s in environment %s\n", workloadType, color.HighlightUserInput(deployedWkld.Name), color.HighlightUserInput(deployedWkld.Env))
case s.name != "" && s.env == "":
log.Infof("%s found only in environment %s\n", color.HighlightUserInput(deployedWkld.Name), color.HighlightUserInput(deployedWkld.Env))
case s.name == "" && s.env != "":
log.Infof("Only the %s %s is found in the environment %s\n", deployedWkld.Type, color.HighlightUserInput(deployedWkld.Name), color.HighlightUserInput(deployedWkld.Env))
}
return deployedWkld, nil
}
wkldEnvNames := make([]string, len(wkldEnvs))
wkldEnvNameMap := map[string]*DeployedWorkload{}
for i, svc := range wkldEnvs {
wkldEnvNames[i] = svc.String()
wkldEnvNameMap[wkldEnvNames[i]] = svc
}
wkldEnvName, err := s.prompt.SelectOne(
msg,
help,
wkldEnvNames,
prompt.WithFinalMessage(finalMessage),
)
if err != nil {
return nil, err
}
deployedWkld = wkldEnvNameMap[wkldEnvName]
return deployedWkld, nil
}