agent/app/agent.go
func newAgent(
	ctx context.Context,
	blackholeEC2Metadata bool,
	acceptInsecureCert *bool) (agent, error) {

	ec2MetadataClient := ec2.NewEC2MetadataClient(nil)
	if blackholeEC2Metadata {
		ec2MetadataClient = ec2.NewBlackholeEC2MetadataClient()
	}

	seelog.Info("Loading configuration")
	cfg, err := config.NewConfig(ec2MetadataClient)
	if err != nil {
		// All required config values can be inferred from EC2 Metadata,
		// so this error could be transient.
		seelog.Criticalf("Error loading config: %v", err)
		return nil, err
	}
	cfg.AcceptInsecureCert = aws.BoolValue(acceptInsecureCert)
	if cfg.AcceptInsecureCert {
		seelog.Warn("SSL certificate verification disabled. This is not recommended.")
	}
	seelog.Infof("Amazon ECS agent Version: %s, Commit: %s", version.Version, version.GitShortHash)
	seelog.Debugf("Loaded config: %s", cfg.String())

	ec2Client := ec2.NewClientImpl(cfg.AWSRegion)
	dockerClient, err := dockerapi.NewDockerGoClient(sdkclientfactory.NewFactory(ctx, cfg.DockerEndpoint), cfg, ctx)

	if err != nil {
		// This is also non terminal in the current config
		seelog.Criticalf("Error creating Docker client: %v", err)
		return nil, err
	}

	var metadataManager containermetadata.Manager
	if cfg.ContainerMetadataEnabled {
		// We use the default API client for the metadata inspect call. This version has some information
		// missing which means if we need those fields later we will need to change this client to
		// the appropriate version
		metadataManager = containermetadata.NewManager(dockerClient, cfg)
	}

	return &ecsAgent{
		ctx:               ctx,
		ec2MetadataClient: ec2MetadataClient,
		ec2Client:         ec2Client,
		cfg:               cfg,
		dockerClient:      dockerClient,
		// We instantiate our own credentialProvider for use in acs/tcs. This tries
		// to mimic roughly the way it's instantiated by the SDK for a default
		// session.
		credentialProvider:    defaults.CredChain(defaults.Config(), defaults.Handlers()),
		stateManagerFactory:   factory.NewStateManager(),
		saveableOptionFactory: factory.NewSaveableOption(),
		pauseLoader:           pause.New(),
		cniClient: ecscni.NewClient(&ecscni.Config{
			PluginsPath:            cfg.CNIPluginsPath,
			MinSupportedCNIVersion: config.DefaultMinSupportedCNIVersion,
		}),
		os:                 oswrapper.New(),
		metadataManager:    metadataManager,
		terminationHandler: sighandlers.StartDefaultTerminationHandler,
		mobyPlugins:        mobypkgwrapper.NewPlugins(),
	}, nil
}
func newAgent(
	ctx context.Context,
	blackholeEC2Metadata bool,
	acceptInsecureCert *bool) (agent, error) {

	ec2MetadataClient := ec2.NewEC2MetadataClient(nil)
	if blackholeEC2Metadata {
		ec2MetadataClient = ec2.NewBlackholeEC2MetadataClient()
	}

	seelog.Info("Loading configuration")
	cfg, err := config.NewConfig(ec2MetadataClient)
	if err != nil {
		// All required config values can be inferred from EC2 Metadata,
		// so this error could be transient.
		seelog.Criticalf("Error loading config: %v", err)
		return nil, err
	}
	cfg.AcceptInsecureCert = aws.BoolValue(acceptInsecureCert)
	if cfg.AcceptInsecureCert {
		seelog.Warn("SSL certificate verification disabled. This is not recommended.")
	}
	seelog.Infof("Amazon ECS agent Version: %s, Commit: %s", version.Version, version.GitShortHash)
	seelog.Debugf("Loaded config: %s", cfg.String())

	ec2Client := ec2.NewClientImpl(cfg.AWSRegion)
	dockerClient, err := dockerapi.NewDockerGoClient(sdkclientfactory.NewFactory(ctx, cfg.DockerEndpoint), cfg, ctx)

	if err != nil {
		// This is also non terminal in the current config
		seelog.Criticalf("Error creating Docker client: %v", err)
		return nil, err
	}

	var metadataManager containermetadata.Manager
	if cfg.ContainerMetadataEnabled {
		// We use the default API client for the metadata inspect call. This version has some information
		// missing which means if we need those fields later we will need to change this client to
		// the appropriate version
		metadataManager = containermetadata.NewManager(dockerClient, cfg)
	}

	return &ecsAgent{
		ctx:               ctx,
		ec2MetadataClient: ec2MetadataClient,
		ec2Client:         ec2Client,
		cfg:               cfg,
		dockerClient:      dockerClient,
		// We instantiate our own credentialProvider for use in acs/tcs. This tries
		// to mimic roughly the way it's instantiated by the SDK for a default
		// session.
		credentialProvider:    defaults.CredChain(defaults.Config(), defaults.Handlers()),
		stateManagerFactory:   factory.NewStateManager(),
		saveableOptionFactory: factory.NewSaveableOption(),
		pauseLoader:           pause.New(),
		cniClient: ecscni.NewClient(&ecscni.Config{
			PluginsPath:            cfg.CNIPluginsPath,
			MinSupportedCNIVersion: config.DefaultMinSupportedCNIVersion,
		}),
		os:                 oswrapper.New(),
		metadataManager:    metadataManager,
		terminationHandler: sighandlers.StartDefaultTerminationHandler,
		mobyPlugins:        mobypkgwrapper.NewPlugins(),
	}, nil
}
func newAgent ( ctx context . Context , blackholeEC2Metadata bool , acceptInsecureCert * bool ) ( agent , error ) { ec2MetadataClient := ec2 . NewEC2MetadataClient ( nil ) if blackholeEC2Metadata { ec2MetadataClient = ec2 . NewBlackholeEC2MetadataClient ( ) } seelog . Info ( " " ) cfg , err := config . NewConfig ( ec2MetadataClient ) if err != nil { // All required config values can be inferred from EC2 Metadata, // so this error could be transient. seelog . Criticalf ( " " , err ) return nil , err } cfg . AcceptInsecureCert = aws . BoolValue ( acceptInsecureCert ) if cfg . AcceptInsecureCert { seelog . Warn ( " " ) } seelog . Infof ( " " , version . Version , version . GitShortHash ) seelog . Debugf ( " " , cfg . String ( ) ) ec2Client := ec2 . NewClientImpl ( cfg . AWSRegion ) dockerClient , err := dockerapi . NewDockerGoClient ( sdkclientfactory . NewFactory ( ctx , cfg . DockerEndpoint ) , cfg , ctx ) if err != nil { // This is also non terminal in the current config seelog . Criticalf ( " " , err ) return nil , err } var metadataManager containermetadata . Manager if cfg . ContainerMetadataEnabled { // We use the default API client for the metadata inspect call. This version has some information // missing which means if we need those fields later we will need to change this client to // the appropriate version metadataManager = containermetadata . NewManager ( dockerClient , cfg ) } return & ecsAgent { ctx : ctx , ec2MetadataClient : ec2MetadataClient , ec2Client : ec2Client , cfg : cfg , dockerClient : dockerClient , // We instantiate our own credentialProvider for use in acs/tcs. This tries // to mimic roughly the way it's instantiated by the SDK for a default // session. credentialProvider : defaults . CredChain ( defaults . Config ( ) , defaults . Handlers ( ) ) , stateManagerFactory : factory . NewStateManager ( ) , saveableOptionFactory : factory . NewSaveableOption ( ) , pauseLoader : pause . New ( ) , cniClient : ecscni . NewClient ( & ecscni . Config { PluginsPath : cfg . CNIPluginsPath , MinSupportedCNIVersion : config . DefaultMinSupportedCNIVersion , } ) , os : oswrapper . New ( ) , metadataManager : metadataManager , terminationHandler : sighandlers . StartDefaultTerminationHandler , mobyPlugins : mobypkgwrapper . NewPlugins ( ) , } , nil }
// newAgent returns a new ecsAgent object, but does not start anything
newAgent returns a new ecsAgent object but does not start anything