@@ -76,11 +76,60 @@ class PhaseSecret:
76
76
path : str = "/"
77
77
tags : List [str ] = field (default_factory = list )
78
78
overridden : bool = False
79
+ application : Optional [str ] = None
80
+ environment : Optional [str ] = None
79
81
80
82
class Phase :
81
83
def __init__ (self , init = True , pss = None , host = None ):
82
84
self ._phase_io = PhaseIO (init = init , pss = pss , host = host )
83
85
86
+ def _resolve_secret_values (self , secrets : List [PhaseSecret ], env_name : str , app_name : str ) -> List [PhaseSecret ]:
87
+ """
88
+ Utility function to resolve secret references within secret values.
89
+
90
+ Args:
91
+ secrets (List[PhaseSecret]): List of secrets to process
92
+ env_name (str): Environment name for secret resolution
93
+ app_name (str): Application name for secret resolution
94
+
95
+ Returns:
96
+ List[PhaseSecret]: List of secrets with resolved values
97
+ """
98
+ # Convert PhaseSecret objects to dict format expected by resolve_all_secrets
99
+ all_secrets = [
100
+ {
101
+ 'environment' : secret .environment or env_name ,
102
+ 'path' : secret .path ,
103
+ 'key' : secret .key ,
104
+ 'value' : secret .value
105
+ }
106
+ for secret in secrets
107
+ ]
108
+
109
+ # Create new list of secrets with resolved values
110
+ resolved_secrets = []
111
+ for secret in secrets :
112
+ resolved_value = resolve_all_secrets (
113
+ value = secret .value ,
114
+ all_secrets = all_secrets ,
115
+ phase = self ._phase_io ,
116
+ current_application_name = secret .application or app_name ,
117
+ current_env_name = secret .environment or env_name
118
+ )
119
+
120
+ resolved_secrets .append (PhaseSecret (
121
+ key = secret .key ,
122
+ value = resolved_value ,
123
+ comment = secret .comment ,
124
+ path = secret .path ,
125
+ tags = secret .tags ,
126
+ overridden = secret .overridden ,
127
+ application = secret .application ,
128
+ environment = secret .environment
129
+ ))
130
+
131
+ return resolved_secrets
132
+
84
133
def get_secret (self , options : GetSecretOptions ) -> Optional [PhaseSecret ]:
85
134
secrets = self ._phase_io .get (
86
135
env_name = options .env_name ,
@@ -92,14 +141,25 @@ def get_secret(self, options: GetSecretOptions) -> Optional[PhaseSecret]:
92
141
)
93
142
if secrets :
94
143
secret = secrets [0 ]
95
- return PhaseSecret (
144
+ phase_secret = PhaseSecret (
96
145
key = secret ['key' ],
97
146
value = secret ['value' ],
98
147
comment = secret .get ('comment' , '' ),
99
148
path = secret .get ('path' , '/' ),
100
149
tags = secret .get ('tags' , []),
101
- overridden = secret .get ('overridden' , False )
150
+ overridden = secret .get ('overridden' , False ),
151
+ application = secret .get ('application' ),
152
+ environment = secret .get ('environment' )
102
153
)
154
+
155
+ # Resolve any secret references in the value
156
+ resolved_secrets = self ._resolve_secret_values (
157
+ [phase_secret ],
158
+ options .env_name ,
159
+ secret .get ('application' , options .app_name )
160
+ )
161
+
162
+ return resolved_secrets [0 ] if resolved_secrets else None
103
163
return None
104
164
105
165
def get_all_secrets (self , options : GetAllSecretsOptions ) -> List [PhaseSecret ]:
@@ -110,17 +170,33 @@ def get_all_secrets(self, options: GetAllSecretsOptions) -> List[PhaseSecret]:
110
170
tag = options .tag ,
111
171
path = options .secret_path
112
172
)
113
- return [
173
+
174
+ if not secrets :
175
+ return []
176
+
177
+ # Get the application name from the first secret
178
+ app_name = secrets [0 ].get ('application' , options .app_name )
179
+
180
+ phase_secrets = [
114
181
PhaseSecret (
115
182
key = secret ['key' ],
116
183
value = secret ['value' ],
117
184
comment = secret .get ('comment' , '' ),
118
185
path = secret .get ('path' , '/' ),
119
186
tags = secret .get ('tags' , []),
120
- overridden = secret .get ('overridden' , False )
187
+ overridden = secret .get ('overridden' , False ),
188
+ application = secret .get ('application' ),
189
+ environment = secret .get ('environment' )
121
190
)
122
191
for secret in secrets
123
192
]
193
+
194
+ # Resolve any secret references in the values
195
+ return self ._resolve_secret_values (
196
+ phase_secrets ,
197
+ options .env_name ,
198
+ app_name
199
+ )
124
200
125
201
def create_secrets (self , options : CreateSecretsOptions ) -> str :
126
202
# Convert the list of dictionaries to a list of tuples
0 commit comments