Skip to content

Commit bace0da

Browse files
committed
Add support for path_prefix configuration in the cluster
1 parent e69e543 commit bace0da

File tree

4 files changed

+116
-3
lines changed

4 files changed

+116
-3
lines changed

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ require (
1414
github.com/onsi/gomega v1.20.0
1515
github.com/rabbitmq/cluster-operator v1.14.0
1616
github.com/sclevine/yj v0.0.0-20200815061347-554173e71934
17+
gopkg.in/ini.v1 v1.66.6
1718
k8s.io/api v0.24.3
1819
k8s.io/apimachinery v0.24.3
1920
k8s.io/client-go v0.24.3

go.sum

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1966,6 +1966,7 @@ gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
19661966
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
19671967
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
19681968
gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
1969+
gopkg.in/ini.v1 v1.66.6 h1:LATuAqN/shcYAOkv3wl2L4rkaKqkcgTBQjOyYDvcPKI=
19691970
gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
19701971
gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
19711972
gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=

rabbitmqclient/cluster_reference.go

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99

1010
rabbitmqv1beta1 "github.com/rabbitmq/cluster-operator/api/v1beta1"
1111
topology "github.com/rabbitmq/messaging-topology-operator/api/v1beta1"
12+
"gopkg.in/ini.v1"
1213
corev1 "k8s.io/api/core/v1"
1314
"k8s.io/apimachinery/pkg/types"
1415
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -99,7 +100,12 @@ func ParseReference(ctx context.Context, c client.Client, rmq topology.RabbitmqC
99100
return nil, false, err
100101
}
101102

102-
endpoint, err := managementURI(svc, cluster.TLSEnabled(), clusterDomain)
103+
pathPrefix, err := readClusterPathPrefix(cluster)
104+
if err != nil {
105+
return nil, false, fmt.Errorf("unable to parse additionconfig setting from the rabbitmqcluster resource: %w", err)
106+
}
107+
108+
endpoint, err := managementURI(svc, cluster.TLSEnabled(), clusterDomain, pathPrefix)
103109
if err != nil {
104110
return nil, false, fmt.Errorf("failed to get endpoint from specified rabbitmqcluster: %w", err)
105111
}
@@ -161,6 +167,33 @@ func readCredentialsFromKubernetesSecret(secret *corev1.Secret) (ConnectionCrede
161167
}, tlsEnabled, nil
162168
}
163169

170+
func readClusterPathPrefix(cluster *rabbitmqv1beta1.RabbitmqCluster) (string, error) {
171+
additionalConfig := cluster.Spec.Rabbitmq.AdditionalConfig
172+
173+
var err error
174+
if additionalConfig == "" {
175+
return "", err
176+
}
177+
178+
path_prefix, err := readIniConfig(additionalConfig, "management", "path_prefix")
179+
if err != nil {
180+
return "", err
181+
}
182+
183+
return path_prefix, nil
184+
}
185+
186+
func readIniConfig(config string, section string, key string) (string, error) {
187+
cfg, err := ini.LoadSources(ini.LoadOptions{
188+
SkipUnrecognizableLines: false,
189+
}, []byte(config))
190+
if err != nil {
191+
return "", err
192+
}
193+
194+
return cfg.Section(section).Key(key).String(), nil
195+
}
196+
164197
func readUsernamePassword(secret *corev1.Secret) (string, string, error) {
165198
if secret == nil {
166199
return "", "", errors.New("unable to extract data from nil secret")
@@ -169,7 +202,7 @@ func readUsernamePassword(secret *corev1.Secret) (string, string, error) {
169202
return string(secret.Data["username"]), string(secret.Data["password"]), nil
170203
}
171204

172-
func managementURI(svc *corev1.Service, tlsEnabled bool, clusterDomain string) (string, error) {
205+
func managementURI(svc *corev1.Service, tlsEnabled bool, clusterDomain string, pathPrefix string) (string, error) {
173206
var managementUiPort int
174207
for _, port := range svc.Spec.Ports {
175208
if port.Name == "management-tls" {
@@ -190,5 +223,11 @@ func managementURI(svc *corev1.Service, tlsEnabled bool, clusterDomain string) (
190223
if tlsEnabled {
191224
scheme = "https"
192225
}
193-
return fmt.Sprintf("%s://%s.%s.svc%s:%d", scheme, svc.Name, svc.Namespace, clusterDomain, managementUiPort), nil
226+
url := url.URL{
227+
Scheme: scheme,
228+
Host: fmt.Sprintf("%s.%s.svc%s:%d", svc.Name, svc.Namespace, clusterDomain, managementUiPort),
229+
Path: pathPrefix,
230+
}
231+
return url.String(), nil
232+
// return fmt.Sprintf("%s://%s.%s.svc%s:%d", scheme, svc.Name, svc.Namespace, clusterDomain, pathPrefix, managementUiPort), nil
194233
}

rabbitmqclient/cluster_reference_test.go

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package rabbitmqclient_test
33
import (
44
"context"
55
"fmt"
6+
67
"github.com/rabbitmq/messaging-topology-operator/rabbitmqclient"
78
"github.com/rabbitmq/messaging-topology-operator/rabbitmqclient/rabbitmqclientfakes"
89

@@ -283,6 +284,77 @@ var _ = Describe("ParseReference", func() {
283284
})
284285
})
285286

287+
When("the RabbitmqCluster is configured with management path_prefix using ini", func() {
288+
BeforeEach(func() {
289+
existingRabbitMQCluster = &rabbitmqv1beta1.RabbitmqCluster{
290+
ObjectMeta: metav1.ObjectMeta{
291+
Name: "rmq",
292+
Namespace: namespace,
293+
},
294+
Spec: rabbitmqv1beta1.RabbitmqClusterSpec{
295+
Rabbitmq: rabbitmqv1beta1.RabbitmqClusterConfigurationSpec{
296+
AdditionalConfig: `
297+
[management]
298+
path_prefix = /my/prefix
299+
`,
300+
},
301+
},
302+
Status: rabbitmqv1beta1.RabbitmqClusterStatus{
303+
Binding: &corev1.LocalObjectReference{
304+
Name: "rmq-default-user-credentials",
305+
},
306+
DefaultUser: &rabbitmqv1beta1.RabbitmqClusterDefaultUser{
307+
ServiceReference: &rabbitmqv1beta1.RabbitmqClusterServiceReference{
308+
Name: "rmq",
309+
Namespace: namespace,
310+
},
311+
},
312+
},
313+
}
314+
existingCredentialSecret = &corev1.Secret{
315+
ObjectMeta: metav1.ObjectMeta{
316+
Name: "rmq-default-user-credentials",
317+
Namespace: namespace,
318+
},
319+
Data: map[string][]byte{
320+
"username": []byte(existingRabbitMQUsername),
321+
"password": []byte(existingRabbitMQPassword),
322+
},
323+
}
324+
existingService = &corev1.Service{
325+
ObjectMeta: metav1.ObjectMeta{
326+
Name: "rmq",
327+
Namespace: namespace,
328+
},
329+
Spec: corev1.ServiceSpec{
330+
ClusterIP: "1.2.3.4",
331+
Ports: []corev1.ServicePort{
332+
{
333+
Name: "management-tls",
334+
Port: int32(15671),
335+
},
336+
},
337+
},
338+
}
339+
objs = []runtime.Object{existingRabbitMQCluster, existingCredentialSecret, existingService}
340+
})
341+
342+
It("returns correct creds in connectionCredentials", func() {
343+
credsProvider, _, err := rabbitmqclient.ParseReference(ctx, fakeClient,
344+
topology.RabbitmqClusterReference{Name: existingRabbitMQCluster.Name},
345+
existingRabbitMQCluster.Namespace,
346+
"")
347+
Expect(err).NotTo(HaveOccurred())
348+
349+
usernameBytes, _ := credsProvider.Data("username")
350+
passwordBytes, _ := credsProvider.Data("password")
351+
uriBytes, _ := credsProvider.Data("uri")
352+
Expect(usernameBytes).To(Equal([]byte(existingRabbitMQUsername)))
353+
Expect(passwordBytes).To(Equal([]byte(existingRabbitMQPassword)))
354+
Expect(uriBytes).To(Equal([]byte("http://rmq.rabbitmq-system.svc:15671/my/prefix")))
355+
})
356+
})
357+
286358
Context("spec.rabbitmqClusterReference.connectionSecret is set", func() {
287359
When("uri has no scheme defined", func() {
288360
BeforeEach(func() {

0 commit comments

Comments
 (0)