@@ -657,6 +657,84 @@ func TestReconcile_LicenseAppliesOnceAndTracksHash(t *testing.T) {
657657 }
658658}
659659
660+ func TestReconcile_LicenseUsesInternalHTTPURLWhenTLSEnabled (t * testing.T ) {
661+ ensureGatewaySchemeRegistered (t )
662+ ctx := context .Background ()
663+
664+ licenseSecret := & corev1.Secret {
665+ ObjectMeta : metav1.ObjectMeta {Name : "test-license-tls-internal-url-secret" , Namespace : "default" },
666+ Data : map [string ][]byte {
667+ coderv1alpha1 .DefaultLicenseSecretKey : []byte ("license-jwt-tls-internal-url" ),
668+ },
669+ }
670+ if err := k8sClient .Create (ctx , licenseSecret ); err != nil {
671+ t .Fatalf ("create license secret: %v" , err )
672+ }
673+ t .Cleanup (func () {
674+ _ = k8sClient .Delete (ctx , licenseSecret )
675+ })
676+
677+ cp := & coderv1alpha1.CoderControlPlane {
678+ ObjectMeta : metav1.ObjectMeta {Name : "test-license-tls-internal-url" , Namespace : "default" },
679+ Spec : coderv1alpha1.CoderControlPlaneSpec {
680+ ExtraEnv : []corev1.EnvVar {{
681+ Name : "CODER_PG_CONNECTION_URL" ,
682+ Value : "postgres://example/license-tls-internal-url" ,
683+ }},
684+ TLS : coderv1alpha1.TLSSpec {
685+ SecretNames : []string {"coder-internal-tls-secret" },
686+ },
687+ LicenseSecretRef : & coderv1alpha1.SecretKeySelector {Name : licenseSecret .Name },
688+ },
689+ }
690+ if err := k8sClient .Create (ctx , cp ); err != nil {
691+ t .Fatalf ("create test CoderControlPlane: %v" , err )
692+ }
693+ t .Cleanup (func () {
694+ _ = k8sClient .Delete (ctx , cp )
695+ })
696+
697+ provisioner := & fakeOperatorAccessProvisioner {token : "operator-token-license-tls-url" }
698+ uploader := & fakeLicenseUploader {}
699+ r := & controller.CoderControlPlaneReconciler {
700+ Client : k8sClient ,
701+ Scheme : scheme ,
702+ OperatorAccessProvisioner : provisioner ,
703+ LicenseUploader : uploader ,
704+ }
705+
706+ if _ , err := r .Reconcile (ctx , ctrl.Request {NamespacedName : types.NamespacedName {Name : cp .Name , Namespace : cp .Namespace }}); err != nil {
707+ t .Fatalf ("first reconcile control plane: %v" , err )
708+ }
709+ deployment := & appsv1.Deployment {}
710+ if err := k8sClient .Get (ctx , types.NamespacedName {Name : cp .Name , Namespace : cp .Namespace }, deployment ); err != nil {
711+ t .Fatalf ("get reconciled deployment: %v" , err )
712+ }
713+ deployment .Status .ReadyReplicas = 1
714+ deployment .Status .Replicas = 1
715+ if err := k8sClient .Status ().Update (ctx , deployment ); err != nil {
716+ t .Fatalf ("update deployment status: %v" , err )
717+ }
718+
719+ if _ , err := r .Reconcile (ctx , ctrl.Request {NamespacedName : types.NamespacedName {Name : cp .Name , Namespace : cp .Namespace }}); err != nil {
720+ t .Fatalf ("second reconcile control plane: %v" , err )
721+ }
722+ if len (uploader .calls ) != 1 {
723+ t .Fatalf ("expected one license upload call, got %d" , len (uploader .calls ))
724+ }
725+ if got := uploader .calls [0 ].coderURL ; got != "http://test-license-tls-internal-url.default.svc.cluster.local:80" {
726+ t .Fatalf ("expected license upload URL %q, got %q" , "http://test-license-tls-internal-url.default.svc.cluster.local:80" , got )
727+ }
728+
729+ reconciled := & coderv1alpha1.CoderControlPlane {}
730+ if err := k8sClient .Get (ctx , types.NamespacedName {Name : cp .Name , Namespace : cp .Namespace }, reconciled ); err != nil {
731+ t .Fatalf ("get reconciled control plane: %v" , err )
732+ }
733+ if ! strings .HasPrefix (reconciled .Status .URL , "https://" ) {
734+ t .Fatalf ("expected status URL to remain https when TLS is enabled, got %q" , reconciled .Status .URL )
735+ }
736+ }
737+
660738func TestReconcile_LicenseReuploadsWhenBackendHasNoLicenses (t * testing.T ) {
661739 ensureGatewaySchemeRegistered (t )
662740 ctx := context .Background ()
0 commit comments