@@ -79,9 +79,8 @@ type ProviderWrapper struct {
79
79
var _ confmap.Provider = (* wrappedProvider )(nil )
80
80
81
81
type wrappedProvider struct {
82
- wrapper * ProviderWrapper
83
- provider confmap.Provider
84
- lastRetrieved * confmap.Retrieved
82
+ wrapper * ProviderWrapper
83
+ provider confmap.Provider
85
84
}
86
85
87
86
func (w * wrappedProvider ) Retrieve (ctx context.Context , uri string , watcher confmap.WatcherFunc ) (* confmap.Retrieved , error ) {
@@ -102,93 +101,65 @@ func (w *wrappedProvider) Shutdown(ctx context.Context) error {
102
101
return w .provider .Shutdown (ctx )
103
102
}
104
103
105
- func (c * ProviderWrapper ) Provider (provider confmap.Provider ) confmap.Provider {
106
- for _ , h := range c .hooks {
104
+ func (pw * ProviderWrapper ) Provider (provider confmap.Provider ) confmap.Provider {
105
+ for _ , h := range pw .hooks {
107
106
h .OnNew ()
108
107
}
109
- c .providersLock .Lock ()
110
- defer c .providersLock .Unlock ()
111
- c .providers [provider .Scheme ()] = provider
112
- return & wrappedProvider {provider : provider , wrapper : c , lastRetrieved : & confmap. Retrieved {} }
108
+ pw .providersLock .Lock ()
109
+ defer pw .providersLock .Unlock ()
110
+ pw .providers [provider .Scheme ()] = provider
111
+ return & wrappedProvider {provider : provider , wrapper : pw }
113
112
}
114
113
115
- // ResolveForWrapped will retrieve from the wrappedProvider provider and merge the result w/ a previous retrieved instance (if any) as latestConf.
116
- // It will then "configsource.BuildConfigSourcesAndResolve(latestConf)" and return the resolved map as a confmap.Retrieved w/ resolve closer and the wrappedProvider provider closer.
117
- func (c * ProviderWrapper ) ResolveForWrapped (ctx context.Context , uri string , onChange confmap.WatcherFunc , w * wrappedProvider ) (* confmap.Retrieved , error ) {
118
- provider := w .provider
119
- retrieved := & confmap.Retrieved {}
120
-
121
- var tmpRetrieved * confmap.Retrieved
122
- var err error
123
- // Here we are getting the value directly from the provider, which
124
- // is what the core's resolver intends (invokes this parent method).
125
- if tmpRetrieved , err = provider .Retrieve (ctx , uri , onChange ); err != nil {
114
+ // ResolveForWrapped will retrieve from the wrappedProvider and, if possible, resolve all config source directives with their resolved values.
115
+ // If the wrappedProvider's retrieved value is only valid AsRaw() (scalar/array) then that will be returned without further evaluation.
116
+ func (pw * ProviderWrapper ) ResolveForWrapped (ctx context.Context , uri string , onChange confmap.WatcherFunc , w * wrappedProvider ) (* confmap.Retrieved , error ) {
117
+ retrieved , err := w .provider .Retrieve (ctx , uri , onChange )
118
+ if err != nil {
126
119
return nil , fmt .Errorf ("configsource provider failed retrieving: %w" , err )
127
- } else if tmpRetrieved != nil {
128
- retrieved = tmpRetrieved
129
120
}
130
121
131
- var previousConf * confmap.Conf
132
- var rawRetrieved * confmap.Retrieved
133
- if previousConf , err = w .lastRetrieved .AsConf (); err != nil {
134
- return nil , fmt .Errorf ("configsource provider failed updated retrieval: %w" , err )
135
- } else if previousConf != nil {
136
- // Need to merge config maps that we've encountered so far
137
- if latestConf , e := retrieved .AsConf (); e != nil {
138
- // raw fallback
139
- if raw , ee := retrieved .AsRaw (); ee == nil {
140
- if rawRetrieved , ee = confmap .NewRetrieved (raw ); ee != nil {
141
- return nil , fmt .Errorf ("failed resolving wrappedProvider retrieve: %w" , e )
142
- }
122
+ conf , err := retrieved .AsConf ()
123
+ if err != nil {
124
+ // raw fallback attempt, or return AsConf() error
125
+ if raw , e := retrieved .AsRaw (); e == nil {
126
+ if rawRetrieved , ee := confmap .NewRetrieved (raw ); ee == nil {
127
+ // raw confmap.Retrieved values shouldn't be further processed so return here
128
+ return rawRetrieved , nil
143
129
}
144
- } else if e = latestConf .Merge (previousConf ); e != nil {
145
- return nil , fmt .Errorf ("failed merging previous wrappedProvider retrieve: %w" , e )
146
- } else if tmpRetrieved , e = confmap .NewRetrieved (latestConf .ToStringMap ()); e != nil {
147
- return nil , err
148
- } else if tmpRetrieved != nil {
149
- retrieved = tmpRetrieved
150
130
}
131
+ return nil , fmt .Errorf ("failed retrieving from wrappedProvider: %w" , err )
151
132
}
152
133
153
- // raw confmap.Retrieved values cannot be coerced AsConf() so we return here to not update lastRetrieved
154
- // or attempt subsequent config source value resolution.
155
- if rawRetrieved != nil {
156
- return rawRetrieved , nil
157
- }
158
-
159
- w .lastRetrieved = retrieved
160
-
161
- latestConf , err := w .lastRetrieved .AsConf ()
162
- if err != nil {
163
- return nil , err
164
- } else if latestConf == nil {
165
- return nil , fmt .Errorf ("latest retrieved confmap.Conf is nil" )
134
+ if conf == nil {
135
+ return nil , fmt .Errorf ("retrieved confmap.Conf is unexpectedly nil" )
166
136
}
167
137
168
- scheme , stringMap := provider .Scheme (), latestConf .ToStringMap ()
169
- for _ , h := range c .hooks {
138
+ scheme , stringMap := w . provider .Scheme (), conf .ToStringMap ()
139
+ for _ , h := range pw .hooks {
170
140
h .OnRetrieve (scheme , stringMap )
171
141
}
172
142
173
- c .providersLock .Lock ()
143
+ // copy providers map for downstream resolution
144
+ pw .providersLock .Lock ()
174
145
providers := map [string ]confmap.Provider {}
175
- for s , p := range c .providers {
146
+ for s , p := range pw .providers {
176
147
providers [s ] = p
177
148
}
178
- c .providersLock .Unlock ()
179
- configSources , conf , err := configsource .BuildConfigSourcesAndSettings (ctx , latestConf , c .logger , c .factories , providers )
149
+ pw .providersLock .Unlock ()
150
+ configSources , confToResolve , err := configsource .BuildConfigSourcesFromConf (ctx , conf , pw .logger , pw .factories , providers )
180
151
if err != nil {
181
152
return nil , fmt .Errorf ("failed resolving latestConf: %w" , err )
182
153
}
183
154
184
- resolved , closeFunc , err := configsource .ResolveWithConfigSources (ctx , configSources , providers , conf , onChange )
155
+ resolved , closeFunc , err := configsource .ResolveWithConfigSources (ctx , configSources , providers , confToResolve , onChange )
185
156
if err != nil {
186
157
return nil , fmt .Errorf ("failed resolving with config sources: %w" , err )
187
158
}
188
159
189
160
return confmap .NewRetrieved (
190
161
resolved .ToStringMap (), confmap .WithRetrievedClose (
191
- configsource .MergeCloseFuncs ([]confmap.CloseFunc {closeFunc , w . lastRetrieved .Close }),
162
+ configsource .MergeCloseFuncs ([]confmap.CloseFunc {closeFunc , retrieved .Close }),
192
163
),
193
164
)
194
165
}
0 commit comments