func()

in internal/pkg/cli/app_show.go [137:230]


func (o *showAppOpts) description() (*describe.App, error) {
	app, err := o.store.GetApplication(o.name)
	if err != nil {
		return nil, fmt.Errorf("get application %s: %w", o.name, err)
	}
	envs, err := o.store.ListEnvironments(o.name)
	if err != nil {
		return nil, fmt.Errorf("list environments in application %s: %w", o.name, err)
	}
	svcs, err := o.store.ListServices(o.name)
	if err != nil {
		return nil, fmt.Errorf("list services in application %s: %w", o.name, err)
	}
	jobs, err := o.store.ListJobs(o.name)
	if err != nil {
		return nil, fmt.Errorf("list jobs in application %s: %w", o.name, err)
	}
	wkldDeployedtoEnvs := make(map[string][]string)
	ctx, cancelWait := context.WithTimeout(context.Background(), waitForStackTimeout)
	defer cancelWait()
	g, _ := errgroup.WithContext(ctx)
	var mux sync.Mutex
	for i := range envs {
		env := envs[i]
		g.Go(func() error {
			return o.populateDeployedWorkloads(o.deployStore.ListDeployedJobs, wkldDeployedtoEnvs, env.Name, &mux)
		})
		g.Go(func() error {
			return o.populateDeployedWorkloads(o.deployStore.ListDeployedServices, wkldDeployedtoEnvs, env.Name, &mux)
		})
	}
	if err := g.Wait(); err != nil {
		return nil, err
	}
	// Sort the map values so that `output` is consistent and the unit test won't be flaky.
	for k := range wkldDeployedtoEnvs {
		sort.Strings(wkldDeployedtoEnvs[k])
	}

	pipelines, err := o.pipelineLister.ListDeployedPipelines(o.name)
	if err != nil {
		return nil, fmt.Errorf("list pipelines in application %s: %w", o.name, err)
	}
	var pipelineInfo []*codepipeline.Pipeline
	for _, pipeline := range pipelines {
		info, err := o.codepipeline.GetPipeline(pipeline.ResourceName)
		if err != nil {
			return nil, fmt.Errorf("get info for pipeline %s: %w", pipeline.Name, err)
		}
		pipelineInfo = append(pipelineInfo, info)
	}

	var trimmedEnvs []*config.Environment
	for _, env := range envs {
		trimmedEnvs = append(trimmedEnvs, &config.Environment{
			Name:      env.Name,
			AccountID: env.AccountID,
			Region:    env.Region,
		})
	}
	var trimmedSvcs []*config.Workload
	for _, svc := range svcs {
		trimmedSvcs = append(trimmedSvcs, &config.Workload{
			Name: svc.Name,
			Type: svc.Type,
		})
	}
	var trimmedJobs []*config.Workload
	for _, job := range jobs {
		trimmedJobs = append(trimmedJobs, &config.Workload{
			Name: job.Name,
			Type: job.Type,
		})
	}
	versionGetter, err := o.newVersionGetter(o.name)
	if err != nil {
		return nil, err
	}
	version, err := versionGetter.Version()
	if err != nil {
		return nil, fmt.Errorf("get version for application %s: %w", o.name, err)
	}
	return &describe.App{
		Name:                app.Name,
		Version:             version,
		URI:                 app.Domain,
		PermissionsBoundary: app.PermissionsBoundary,
		Envs:                trimmedEnvs,
		Services:            trimmedSvcs,
		Jobs:                trimmedJobs,
		Pipelines:           pipelineInfo,
		WkldDeployedtoEnvs:  wkldDeployedtoEnvs,
	}, nil
}