Skip to content

Commit 9bba483

Browse files
621 allow for plain http connections (#622)
* add flag to connect to cluster using http even if tls enabled * use https if non-TLS listeners are disabled
1 parent 7625a11 commit 9bba483

File tree

6 files changed

+204
-47
lines changed

6 files changed

+204
-47
lines changed

controllers/common.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,5 @@ const (
3232
OperatorNamespaceEnvVar = "OPERATOR_NAMESPACE"
3333
EnableWebhooksEnvVar = "ENABLE_WEBHOOKS"
3434
ControllerSyncPeriodEnvVar = "SYNC_PERIOD"
35+
ConnectUsingPlainHTTPEnvVar = "CONNECT_USING_PLAIN_HTTP"
3536
)

controllers/topology_controller.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ type TopologyReconciler struct {
3333
Recorder record.EventRecorder
3434
RabbitmqClientFactory rabbitmqclient.Factory
3535
KubernetesClusterDomain string
36+
ConnectUsingPlainHTTP bool
3637
}
3738

3839
func (r *TopologyReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
@@ -48,7 +49,7 @@ func (r *TopologyReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
4849
return ctrl.Result{}, err
4950
}
5051

51-
credsProvider, tlsEnabled, err := rabbitmqclient.ParseReference(ctx, r.Client, obj.RabbitReference(), obj.GetNamespace(), r.KubernetesClusterDomain)
52+
credsProvider, tlsEnabled, err := rabbitmqclient.ParseReference(ctx, r.Client, obj.RabbitReference(), obj.GetNamespace(), r.KubernetesClusterDomain, r.ConnectUsingPlainHTTP)
5253
if err != nil {
5354
return r.handleRMQReferenceParseError(ctx, obj, err)
5455
}

controllers/topology_controller_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,4 +86,35 @@ var _ = Describe("TopologyReconciler", func() {
8686
Expect(uri).To(BeEquivalentTo("https://example-rabbit.default.svc:15671"))
8787
})
8888
})
89+
90+
When("flag for plain HTTP connection is set", func() {
91+
It("uses http for connection", func() {
92+
Expect((&controllers.TopologyReconciler{
93+
Client: mgr.GetClient(),
94+
Type: &topology.Queue{},
95+
Scheme: mgr.GetScheme(),
96+
Recorder: fakeRecorder,
97+
RabbitmqClientFactory: fakeRabbitMQClientFactory,
98+
ReconcileFunc: &controllers.QueueReconciler{},
99+
ConnectUsingPlainHTTP: true,
100+
}).SetupWithManager(mgr)).To(Succeed())
101+
102+
queue := &topology.Queue{
103+
ObjectMeta: metav1.ObjectMeta{Name: "cb-queue", Namespace: "default"},
104+
Spec: topology.QueueSpec{RabbitmqClusterReference: commonRabbitmqClusterRef},
105+
}
106+
fakeRabbitMQClient.DeclareQueueReturns(commonHttpCreatedResponse, nil)
107+
fakeRabbitMQClient.DeleteQueueReturns(commonHttpDeletedResponse, nil)
108+
Expect(client.Create(ctx, queue)).To(Succeed())
109+
110+
Eventually(func() int {
111+
return len(fakeRabbitMQClientFactoryArgsForCall)
112+
}, 5).Should(BeNumerically(">", 0))
113+
114+
credentials, _, _ := FakeRabbitMQClientFactoryArgsForCall(0)
115+
uri, found := credentials["uri"]
116+
Expect(found).To(BeTrue(), "expected to find key 'uri'")
117+
Expect(uri).To(BeEquivalentTo("http://example-rabbit.default.svc:15672"))
118+
})
119+
})
89120
})

main.go

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ func main() {
102102

103103
clusterDomain := sanitizeClusterDomainInput(os.Getenv(controllers.KubernetesInternalDomainEnvVar))
104104

105+
usePlainHTTP := getBoolEnv(controllers.ConnectUsingPlainHTTPEnvVar)
106+
105107
managerOpts := ctrl.Options{
106108
Scheme: scheme,
107109
MetricsBindAddress: metricsAddr,
@@ -167,6 +169,7 @@ func main() {
167169
RabbitmqClientFactory: rabbitmqclient.RabbitholeClientFactory,
168170
KubernetesClusterDomain: clusterDomain,
169171
ReconcileFunc: &controllers.QueueReconciler{},
172+
ConnectUsingPlainHTTP: usePlainHTTP,
170173
}).SetupWithManager(mgr); err != nil {
171174
log.Error(err, "unable to create controller", "controller", controllers.QueueControllerName)
172175
os.Exit(1)
@@ -181,6 +184,7 @@ func main() {
181184
RabbitmqClientFactory: rabbitmqclient.RabbitholeClientFactory,
182185
KubernetesClusterDomain: clusterDomain,
183186
ReconcileFunc: &controllers.ExchangeReconciler{},
187+
ConnectUsingPlainHTTP: usePlainHTTP,
184188
}).SetupWithManager(mgr); err != nil {
185189
log.Error(err, "unable to create controller", "controller", controllers.ExchangeControllerName)
186190
os.Exit(1)
@@ -195,6 +199,7 @@ func main() {
195199
RabbitmqClientFactory: rabbitmqclient.RabbitholeClientFactory,
196200
KubernetesClusterDomain: clusterDomain,
197201
ReconcileFunc: &controllers.BindingReconciler{},
202+
ConnectUsingPlainHTTP: usePlainHTTP,
198203
}).SetupWithManager(mgr); err != nil {
199204
log.Error(err, "unable to create controller", "controller", controllers.BindingControllerName)
200205
os.Exit(1)
@@ -210,6 +215,7 @@ func main() {
210215
KubernetesClusterDomain: clusterDomain,
211216
WatchTypes: []client.Object{&corev1.Secret{}},
212217
ReconcileFunc: &controllers.UserReconciler{Client: mgr.GetClient(), Scheme: mgr.GetScheme()},
218+
ConnectUsingPlainHTTP: usePlainHTTP,
213219
}).SetupWithManager(mgr); err != nil {
214220
log.Error(err, "unable to create controller", "controller", controllers.UserControllerName)
215221
os.Exit(1)
@@ -224,6 +230,7 @@ func main() {
224230
RabbitmqClientFactory: rabbitmqclient.RabbitholeClientFactory,
225231
KubernetesClusterDomain: clusterDomain,
226232
ReconcileFunc: &controllers.VhostReconciler{Client: mgr.GetClient()},
233+
ConnectUsingPlainHTTP: usePlainHTTP,
227234
}).SetupWithManager(mgr); err != nil {
228235
log.Error(err, "unable to create controller", "controller", controllers.VhostControllerName)
229236
os.Exit(1)
@@ -238,6 +245,7 @@ func main() {
238245
RabbitmqClientFactory: rabbitmqclient.RabbitholeClientFactory,
239246
KubernetesClusterDomain: clusterDomain,
240247
ReconcileFunc: &controllers.PolicyReconciler{},
248+
ConnectUsingPlainHTTP: usePlainHTTP,
241249
}).SetupWithManager(mgr); err != nil {
242250
log.Error(err, "unable to create controller", "controller", controllers.PolicyControllerName)
243251
os.Exit(1)
@@ -252,6 +260,7 @@ func main() {
252260
RabbitmqClientFactory: rabbitmqclient.RabbitholeClientFactory,
253261
KubernetesClusterDomain: clusterDomain,
254262
ReconcileFunc: &controllers.PermissionReconciler{Client: mgr.GetClient(), Scheme: mgr.GetScheme()},
263+
ConnectUsingPlainHTTP: usePlainHTTP,
255264
}).SetupWithManager(mgr); err != nil {
256265
log.Error(err, "unable to create controller", "controller", controllers.PermissionControllerName)
257266
os.Exit(1)
@@ -266,6 +275,7 @@ func main() {
266275
RabbitmqClientFactory: rabbitmqclient.RabbitholeClientFactory,
267276
KubernetesClusterDomain: clusterDomain,
268277
ReconcileFunc: &controllers.SchemaReplicationReconciler{Client: mgr.GetClient()},
278+
ConnectUsingPlainHTTP: usePlainHTTP,
269279
}).SetupWithManager(mgr); err != nil {
270280
log.Error(err, "unable to create controller", "controller", controllers.SchemaReplicationControllerName)
271281
os.Exit(1)
@@ -280,6 +290,7 @@ func main() {
280290
RabbitmqClientFactory: rabbitmqclient.RabbitholeClientFactory,
281291
KubernetesClusterDomain: clusterDomain,
282292
ReconcileFunc: &controllers.FederationReconciler{Client: mgr.GetClient()},
293+
ConnectUsingPlainHTTP: usePlainHTTP,
283294
}).SetupWithManager(mgr); err != nil {
284295
log.Error(err, "unable to create controller", "controller", controllers.FederationControllerName)
285296
os.Exit(1)
@@ -294,6 +305,7 @@ func main() {
294305
RabbitmqClientFactory: rabbitmqclient.RabbitholeClientFactory,
295306
KubernetesClusterDomain: clusterDomain,
296307
ReconcileFunc: &controllers.ShovelReconciler{Client: mgr.GetClient()},
308+
ConnectUsingPlainHTTP: usePlainHTTP,
297309
}).SetupWithManager(mgr); err != nil {
298310
log.Error(err, "unable to create controller", "controller", controllers.ShovelControllerName)
299311
os.Exit(1)
@@ -308,6 +320,7 @@ func main() {
308320
RabbitmqClientFactory: rabbitmqclient.RabbitholeClientFactory,
309321
KubernetesClusterDomain: clusterDomain,
310322
ReconcileFunc: &controllers.TopicPermissionReconciler{Client: mgr.GetClient(), Scheme: mgr.GetScheme()},
323+
ConnectUsingPlainHTTP: usePlainHTTP,
311324
}).SetupWithManager(mgr); err != nil {
312325
log.Error(err, "unable to create controller", "controller", controllers.TopicPermissionControllerName)
313326
os.Exit(1)
@@ -386,7 +399,7 @@ func main() {
386399

387400
func getEnvInDuration(envName string) time.Duration {
388401
var durationInt int64
389-
if durationStr := os.Getenv(envName); durationStr != "" {
402+
if durationStr, ok := os.LookupEnv(envName); ok {
390403
var err error
391404
if durationInt, err = strconv.ParseInt(durationStr, 10, 64); err != nil {
392405
log.Error(err, fmt.Sprintf("unable to parse provided '%s'", envName))
@@ -395,3 +408,15 @@ func getEnvInDuration(envName string) time.Duration {
395408
}
396409
return time.Duration(durationInt) * time.Second
397410
}
411+
412+
func getBoolEnv(envName string) bool {
413+
var boolVar bool
414+
if boolStr, ok := os.LookupEnv(envName); ok {
415+
var err error
416+
if boolVar, err = strconv.ParseBool(boolStr); err != nil {
417+
log.Error(err, fmt.Sprintf("unable to parse provided '%s'", envName))
418+
os.Exit(1)
419+
}
420+
}
421+
return boolVar
422+
}

rabbitmqclient/cluster_reference.go

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ var (
3232
NoServiceReferenceSetError = errors.New("RabbitmqCluster has no ServiceReference set in status.defaultUser")
3333
)
3434

35-
func ParseReference(ctx context.Context, c client.Client, rmq topology.RabbitmqClusterReference, requestNamespace string, clusterDomain string) (map[string]string, bool, error) {
35+
func ParseReference(ctx context.Context, c client.Client, rmq topology.RabbitmqClusterReference, requestNamespace string, clusterDomain string, connectUsingHTTP bool) (map[string]string, bool, error) {
3636
if rmq.ConnectionSecret != nil {
3737
secret := &corev1.Secret{}
3838
if err := c.Get(ctx, types.NamespacedName{Namespace: requestNamespace, Name: rmq.ConnectionSecret.Name}, secret); err != nil {
@@ -99,8 +99,8 @@ func ParseReference(ctx context.Context, c client.Client, rmq topology.RabbitmqC
9999
if err != nil {
100100
return nil, false, fmt.Errorf("unable to parse additionconfig setting from the rabbitmqcluster resource: %w", err)
101101
}
102-
103-
endpoint, err := managementURI(svc, cluster.TLSEnabled(), clusterDomain, additionalConfig["management.path_prefix"])
102+
useTLSForConnection := cluster.TLSEnabled() && (!connectUsingHTTP || cluster.DisableNonTLSListeners())
103+
endpoint, err := managementURI(svc, useTLSForConnection, clusterDomain, additionalConfig["management.path_prefix"])
104104
if err != nil {
105105
return nil, false, fmt.Errorf("failed to get endpoint from specified rabbitmqcluster: %w", err)
106106
}
@@ -109,7 +109,7 @@ func ParseReference(ctx context.Context, c client.Client, rmq topology.RabbitmqC
109109
"username": user,
110110
"password": pass,
111111
"uri": endpoint,
112-
}, cluster.TLSEnabled(), nil
112+
}, useTLSForConnection, nil
113113
}
114114

115115
func AllowedNamespace(rmq topology.RabbitmqClusterReference, requestNamespace string, cluster *rabbitmqv1beta1.RabbitmqCluster) bool {
@@ -178,25 +178,28 @@ func readUsernamePassword(secret *corev1.Secret) (string, string, error) {
178178
return string(secret.Data["username"]), string(secret.Data["password"]), nil
179179
}
180180

181-
func managementURI(svc *corev1.Service, tlsEnabled bool, clusterDomain string, pathPrefix string) (string, error) {
181+
func managementURI(svc *corev1.Service, useTLSForConnection bool, clusterDomain string, pathPrefix string) (string, error) {
182182
var managementUiPort int
183+
var portName string
184+
185+
if useTLSForConnection {
186+
portName = "management-tls"
187+
} else {
188+
portName = "management"
189+
}
183190
for _, port := range svc.Spec.Ports {
184-
if port.Name == "management-tls" {
191+
if port.Name == portName {
185192
managementUiPort = int(port.Port)
186193
break
187194
}
188-
if port.Name == "management" {
189-
managementUiPort = int(port.Port)
190-
// Do not break here because we may still find 'management-tls' port
191-
}
192195
}
193196

194197
if managementUiPort == 0 {
195-
return "", fmt.Errorf("failed to find 'management' or 'management-tls' from service %s", svc.Name)
198+
return "", fmt.Errorf("failed to find %s from service %s", portName, svc.Name)
196199
}
197200

198201
scheme := "http"
199-
if tlsEnabled {
202+
if useTLSForConnection {
200203
scheme = "https"
201204
}
202205
url := url.URL{

0 commit comments

Comments
 (0)