docker/swarmkit

View on GitHub
agent/config.go

Summary

Maintainability
A
35 mins
Test Coverage
package agent

import (
    "github.com/docker/go-events"
    "github.com/moby/swarmkit/v2/agent/exec"
    "github.com/moby/swarmkit/v2/api"
    "github.com/moby/swarmkit/v2/connectionbroker"
    "github.com/pkg/errors"
    bolt "go.etcd.io/bbolt"
    "google.golang.org/grpc/credentials"
)

// NodeChanges encapsulates changes that should be made to the node as per session messages
// from the dispatcher
type NodeChanges struct {
    Node     *api.Node
    RootCert []byte
}

// Config provides values for an Agent.
type Config struct {
    // Hostname the name of host for agent instance.
    Hostname string

    // ConnBroker provides a connection broker for retrieving gRPC
    // connections to managers.
    ConnBroker *connectionbroker.Broker

    // Executor specifies the executor to use for the agent.
    Executor exec.Executor

    // DB used for task storage. Must be open for the lifetime of the agent.
    DB *bolt.DB

    // NotifyNodeChange channel receives new node changes from session messages.
    NotifyNodeChange chan<- *NodeChanges

    // NotifyTLSChange channel sends new TLS information changes, which can cause a session to restart
    NotifyTLSChange <-chan events.Event

    // Credentials is credentials for grpc connection to manager.
    Credentials credentials.TransportCredentials

    // NodeTLSInfo contains the starting node TLS info to bootstrap into the agent
    NodeTLSInfo *api.NodeTLSInfo

    // SessionTracker, if provided, will have its SessionClosed and SessionError methods called
    // when sessions close and error.
    SessionTracker SessionTracker

    // FIPS returns whether the node is FIPS-enabled
    FIPS bool
}

func (c *Config) validate() error {
    if c.Credentials == nil {
        return errors.New("agent: Credentials is required")
    }

    if c.Executor == nil {
        return errors.New("agent: executor required")
    }

    if c.DB == nil {
        return errors.New("agent: database required")
    }

    if c.NodeTLSInfo == nil {
        return errors.New("agent: Node TLS info is required")
    }

    return nil
}

// A SessionTracker gets notified when sessions close and error
type SessionTracker interface {
    // SessionClosed is called whenever a session is closed - if the function errors, the agent
    // will exit with the returned error.  Otherwise the agent can continue and rebuild a new session.
    SessionClosed() error

    // SessionError is called whenever a session errors
    SessionError(err error)

    // SessionEstablished is called whenever a session is established
    SessionEstablished()
}