func (agent *ecsAgent) newTaskEngine(containerChangeEventStream *eventstream.EventStream,
	credentialsManager credentials.Manager,
	state dockerstate.TaskEngineState,
	imageManager engine.ImageManager) (engine.TaskEngine, string, error) {

	containerChangeEventStream.StartListening()

	if !agent.cfg.Checkpoint {
		seelog.Info("Checkpointing not enabled; a new container instance will be created each time the agent is run")
		return engine.NewTaskEngine(agent.cfg, agent.dockerClient, credentialsManager,
			containerChangeEventStream, imageManager, state,
			agent.metadataManager, agent.resourceFields), "", nil
	}

	// We try to set these values by loading the existing state file first
	var previousCluster, previousEC2InstanceID, previousContainerInstanceArn, previousAZ string
	previousTaskEngine := engine.NewTaskEngine(agent.cfg, agent.dockerClient,
		credentialsManager, containerChangeEventStream, imageManager, state,
		agent.metadataManager, agent.resourceFields)

	// previousStateManager is used to verify that our current runtime configuration is
	// compatible with our past configuration as reflected by our state-file
	previousStateManager, err := agent.newStateManager(previousTaskEngine, &previousCluster,
		&previousContainerInstanceArn, &previousEC2InstanceID, &previousAZ)
	if err != nil {
		seelog.Criticalf("Error creating state manager: %v", err)
		return nil, "", err
	}

	err = previousStateManager.Load()
	if err != nil {
		seelog.Criticalf("Error loading previously saved state: %v", err)
		return nil, "", err
	}

	err = agent.checkCompatibility(previousTaskEngine)
	if err != nil {
		seelog.Criticalf("Error checking compatibility with previously saved state: %v", err)
		return nil, "", err
	}

	currentEC2InstanceID := agent.getEC2InstanceID()
	if previousEC2InstanceID != "" && previousEC2InstanceID != currentEC2InstanceID {
		seelog.Warnf(instanceIDMismatchErrorFormat,
			previousEC2InstanceID, currentEC2InstanceID)

		// Reset agent state as a new container instance
		state.Reset()
		// Reset taskEngine; all the other values are still default
		return engine.NewTaskEngine(agent.cfg, agent.dockerClient, credentialsManager,
			containerChangeEventStream, imageManager, state, agent.metadataManager,
			agent.resourceFields), currentEC2InstanceID, nil
	}

	if previousCluster != "" {
		if err := agent.setClusterInConfig(previousCluster); err != nil {
			return nil, "", err
		}
	}

	// Use the values we loaded if there's no issue
	agent.containerInstanceARN = previousContainerInstanceArn

	return previousTaskEngine, currentEC2InstanceID, nil
}
func (agent *ecsAgent) newTaskEngine(containerChangeEventStream *eventstream.EventStream,
	credentialsManager credentials.Manager,
	state dockerstate.TaskEngineState,
	imageManager engine.ImageManager) (engine.TaskEngine, string, error) {

	containerChangeEventStream.StartListening()

	if !agent.cfg.Checkpoint {
		seelog.Info("Checkpointing not enabled; a new container instance will be created each time the agent is run")
		return engine.NewTaskEngine(agent.cfg, agent.dockerClient, credentialsManager,
			containerChangeEventStream, imageManager, state,
			agent.metadataManager, agent.resourceFields), "", nil
	}

	
	var previousCluster, previousEC2InstanceID, previousContainerInstanceArn, previousAZ string
	previousTaskEngine := engine.NewTaskEngine(agent.cfg, agent.dockerClient,
		credentialsManager, containerChangeEventStream, imageManager, state,
		agent.metadataManager, agent.resourceFields)

	
	
	previousStateManager, err := agent.newStateManager(previousTaskEngine, &previousCluster,
		&previousContainerInstanceArn, &previousEC2InstanceID, &previousAZ)
	if err != nil {
		seelog.Criticalf("Error creating state manager: %v", err)
		return nil, "", err
	}

	err = previousStateManager.Load()
	if err != nil {
		seelog.Criticalf("Error loading previously saved state: %v", err)
		return nil, "", err
	}

	err = agent.checkCompatibility(previousTaskEngine)
	if err != nil {
		seelog.Criticalf("Error checking compatibility with previously saved state: %v", err)
		return nil, "", err
	}

	currentEC2InstanceID := agent.getEC2InstanceID()
	if previousEC2InstanceID != "" && previousEC2InstanceID != currentEC2InstanceID {
		seelog.Warnf(instanceIDMismatchErrorFormat,
			previousEC2InstanceID, currentEC2InstanceID)

		
		state.Reset()
		
		return engine.NewTaskEngine(agent.cfg, agent.dockerClient, credentialsManager,
			containerChangeEventStream, imageManager, state, agent.metadataManager,
			agent.resourceFields), currentEC2InstanceID, nil
	}

	if previousCluster != "" {
		if err := agent.setClusterInConfig(previousCluster); err != nil {
			return nil, "", err
		}
	}

	
	agent.containerInstanceARN = previousContainerInstanceArn

	return previousTaskEngine, currentEC2InstanceID, nil
}
func ( agent * ecsAgent ) newTaskEngine ( containerChangeEventStream * eventstream . EventStream , credentialsManager credentials . Manager , state dockerstate . TaskEngineState , imageManager engine . ImageManager ) ( engine . TaskEngine , string , error ) { containerChangeEventStream . StartListening ( ) if ! agent . cfg . Checkpoint { seelog . Info ( " " ) return engine . NewTaskEngine ( agent . cfg , agent . dockerClient , credentialsManager , containerChangeEventStream , imageManager , state , agent . metadataManager , agent . resourceFields ) , " " , nil } // We try to set these values by loading the existing state file first var previousCluster , previousEC2InstanceID , previousContainerInstanceArn , previousAZ string previousTaskEngine := engine . NewTaskEngine ( agent . cfg , agent . dockerClient , credentialsManager , containerChangeEventStream , imageManager , state , agent . metadataManager , agent . resourceFields ) // previousStateManager is used to verify that our current runtime configuration is // compatible with our past configuration as reflected by our state-file previousStateManager , err := agent . newStateManager ( previousTaskEngine , & previousCluster , & previousContainerInstanceArn , & previousEC2InstanceID , & previousAZ ) if err != nil { seelog . Criticalf ( " " , err ) return nil , " " , err } err = previousStateManager . Load ( ) if err != nil { seelog . Criticalf ( " " , err ) return nil , " " , err } err = agent . checkCompatibility ( previousTaskEngine ) if err != nil { seelog . Criticalf ( " " , err ) return nil , " " , err } currentEC2InstanceID := agent . getEC2InstanceID ( ) if previousEC2InstanceID != " " && previousEC2InstanceID != currentEC2InstanceID { seelog . Warnf ( instanceIDMismatchErrorFormat , previousEC2InstanceID , currentEC2InstanceID ) // Reset agent state as a new container instance state . Reset ( ) // Reset taskEngine; all the other values are still default return engine . NewTaskEngine ( agent . cfg , agent . dockerClient , credentialsManager , containerChangeEventStream , imageManager , state , agent . metadataManager , agent . resourceFields ) , currentEC2InstanceID , nil } if previousCluster != " " { if err := agent . setClusterInConfig ( previousCluster ) ; err != nil { return nil , " " , err } } // Use the values we loaded if there's no issue agent . containerInstanceARN = previousContainerInstanceArn return previousTaskEngine , currentEC2InstanceID , nil }
// newTaskEngine creates a new docker task engine object. It tries to load the
// local state if needed, else initializes a new one
newTaskEngine creates a new docker task engine object . It tries to load the local state if needed else initializes a new one