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 }