Skip to content

Commit 4c07e60

Browse files
committed
fix: use HTTPS SDK URL when TLS service port is 443
1 parent 2af8ddb commit 4c07e60

2 files changed

Lines changed: 77 additions & 1 deletion

File tree

internal/controller/codercontrolplane_controller.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1393,7 +1393,12 @@ func controlPlaneSDKURL(coderControlPlane *coderv1alpha1.CoderControlPlane) stri
13931393
servicePort = defaultControlPlanePort
13941394
}
13951395

1396-
return fmt.Sprintf("http://%s.%s.svc.cluster.local:%d", coderControlPlane.Name, coderControlPlane.Namespace, servicePort)
1396+
scheme := "http"
1397+
if controlPlaneTLSEnabled(coderControlPlane) && servicePort == 443 {
1398+
scheme = "https"
1399+
}
1400+
1401+
return fmt.Sprintf("%s://%s.%s.svc.cluster.local:%d", scheme, coderControlPlane.Name, coderControlPlane.Namespace, servicePort)
13971402
}
13981403

13991404
func (r *CoderControlPlaneReconciler) reconcileOperatorAccess(

internal/controller/codercontrolplane_controller_test.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -735,6 +735,77 @@ func TestReconcile_LicenseUsesInternalHTTPURLWhenTLSEnabled(t *testing.T) {
735735
}
736736
}
737737

738+
func TestReconcile_LicenseUsesHTTPSWhenTLSAndServicePort443(t *testing.T) {
739+
ensureGatewaySchemeRegistered(t)
740+
ctx := context.Background()
741+
742+
licenseSecret := &corev1.Secret{
743+
ObjectMeta: metav1.ObjectMeta{Name: "test-license-tls-443-url-secret", Namespace: "default"},
744+
Data: map[string][]byte{
745+
coderv1alpha1.DefaultLicenseSecretKey: []byte("license-jwt-tls-443-url"),
746+
},
747+
}
748+
if err := k8sClient.Create(ctx, licenseSecret); err != nil {
749+
t.Fatalf("create license secret: %v", err)
750+
}
751+
t.Cleanup(func() {
752+
_ = k8sClient.Delete(ctx, licenseSecret)
753+
})
754+
755+
cp := &coderv1alpha1.CoderControlPlane{
756+
ObjectMeta: metav1.ObjectMeta{Name: "test-license-tls-443-url", Namespace: "default"},
757+
Spec: coderv1alpha1.CoderControlPlaneSpec{
758+
ExtraEnv: []corev1.EnvVar{{
759+
Name: "CODER_PG_CONNECTION_URL",
760+
Value: "postgres://example/license-tls-443-url",
761+
}},
762+
Service: coderv1alpha1.ServiceSpec{Port: 443},
763+
TLS: coderv1alpha1.TLSSpec{
764+
SecretNames: []string{"coder-internal-tls-443-secret"},
765+
},
766+
LicenseSecretRef: &coderv1alpha1.SecretKeySelector{Name: licenseSecret.Name},
767+
},
768+
}
769+
if err := k8sClient.Create(ctx, cp); err != nil {
770+
t.Fatalf("create test CoderControlPlane: %v", err)
771+
}
772+
t.Cleanup(func() {
773+
_ = k8sClient.Delete(ctx, cp)
774+
})
775+
776+
provisioner := &fakeOperatorAccessProvisioner{token: "operator-token-license-tls-443-url"}
777+
uploader := &fakeLicenseUploader{}
778+
r := &controller.CoderControlPlaneReconciler{
779+
Client: k8sClient,
780+
Scheme: scheme,
781+
OperatorAccessProvisioner: provisioner,
782+
LicenseUploader: uploader,
783+
}
784+
785+
if _, err := r.Reconcile(ctx, ctrl.Request{NamespacedName: types.NamespacedName{Name: cp.Name, Namespace: cp.Namespace}}); err != nil {
786+
t.Fatalf("first reconcile control plane: %v", err)
787+
}
788+
deployment := &appsv1.Deployment{}
789+
if err := k8sClient.Get(ctx, types.NamespacedName{Name: cp.Name, Namespace: cp.Namespace}, deployment); err != nil {
790+
t.Fatalf("get reconciled deployment: %v", err)
791+
}
792+
deployment.Status.ReadyReplicas = 1
793+
deployment.Status.Replicas = 1
794+
if err := k8sClient.Status().Update(ctx, deployment); err != nil {
795+
t.Fatalf("update deployment status: %v", err)
796+
}
797+
798+
if _, err := r.Reconcile(ctx, ctrl.Request{NamespacedName: types.NamespacedName{Name: cp.Name, Namespace: cp.Namespace}}); err != nil {
799+
t.Fatalf("second reconcile control plane: %v", err)
800+
}
801+
if len(uploader.calls) != 1 {
802+
t.Fatalf("expected one license upload call, got %d", len(uploader.calls))
803+
}
804+
if got := uploader.calls[0].coderURL; got != "https://test-license-tls-443-url.default.svc.cluster.local:443" {
805+
t.Fatalf("expected license upload URL %q, got %q", "https://test-license-tls-443-url.default.svc.cluster.local:443", got)
806+
}
807+
}
808+
738809
func TestReconcile_LicenseReuploadsWhenBackendHasNoLicenses(t *testing.T) {
739810
ensureGatewaySchemeRegistered(t)
740811
ctx := context.Background()

0 commit comments

Comments
 (0)