1 package config
2
3 import (
4 "fmt"
5 "strings"
6 )
7
8
9
10 type ClientEnableState uint
11
12
13 const (
14 ClientDefaultEnableState ClientEnableState = iota
15 ClientDisabled
16 ClientEnabled
17 )
18
19
20 type EndpointModeState uint
21
22
23 const (
24 EndpointModeStateUnset EndpointModeState = iota
25 EndpointModeStateIPv4
26 EndpointModeStateIPv6
27 )
28
29
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
47 type ClientEnableStateResolver interface {
48 GetEC2IMDSClientEnableState() (ClientEnableState, bool, error)
49 }
50
51
52 type EndpointModeResolver interface {
53 GetEC2IMDSEndpointMode() (EndpointModeState, bool, error)
54 }
55
56
57 type EndpointResolver interface {
58 GetEC2IMDSEndpoint() (string, bool, error)
59 }
60
61 type v1FallbackDisabledResolver interface {
62 GetEC2IMDSV1FallbackDisabled() (bool, bool)
63 }
64
65
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
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
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
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
View as plain text