github.com/Ilhicas/nomad@v1.0.4-0.20210304152020-e86851182bc3/client/allocrunner/state/state.go (about)

     1  package state
     2  
     3  import (
     4  	"time"
     5  
     6  	"github.com/hashicorp/nomad/nomad/structs"
     7  )
     8  
     9  // State captures the state of the allocation runner.
    10  type State struct {
    11  	// ClientStatus captures the overall state of the allocation
    12  	ClientStatus string
    13  
    14  	// ClientDescription is an optional human readable description of the
    15  	// allocations client state
    16  	ClientDescription string
    17  
    18  	// DeploymentStatus captures the status of the deployment
    19  	DeploymentStatus *structs.AllocDeploymentStatus
    20  
    21  	// TaskStates is a snapshot of task states.
    22  	TaskStates map[string]*structs.TaskState
    23  
    24  	// NetworkStatus captures network details not known until runtime
    25  	NetworkStatus *structs.AllocNetworkStatus
    26  }
    27  
    28  // SetDeploymentStatus is a helper for updating the client-controlled
    29  // DeploymentStatus fields: Healthy and Timestamp. The Canary and ModifyIndex
    30  // fields should only be updated by the server.
    31  func (s *State) SetDeploymentStatus(timestamp time.Time, healthy bool) {
    32  	if s.DeploymentStatus == nil {
    33  		s.DeploymentStatus = &structs.AllocDeploymentStatus{}
    34  	}
    35  
    36  	s.DeploymentStatus.Healthy = &healthy
    37  	s.DeploymentStatus.Timestamp = timestamp
    38  }
    39  
    40  // ClearDeploymentStatus is a helper to clear the client-controlled
    41  // DeploymentStatus fields: Healthy and Timestamp. The Canary and ModifyIndex
    42  // fields should only be updated by the server.
    43  func (s *State) ClearDeploymentStatus() {
    44  	if s.DeploymentStatus == nil {
    45  		return
    46  	}
    47  
    48  	s.DeploymentStatus.Healthy = nil
    49  	s.DeploymentStatus.Timestamp = time.Time{}
    50  }
    51  
    52  // Copy returns a deep copy of State.
    53  func (s *State) Copy() *State {
    54  	taskStates := make(map[string]*structs.TaskState, len(s.TaskStates))
    55  	for k, v := range s.TaskStates {
    56  		taskStates[k] = v.Copy()
    57  	}
    58  	return &State{
    59  		ClientStatus:      s.ClientStatus,
    60  		ClientDescription: s.ClientDescription,
    61  		DeploymentStatus:  s.DeploymentStatus.Copy(),
    62  		TaskStates:        taskStates,
    63  		NetworkStatus:     s.NetworkStatus.Copy(),
    64  	}
    65  }
    66  
    67  // ClientTerminalStatus returns if the client status is terminal and will no longer transition
    68  func (a *State) ClientTerminalStatus() bool {
    69  	switch a.ClientStatus {
    70  	case structs.AllocClientStatusComplete, structs.AllocClientStatusFailed, structs.AllocClientStatusLost:
    71  		return true
    72  	default:
    73  		return false
    74  	}
    75  }