Skip to content

Commit 18c8f63

Browse files
committed
feat: handle secret references in phase.py
1 parent ea1b8c9 commit 18c8f63

File tree

1 file changed

+80
-4
lines changed

1 file changed

+80
-4
lines changed

src/phase/phase.py

+80-4
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,60 @@ class PhaseSecret:
7676
path: str = "/"
7777
tags: List[str] = field(default_factory=list)
7878
overridden: bool = False
79+
application: Optional[str] = None
80+
environment: Optional[str] = None
7981

8082
class Phase:
8183
def __init__(self, init=True, pss=None, host=None):
8284
self._phase_io = PhaseIO(init=init, pss=pss, host=host)
8385

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+
84133
def get_secret(self, options: GetSecretOptions) -> Optional[PhaseSecret]:
85134
secrets = self._phase_io.get(
86135
env_name=options.env_name,
@@ -92,14 +141,25 @@ def get_secret(self, options: GetSecretOptions) -> Optional[PhaseSecret]:
92141
)
93142
if secrets:
94143
secret = secrets[0]
95-
return PhaseSecret(
144+
phase_secret = PhaseSecret(
96145
key=secret['key'],
97146
value=secret['value'],
98147
comment=secret.get('comment', ''),
99148
path=secret.get('path', '/'),
100149
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')
102153
)
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
103163
return None
104164

105165
def get_all_secrets(self, options: GetAllSecretsOptions) -> List[PhaseSecret]:
@@ -110,17 +170,33 @@ def get_all_secrets(self, options: GetAllSecretsOptions) -> List[PhaseSecret]:
110170
tag=options.tag,
111171
path=options.secret_path
112172
)
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 = [
114181
PhaseSecret(
115182
key=secret['key'],
116183
value=secret['value'],
117184
comment=secret.get('comment', ''),
118185
path=secret.get('path', '/'),
119186
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')
121190
)
122191
for secret in secrets
123192
]
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+
)
124200

125201
def create_secrets(self, options: CreateSecretsOptions) -> str:
126202
# Convert the list of dictionaries to a list of tuples

0 commit comments

Comments
 (0)