45
45
"""
46
46
47
47
48
- def resolve_secret_reference (ref : str , secrets_dict : Dict [str , Dict [str , Dict [ str , str ]]], phase : 'Phase' , current_application_name : str , current_env_name : str ) -> str :
48
+ def resolve_secret_reference (ref : str , secrets_dict : Dict [str , Dict [str , List [ 'PhaseSecret' ]]], phase : 'Phase' , current_application_name : str , current_env_name : str ) -> str :
49
49
"""
50
50
Resolves a single secret reference to its actual value by fetching it from the specified environment.
51
51
@@ -64,12 +64,10 @@ def resolve_secret_reference(ref: str, secrets_dict: Dict[str, Dict[str, Dict[st
64
64
Raises:
65
65
ValueError: If the current environment name is not provided, or the secret is not found.
66
66
"""
67
-
68
67
env_name = current_env_name
69
- path = "/" # Default root path
68
+ path = "/"
70
69
key_name = ref
71
70
72
- # Parse the reference to identify environment, path, and secret key.
73
71
if "." in ref : # Cross-environment references
74
72
parts = ref .split ("." , 1 )
75
73
env_name , rest = parts [0 ], parts [1 ]
@@ -84,29 +82,22 @@ def resolve_secret_reference(ref: str, secrets_dict: Dict[str, Dict[str, Dict[st
84
82
path = ref [:last_slash_index ]
85
83
key_name = ref [last_slash_index + 1 :]
86
84
87
- # Adjust for leading slash in path if not present
88
85
if not path .startswith ("/" ):
89
86
path = "/" + path
90
87
91
88
try :
92
- # Lookup with environment, path, and key
93
- if env_name in secrets_dict and path in secrets_dict [env_name ]:
94
- for secret in secrets_dict [env_name ][path ]:
89
+ if env_name in secrets_dict and path in secrets_dict [env_name ] and key_name in secrets_dict [env_name ][path ]:
90
+ return secrets_dict [env_name ][path ][key_name ]
91
+ elif env_name != current_env_name :
92
+ fetched_secrets = phase .get (env_name = env_name , app_name = current_application_name , keys = [key_name ], path = path )
93
+ for secret in fetched_secrets :
95
94
if secret .key == key_name :
96
95
return secret .value
97
- else :
98
- # Handle fallback for cross-environment or missing secrets
99
- if env_name != current_env_name :
100
- fetched_secrets = phase .get (env_name = env_name , app_name = current_application_name , keys = [key_name ], path = path )
101
- for secret in fetched_secrets :
102
- if secret .key == key_name :
103
- return secret .value
104
96
except EnvironmentNotFoundException :
105
97
pass
106
98
107
- # Return the reference as is if not resolved
108
99
return f"${{{ ref } }}"
109
-
100
+
110
101
111
102
def resolve_all_secrets (value : str , all_secrets : List [Dict [str , str ]], phase : 'Phase' , current_application_name : str , current_env_name : str ) -> str :
112
103
"""
@@ -130,17 +121,15 @@ def resolve_all_secrets(value: str, all_secrets: List[Dict[str, str]], phase: 'P
130
121
131
122
secrets_dict = {}
132
123
for secret in all_secrets :
133
- env_name = current_env_name # Assume current environment if not specified
134
- path = secret .path
124
+ env_name = secret .environment if hasattr (secret , 'environment' ) else current_env_name
135
125
if env_name not in secrets_dict :
136
126
secrets_dict [env_name ] = {}
137
- if path not in secrets_dict [env_name ]:
138
- secrets_dict [env_name ][path ] = []
139
- secrets_dict [env_name ][path ]. append ( secret )
127
+ if secret . path not in secrets_dict [env_name ]:
128
+ secrets_dict [env_name ][secret . path ] = {}
129
+ secrets_dict [env_name ][secret . path ][ secret . key ] = secret . value
140
130
141
131
refs = SECRET_REF_REGEX .findall (value )
142
132
resolved_value = value
143
- # Resolve each found reference and replace it with resolved_secret_value.
144
133
for ref in refs :
145
134
resolved_secret_value = resolve_secret_reference (ref , secrets_dict , phase , current_application_name , current_env_name )
146
135
resolved_value = resolved_value .replace (f"${{{ ref } }}" , resolved_secret_value )
0 commit comments