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}