resolvers.go

  1package config
  2
  3import (
  4	"fmt"
  5	"strings"
  6)
  7
  8// ClientEnableState provides an enumeration if the client is enabled,
  9// disabled, or default behavior.
 10type ClientEnableState uint
 11
 12// Enumeration values for ClientEnableState
 13const (
 14	ClientDefaultEnableState ClientEnableState = iota
 15	ClientDisabled
 16	ClientEnabled
 17)
 18
 19// EndpointModeState is the EC2 IMDS Endpoint Configuration Mode
 20type EndpointModeState uint
 21
 22// Enumeration values for ClientEnableState
 23const (
 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
 30func (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.
 47type ClientEnableStateResolver interface {
 48	GetEC2IMDSClientEnableState() (ClientEnableState, bool, error)
 49}
 50
 51// EndpointModeResolver is a config resolver interface for retrieving the EndpointModeState configuration.
 52type EndpointModeResolver interface {
 53	GetEC2IMDSEndpointMode() (EndpointModeState, bool, error)
 54}
 55
 56// EndpointResolver is a config resolver interface for retrieving the endpoint.
 57type EndpointResolver interface {
 58	GetEC2IMDSEndpoint() (string, bool, error)
 59}
 60
 61type v1FallbackDisabledResolver interface {
 62	GetEC2IMDSV1FallbackDisabled() (bool, bool)
 63}
 64
 65// ResolveClientEnableState resolves the ClientEnableState from a list of configuration sources.
 66func 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.
 79func 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.
 92func 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 ...
105func 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}