in internal/pkg/cli/deploy/workload.go [252:342]
func newWorkloadDeployer(in *WorkloadDeployerInput) (*workloadDeployer, error) {
ws, err := workspace.Use(afero.NewOsFs())
if err != nil {
return nil, err
}
defaultSession, err := in.SessionProvider.Default()
if err != nil {
return nil, fmt.Errorf("create default: %w", err)
}
envSession, err := in.SessionProvider.FromRole(in.Env.ManagerRoleARN, in.Env.Region)
if err != nil {
return nil, fmt.Errorf("create env session with region %s: %w", in.Env.Region, err)
}
defaultSessEnvRegion, err := in.SessionProvider.DefaultWithRegion(in.Env.Region)
if err != nil {
return nil, fmt.Errorf("create default session with region %s: %w", in.Env.Region, err)
}
resources, err := cloudformation.New(defaultSession, cloudformation.WithProgressTracker(os.Stderr)).GetAppResourcesByRegion(in.App, in.Env.Region)
if err != nil {
return nil, fmt.Errorf("get application %s resources from region %s: %w", in.App.Name, in.Env.Region, err)
}
var addons stackBuilder
addons, err = addon.ParseFromWorkload(in.Name, ws)
if err != nil {
var notFoundErr *addon.ErrAddonsNotFound
if !errors.As(err, ¬FoundErr) {
return nil, fmt.Errorf("parse addons stack for workload %s: %w", in.Name, err)
}
addons = nil // so that we can check for no addons with nil comparison
}
repoName := RepoName(in.App.Name, in.Name)
repository := repository.NewWithURI(
ecr.New(defaultSessEnvRegion), repoName, resources.RepositoryURLs[in.Name])
store := config.NewSSMStore(identity.New(defaultSession), ssm.New(defaultSession), aws.StringValue(defaultSession.Config.Region))
envDescriber, err := describe.NewEnvDescriber(describe.NewEnvDescriberConfig{
App: in.App.Name,
Env: in.Env.Name,
ConfigStore: store,
})
if err != nil {
return nil, err
}
mft, err := envDescriber.Manifest()
if err != nil {
return nil, fmt.Errorf("read the manifest used to deploy environment %s: %w", in.Env.Name, err)
}
envConfig, err := manifest.UnmarshalEnvironment(mft)
if err != nil {
return nil, fmt.Errorf("unmarshal the manifest used to deploy environment %s: %w", in.Env.Name, err)
}
cfn := cloudformation.New(envSession, cloudformation.WithProgressTracker(os.Stderr))
labeledTermPrinter := func(fw syncbuffer.FileWriter, bufs []*syncbuffer.LabeledSyncBuffer, opts ...syncbuffer.LabeledTermPrinterOption) LabeledTermPrinter {
return syncbuffer.NewLabeledTermPrinter(fw, bufs, opts...)
}
docker := dockerengine.New(exec.NewCmd())
return &workloadDeployer{
name: in.Name,
app: in.App,
env: in.Env,
image: in.Image,
resources: resources,
workspacePath: ws.Path(),
fs: afero.NewOsFs(),
s3Client: s3.New(envSession),
addons: addons,
repository: repository,
deployer: cfn,
tmplGetter: cfn,
endpointGetter: envDescriber,
spinner: termprogress.NewSpinner(log.DiagnosticWriter),
templateFS: template.New(),
envVersionGetter: in.EnvVersionGetter,
overrider: in.Overrider,
docker: docker,
customResources: in.customResources,
defaultSess: defaultSession,
defaultSessWithEnvRegion: defaultSessEnvRegion,
envSess: envSession,
store: store,
envConfig: envConfig,
labeledTermPrinter: labeledTermPrinter,
mft: in.Mft,
rawMft: in.RawMft,
}, nil
}