github.com/mattyr/nomad@v0.3.3-0.20160919021406-3485a065154a/client/fingerprint/fingerprint.go (about)

     1  package fingerprint
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"sort"
     7  	"time"
     8  
     9  	"github.com/hashicorp/nomad/client/config"
    10  	"github.com/hashicorp/nomad/nomad/structs"
    11  )
    12  
    13  // EmptyDuration is to be used by fingerprinters that are not periodic.
    14  const (
    15  	EmptyDuration = time.Duration(0)
    16  )
    17  
    18  func init() {
    19  	builtinFingerprintMap["arch"] = NewArchFingerprint
    20  	builtinFingerprintMap["consul"] = NewConsulFingerprint
    21  	builtinFingerprintMap["cpu"] = NewCPUFingerprint
    22  	builtinFingerprintMap["env_aws"] = NewEnvAWSFingerprint
    23  	builtinFingerprintMap["env_gce"] = NewEnvGCEFingerprint
    24  	builtinFingerprintMap["host"] = NewHostFingerprint
    25  	builtinFingerprintMap["memory"] = NewMemoryFingerprint
    26  	builtinFingerprintMap["network"] = NewNetworkFingerprint
    27  	builtinFingerprintMap["nomad"] = NewNomadFingerprint
    28  	builtinFingerprintMap["storage"] = NewStorageFingerprint
    29  	builtinFingerprintMap["vault"] = NewVaultFingerprint
    30  
    31  	// Initialize the list of available fingerprinters per platform.  Each
    32  	// platform defines its own list of available fingerprinters.
    33  	initPlatformFingerprints(builtinFingerprintMap)
    34  }
    35  
    36  // builtinFingerprintMap contains the built in registered fingerprints which are
    37  // available for a given platform.
    38  var builtinFingerprintMap = make(map[string]Factory, 16)
    39  
    40  // BuiltinFingerprints is a slice containing the key names of all registered
    41  // fingerprints available, to provided an ordered iteration
    42  func BuiltinFingerprints() []string {
    43  	fingerprints := make([]string, 0, len(builtinFingerprintMap))
    44  	for k := range builtinFingerprintMap {
    45  		fingerprints = append(fingerprints, k)
    46  	}
    47  	sort.Strings(fingerprints)
    48  	return fingerprints
    49  }
    50  
    51  // NewFingerprint is used to instantiate and return a new fingerprint
    52  // given the name and a logger
    53  func NewFingerprint(name string, logger *log.Logger) (Fingerprint, error) {
    54  	// Lookup the factory function
    55  	factory, ok := builtinFingerprintMap[name]
    56  	if !ok {
    57  		return nil, fmt.Errorf("unknown fingerprint '%s'", name)
    58  	}
    59  
    60  	// Instantiate the fingerprint
    61  	f := factory(logger)
    62  	return f, nil
    63  }
    64  
    65  // Factory is used to instantiate a new Fingerprint
    66  type Factory func(*log.Logger) Fingerprint
    67  
    68  // Fingerprint is used for doing "fingerprinting" of the
    69  // host to automatically determine attributes, resources,
    70  // and metadata about it. Each of these is a heuristic, and
    71  // many of them can be applied on a particular host.
    72  type Fingerprint interface {
    73  	// Fingerprint is used to update properties of the Node,
    74  	// and returns if the fingerprint was applicable and a potential error.
    75  	Fingerprint(*config.Config, *structs.Node) (bool, error)
    76  
    77  	// Periodic is a mechanism for the fingerprinter to indicate that it should
    78  	// be run periodically. The return value is a boolean indicating if it
    79  	// should be periodic, and if true, a duration.
    80  	Periodic() (bool, time.Duration)
    81  }
    82  
    83  // StaticFingerprinter can be embedded in a struct that has a Fingerprint method
    84  // to make it non-periodic.
    85  type StaticFingerprinter struct{}
    86  
    87  func (s *StaticFingerprinter) Periodic() (bool, time.Duration) {
    88  	return false, EmptyDuration
    89  }