github.com/ferranbt/nomad@v0.9.3-0.20190607002617-85c449b7667c/plugins/device/mock.go (about)

     1  package device
     2  
     3  import (
     4  	"context"
     5  	"time"
     6  
     7  	"github.com/hashicorp/nomad/plugins/base"
     8  )
     9  
    10  type FingerprintFn func(context.Context) (<-chan *FingerprintResponse, error)
    11  type ReserveFn func([]string) (*ContainerReservation, error)
    12  type StatsFn func(context.Context, time.Duration) (<-chan *StatsResponse, error)
    13  
    14  // MockDevicePlugin is used for testing.
    15  // Each function can be set as a closure to make assertions about how data
    16  // is passed through the base plugin layer.
    17  type MockDevicePlugin struct {
    18  	*base.MockPlugin
    19  	FingerprintF FingerprintFn
    20  	ReserveF     ReserveFn
    21  	StatsF       StatsFn
    22  }
    23  
    24  func (p *MockDevicePlugin) Fingerprint(ctx context.Context) (<-chan *FingerprintResponse, error) {
    25  	return p.FingerprintF(ctx)
    26  }
    27  
    28  func (p *MockDevicePlugin) Reserve(devices []string) (*ContainerReservation, error) {
    29  	return p.ReserveF(devices)
    30  }
    31  
    32  func (p *MockDevicePlugin) Stats(ctx context.Context, interval time.Duration) (<-chan *StatsResponse, error) {
    33  	return p.StatsF(ctx, interval)
    34  }
    35  
    36  // Below are static implementations of the device functions
    37  
    38  // StaticFingerprinter fingerprints the passed devices just once
    39  func StaticFingerprinter(devices []*DeviceGroup) FingerprintFn {
    40  	return func(_ context.Context) (<-chan *FingerprintResponse, error) {
    41  		outCh := make(chan *FingerprintResponse, 1)
    42  		outCh <- &FingerprintResponse{
    43  			Devices: devices,
    44  		}
    45  		return outCh, nil
    46  	}
    47  }
    48  
    49  // ErrorChFingerprinter returns an error fingerprinting over the channel
    50  func ErrorChFingerprinter(err error) FingerprintFn {
    51  	return func(_ context.Context) (<-chan *FingerprintResponse, error) {
    52  		outCh := make(chan *FingerprintResponse, 1)
    53  		outCh <- &FingerprintResponse{
    54  			Error: err,
    55  		}
    56  		return outCh, nil
    57  	}
    58  }
    59  
    60  // StaticReserve returns the passed container reservation
    61  func StaticReserve(out *ContainerReservation) ReserveFn {
    62  	return func(_ []string) (*ContainerReservation, error) {
    63  		return out, nil
    64  	}
    65  }
    66  
    67  // ErrorReserve returns the passed error
    68  func ErrorReserve(err error) ReserveFn {
    69  	return func(_ []string) (*ContainerReservation, error) {
    70  		return nil, err
    71  	}
    72  }
    73  
    74  // StaticStats returns the passed statistics
    75  func StaticStats(out []*DeviceGroupStats) StatsFn {
    76  	return func(ctx context.Context, intv time.Duration) (<-chan *StatsResponse, error) {
    77  		outCh := make(chan *StatsResponse, 1)
    78  
    79  		go func() {
    80  			ticker := time.NewTimer(0)
    81  			for {
    82  				select {
    83  				case <-ctx.Done():
    84  					return
    85  				case <-ticker.C:
    86  					ticker.Reset(intv)
    87  				}
    88  
    89  				outCh <- &StatsResponse{
    90  					Groups: out,
    91  				}
    92  			}
    93  		}()
    94  
    95  		return outCh, nil
    96  	}
    97  }
    98  
    99  // ErrorChStats returns an error collecting stats over the channel
   100  func ErrorChStats(err error) StatsFn {
   101  	return func(_ context.Context, _ time.Duration) (<-chan *StatsResponse, error) {
   102  		outCh := make(chan *StatsResponse, 1)
   103  		outCh <- &StatsResponse{
   104  			Error: err,
   105  		}
   106  		return outCh, nil
   107  	}
   108  }