From a6eacaad5ec02327d5f7b3ab3cff3c5cb5fa376d Mon Sep 17 00:00:00 2001 From: Armon Dadgar Date: Sun, 16 Aug 2015 16:40:04 -0700 Subject: [PATCH] agent: boilerplate --- command/agent/agent.go | 68 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 3 deletions(-) diff --git a/command/agent/agent.go b/command/agent/agent.go index 2221fe244..0c2540b3f 100644 --- a/command/agent/agent.go +++ b/command/agent/agent.go @@ -1,19 +1,81 @@ package agent -import "io" +import ( + "io" + "log" + "os" + "sync" + "github.com/hashicorp/nomad/nomad" +) + +// Agent is a long running daemon that is used to run both +// clients and servers. Servers are responsible for managing +// state and making scheduling decisions. Clients can be +// scheduled to, and are responsible for interfacing with +// servers to run allocations. type Agent struct { + config *Config + logger *log.Logger + logOutput io.Writer + + server *nomad.Server + client *nomad.Server // TODO + + shutdown bool + shutdownCh chan struct{} + shutdownLock sync.Mutex } +// NewAgent is used to create a new agent with the given configuration func NewAgent(config *Config, logOutput io.Writer) (*Agent, error) { - a := &Agent{} + // Ensure we have a log sink + if logOutput == nil { + logOutput = os.Stderr + } + + a := &Agent{ + config: config, + logger: log.New(logOutput, "", log.LstdFlags), + logOutput: logOutput, + shutdownCh: make(chan struct{}), + } return a, nil } +// Leave is used gracefully exit. Clients will inform servers +// of their departure so that allocations can be rescheduled. func (a *Agent) Leave() error { return nil } +// Shutdown is used to terminate the agent. func (a *Agent) Shutdown() error { - return nil + a.shutdownLock.Lock() + defer a.shutdownLock.Unlock() + + if a.shutdown { + return nil + } + + a.logger.Println("[INFO] agent: requesting shutdown") + var err error + if a.server != nil { + err = a.server.Shutdown() + } else { + err = a.client.Shutdown() + } + + a.logger.Println("[INFO] agent: shutdown complete") + a.shutdown = true + close(a.shutdownCh) + return err +} + +// RPC is used to make an RPC call to the Nomad servers +func (a *Agent) RPC(method string, args interface{}, reply interface{}) error { + if a.server != nil { + return a.server.RPC(method, args, reply) + } + return a.client.RPC(method, args, reply) }