in cli/azd/internal/cmd/show/show.go [138:281]
func (s *showAction) Run(ctx context.Context) (*actions.ActionResult, error) {
s.console.ShowSpinner(ctx, "Gathering information about your app and its resources...", input.Step)
defer s.console.StopSpinner(ctx, "", input.Step)
res := contracts.ShowResult{
Name: s.projectConfig.Name,
Services: make(map[string]contracts.ShowService),
}
stableServices, err := s.importManager.ServiceStable(ctx, s.projectConfig)
if err != nil {
return nil, err
}
for _, svc := range stableServices {
path, err := getFullPathToProjectForService(svc)
if err != nil {
return nil, err
}
showSvc := contracts.ShowService{
Project: contracts.ShowServiceProject{
Path: path,
Type: showTypeFromLanguage(svc.Language),
},
}
res.Services[svc.Name] = showSvc
}
// Add information about the target of each service, if we can determine it (if the infrastructure has
// not been deployed, for example, we'll just not include target information)
//
// Before we can discover resources, we need to load the current environment. We do this ourselves instead of
// having an environment injected into us so we can handle cases where the current environment doesn't exist (if we
// injected an environment, we'd prompt the user to see if they want to created one and we'd prefer not to have show
// interact with the user).
environmentName := s.flags.EnvironmentName
if environmentName == "" {
var err error
environmentName, err = s.azdCtx.GetDefaultEnvironmentName()
if err != nil {
log.Printf("could not determine current environment: %s, resource ids will not be available", err)
}
}
var subId, rgName string
if env, err := s.envManager.Get(ctx, environmentName); err != nil {
if errors.Is(err, environment.ErrNotFound) && s.flags.EnvironmentName != "" {
return nil, fmt.Errorf(
`"environment '%s' does not exist. You can create it with "azd env new"`, environmentName,
)
}
log.Printf("could not load environment: %s, resource ids will not be available", err)
} else {
if subId = env.GetSubscriptionId(); subId == "" {
log.Printf("provision has not been run, resource ids will not be available")
} else {
resourceManager, err := s.lazyResourceManager.GetValue()
if err != nil {
return nil, err
}
envName := env.Name()
if s.featureManager.IsEnabled(composeFeature) && len(s.args) > 0 {
name := s.args[0]
err := s.showResource(ctx, name, env)
if err != nil {
return nil, err
}
return nil, nil
}
rgName, err = s.infraResourceManager.FindResourceGroupForEnvironment(ctx, subId, envName)
if err == nil {
for _, serviceConfig := range stableServices {
svcName := serviceConfig.Name
resources, err := resourceManager.GetServiceResources(ctx, subId, rgName, serviceConfig)
if err == nil {
resourceIds := make([]string, len(resources))
for idx, res := range resources {
resourceIds[idx] = res.Id
}
resSvc := res.Services[svcName]
resSvc.Target = &contracts.ShowTargetArm{
ResourceIds: resourceIds,
}
resSvc.IngresUrl = s.serviceEndpoint(ctx, subId, serviceConfig, env)
res.Services[svcName] = resSvc
} else {
log.Printf("ignoring error determining resource id for service %s: %v", svcName, err)
}
}
} else {
log.Printf(
"ignoring error determining resource group for environment %s, resource ids will not be available: %v",
env.Name(),
err)
}
}
}
if s.formatter.Kind() == output.JsonFormat {
return nil, s.formatter.Format(res, s.writer, nil)
}
appEnvironments, err := s.envManager.List(ctx)
if err != nil {
return nil, err
}
uxEnvironments := make([]*ux.ShowEnvironment, len(appEnvironments))
for index, environment := range appEnvironments {
uxEnvironments[index] = &ux.ShowEnvironment{
Name: environment.Name,
IsCurrent: environment.Name == environmentName,
IsRemote: !environment.HasLocal && environment.HasRemote,
}
}
uxServices := make([]*ux.ShowService, len(res.Services))
var index int
for serviceName, service := range res.Services {
uxServices[index] = &ux.ShowService{
Name: serviceName,
IngresUrl: service.IngresUrl,
}
index++
}
s.console.MessageUxItem(ctx, &ux.Show{
AppName: s.projectConfig.Name,
Services: uxServices,
Environments: uxEnvironments,
AzurePortalLink: cmd.AzurePortalLink(s.portalUrlBase, subId, rgName),
})
return nil, nil
}