in internal/pkg/describe/backend_service.go [118:240]
func (d *BackendServiceDescriber) Describe() (HumanJSONStringer, error) {
environments, err := d.store.ListEnvironmentsDeployedTo(d.app, d.svc)
if err != nil {
return nil, fmt.Errorf("list deployed environments for application %s: %w", d.app, err)
}
var routes []*WebServiceRoute
var configs []*ECSServiceConfig
sdEndpoints := make(serviceDiscoveries)
scEndpoints := make(serviceConnects)
var envVars []*containerEnvVar
var secrets []*secret
var alarmDescriptions []*cloudwatch.AlarmDescription
for _, env := range environments {
svcDescr, err := d.initECSServiceDescribers(env)
if err != nil {
return nil, err
}
uri, err := d.URI(env)
if err != nil {
return nil, fmt.Errorf("retrieve service URI: %w", err)
}
if uri.AccessType == URIAccessTypeInternal {
routes = append(routes, &WebServiceRoute{
Environment: env,
URL: uri.URI,
})
}
svcParams, err := svcDescr.Params()
if err != nil {
return nil, fmt.Errorf("get stack parameters for environment %s: %w", env, err)
}
envDescr, err := d.initEnvDescribers(env)
if err != nil {
return nil, err
}
port := blankContainerPort
if isReachableWithinVPC(svcParams) {
port = svcParams[cfnstack.WorkloadTargetPortParamKey]
if err := sdEndpoints.collectEndpoints(envDescr, d.svc, env, port); err != nil {
return nil, err
}
if err := scEndpoints.collectEndpoints(svcDescr, env); err != nil {
return nil, err
}
}
containerPlatform, err := svcDescr.Platform()
if err != nil {
return nil, fmt.Errorf("retrieve platform: %w", err)
}
configs = append(configs, &ECSServiceConfig{
ServiceConfig: &ServiceConfig{
Environment: env,
Port: port,
CPU: svcParams[cfnstack.WorkloadTaskCPUParamKey],
Memory: svcParams[cfnstack.WorkloadTaskMemoryParamKey],
Platform: dockerengine.PlatformString(containerPlatform.OperatingSystem, containerPlatform.Architecture),
},
Tasks: svcParams[cfnstack.WorkloadTaskCountParamKey],
})
alarmNames, err := svcDescr.RollbackAlarmNames()
if err != nil {
return nil, fmt.Errorf("retrieve rollback alarm names: %w", err)
}
if len(alarmNames) != 0 {
cwAlarmDescr, err := d.initCWDescriber(env)
if err != nil {
return nil, err
}
alarmDescs, err := cwAlarmDescr.AlarmDescriptions(alarmNames)
if err != nil {
return nil, fmt.Errorf("retrieve alarm descriptions: %w", err)
}
for _, alarm := range alarmDescs {
alarm.Environment = env
}
alarmDescriptions = append(alarmDescriptions, alarmDescs...)
}
backendSvcEnvVars, err := svcDescr.EnvVars()
if err != nil {
return nil, fmt.Errorf("retrieve environment variables: %w", err)
}
envVars = append(envVars, flattenContainerEnvVars(env, backendSvcEnvVars)...)
webSvcSecrets, err := svcDescr.Secrets()
if err != nil {
return nil, fmt.Errorf("retrieve secrets: %w", err)
}
secrets = append(secrets, flattenSecrets(env, webSvcSecrets)...)
}
resources := make(map[string][]*stack.Resource)
if d.enableResources {
for _, env := range environments {
svcDescr, err := d.initECSServiceDescribers(env)
if err != nil {
return nil, err
}
stackResources, err := svcDescr.StackResources()
if err != nil {
return nil, fmt.Errorf("retrieve service resources: %w", err)
}
resources[env] = stackResources
}
}
return &backendSvcDesc{
ecsSvcDesc: ecsSvcDesc{
Service: d.svc,
Type: manifestinfo.BackendServiceType,
App: d.app,
Configurations: configs,
AlarmDescriptions: alarmDescriptions,
Routes: routes,
ServiceDiscovery: sdEndpoints,
ServiceConnect: scEndpoints,
Variables: envVars,
Secrets: secrets,
Resources: resources,
environments: environments,
},
}, nil
}