resolvers.go raw

   1  package config
   2  
   3  import (
   4  	"fmt"
   5  	"strings"
   6  )
   7  
   8  // ClientEnableState provides an enumeration if the client is enabled,
   9  // disabled, or default behavior.
  10  type ClientEnableState uint
  11  
  12  // Enumeration values for ClientEnableState
  13  const (
  14  	ClientDefaultEnableState ClientEnableState = iota
  15  	ClientDisabled
  16  	ClientEnabled
  17  )
  18  
  19  // EndpointModeState is the EC2 IMDS Endpoint Configuration Mode
  20  type EndpointModeState uint
  21  
  22  // Enumeration values for ClientEnableState
  23  const (
  24  	EndpointModeStateUnset EndpointModeState = iota
  25  	EndpointModeStateIPv4
  26  	EndpointModeStateIPv6
  27  )
  28  
  29  // SetFromString sets the EndpointModeState based on the provided string value. Unknown values will default to EndpointModeStateUnset
  30  func (e *EndpointModeState) SetFromString(v string) error {
  31  	v = strings.TrimSpace(v)
  32  
  33  	switch {
  34  	case len(v) == 0:
  35  		*e = EndpointModeStateUnset
  36  	case strings.EqualFold(v, "IPv6"):
  37  		*e = EndpointModeStateIPv6
  38  	case strings.EqualFold(v, "IPv4"):
  39  		*e = EndpointModeStateIPv4
  40  	default:
  41  		return fmt.Errorf("unknown EC2 IMDS endpoint mode, must be either IPv6 or IPv4")
  42  	}
  43  	return nil
  44  }
  45  
  46  // ClientEnableStateResolver is a config resolver interface for retrieving whether the IMDS client is disabled.
  47  type ClientEnableStateResolver interface {
  48  	GetEC2IMDSClientEnableState() (ClientEnableState, bool, error)
  49  }
  50  
  51  // EndpointModeResolver is a config resolver interface for retrieving the EndpointModeState configuration.
  52  type EndpointModeResolver interface {
  53  	GetEC2IMDSEndpointMode() (EndpointModeState, bool, error)
  54  }
  55  
  56  // EndpointResolver is a config resolver interface for retrieving the endpoint.
  57  type EndpointResolver interface {
  58  	GetEC2IMDSEndpoint() (string, bool, error)
  59  }
  60  
  61  type v1FallbackDisabledResolver interface {
  62  	GetEC2IMDSV1FallbackDisabled() (bool, bool)
  63  }
  64  
  65  // ResolveClientEnableState resolves the ClientEnableState from a list of configuration sources.
  66  func ResolveClientEnableState(sources []interface{}) (value ClientEnableState, found bool, err error) {
  67  	for _, source := range sources {
  68  		if resolver, ok := source.(ClientEnableStateResolver); ok {
  69  			value, found, err = resolver.GetEC2IMDSClientEnableState()
  70  			if err != nil || found {
  71  				return value, found, err
  72  			}
  73  		}
  74  	}
  75  	return value, found, err
  76  }
  77  
  78  // ResolveEndpointModeConfig resolves the EndpointModeState from a list of configuration sources.
  79  func ResolveEndpointModeConfig(sources []interface{}) (value EndpointModeState, found bool, err error) {
  80  	for _, source := range sources {
  81  		if resolver, ok := source.(EndpointModeResolver); ok {
  82  			value, found, err = resolver.GetEC2IMDSEndpointMode()
  83  			if err != nil || found {
  84  				return value, found, err
  85  			}
  86  		}
  87  	}
  88  	return value, found, err
  89  }
  90  
  91  // ResolveEndpointConfig resolves the endpoint from a list of configuration sources.
  92  func ResolveEndpointConfig(sources []interface{}) (value string, found bool, err error) {
  93  	for _, source := range sources {
  94  		if resolver, ok := source.(EndpointResolver); ok {
  95  			value, found, err = resolver.GetEC2IMDSEndpoint()
  96  			if err != nil || found {
  97  				return value, found, err
  98  			}
  99  		}
 100  	}
 101  	return value, found, err
 102  }
 103  
 104  // ResolveV1FallbackDisabled ...
 105  func ResolveV1FallbackDisabled(sources []interface{}) (bool, bool) {
 106  	for _, source := range sources {
 107  		if resolver, ok := source.(v1FallbackDisabledResolver); ok {
 108  			if v, found := resolver.GetEC2IMDSV1FallbackDisabled(); found {
 109  				return v, true
 110  			}
 111  		}
 112  	}
 113  	return false, false
 114  }
 115