@@ -784,7 +784,7 @@ func (r *CoderControlPlaneReconciler) reconcileDeployment(ctx context.Context, c
784784 accessURLConfiguredViaEnvFrom := false
785785 if injectClusterAccessURL {
786786 var err error
787- accessURLConfiguredViaEnvFrom , err = envFromMayDefineEnvVar ( coderControlPlane .Spec .EnvFrom , "CODER_ACCESS_URL" )
787+ accessURLConfiguredViaEnvFrom , err = r . envFromDefinesEnvVar ( ctx , coderControlPlane . Namespace , coderControlPlane .Spec .EnvFrom , "CODER_ACCESS_URL" )
788788 if err != nil {
789789 return nil , err
790790 }
@@ -2078,40 +2078,104 @@ func (r *CoderControlPlaneReconciler) resolvePostgresURLFromExtraEnv(
20782078 return r .readSecretValue (ctx , coderControlPlane .Namespace , secretRef .Name , secretRef .Key )
20792079}
20802080
2081- func envFromMayDefineEnvVar (envFromSources []corev1.EnvFromSource , envVarName string ) (bool , error ) {
2081+ func (r * CoderControlPlaneReconciler ) envFromDefinesEnvVar (
2082+ ctx context.Context ,
2083+ namespace string ,
2084+ envFromSources []corev1.EnvFromSource ,
2085+ envVarName string ,
2086+ ) (bool , error ) {
2087+ if strings .TrimSpace (namespace ) == "" {
2088+ return false , fmt .Errorf ("assertion failed: namespace must not be empty" )
2089+ }
20822090 if strings .TrimSpace (envVarName ) == "" {
20832091 return false , fmt .Errorf ("assertion failed: environment variable name must not be empty" )
20842092 }
20852093
2094+ var reader client.Reader = r .Client
2095+ if r .APIReader != nil {
2096+ reader = r .APIReader
2097+ }
2098+ if reader == nil {
2099+ return false , fmt .Errorf ("assertion failed: reader must not be nil" )
2100+ }
2101+
20862102 for i := range envFromSources {
20872103 envFromSource := envFromSources [i ]
20882104 if envFromSource .ConfigMapRef != nil && envFromSource .SecretRef != nil {
20892105 return false , fmt .Errorf ("assertion failed: envFrom[%d] must not set both configMapRef and secretRef" , i )
20902106 }
20912107
2092- prefix := strings .TrimSpace (envFromSource .Prefix )
2093- if prefix != "" && ! strings .HasPrefix (envVarName , prefix ) {
2108+ lookupKey , includeSource , err := envFromLookupKeyForEnvVar (i , envFromSource .Prefix , envVarName )
2109+ if err != nil {
2110+ return false , err
2111+ }
2112+ if ! includeSource {
20942113 continue
20952114 }
20962115
20972116 if envFromSource .ConfigMapRef != nil {
2098- if strings .TrimSpace (envFromSource .ConfigMapRef .Name ) == "" {
2117+ configMapName := strings .TrimSpace (envFromSource .ConfigMapRef .Name )
2118+ if configMapName == "" {
20992119 return false , fmt .Errorf ("assertion failed: envFrom[%d].configMapRef.name must not be empty" , i )
21002120 }
2101- return true , nil
2121+
2122+ configMap := & corev1.ConfigMap {}
2123+ err := reader .Get (ctx , types.NamespacedName {Namespace : namespace , Name : configMapName }, configMap )
2124+ if err != nil {
2125+ if apierrors .IsNotFound (err ) {
2126+ continue
2127+ }
2128+ return false , fmt .Errorf ("get envFrom[%d] configmap %s/%s: %w" , i , namespace , configMapName , err )
2129+ }
2130+ if _ , ok := configMap .Data [lookupKey ]; ok {
2131+ return true , nil
2132+ }
2133+ if _ , ok := configMap .BinaryData [lookupKey ]; ok {
2134+ return true , nil
2135+ }
2136+ continue
21022137 }
21032138
21042139 if envFromSource .SecretRef != nil {
2105- if strings .TrimSpace (envFromSource .SecretRef .Name ) == "" {
2140+ secretName := strings .TrimSpace (envFromSource .SecretRef .Name )
2141+ if secretName == "" {
21062142 return false , fmt .Errorf ("assertion failed: envFrom[%d].secretRef.name must not be empty" , i )
21072143 }
2108- return true , nil
2144+
2145+ secret := & corev1.Secret {}
2146+ err := reader .Get (ctx , types.NamespacedName {Namespace : namespace , Name : secretName }, secret )
2147+ if err != nil {
2148+ if apierrors .IsNotFound (err ) {
2149+ continue
2150+ }
2151+ return false , fmt .Errorf ("get envFrom[%d] secret %s/%s: %w" , i , namespace , secretName , err )
2152+ }
2153+ if _ , ok := secret .Data [lookupKey ]; ok {
2154+ return true , nil
2155+ }
21092156 }
21102157 }
21112158
21122159 return false , nil
21132160}
21142161
2162+ func envFromLookupKeyForEnvVar (index int , prefix , envVarName string ) (string , bool , error ) {
2163+ prefix = strings .TrimSpace (prefix )
2164+ if prefix == "" {
2165+ return envVarName , true , nil
2166+ }
2167+ if ! strings .HasPrefix (envVarName , prefix ) {
2168+ return "" , false , nil
2169+ }
2170+
2171+ lookupKey := strings .TrimPrefix (envVarName , prefix )
2172+ if strings .TrimSpace (lookupKey ) == "" {
2173+ return "" , false , fmt .Errorf ("assertion failed: envFrom[%d] prefix %q must not consume the entire environment variable name %q" , index , prefix , envVarName )
2174+ }
2175+
2176+ return lookupKey , true , nil
2177+ }
2178+
21152179func findEnvVar (envVars []corev1.EnvVar , name string ) (* corev1.EnvVar , error ) {
21162180 if strings .TrimSpace (name ) == "" {
21172181 return nil , fmt .Errorf ("assertion failed: environment variable name must not be empty" )
0 commit comments