Skip to content

Commit 0b245c0

Browse files
committed
Allow customize http vhost config using HttpdCustomization.CustomConfigSecret
This change allows to customize the httpd vhost config using this parameter to specify a secret that contains service config data. The content of each provided snippet gets rendered as a go template and placed into /etc/httpd/conf/httpd_custom_<endpoint>_<key> . At the end of the vhost config in the default httpd template these custom configs get included using `Include conf/httpd_custom_<endpoint>_*`. For information on how sections in httpd configuration get merged, check section "How the sections are merged" in https://httpd.apache.org/docs/current/sections.html#merging All possible parameters which can be use in a template can be looked up in the <service>-config-data secret of the service like: $ oc get secret -n openstack placement-config-data -o json | jq -r .data.TemplateParameters | base64 -d or in the running pod of the service in the file: $ cat /var/lib/config-data/default/TemplateParameters The content is a versioned dump of the parameters of the service operator, like: ~~~ DatabaseConnection: mysql+pymysql://<user>:<pwd>@hostname-for-openstack.openstack.svc/placement?read_default_file=/etc/my.cnf KeystoneInternalURL: http://keystone-internal.openstack.svc:5000 KeystonePublicURL: http://keystone-public-openstack.testin LogFile: /var/log/placement/placement-api.log PlacementPassword: <pwd> ServiceUser: placement TimeOut: 60 VHosts: internal: Override: false ServerName: placement-internal.openstack.svc TLS: false public: Override: false ServerName: placement-public.openstack.svc TLS: false ~~~ Depends-On: openstack-k8s-operators/lib-common#591 Depends-On: openstack-k8s-operators/lib-common#593 Jira: https://issues.redhat.com/browse/OSPRH-13100 Signed-off-by: Martin Schuppert <[email protected]>
1 parent 5c39b09 commit 0b245c0

File tree

13 files changed

+191
-14
lines changed

13 files changed

+191
-14
lines changed

api/bases/placement.openstack.org_placementapis.yaml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,20 @@ spec:
8484
description: DefaultConfigOverwrite - interface to overwrite default
8585
config files like policy.yaml.
8686
type: object
87+
httpdCustomization:
88+
description: HttpdCustomization - customize the httpd service
89+
properties:
90+
customConfigSecret:
91+
description: |-
92+
CustomConfigSecret - customize the httpd vhost config using this parameter to specify
93+
a secret that contains service config data. The content of each provided snippet gets
94+
rendered as a go template and placed into /etc/httpd/conf/httpd_custom_<key> .
95+
In the default httpd template at the end of the vhost those custom configs get
96+
included using `Include conf/httpd_custom_<endpoint>_*`.
97+
For information on how sections in httpd configuration get merged, check section
98+
"How the sections are merged" in https://httpd.apache.org/docs/current/sections.html#merging
99+
type: string
100+
type: object
87101
networkAttachments:
88102
description: NetworkAttachments is a list of NetworkAttachment resource
89103
names to expose the services to the given network

api/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ module github.com/openstack-k8s-operators/placement-operator/api
33
go 1.21
44

55
require (
6-
github.com/openstack-k8s-operators/lib-common/modules/common v0.5.1-0.20241216113837-d172b3ac0f4e
6+
github.com/openstack-k8s-operators/lib-common/modules/common v0.5.1-0.20250116145727-01a8948d5dd7
77
k8s.io/api v0.29.10
88
k8s.io/apimachinery v0.29.10
99
sigs.k8s.io/controller-runtime v0.17.6

api/go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ github.com/onsi/ginkgo/v2 v2.20.1 h1:YlVIbqct+ZmnEph770q9Q7NVAz4wwIiVNahee6JyUzo
7373
github.com/onsi/ginkgo/v2 v2.20.1/go.mod h1:lG9ey2Z29hR41WMVthyJBGUBcBhGOtoPF2VFMvBXFCI=
7474
github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=
7575
github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=
76-
github.com/openstack-k8s-operators/lib-common/modules/common v0.5.1-0.20241216113837-d172b3ac0f4e h1:hf4kVQBkyG79WcHBxdQ25QrDBbGFdarebS1Tc0Xclq4=
77-
github.com/openstack-k8s-operators/lib-common/modules/common v0.5.1-0.20241216113837-d172b3ac0f4e/go.mod h1:YpNTuJhDWhbXM50O3qBkhO7M+OOyRmWkNVmJ4y3cyFs=
76+
github.com/openstack-k8s-operators/lib-common/modules/common v0.5.1-0.20250116145727-01a8948d5dd7 h1:vXHpH93PjbAgg5ZN6n5WmxkybVQOs0nhXvVw62o7aZs=
77+
github.com/openstack-k8s-operators/lib-common/modules/common v0.5.1-0.20250116145727-01a8948d5dd7/go.mod h1:YpNTuJhDWhbXM50O3qBkhO7M+OOyRmWkNVmJ4y3cyFs=
7878
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
7979
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
8080
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=

api/v1beta1/placementapi_types.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,10 @@ type PlacementAPISpecCore struct {
124124
// +operator-sdk:csv:customresourcedefinitions:type=spec
125125
// TLS - Parameters related to the TLS
126126
TLS tls.API `json:"tls,omitempty"`
127+
128+
// +kubebuilder:validation:Optional
129+
// HttpdCustomization - customize the httpd service
130+
HttpdCustomization HttpdCustomization `json:"httpdCustomization,omitempty"`
127131
}
128132

129133
// APIOverrideSpec to override the generated manifest of several child resources.
@@ -141,6 +145,19 @@ type PasswordSelector struct {
141145
Service string `json:"service"`
142146
}
143147

148+
// HttpdCustomization - customize the httpd service
149+
type HttpdCustomization struct {
150+
// +kubebuilder:validation:Optional
151+
// CustomConfigSecret - customize the httpd vhost config using this parameter to specify
152+
// a secret that contains service config data. The content of each provided snippet gets
153+
// rendered as a go template and placed into /etc/httpd/conf/httpd_custom_<key> .
154+
// In the default httpd template at the end of the vhost those custom configs get
155+
// included using `Include conf/httpd_custom_<endpoint>_*`.
156+
// For information on how sections in httpd configuration get merged, check section
157+
// "How the sections are merged" in https://httpd.apache.org/docs/current/sections.html#merging
158+
CustomConfigSecret *string `json:"customConfigSecret,omitempty"`
159+
}
160+
144161
// PlacementAPIStatus defines the observed state of PlacementAPI
145162
type PlacementAPIStatus struct {
146163
// ReadyCount of placement API instances

api/v1beta1/zz_generated.deepcopy.go

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/crd/bases/placement.openstack.org_placementapis.yaml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,20 @@ spec:
8484
description: DefaultConfigOverwrite - interface to overwrite default
8585
config files like policy.yaml.
8686
type: object
87+
httpdCustomization:
88+
description: HttpdCustomization - customize the httpd service
89+
properties:
90+
customConfigSecret:
91+
description: |-
92+
CustomConfigSecret - customize the httpd vhost config using this parameter to specify
93+
a secret that contains service config data. The content of each provided snippet gets
94+
rendered as a go template and placed into /etc/httpd/conf/httpd_custom_<key> .
95+
In the default httpd template at the end of the vhost those custom configs get
96+
included using `Include conf/httpd_custom_<endpoint>_*`.
97+
For information on how sections in httpd configuration get merged, check section
98+
"How the sections are merged" in https://httpd.apache.org/docs/current/sections.html#merging
99+
type: string
100+
type: object
87101
networkAttachments:
88102
description: NetworkAttachments is a list of NetworkAttachment resource
89103
names to expose the services to the given network

controllers/placementapi_controller.go

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"fmt"
2222
"time"
2323

24+
"gopkg.in/yaml.v2"
2425
"k8s.io/apimachinery/pkg/fields"
2526
"k8s.io/apimachinery/pkg/runtime"
2627
"k8s.io/apimachinery/pkg/types"
@@ -815,17 +816,19 @@ func (r *PlacementAPIReconciler) initConditions(
815816

816817
// fields to index to reconcile when change
817818
const (
818-
passwordSecretField = ".spec.secret"
819-
caBundleSecretNameField = ".spec.tls.caBundleSecretName"
820-
tlsAPIInternalField = ".spec.tls.api.internal.secretName"
821-
tlsAPIPublicField = ".spec.tls.api.public.secretName"
819+
passwordSecretField = ".spec.secret"
820+
caBundleSecretNameField = ".spec.tls.caBundleSecretName"
821+
tlsAPIInternalField = ".spec.tls.api.internal.secretName"
822+
tlsAPIPublicField = ".spec.tls.api.public.secretName"
823+
httpdCustomServiceConfigSecretField = ".spec.httpdCustomization.customServiceConfigSecret"
822824
)
823825

824826
var allWatchFields = []string{
825827
passwordSecretField,
826828
caBundleSecretNameField,
827829
tlsAPIInternalField,
828830
tlsAPIPublicField,
831+
httpdCustomServiceConfigSecretField,
829832
}
830833

831834
// SetupWithManager sets up the controller with the Manager.
@@ -878,6 +881,18 @@ func (r *PlacementAPIReconciler) SetupWithManager(mgr ctrl.Manager) error {
878881
return err
879882
}
880883

884+
// index httpdOverrideSecretField
885+
if err := mgr.GetFieldIndexer().IndexField(context.Background(), &placementv1.PlacementAPI{}, httpdCustomServiceConfigSecretField, func(rawObj client.Object) []string {
886+
// Extract the secret name from the spec, if one is provided
887+
cr := rawObj.(*placementv1.PlacementAPI)
888+
if cr.Spec.HttpdCustomization.CustomConfigSecret == nil {
889+
return nil
890+
}
891+
return []string{*cr.Spec.HttpdCustomization.CustomConfigSecret}
892+
}); err != nil {
893+
return err
894+
}
895+
881896
return ctrl.NewControllerManagedBy(mgr).
882897
For(&placementv1.PlacementAPI{}).
883898
Owns(&mariadbv1.MariaDBDatabase{}).
@@ -1242,7 +1257,7 @@ func (r *PlacementAPIReconciler) generateServiceConfigMaps(
12421257
"KeystoneInternalURL": keystoneInternalURL,
12431258
"KeystonePublicURL": keystonePublicURL,
12441259
"PlacementPassword": string(ospSecret.Data[instance.Spec.PasswordSelectors.Service]),
1245-
"log_file": "/var/log/placement/placement-api.log",
1260+
"LogFile": "/var/log/placement/placement-api.log",
12461261
"DatabaseConnection": fmt.Sprintf("mysql+pymysql://%s:%s@%s/%s?read_default_file=/etc/my.cnf",
12471262
databaseAccount.Spec.UserName,
12481263
string(dbSecret.Data[mariadbv1.DatabasePasswordSelector]),
@@ -1251,7 +1266,16 @@ func (r *PlacementAPIReconciler) generateServiceConfigMaps(
12511266
),
12521267
}
12531268

1269+
httpdOverrideSecret := &corev1.Secret{}
1270+
if instance.Spec.HttpdCustomization.CustomConfigSecret != nil && *instance.Spec.HttpdCustomization.CustomConfigSecret != "" {
1271+
httpdOverrideSecret, _, err = secret.GetSecret(ctx, h, *instance.Spec.HttpdCustomization.CustomConfigSecret, instance.Namespace)
1272+
if err != nil {
1273+
return err
1274+
}
1275+
}
1276+
12541277
// create httpd vhost template parameters
1278+
customTemplates := map[string]string{}
12551279
httpdVhostConfig := map[string]interface{}{}
12561280
for _, endpt := range []service.Endpoint{service.EndpointInternal, service.EndpointPublic} {
12571281
endptConfig := map[string]interface{}{}
@@ -1262,11 +1286,28 @@ func (r *PlacementAPIReconciler) generateServiceConfigMaps(
12621286
endptConfig["SSLCertificateFile"] = fmt.Sprintf("/etc/pki/tls/certs/%s.crt", endpt.String())
12631287
endptConfig["SSLCertificateKeyFile"] = fmt.Sprintf("/etc/pki/tls/private/%s.key", endpt.String())
12641288
}
1289+
1290+
endptConfig["Override"] = false
1291+
if len(httpdOverrideSecret.Data) > 0 {
1292+
endptConfig["Override"] = true
1293+
for key, data := range httpdOverrideSecret.Data {
1294+
if len(data) > 0 {
1295+
customTemplates["httpd_custom_"+endpt.String()+"_"+key] = string(data)
1296+
}
1297+
}
1298+
}
12651299
httpdVhostConfig[endpt.String()] = endptConfig
12661300
}
12671301
templateParameters["VHosts"] = httpdVhostConfig
12681302
templateParameters["TimeOut"] = instance.Spec.APITimeout
12691303

1304+
// Marshal the templateParameters map to YAML
1305+
yamlData, err := yaml.Marshal(templateParameters)
1306+
if err != nil {
1307+
return fmt.Errorf("Error marshalling to YAML: %w", err)
1308+
}
1309+
customData[common.TemplateParameters] = string(yamlData)
1310+
12701311
extraTemplates := map[string]string{
12711312
"placement.conf": "placementapi/config/placement.conf",
12721313
}
@@ -1286,6 +1327,7 @@ func (r *PlacementAPIReconciler) generateServiceConfigMaps(
12861327
Namespace: instance.Namespace,
12871328
Type: util.TemplateTypeConfig,
12881329
InstanceType: instance.Kind,
1330+
StringTemplate: customTemplates,
12891331
CustomData: customData,
12901332
ConfigOptions: templateParameters,
12911333
Labels: cmLabels,

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,12 @@ require (
99
github.com/onsi/ginkgo/v2 v2.20.1
1010
github.com/onsi/gomega v1.34.1
1111
github.com/openstack-k8s-operators/keystone-operator/api v0.5.1-0.20241212135809-dc78e7221d12
12-
github.com/openstack-k8s-operators/lib-common/modules/common v0.5.1-0.20241216113837-d172b3ac0f4e
12+
github.com/openstack-k8s-operators/lib-common/modules/common v0.5.1-0.20250116145727-01a8948d5dd7
1313
github.com/openstack-k8s-operators/lib-common/modules/test v0.5.1-0.20241216113837-d172b3ac0f4e
1414
github.com/openstack-k8s-operators/mariadb-operator/api v0.5.1-0.20241212160155-4e7d8f749820
1515
github.com/openstack-k8s-operators/placement-operator/api v0.3.1-0.20240216174613-3d349f26e681
1616
go.uber.org/zap v1.27.0
17+
gopkg.in/yaml.v2 v2.4.0
1718
k8s.io/api v0.29.10
1819
k8s.io/apimachinery v0.29.10
1920
k8s.io/client-go v0.29.10
@@ -70,7 +71,6 @@ require (
7071
google.golang.org/appengine v1.6.8 // indirect
7172
google.golang.org/protobuf v1.34.1 // indirect
7273
gopkg.in/inf.v0 v0.9.1 // indirect
73-
gopkg.in/yaml.v2 v2.4.0 // indirect
7474
gopkg.in/yaml.v3 v3.0.1 // indirect
7575
k8s.io/apiextensions-apiserver v0.29.10 // indirect
7676
k8s.io/component-base v0.29.10 // indirect

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,8 @@ github.com/openshift/api v0.0.0-20240830023148-b7d0481c9094 h1:J1wuGhVxpsHykZBa6
8080
github.com/openshift/api v0.0.0-20240830023148-b7d0481c9094/go.mod h1:CxgbWAlvu2iQB0UmKTtRu1YfepRg1/vJ64n2DlIEVz4=
8181
github.com/openstack-k8s-operators/keystone-operator/api v0.5.1-0.20241212135809-dc78e7221d12 h1:37tN4oVifWqkerafFrx3DFDDTOOzn2H+c67WIQ1Vkss=
8282
github.com/openstack-k8s-operators/keystone-operator/api v0.5.1-0.20241212135809-dc78e7221d12/go.mod h1:AZhHY6dZzGyG9iVOf1poD7pTS9c7ZG/f99Fg+GdFVEk=
83-
github.com/openstack-k8s-operators/lib-common/modules/common v0.5.1-0.20241216113837-d172b3ac0f4e h1:hf4kVQBkyG79WcHBxdQ25QrDBbGFdarebS1Tc0Xclq4=
84-
github.com/openstack-k8s-operators/lib-common/modules/common v0.5.1-0.20241216113837-d172b3ac0f4e/go.mod h1:YpNTuJhDWhbXM50O3qBkhO7M+OOyRmWkNVmJ4y3cyFs=
83+
github.com/openstack-k8s-operators/lib-common/modules/common v0.5.1-0.20250116145727-01a8948d5dd7 h1:vXHpH93PjbAgg5ZN6n5WmxkybVQOs0nhXvVw62o7aZs=
84+
github.com/openstack-k8s-operators/lib-common/modules/common v0.5.1-0.20250116145727-01a8948d5dd7/go.mod h1:YpNTuJhDWhbXM50O3qBkhO7M+OOyRmWkNVmJ4y3cyFs=
8585
github.com/openstack-k8s-operators/lib-common/modules/openstack v0.5.1-0.20241216113837-d172b3ac0f4e h1:HFo4OqPY0x4ZQeaWI2YGonTXAGTQFt+rOEJlfZVhS7s=
8686
github.com/openstack-k8s-operators/lib-common/modules/openstack v0.5.1-0.20241216113837-d172b3ac0f4e/go.mod h1:IASoGvp5QM/tBJUd/8i8uIjj4DBnI+64Ydh4r7pmnvA=
8787
github.com/openstack-k8s-operators/lib-common/modules/test v0.5.1-0.20241216113837-d172b3ac0f4e h1:/iWDp3j+ET3gE5IjKHtdZaPd4SQyLHB/4L5jB16cV3I=

templates/placementapi/config/httpd.conf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,11 @@ CustomLog /dev/stdout proxy env=forwarded
6868
WSGIDaemonProcess {{ $endpt }} display-name={{ $endpt }} group=placement processes=3 threads=1 user=placement
6969
WSGIProcessGroup {{ $endpt }}
7070
WSGIScriptAlias / /usr/bin/placement-api
71+
72+
{{- if $vhost.Override }}
73+
Include conf/httpd_custom_{{ $endpt }}_*
74+
{{- end }}
75+
7176
</VirtualHost>
7277
{{ end }}
7378

templates/placementapi/config/placement-api-config.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,13 @@
5353
"dest": "/etc/my.cnf",
5454
"owner": "placement",
5555
"perm": "0644"
56+
},
57+
{
58+
"source": "/var/lib/config-data/default/httpd_custom_*",
59+
"dest": "/etc/httpd/conf/",
60+
"owner": "apache",
61+
"perm": "0444",
62+
"optional": true
5663
}
5764
],
5865
"permissions": [

templates/placementapi/config/placement.conf

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
max_logfile_count=5
44
max_logfile_size_mb=50
55
log_rotation_type=size
6-
{{if (index . "log_file") }}
7-
log_file = {{ .log_file }}
6+
{{if (index . "LogFile") }}
7+
log_file = {{ .LogFile }}
88
{{end}}
99
debug = true
1010

tests/functional/placementapi_controller_test.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131
"k8s.io/apimachinery/pkg/types"
3232

3333
keystonev1 "github.com/openstack-k8s-operators/keystone-operator/api/v1beta1"
34+
"github.com/openstack-k8s-operators/lib-common/modules/common"
3435
condition "github.com/openstack-k8s-operators/lib-common/modules/common/condition"
3536
mariadb_test "github.com/openstack-k8s-operators/mariadb-operator/api/test/helpers"
3637
)
@@ -977,6 +978,62 @@ var _ = Describe("PlacementAPI controller", func() {
977978
}, timeout, interval).Should(Succeed())
978979
})
979980
})
981+
982+
When("A PlacementAPI is created with HttpdCustomization.CustomConfigSecret", func() {
983+
BeforeEach(func() {
984+
customServiceConfigSecretName := types.NamespacedName{Name: "foo", Namespace: namespace}
985+
customConfig := []byte(`CustomParam "foo"
986+
CustomKeystonePublicURL "{{ .KeystonePublicURL }}"`)
987+
th.CreateSecret(
988+
customServiceConfigSecretName,
989+
map[string][]byte{
990+
"bar.conf": customConfig,
991+
},
992+
)
993+
994+
spec := GetDefaultPlacementAPISpec()
995+
spec["httpdCustomization"] = map[string]interface{}{
996+
"customConfigSecret": customServiceConfigSecretName.Name,
997+
}
998+
999+
placement := CreatePlacementAPI(names.PlacementAPIName, spec)
1000+
DeferCleanup(th.DeleteInstance, placement)
1001+
1002+
DeferCleanup(keystone.DeleteKeystoneAPI, keystone.CreateKeystoneAPI(namespace))
1003+
DeferCleanup(k8sClient.Delete, ctx, CreatePlacementAPISecret(namespace, SecretName))
1004+
1005+
serviceSpec := corev1.ServiceSpec{Ports: []corev1.ServicePort{{Port: 3306}}}
1006+
DeferCleanup(
1007+
mariadb.DeleteDBService,
1008+
mariadb.CreateDBService(namespace, "openstack", serviceSpec),
1009+
)
1010+
mariadb.SimulateMariaDBDatabaseCompleted(names.MariaDBDatabaseName)
1011+
mariadb.SimulateMariaDBAccountCompleted(names.MariaDBAccount)
1012+
1013+
th.SimulateJobSuccess(names.DBSyncJobName)
1014+
th.SimulateDeploymentReplicaReady(names.DeploymentName)
1015+
keystone.SimulateKeystoneServiceReady(names.KeystoneServiceName)
1016+
keystone.SimulateKeystoneEndpointReady(names.KeystoneEndpointName)
1017+
DeferCleanup(th.DeleteInstance, placement)
1018+
})
1019+
1020+
It("it renders the custom template and adds it to the placement-config-data secret", func() {
1021+
scrt := th.GetSecret(names.ConfigMapName)
1022+
Expect(scrt).ShouldNot(BeNil())
1023+
Expect(scrt.Data).Should(HaveKey(common.TemplateParameters))
1024+
configData := string(scrt.Data[common.TemplateParameters])
1025+
keystonePublicURL := "http://keystone-public-openstack.testing"
1026+
Expect(configData).Should(ContainSubstring(fmt.Sprintf("KeystonePublicURL: %s", keystonePublicURL)))
1027+
1028+
for _, cfg := range []string{"httpd_custom_internal_bar.conf", "httpd_custom_public_bar.conf"} {
1029+
Expect(scrt.Data).Should(HaveKey(cfg))
1030+
configData := string(scrt.Data[cfg])
1031+
Expect(configData).Should(ContainSubstring("CustomParam \"foo\""))
1032+
Expect(configData).Should(ContainSubstring(fmt.Sprintf("CustomKeystonePublicURL \"%s\"", keystonePublicURL)))
1033+
}
1034+
})
1035+
})
1036+
9801037
// Run MariaDBAccount suite tests. these are pre-packaged ginkgo tests
9811038
// that exercise standard account create / update patterns that should be
9821039
// common to all controllers that ensure MariaDBAccount CRs.

0 commit comments

Comments
 (0)