Skip to content

Commit 6f18853

Browse files
committed
feat(clients): parses and uses additional HTTP headers
The additional http headers set via `MONACO_ADDITIONAL_HTTP_HEADERS` are parsed and used in all places where a client factory is used to create REST clients. Additionally, it is parsed once in the runner in order to log the keys of the additional HTTP headers right at the start of Monaco.
1 parent 66898b6 commit 6f18853

File tree

4 files changed

+28
-5
lines changed

4 files changed

+28
-5
lines changed

cmd/monaco/account/delete.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
"github.com/dynatrace/dynatrace-configuration-as-code-core/clients"
2828
"github.com/dynatrace/dynatrace-configuration-as-code/v2/cmd/monaco/cmdutils"
2929
"github.com/dynatrace/dynatrace-configuration-as-code/v2/cmd/monaco/completion"
30+
"github.com/dynatrace/dynatrace-configuration-as-code/v2/internal/environment"
3031
"github.com/dynatrace/dynatrace-configuration-as-code/v2/internal/errutils"
3132
"github.com/dynatrace/dynatrace-configuration-as-code/v2/internal/files"
3233
"github.com/dynatrace/dynatrace-configuration-as-code/v2/internal/log"
@@ -160,10 +161,12 @@ func createAccountDeleteClient(ctx context.Context, a manifest.Account) (delete.
160161
apiUrl = a.ApiUrl.Value
161162
}
162163

164+
additionalHeaders := environment.GetAdditionalHttpHeadersFromEnv()
163165
c, err := clients.Factory().
164166
WithAccountURL(apiUrl).
165167
WithOAuthCredentials(oauthCreds).
166168
WithUserAgent(client.DefaultMonacoUserAgent).
169+
WithCustomHeaders(additionalHeaders).
167170
AccountClient(ctx)
168171
if err != nil {
169172
return delete.Account{}, err

cmd/monaco/dynatrace/dynatrace.go

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,13 @@ func isValidEnvironment(ctx context.Context, env manifest.EnvironmentDefinition)
7575
// canEstablishClassicConnection checks if a classic connection (via token) can be established. Scopes are not validated.
7676
func canEstablishClassicConnection(ctx context.Context, env manifest.EnvironmentDefinition) bool {
7777
token := env.Auth.Token.Value.Value()
78+
additionalHeaders := environment.GetAdditionalHttpHeadersFromEnv()
7879
client, err := clients.Factory().
7980
WithClassicURL(env.URL.Value).
8081
WithAccessToken(token).
8182
WithRateLimiter(true).
8283
WithRetryOptions(&client.DefaultRetryOptions).
84+
WithCustomHeaders(additionalHeaders).
8385
CreateClassicClient()
8486
if err != nil {
8587
report.GetReporterFromContextOrDiscard(ctx).ReportLoading(report.StateError, fmt.Errorf("could not create client %q (%s): %w", env.Name, env.URL.Value, err), "", nil)
@@ -124,6 +126,7 @@ func handleAuthError(ctx context.Context, env manifest.EnvironmentDefinition, er
124126
// CreateAccountClients gives back clients to use for specific accounts
125127
func CreateAccountClients(ctx context.Context, manifestAccounts map[string]manifest.Account) (map[account.AccountInfo]*accounts.Client, error) {
126128
concurrentRequestLimit := environment.GetEnvValueIntLog(environment.ConcurrentRequestsEnvKey)
129+
additionalHeaders := environment.GetAdditionalHttpHeadersFromEnv()
127130
accClients := make(map[account.AccountInfo]*accounts.Client, len(manifestAccounts))
128131
for _, acc := range manifestAccounts {
129132
oauthCreds := clientcredentials.Config{
@@ -138,7 +141,8 @@ func CreateAccountClients(ctx context.Context, manifestAccounts map[string]manif
138141
WithUserAgent(client.DefaultMonacoUserAgent).
139142
WithRateLimiter(true).
140143
WithRetryOptions(&client.DefaultRetryOptions).
141-
WithAccountURL(accountApiUrlOrDefault(acc.ApiUrl))
144+
WithAccountURL(accountApiUrlOrDefault(acc.ApiUrl)).
145+
WithCustomHeaders(additionalHeaders)
142146

143147
if supportarchive.IsEnabled(ctx) {
144148
factory = factory.WithHTTPListener(&corerest.HTTPListener{Callback: trafficlogs.GetInstance().LogToFiles})
@@ -218,7 +222,13 @@ func getDynatraceClassicURL(ctx context.Context, platformURL string, oauthCreds
218222
}
219223
}
220224

221-
client, err := clients.Factory().WithPlatformURL(platformURL).WithOAuthCredentials(oauthCreds).CreatePlatformClient(ctx)
225+
additionalHeaders := environment.GetAdditionalHttpHeadersFromEnv()
226+
client, err := clients.Factory().
227+
WithPlatformURL(platformURL).
228+
WithOAuthCredentials(oauthCreds).
229+
WithCustomHeaders(additionalHeaders).
230+
CreatePlatformClient(ctx)
231+
222232
if err != nil {
223233
return "", err
224234
}
@@ -231,9 +241,10 @@ func findSimpleClassicURL(ctx context.Context, platformURL string) (classicUrl s
231241
return "", false
232242
}
233243

244+
additionalHeaders := environment.GetAdditionalHttpHeadersFromEnv()
234245
classicUrl = strings.Replace(platformURL, ".apps.", ".live.", 1)
235246

236-
client, err := clients.Factory().WithClassicURL(classicUrl).CreateClassicClient()
247+
client, err := clients.Factory().WithClassicURL(classicUrl).WithCustomHeaders(additionalHeaders).CreateClassicClient()
237248
if err != nil {
238249
return "", false
239250
}

cmd/monaco/runner/runner.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020

2121
"github.com/spf13/afero"
2222
"github.com/spf13/cobra"
23+
"golang.org/x/exp/maps"
2324

2425
"github.com/dynatrace/dynatrace-configuration-as-code/v2/cmd/monaco/account"
2526
"github.com/dynatrace/dynatrace-configuration-as-code/v2/cmd/monaco/delete"
@@ -29,6 +30,7 @@ import (
2930
"github.com/dynatrace/dynatrace-configuration-as-code/v2/cmd/monaco/purge"
3031
"github.com/dynatrace/dynatrace-configuration-as-code/v2/cmd/monaco/supportarchive"
3132
versionCommand "github.com/dynatrace/dynatrace-configuration-as-code/v2/cmd/monaco/version"
33+
"github.com/dynatrace/dynatrace-configuration-as-code/v2/internal/environment"
3234
"github.com/dynatrace/dynatrace-configuration-as-code/v2/internal/featureflags"
3335
"github.com/dynatrace/dynatrace-configuration-as-code/v2/internal/log"
3436
"github.com/dynatrace/dynatrace-configuration-as-code/v2/internal/log/field"
@@ -96,6 +98,11 @@ Examples:
9698
}
9799

98100
memory.SetDefaultLimit()
101+
102+
additionalHeaders := environment.GetAdditionalHttpHeadersFromEnv()
103+
if len(additionalHeaders) > 0 {
104+
log.Info("Additional custom HTTP headers: %q, from '%s' environment variable", maps.Keys(additionalHeaders), environment.AdditionalHttpHeaders)
105+
}
99106
},
100107
Run: func(cmd *cobra.Command, args []string) {
101108
_ = cmd.Help()

pkg/client/clientset.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -264,16 +264,18 @@ func CreateClientSetWithOptions(ctx context.Context, url string, auth manifest.A
264264
serviceLevelObjectiveClient ServiceLevelObjectiveClient
265265
err error
266266
)
267-
concurrentReqLimit := environment.GetEnvValueIntLog(environment.ConcurrentRequestsEnvKey)
268267
if err = validateURL(url); err != nil {
269268
return nil, err
270269
}
271270

271+
concurrentReqLimit := environment.GetEnvValueIntLog(environment.ConcurrentRequestsEnvKey)
272+
additionalHeaders := environment.GetAdditionalHttpHeadersFromEnv()
272273
cFactory := clients.Factory().
273274
WithConcurrentRequestLimit(concurrentReqLimit).
274275
WithUserAgent(opts.getUserAgentString()).
275276
WithRetryOptions(&DefaultRetryOptions).
276-
WithRateLimiter(true)
277+
WithRateLimiter(true).
278+
WithCustomHeaders(additionalHeaders)
277279

278280
if supportarchive.IsEnabled(ctx) {
279281
cFactory = cFactory.WithHTTPListener(&rest.HTTPListener{Callback: trafficlogs.GetInstance().LogToFiles})

0 commit comments

Comments
 (0)