in internal/pkg/term/selector/selector.go [461:558]
func (s *DeploySelect) DeployedService(msg, help string, app string, opts ...GetDeployedServiceOpts) (*DeployedService, error) {
for _, opt := range opts {
opt(s)
}
var err error
var envNames []string
svcTypes := map[string]string{}
// ServiceType is only utilized by the filtering functionality. No need to retrieve types if filters are not being applied
if len(s.filters) > 0 {
services, err := s.config.ListServices(app)
if err != nil {
return nil, fmt.Errorf("list services: %w", err)
}
for _, svc := range services {
svcTypes[svc.Name] = svc.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)
}
}
svcEnvs := []*DeployedService{}
for _, envName := range envNames {
var svcNames []string
if s.svc != "" {
deployed, err := s.deployStoreSvc.IsServiceDeployed(app, envName, s.svc)
if err != nil {
return nil, fmt.Errorf("check if service %s is deployed in environment %s: %w", s.svc, envName, err)
}
if !deployed {
continue
}
svcNames = append(svcNames, s.svc)
} else {
svcNames, err = s.deployStoreSvc.ListDeployedServices(app, envName)
if err != nil {
return nil, fmt.Errorf("list deployed service for environment %s: %w", envName, err)
}
}
for _, svcName := range svcNames {
svcEnv := &DeployedService{
Svc: svcName,
Env: envName,
SvcType: svcTypes[svcName],
}
svcEnvs = append(svcEnvs, svcEnv)
}
}
if len(svcEnvs) == 0 {
return nil, fmt.Errorf("no deployed services found in application %s", color.HighlightUserInput(app))
}
if svcEnvs, err = s.filterServices(svcEnvs); err != nil {
return nil, err
}
if len(svcEnvs) == 0 {
return nil, fmt.Errorf("no matching deployed services found in application %s", color.HighlightUserInput(app))
}
// return if only one deployed service found
var deployedSvc *DeployedService
if len(svcEnvs) == 1 {
deployedSvc = svcEnvs[0]
if s.svc == "" && s.env == "" {
log.Infof("Found only one deployed service %s in environment %s\n", color.HighlightUserInput(deployedSvc.Svc), color.HighlightUserInput(deployedSvc.Env))
}
if (s.svc != "") != (s.env != "") {
log.Infof("Service %s found in environment %s\n", color.HighlightUserInput(deployedSvc.Svc), color.HighlightUserInput(deployedSvc.Env))
}
return deployedSvc, nil
}
svcEnvNames := make([]string, len(svcEnvs))
svcEnvNameMap := map[string]*DeployedService{}
for i, svc := range svcEnvs {
svcEnvNames[i] = svc.String()
svcEnvNameMap[svcEnvNames[i]] = svc
}
svcEnvName, err := s.prompt.SelectOne(
msg,
help,
svcEnvNames,
prompt.WithFinalMessage(deployedSvcFinalMsg),
)
if err != nil {
return nil, fmt.Errorf("select deployed services for application %s: %w", app, err)
}
deployedSvc = svcEnvNameMap[svcEnvName]
return deployedSvc, nil
}