|
15 | 15 | # We undertake not to change the open source license (MIT license) applicable |
16 | 16 | # to the current version of the project delivered to anyone in the future. |
17 | 17 |
|
| 18 | +import datetime |
18 | 19 | import logging |
19 | 20 | import operator |
20 | 21 | import uuid |
21 | 22 | from typing import Callable, Dict, Generator, Iterable, Iterator, List, NamedTuple, Optional, TypeVar, cast |
22 | 23 |
|
| 24 | +from attrs import define |
23 | 25 | from django.http import Http404 |
24 | 26 |
|
25 | 27 | from paasng.accessories.servicehub.constants import ServiceBindingType, ServiceType |
@@ -237,37 +239,36 @@ def get_env_vars( |
237 | 239 | :param filter_enabled: Whether to filter enabled service instances |
238 | 240 | :returns: Dict of env variables. |
239 | 241 | """ |
240 | | - rels = list(self.list_provisioned_rels(engine_app, service=service)) |
241 | | - if filter_enabled: |
242 | | - instances = [rel.get_instance() for rel in rels if rel.db_obj.credentials_enabled] |
243 | | - else: |
244 | | - instances = [rel.get_instance() for rel in rels] |
245 | | - # 新的覆盖旧的 |
246 | | - instances.sort(key=operator.attrgetter("create_time")) |
| 242 | + groups = self.get_env_var_groups(engine_app, service=service, filter_enabled=filter_enabled) |
| 243 | + # 如果存在同名环境变量,以较新的为准 |
| 244 | + groups.sort(key=operator.attrgetter("created_at")) |
247 | 245 |
|
248 | 246 | result = {} |
249 | | - for i in instances: |
250 | | - result.update(i.credentials) |
| 247 | + for g in groups: |
| 248 | + result.update(g.data) |
251 | 249 | return result |
252 | 250 |
|
253 | | - def get_enabled_env_keys(self, engine_app: EngineApp) -> Dict[str, List[str]]: |
254 | | - """ |
255 | | - Get all provisioned services environment keys |
| 251 | + def get_env_var_groups( |
| 252 | + self, engine_app: EngineApp, service: Optional[ServiceObj] = None, filter_enabled: bool = False |
| 253 | + ) -> "List[EnvVariableGroup]": |
| 254 | + """Get all provisioned services env variable groups. A group is a collection of environment variables |
| 255 | + that belong to a specific service instance. |
256 | 256 |
|
257 | 257 | :param engine_app: EngineApp object |
258 | | - :return: Dictionary of service display names to list of their environment keys |
| 258 | + :param service: Optional service object. if given, will only return credentials of the specified service, |
| 259 | + otherwise return the credentials of all services. |
| 260 | + :param filter_enabled: Whether to filter enabled service instances |
| 261 | + :returns: List of env variable groups. |
259 | 262 | """ |
260 | | - provisioned_rels = self.list_provisioned_rels(engine_app) |
261 | | - # 凭证的信息写入环境变量的增强服务才展示 |
262 | | - enabled_rels = [rel for rel in provisioned_rels if rel.db_obj.credentials_enabled] |
263 | | - |
264 | | - results = {} |
265 | | - for rel in enabled_rels: |
266 | | - # display_name 会被国际化处理为殊字符串类型(__proxy__类型),必须首先将它们转化为标准的字符串 |
267 | | - service_name = str(rel.get_service().display_name) |
268 | | - instance_credentials_keys = list(rel.get_instance().credentials.keys()) |
269 | | - results[service_name] = instance_credentials_keys |
| 263 | + results = [] |
| 264 | + for rel in self.list_provisioned_rels(engine_app, service=service): |
| 265 | + if filter_enabled and not rel.db_obj.credentials_enabled: |
| 266 | + continue |
270 | 267 |
|
| 268 | + inst = rel.get_instance() |
| 269 | + results.append( |
| 270 | + EnvVariableGroup(service=rel.get_service(), data=inst.credentials, created_at=inst.create_time) |
| 271 | + ) |
271 | 272 | return results |
272 | 273 |
|
273 | 274 | def get_attachment_by_engine_app(self, service: ServiceObj, engine_app: EngineApp): |
@@ -340,3 +341,17 @@ def _check_duplicated_sharing(self, service: ServiceObj): |
340 | 341 | raise DuplicatedServiceBoundError( |
341 | 342 | f"Module: {self.module.name} already shared an attachment in service: {service.name}" |
342 | 343 | ) |
| 344 | + |
| 345 | + |
| 346 | +@define |
| 347 | +class EnvVariableGroup: |
| 348 | + """An env variable group. |
| 349 | +
|
| 350 | + :param service: The owner service object. |
| 351 | + :param data: The environment variables. |
| 352 | + :param created_at: The time when the var group was created. |
| 353 | + """ |
| 354 | + |
| 355 | + service: ServiceObj |
| 356 | + data: Dict[str, str] |
| 357 | + created_at: datetime.datetime | None |
0 commit comments