Skip to content

Commit a34c3ae

Browse files
committed
creates proxy TLS secret in the runtime
1 parent 3ec1d6d commit a34c3ae

File tree

6 files changed

+78
-66
lines changed

6 files changed

+78
-66
lines changed

doc/e2e/features.md

+8-8
Original file line numberDiff line numberDiff line change
@@ -219,15 +219,15 @@ import "github.com/Dynatrace/dynatrace-operator/test/features/cloudnative/codemo
219219

220220
<a name="ImageHasBeenDownloaded"></a>
221221

222-
## func [ImageHasBeenDownloaded](<https://github.com/Dynatrace/dynatrace-operator/blob/main/test/features/cloudnative/codemodules/codemodules.go#L488>)
222+
## func [ImageHasBeenDownloaded](<https://github.com/Dynatrace/dynatrace-operator/blob/main/test/features/cloudnative/codemodules/codemodules.go#L493>)
223223

224224
```go
225225
func ImageHasBeenDownloaded(dk dynakube.DynaKube) features.Func
226226
```
227227

228228
<a name="InstallFromImage"></a>
229229

230-
## func [InstallFromImage](<https://github.com/Dynatrace/dynatrace-operator/blob/main/test/features/cloudnative/codemodules/codemodules.go#L69>)
230+
## func [InstallFromImage](<https://github.com/Dynatrace/dynatrace-operator/blob/main/test/features/cloudnative/codemodules/codemodules.go#L68>)
231231

232232
```go
233233
func InstallFromImage(t *testing.T) features.Feature
@@ -237,15 +237,15 @@ Verification that the storage in the CSI driver directory does not increase when
237237

238238
<a name="VolumesAreMountedCorrectly"></a>
239239

240-
## func [VolumesAreMountedCorrectly](<https://github.com/Dynatrace/dynatrace-operator/blob/main/test/features/cloudnative/codemodules/codemodules.go#L574>)
240+
## func [VolumesAreMountedCorrectly](<https://github.com/Dynatrace/dynatrace-operator/blob/main/test/features/cloudnative/codemodules/codemodules.go#L579>)
241241

242242
```go
243243
func VolumesAreMountedCorrectly(sampleApp sample.App) features.Func
244244
```
245245

246246
<a name="WithProxy"></a>
247247

248-
## func [WithProxy](<https://github.com/Dynatrace/dynatrace-operator/blob/main/test/features/cloudnative/codemodules/codemodules.go#L138>)
248+
## func [WithProxy](<https://github.com/Dynatrace/dynatrace-operator/blob/main/test/features/cloudnative/codemodules/codemodules.go#L137>)
249249

250250
```go
251251
func WithProxy(t *testing.T, proxySpec *value.Source) features.Feature
@@ -261,31 +261,31 @@ Connectivity in the dynatrace namespace and sample application namespace is rest
261261

262262
<a name="WithProxyAndAGCert"></a>
263263

264-
## func [WithProxyAndAGCert](<https://github.com/Dynatrace/dynatrace-operator/blob/main/test/features/cloudnative/codemodules/codemodules.go#L207>)
264+
## func [WithProxyAndAGCert](<https://github.com/Dynatrace/dynatrace-operator/blob/main/test/features/cloudnative/codemodules/codemodules.go#L206>)
265265

266266
```go
267267
func WithProxyAndAGCert(t *testing.T, proxySpec *value.Source) features.Feature
268268
```
269269

270270
<a name="WithProxyAndAutomaticAGCert"></a>
271271

272-
## func [WithProxyAndAutomaticAGCert](<https://github.com/Dynatrace/dynatrace-operator/blob/main/test/features/cloudnative/codemodules/codemodules.go#L272>)
272+
## func [WithProxyAndAutomaticAGCert](<https://github.com/Dynatrace/dynatrace-operator/blob/main/test/features/cloudnative/codemodules/codemodules.go#L271>)
273273

274274
```go
275275
func WithProxyAndAutomaticAGCert(t *testing.T, proxySpec *value.Source) features.Feature
276276
```
277277

278278
<a name="WithProxyCAAndAGCert"></a>
279279

280-
## func [WithProxyCAAndAGCert](<https://github.com/Dynatrace/dynatrace-operator/blob/main/test/features/cloudnative/codemodules/codemodules.go#L334>)
280+
## func [WithProxyCAAndAGCert](<https://github.com/Dynatrace/dynatrace-operator/blob/main/test/features/cloudnative/codemodules/codemodules.go#L333>)
281281

282282
```go
283283
func WithProxyCAAndAGCert(t *testing.T, proxySpec *value.Source) features.Feature
284284
```
285285

286286
<a name="WithProxyCAAndAutomaticAGCert"></a>
287287

288-
## func [WithProxyCAAndAutomaticAGCert](<https://github.com/Dynatrace/dynatrace-operator/blob/main/test/features/cloudnative/codemodules/codemodules.go#L407>)
288+
## func [WithProxyCAAndAutomaticAGCert](<https://github.com/Dynatrace/dynatrace-operator/blob/main/test/features/cloudnative/codemodules/codemodules.go#L409>)
289289

290290
```go
291291
func WithProxyCAAndAutomaticAGCert(t *testing.T, proxySpec *value.Source) features.Feature

test/features/cloudnative/codemodules/codemodules.go

+10-5
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ const (
5858

5959
agSecretName = "ag-ca"
6060
configMapName = "proxy-ca"
61-
proxyCertificate = "custom-cas/custom.pem"
6261
agCertificate = "custom-cas/agcrt.pem"
6362
agCertificateAndPrivateKey = "custom-cas/agcrtkey.p12"
6463
agCertificateAndPrivateKeyField = "server.p12"
@@ -367,14 +366,17 @@ func WithProxyCAAndAGCert(t *testing.T, proxySpec *value.Source) features.Featur
367366
})
368367
builder.Assess("create AG TLS secret", secret.Create(agSecret))
369368

369+
proxyCert, proxyPk, err := proxy.CreateProxyTLSCertAndKey()
370+
require.NoError(t, err, "failed to create proxy TLS secret")
371+
370372
// Add customCA config map
371-
trustedCa, _ := os.ReadFile(path.Join(project.TestDataDir(), proxyCertificate))
373+
trustedCa := proxyCert
372374
caConfigMap := configmap.New(configMapName, cloudNativeDynakube.Namespace,
373375
map[string]string{dynakube.TrustedCAKey: string(trustedCa)})
374376
builder.Assess("create trusted CAs config map", configmap.Create(caConfigMap))
375377

376378
// Register proxy create and delete
377-
proxy.SetupProxyWithCustomCAandTeardown(t, builder, cloudNativeDynakube)
379+
proxy.SetupProxyWithCustomCAandTeardown(t, builder, cloudNativeDynakube, proxyCert, proxyPk)
378380
proxy.CutOffDynatraceNamespace(builder, proxySpec)
379381
proxy.IsDynatraceNamespaceCutOff(builder, cloudNativeDynakube)
380382

@@ -428,14 +430,17 @@ func WithProxyCAAndAutomaticAGCert(t *testing.T, proxySpec *value.Source) featur
428430

429431
builder.Assess("create sample namespace", sampleApp.InstallNamespace())
430432

433+
proxyCert, proxyPk, err := proxy.CreateProxyTLSCertAndKey()
434+
require.NoError(t, err, "failed to create proxy TLS secret")
435+
431436
// Add customCA config map
432-
trustedCa, _ := os.ReadFile(path.Join(project.TestDataDir(), proxyCertificate))
437+
trustedCa := proxyCert
433438
caConfigMap := configmap.New(configMapName, cloudNativeDynakube.Namespace,
434439
map[string]string{dynakube.TrustedCAKey: string(trustedCa)})
435440
builder.Assess("create trusted CAs config map", configmap.Create(caConfigMap))
436441

437442
// Register proxy create and delete
438-
proxy.SetupProxyWithCustomCAandTeardown(t, builder, cloudNativeDynakube)
443+
proxy.SetupProxyWithCustomCAandTeardown(t, builder, cloudNativeDynakube, proxyCert, proxyPk)
439444
proxy.CutOffDynatraceNamespace(builder, proxySpec)
440445
proxy.IsDynatraceNamespaceCutOff(builder, cloudNativeDynakube)
441446

test/helpers/proxy/proxy.go

+52-4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ package proxy
44

55
import (
66
"context"
7+
"crypto/x509"
78
"fmt"
89
"path"
910
"path/filepath"
@@ -12,6 +13,8 @@ import (
1213
"github.com/Dynatrace/dynatrace-operator/pkg/api/shared/value"
1314
"github.com/Dynatrace/dynatrace-operator/pkg/api/v1beta4/dynakube"
1415
"github.com/Dynatrace/dynatrace-operator/pkg/injection/codemodule/installer/common"
16+
"github.com/Dynatrace/dynatrace-operator/pkg/util/certificates"
17+
"github.com/Dynatrace/dynatrace-operator/pkg/util/timeprovider"
1518
"github.com/Dynatrace/dynatrace-operator/pkg/webhook"
1619
oamutation "github.com/Dynatrace/dynatrace-operator/pkg/webhook/mutation/pod/v1/oneagent"
1720
"github.com/Dynatrace/dynatrace-operator/test/helpers"
@@ -20,6 +23,7 @@ import (
2023
"github.com/Dynatrace/dynatrace-operator/test/helpers/kubeobjects/manifests"
2124
"github.com/Dynatrace/dynatrace-operator/test/helpers/kubeobjects/namespace"
2225
"github.com/Dynatrace/dynatrace-operator/test/helpers/kubeobjects/pod"
26+
"github.com/Dynatrace/dynatrace-operator/test/helpers/kubeobjects/secret"
2327
"github.com/Dynatrace/dynatrace-operator/test/helpers/platform"
2428
"github.com/Dynatrace/dynatrace-operator/test/helpers/sample"
2529
"github.com/Dynatrace/dynatrace-operator/test/helpers/shell"
@@ -45,9 +49,10 @@ const (
4549
var (
4650
dynatraceNetworkPolicy = path.Join(project.TestDataDir(), "network/dynatrace-denial.yaml")
4751

48-
proxyDeploymentPath = path.Join(project.TestDataDir(), "network/proxy.yaml")
49-
proxyWithCustomCADeploymentPath = path.Join(project.TestDataDir(), "network/proxy-ssl.yaml")
50-
proxySCCPath = path.Join(project.TestDataDir(), "network/proxy-scc.yaml")
52+
proxyDeploymentPath = path.Join(project.TestDataDir(), "network/proxy.yaml")
53+
proxyWithCustomCADeploymentPath = path.Join(project.TestDataDir(), "network/proxy-ssl.yaml")
54+
proxyNamespaceWithCustomCADeploymentPath = path.Join(project.TestDataDir(), "network/proxy-ssl-namespace.yaml")
55+
proxySCCPath = path.Join(project.TestDataDir(), "network/proxy-scc.yaml")
5156

5257
ProxySpec = &value.Source{
5358
Value: "http://squid.proxy.svc.cluster.local:3128",
@@ -67,8 +72,11 @@ func SetupProxyWithTeardown(t *testing.T, builder *features.FeatureBuilder, test
6772
}
6873
}
6974

70-
func SetupProxyWithCustomCAandTeardown(t *testing.T, builder *features.FeatureBuilder, testDynakube dynakube.DynaKube) {
75+
func SetupProxyWithCustomCAandTeardown(t *testing.T, builder *features.FeatureBuilder, testDynakube dynakube.DynaKube, pemCert []byte, pemPk []byte) {
7176
if testDynakube.Spec.Proxy != nil {
77+
builder.Assess("create proxy namespace", helpers.ToFeatureFunc(manifests.InstallFromFile(proxyNamespaceWithCustomCADeploymentPath), true))
78+
proxySecret := createProxyTLSSecret(pemCert, pemPk)
79+
builder.Assess("create proxy TLS secret", secret.Create(proxySecret))
7280
installProxySCC(builder, t)
7381
builder.Assess("install proxy", helpers.ToFeatureFunc(manifests.InstallFromFile(proxyWithCustomCADeploymentPath), true))
7482
builder.Assess("proxy started", helpers.ToFeatureFunc(deployment.WaitFor(proxyDeploymentName, proxyNamespaceName), true))
@@ -141,3 +149,43 @@ func CheckRuxitAgentProcFileHasProxySetting(sampleApp sample.App, proxySpec *val
141149
func getWebhookServiceUrl(dk dynakube.DynaKube) string {
142150
return fmt.Sprintf("%s.%s.svc.cluster.local", webhook.DeploymentName, dk.Namespace)
143151
}
152+
153+
func createProxyTLSSecret(pemCert []byte, pemPK []byte) corev1.Secret {
154+
pem := pemCert
155+
pem = append(pem, byte('\n'))
156+
pem = append(pem, pemPK...)
157+
158+
secretData := map[string][]byte{
159+
"squid-ca-cert.pem": pem,
160+
}
161+
162+
proxySecret := secret.New("proxy-ca", "proxy", secretData)
163+
proxySecret.Type = corev1.SecretTypeOpaque
164+
165+
return proxySecret
166+
}
167+
168+
func CreateProxyTLSCertAndKey() (pemCert []byte, pemKey []byte, err error) {
169+
cert, err := certificates.New(timeprovider.New())
170+
if err != nil {
171+
return nil, nil, err
172+
}
173+
174+
cert.Cert.DNSNames = []string{
175+
"squid.proxy",
176+
"squid.proxy.svc",
177+
"squid.proxy.svc.cluster.local",
178+
}
179+
cert.Cert.KeyUsage = x509.KeyUsageKeyEncipherment | x509.KeyUsageDataEncipherment
180+
cert.Cert.ExtKeyUsage = []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}
181+
cert.Cert.Subject.CommonName = "squid.proxy"
182+
cert.Cert.IsCA = true
183+
cert.Cert.BasicConstraintsValid = true
184+
185+
err = cert.SelfSign()
186+
if err != nil {
187+
return nil, nil, err
188+
}
189+
190+
return cert.ToPEM()
191+
}

test/testdata/custom-cas/custom.pem

-31
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
apiVersion: v1
2+
kind: Namespace
3+
metadata:
4+
name: proxy
5+
annotations:
6+
dynatrace.com/inject: "false"
7+
labels:
8+
app: squid

test/testdata/network/proxy-ssl.yaml

-18
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,10 @@
11
apiVersion: v1
2-
kind: Namespace
3-
metadata:
4-
name: proxy
5-
annotations:
6-
dynatrace.com/inject: "false"
7-
labels:
8-
app: squid
9-
---
10-
apiVersion: v1
112
kind: ServiceAccount
123
metadata:
134
name: proxy
145
namespace: proxy
156
---
167
apiVersion: v1
17-
kind: Secret
18-
metadata:
19-
name: proxy-ca
20-
namespace: proxy
21-
data:
22-
squid-ca-cert.pem: |
23-
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZWRENDQXp5Z0F3SUJBZ0lVUGlSSnphM0tVMnBYenVtVnB2eUhpNjduSXRrd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0ZqRVVNQklHQTFVRUF3d0xjM0YxYVdRdWNISnZlSGt3SGhjTk1qVXdNakF6TVRJeE1qUXlXaGNOTWpZdwpNakF6TVRJeE1qUXlXakFXTVJRd0VnWURWUVFEREF0emNYVnBaQzV3Y205NGVUQ0NBaUl3RFFZSktvWklodmNOCkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFNRk9ualdzcERGR0ppc3pXSDh3S25lVlFQTnFMb1hLMGV3bS9BaHkKWUxEQVc0amlSQmVJOUoyZTZ2OEpkdlp6d2lIR1lidEpRbll6Q2RQYWg3cWRlTEkzUko2akxBMWlCWWp1YWpJNgpEb2RnZi9paFQ5ejB2d1M0VXBKOEZOQjk4UUR1Z25ndzJkblR6TmJDRjFIeHh4WGhXbVRIUktQdjc5cVdHZzJRCk1xSzd3M210S1BONmhhNURaaE5WNmVqZGNtSlpVNEw5bU9tQ0pJWkVPa1UvS0tNM2huV1FUd1QwSXpxeHBwT2cKY2hDWFh0c09aV1AxSlNXZ0dlYkN5ZTJ5TlFRSWtzQnVIWW5qWlFjOWcvOTE5c293Q0daYkVaYzE5a2d2YWErSQpqTk5BQWg1UEgrVXVTemp1cGQrSEpHWnR6MzlVL3B2UW16L0ltdW50d0daRUVNTENZMUx3K0gzTzJXN2JLQWFjCmhNNFFEYWg1SjVFbjc3K2xGaytjZTBkbmN0UTc2aUwxd3cwVERpTFM1QzdvWjVsR2ZnaWRYZ0lZYnBzSVZoVUgKZWU4RWkwWmM2SzNzbU1NNGRYc3FKdHdXRVJoczBHMnUvQ3ZKMXI0Z3hlSUFmNStiaWhYUEdJOWxNdFBSSGEvMQozMVNuNlVUeVphb2l6alNZeVltSXVJZllNVkM1WCtEdEZVYjN3RysvVXlTdHFEcUZYUExEUzN5SHloajQyejhPClNBeDgydlpEUE8rQ0lWRHpzcWhyeGcyRzlzNWdCRnp2L3hTYWNFbFpFd3pFTGEwZmNyQXJhOEJMamtGVmdkaE0KTnNOWjRDWU9oRjJpdURDOWFRbXNXS0Iwak5CdWpkTW0vRVBKS1VETEtnMCtKNHJEYTg1WU5EOTZOYUtMWktVMgpjNk5kQWdNQkFBR2pnWmt3Z1pZd0hRWURWUjBPQkJZRUZBZjhOaDZENVpHUFBoVkNmOFBYOFM0cCtHcE9NQjhHCkExVWRJd1FZTUJhQUZBZjhOaDZENVpHUFBoVkNmOFBYOFM0cCtHcE9NRVlHQTFVZEVRUS9NRDJDQzNOeGRXbGsKTG5CeWIzaDVnZzl6Y1hWcFpDNXdjbTk0ZVM1emRtT0NIWE54ZFdsa0xuQnliM2g1TG5OMll5NWpiSFZ6ZEdWeQpMbXh2WTJGc01Bd0dBMVVkRXdRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTEJRQURnZ0lCQUNzYThMNGJvRkltCkxaVHp0VVpkUUFIWm51SmlNSEhzMnZidmJLM256aWFGZDl5Z2YwZi94L3hKNGI5QWU1bXpBc0MrdE42NVB3UnQKTDlua1lyOEttV0hVaERqY0IweWE3NFliTllqbGJiT2ZQa0R0SDIxSEd1T1JEVEJlMER3OWFjTW1YeTBhcmRZdQpjbTQveDBJMWlBRmNPbDFPWDYxVTlsYjc1RzJGaitXT2JPeldWWEJEQ0pWRGtUWjJETittNGZTL1JJRWhTcm1rCmNDTWFJcjYwc0tNT2lQWGdBSXBRR1ZYRVYxNDJSbThiZHVjb00yeG81ZmZVK1BaN1pVbk8rdXAzNXdHU0NEcHEKYm9HcEpUSUxxQTY4WGhzUGFvSEY2T0YvcERSTzlveFE1YVlIUWw3UmF4Tml6c2YwVHFoVWJZeGc1L1hVUnZTagpnSDE3T2MwRlFpaG9xU1NtRVZlVXE5aUUxOHVITENlMjdlVWNsL1VqK29PQlg0cXZIeXNkSmRGSWNQY2VOcllxCkVkU0ZGek5pckprVDlodG56YlhHZXhXdUJCQW9pWnlGaUJqU0kvaHlna0w5QzQzYUhSK2V6dU9lZHlVRm9XKzEKeGgvNGdXYUVlMDFXczVVbjhYcUdleE5UdWtQcjkrMlJ0R3R2d1htOWZVbGhZaEpLSEVzcTdZaDFUelNleWxMSwppSEUzZ2FicXk5SEh3SzJpcWhSODM0NUY4aXJGQys3QVJIVHE1NVVJdldOb2p6YVc1bndXSkR4YXkrYm1QKzZyCkVqdFAzNlVVaEg4RXhBUjRkNTlGQWVUaTZnSC85TkZOZjFEV0h0ZDRDbmRpeHM5VkVLa1FaMUx4MXpiSUhGTmgKaUpWUlNaczJIWlZqUEF4R3V5ZFJIcDlKOWI3SmthNkMKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQotLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS0KTUlJSlFnSUJBREFOQmdrcWhraUc5dzBCQVFFRkFBU0NDU3d3Z2drb0FnRUFBb0lDQVFEQlRwNDFyS1F4UmlZcgpNMWgvTUNwM2xVRHphaTZGeXRIc0p2d0ljbUN3d0Z1STRrUVhpUFNkbnVyL0NYYjJjOEloeG1HN1NVSjJNd25UCjJvZTZuWGl5TjBTZW95d05ZZ1dJN21veU9nNkhZSC80b1UvYzlMOEV1RktTZkJUUWZmRUE3b0o0TU5uWjA4elcKd2hkUjhjY1Y0VnBreDBTajcrL2FsaG9Oa0RLaXU4TjVyU2p6ZW9XdVEyWVRWZW5vM1hKaVdWT0MvWmpwZ2lTRwpSRHBGUHlpak40WjFrRThFOUNNNnNhYVRvSElRbDE3YkRtVmo5U1Vsb0JubXdzbnRzalVFQ0pMQWJoMko0MlVIClBZUC9kZmJLTUFobVd4R1hOZlpJTDJtdmlJelRRQUllVHgvbExrczQ3cVhmaHlSbWJjOS9WUDZiMEpzL3lKcnAKN2NCbVJCREN3bU5TOFBoOXp0bHUyeWdHbklUT0VBMm9lU2VSSisrL3BSWlBuSHRIWjNMVU8rb2k5Y01ORXc0aQowdVF1NkdlWlJuNEluVjRDR0c2YkNGWVZCM252Qkl0R1hPaXQ3SmpET0hWN0tpYmNGaEVZYk5CdHJ2d3J5ZGErCklNWGlBSCtmbTRvVnp4aVBaVExUMFIydjlkOVVwK2xFOG1XcUlzNDBtTW1KaUxpSDJERlF1Vi9nN1JWRzk4QnYKdjFNa3JhZzZoVnp5dzB0OGg4b1krTnMvRGtnTWZOcjJRenp2Z2lGUTg3S29hOFlOaHZiT1lBUmM3LzhVbW5CSgpXUk1NeEMydEgzS3dLMnZBUzQ1QlZZSFlURGJEV2VBbURvUmRvcmd3dldrSnJGaWdkSXpRYm8zVEp2eER5U2xBCnl5b05QaWVLdzJ2T1dEUS9laldpaTJTbE5uT2pYUUlEQVFBQkFvSUNBQzV6K3hjQTd0QWNnRzJmUUNRSWFod2sKbE9BcDR4WXB3RHFVdjdvejZrSnZaMC9FdUFKRDJpektsTVJHL1B5S290dEU5aFZ3ckhVRkhOWjVUR2F2RXVNWQozdmVVVkxDK25uL2ljMGl3cE84cFpIZFdKSC8vbkt2QXM2OFovRktDQVZsczk1TjBnZFdUelVUS2pab1dsUFlRCkdvM2ZTUUp3VlY1YzlkUE9sQ3lCSEo5djJraHdhQkdSaHNVY3YwSkRmUXBmVnU5Q2krMkpaY2VTTzhLS1EvUzkKRWlYTVVRRHF2bENMZ25FMWZGTzZYSVFkdUlYRjBuQnhRZWd2WlNFbTB4Q3VFcjRGZURtN21IcWQ4TXVDQ0pWYgo1NWpaUjZmand0UmorR3pEVHJ3eFJKRU9DS2NsY2RRem5VN1RCZzlMVWpMU05RRXlweXd6dys1MVFPZ1NjVWhCCkJjWTJzcitXeml3R3lhMC9KdUZGaTFQam9sckpRSmxLRW9sZVVHeGZxUGN3ZWI4OUluOFE3dVlRSHNscmJ2M1AKYzdyWFJQLzkydWd1bS9ocTNJcURWcUhSVUIrUUkwTWdabHlkTi9RbENVaFNUbmxkZUhKbFNrOEwvdXZTTmVhaApXRnV4ZHdBZnBMUUE3ZXo2Z1BSandtRXAzZ3BnVkduRVpNcWIzaGtJbm9ZWnlrVW1TNUI4eHRDV3RXenhITUFDCnl0RU52N1RoeUUwWkdkZkhZRXBmQ2dFYnp5MUZDK0FXZGc3N3VyTE1ORWpvakRKOTZydHd2anUwMk9uRmVDaTAKUm15emEvaEJQanhzRUEzY3JZQXkxQlNMM0l2TGNGUC9nRXM4a0FqaWt3cURsNWNxeVcvYzdGN2VTTXBkeWY5QwplaXMrNHpIRDZORnpFYzBPNWhQaEFvSUJBUUR2Szh1UzBYdXB5aXZreThUVDVveGR5SnlNUk1xZW9DVWRGYndjClg4cUdmZnYxdlo4SkJKRHZGdHFZWnF4YlpTVmVBbTdWeTFCVGs3TlhhbmdoRi9tL05aM0dIRUVmWHZxY3lsdzYKL21QRXRLYXcwRU1DOC9tZFNMNjFramdlT2JiWVl4bW5Hd2QzYXJ4VEtacEJkOWFUcWZGUWdjQTdSZWVWa3hFWAo5N0F0TzZ1Qzk5OTJrRVdWS1dNRGtKbjNGSTBQTWN4WVN2bi9ORi95M1RncHJSTTZ0UDlGUWNtWC9OVElYb2l1CmhoM0x2bEU1MlhKQnpweC84SnhreGpPSkI5QXdLUC85endlVG1ncW1peUVJcWhlM0lUNjMzdDltV2hQR29JZVUKT0FkcFVBNHg1UmlLWGVaelUzZm4wQW83WlZVdjN3UWRkOFVhTThXZVcxVVA3clhaQW9JQkFRRE82S3dEMzJxcgo4bzdYWWhlS0toZHRMUnkzcFpHUlZheVlqWHZObFFQb1hQb1BvNjkxSk9OZWQrQWhrdVNNYzBJdFNBMGtMaXRUCmdyaVhpemhsNHpZMkptdENoRzhDRXRVVXhzbGY3UkY5SlNlN1p3ekhxeWVRVlNvdVF5aFllK1VKTWYwdTR6QTAKMWNTWTlFUGNweG1ja01nZ3dkc0NRbEpNYnJaMWRLeFNBTTBFRXlPcnFXdU9wd1hBWkhLRVdwcXh5M0Z4SGlZVgpXYVZ0K2ZzOERsODhwZU9tMVZaeXk4TllMSHl3VlFzS2s0UFpUL0hwZStMMHhyUGdxNXJyWHBjVWRmL3RmZGVoCjBxc3h4cmRSSmliMUFmdGh2ME5Mb1F0TUxxaXJjU1o4S1hxWFEwVG5PQ0JYTm9XSWNXUmlrM0ZlN1BGYXMrS0EKdkVEVXV5Z3ZMbE1sQW9JQkFBaExpNDczQndQM2lCZ3lYUXhBWmNQbTdrOExINy9xcS83YlB4LzR6b3hsbURTSQp0QmhhK1MvaHFnazVIbWM1RmRleDIrZzhXZmZjR285QW1SUUV3ZHU0MzFUOHErR0xxTU9CWFR1S2tTbEVYcmVwCk1Ybkx2bStQRTFZMjBRMXpVUDBtU3NCNTlvTlV4MTFYQnd1WVBXLzNwKy96NEJmdUw3OEhUOE4yQ3IwMjRaYjAKUStMWDFDSDlRbnJnTEFiZXhwbXRUM29NZDZrN1JzeWtrWXNZZnA4OW9kRGtIRHJTUVFzR0JGV1JQejFPeDRCcgpJMFJYQnlTRTB0Zkg3QWVucHJmVTVEUUlWeW51WU1vdjd5QmV6ZDNESUdxK0p4OWtwbVR3TW1PWW9lRXNMcUhhCllVU0RSemZld0R6aEFVbllGT0ZKS2RwZnlnMURtR29LbnVPamt0a0NnZ0VBWlVzYkN6cFJLcVN3c1ZqZ1ZVK04KOEhEcFlpNjRPUUpNWU5MRERUNHFqNU1WQ0pzRnhyK3NZQThudHNnSEE0dFpsbmx6bFliVXh5bHozUnpYRzJwRQptL1hyQk1GNDV2YjVRaGFmZDByRUNSUXJnMTlMcm1Sb0ZnemJmWko3S2ZaZGhrYm13QkdSQkF5ekZuNWV5cU16CnNxWmVrMHJVUVNMZXozUlQ5dVNMaUFuRVZINWFOQ3ZZOEJsc2cyZXBlSW95dVYvenhZRVErOXJMVmkvUGd2TTIKUkthaDhJYjRyM0o1eTZ6YnppZVVKRFZia3dQRVZwM0Qyamw4emp5MHR3Mnp3TnlUMGx5Tk9EZStmN3ZjK3VsRwpvU083UVhzMUlzMVFqcGM1RTlWdEZkUG9wQ3pXaXF1N2lYYXpvTHlDZkkvYUxMS3E1ZEN5em50YThjbytQZnJiCjBRS0NBUUVBcktXSThDOW1ENnlRdWZIQVBCRDJLTXhnUTJVdjNaUHZqNU5kcUppMjFweThNSjNyNWQ4RFFsQWcKQ2w3RURoNml0alY2cFhCeGdsL0Nha1lMcURtczh4aG1KVkhWSmtlZ0E4OW53QXMxekx3d21tUmpyU3U2R0F3VgphOWpNdEJWK3dhY09kWHQwUVRlbVVhbzdNY1gzVy9PU1l6WXBlS1dEemQwUy9qeDZadHJkM2lGQ20vMTBydkYyCmJ1QTlJTWE2Q041QytHTTFhZ2xrb2s0Z1VWYWtHSk1uMXJRc3F3b0JlVkpxSkFHRVRWcExKY0hhbzNhVFh6ckgKU2gvVGFxUEVZUzlpRnV6NWhsc3ZNWUFFZUtML0VZNGo4Vi9EMlljYTJMTG5HV1BzS2VMQ2FMWkhucU1ieWtHeQo3ZEVQdGVZRTlrVFZqcmtwV2t6SGYyelQ4d3NxNkE9PQotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tCg==
24-
---
25-
apiVersion: v1
268
kind: ConfigMap
279
metadata:
2810
name: configfile

0 commit comments

Comments
 (0)