@@ -3031,6 +3031,81 @@ func TestReconcile_DeploymentAlignment(t *testing.T) {
30313031 }
30323032 })
30333033
3034+ t .Run ("EnvFromBinaryDataDoesNotSuppressDefault" , func (t * testing.T ) {
3035+ configMap := & corev1.ConfigMap {
3036+ ObjectMeta : metav1.ObjectMeta {Name : "test-deployment-alignment-envfrom-binary" , Namespace : "default" },
3037+ BinaryData : map [string ][]byte {
3038+ "CODER_ACCESS_URL" : []byte ("https://binary-data.example.test" ),
3039+ },
3040+ }
3041+ if err := k8sClient .Create (ctx , configMap ); err != nil {
3042+ t .Fatalf ("create configmap: %v" , err )
3043+ }
3044+ t .Cleanup (func () {
3045+ _ = k8sClient .Delete (ctx , configMap )
3046+ })
3047+
3048+ cp := & coderv1alpha1.CoderControlPlane {
3049+ ObjectMeta : metav1.ObjectMeta {Name : "test-deployment-alignment-envfrom-binary" , Namespace : "default" },
3050+ Spec : coderv1alpha1.CoderControlPlaneSpec {
3051+ Image : "test-deployment-alignment:latest" ,
3052+ EnvFrom : []corev1.EnvFromSource {{
3053+ ConfigMapRef : & corev1.ConfigMapEnvSource {
3054+ LocalObjectReference : corev1.LocalObjectReference {Name : configMap .Name },
3055+ },
3056+ }},
3057+ },
3058+ }
3059+ if err := k8sClient .Create (ctx , cp ); err != nil {
3060+ t .Fatalf ("create control plane: %v" , err )
3061+ }
3062+ t .Cleanup (func () {
3063+ _ = k8sClient .Delete (ctx , cp )
3064+ })
3065+
3066+ r := & controller.CoderControlPlaneReconciler {Client : k8sClient , APIReader : k8sClient , Scheme : scheme }
3067+ if _ , err := r .Reconcile (ctx , ctrl.Request {NamespacedName : types.NamespacedName {Name : cp .Name , Namespace : cp .Namespace }}); err != nil {
3068+ t .Fatalf ("reconcile control plane: %v" , err )
3069+ }
3070+
3071+ deployment := & appsv1.Deployment {}
3072+ if err := k8sClient .Get (ctx , types.NamespacedName {Name : cp .Name , Namespace : cp .Namespace }, deployment ); err != nil {
3073+ t .Fatalf ("get deployment: %v" , err )
3074+ }
3075+ container := deployment .Spec .Template .Spec .Containers [0 ]
3076+ expectedAccessURL := "http://" + cp .Name + "." + cp .Namespace + ".svc.cluster.local"
3077+ if got := mustFindEnvVar (t , container .Env , "CODER_ACCESS_URL" ).Value ; got != expectedAccessURL {
3078+ t .Fatalf ("expected default CODER_ACCESS_URL %q, got %q" , expectedAccessURL , got )
3079+ }
3080+ })
3081+
3082+ t .Run ("EnvFromWithConfigMapAndSecretRefsIsRejectedAtAdmission" , func (t * testing.T ) {
3083+ cp := & coderv1alpha1.CoderControlPlane {
3084+ ObjectMeta : metav1.ObjectMeta {Name : "test-deployment-alignment-envfrom-both-refs" , Namespace : "default" },
3085+ Spec : coderv1alpha1.CoderControlPlaneSpec {
3086+ Image : "test-deployment-alignment:latest" ,
3087+ EnvFrom : []corev1.EnvFromSource {{
3088+ ConfigMapRef : & corev1.ConfigMapEnvSource {
3089+ LocalObjectReference : corev1.LocalObjectReference {Name : "both-refs-configmap" },
3090+ },
3091+ SecretRef : & corev1.SecretEnvSource {
3092+ LocalObjectReference : corev1.LocalObjectReference {Name : "both-refs-secret" },
3093+ },
3094+ }},
3095+ },
3096+ }
3097+ err := k8sClient .Create (ctx , cp )
3098+ if err == nil {
3099+ t .Fatal ("expected create to fail when envFrom entry sets both configMapRef and secretRef" )
3100+ }
3101+ if ! apierrors .IsInvalid (err ) {
3102+ t .Fatalf ("expected invalid error for envFrom entry with both refs, got: %v" , err )
3103+ }
3104+ if ! strings .Contains (err .Error (), "envFrom" ) {
3105+ t .Fatalf ("expected envFrom validation error, got: %v" , err )
3106+ }
3107+ })
3108+
30343109 t .Run ("ResourcesAndSecurityContextsApplied" , func (t * testing.T ) {
30353110 runAsUser := int64 (1001 )
30363111 allowPrivilegeEscalation := false
0 commit comments