Taragolis commented on code in PR #23560:
URL: https://github.com/apache/airflow/pull/23560#discussion_r900877600


##########
airflow/configuration.py:
##########
@@ -1487,47 +1500,118 @@ def set(*args, **kwargs) -> None:
     conf.set(*args, **kwargs)
 
 
-def ensure_secrets_loaded() -> List[BaseSecretsBackend]:
-    """
-    Ensure that all secrets backends are loaded.
-    If the secrets_backend_list contains only 2 default backends, reload it.
-    """
-    # Check if the secrets_backend_list contains only 2 default backends
-    if len(secrets_backend_list) == 2:
-        return initialize_secrets_backends()
-    return secrets_backend_list
+class DefaultSecretsBackend(UserList):
+    """List Container which use for store default secrets backends."""
+
+
+@dataclass(frozen=True)
+class SecretsBackendConfig:
+    """Secrets Backend Config dataclass helper."""
+
+    backend: str
+    backend_kwargs: Dict[str, Any] = field(default_factory=dict)
+
+    @classmethod
+    def from_dict(cls, d: Dict[str, Any]) -> 'SecretsBackendConfig':
+        """
+        Read Secret Backend Config from dictionary
+
+        Ignores all unexpected keywords
+        """
+        return cls(d['backend'], d.get('backend_kwargs', {}))
 
+    @classmethod
+    def from_config(cls) -> Optional['SecretsBackendConfig']:
+        """Try to get ``SecretsBackendConfig`` from airflow config [secrets] 
section"""
+        secrets_backend = conf.get(section='secrets', key='backend', 
fallback=None)
 
-def get_custom_secret_backend() -> Optional[BaseSecretsBackend]:
-    """Get Secret Backend if defined in airflow.cfg"""
-    secrets_backend_cls = conf.getimport(section='secrets', key='backend')
+        if not secrets_backend:
+            return None
 
-    if secrets_backend_cls:
         try:
-            backends: Any = conf.get(section='secrets', key='backend_kwargs', 
fallback='{}')
-            alternative_secrets_config_dict = json.loads(backends)
+            secrets_backend_kwargs: Any = conf.get(section='secrets', 
key='backend_kwargs', fallback='{}')
+            secrets_backend_kwargs = json.loads(secrets_backend_kwargs)
         except JSONDecodeError:
-            alternative_secrets_config_dict = {}
+            secrets_backend_kwargs = {}
+
+        return cls(secrets_backend, secrets_backend_kwargs)
+
+    def initialize(self) -> BaseSecretsBackend:
+        """Initialize Secrets Backend."""
+        return import_string(self.backend)(**self.backend_kwargs)
+
+
+class UniqueSecretsBackendsConfigs(UserList):

Review Comment:
   This helper only remove backends with the same configuration. 
   I think there is no reason check again backend which return `None` again 
because in most case the result in most case would be same, only show warning 
that this Backend with exactly the same configuration already in list of 
configuration
   
   ---
   
   Example:
   
   ```json
   [
     {
       
"backend":"airflow.secrets.environment_variables.EnvironmentVariablesBackend"
     },
     {
       
"backend":"airflow.providers.amazon.aws.secrets.systems_manager.SystemsManagerParameterStoreBackend",
       "backend_kwargs":{
         "connections_prefix":"/airflow/connections",
         "variables_prefix": "/airflow/variables",
         "profile_name":"default"
       }
     },
     {
       "backend":"airflow.secrets.metastore.MetastoreBackend"
     },
     {
       
"backend":"airflow.secrets.environment_variables.EnvironmentVariablesBackend"
     },
     {
       
"backend":"airflow.providers.amazon.aws.secrets.systems_manager.SystemsManagerParameterStoreBackend",
       "backend_kwargs":{
         "connections_prefix":"/another/connections",
         "variables_prefix": "/another/variables",
         "profile_name":"awesome",
         "region_name": "ap-southeast-1"
       }
     },
     {
       "backend":"airflow.secrets.metastore.MetastoreBackend"
     }
   ]
   ```
   
   keep only this one 
   
   
   ```json
   [
     {
       
"backend":"airflow.secrets.environment_variables.EnvironmentVariablesBackend"
     },
     {
       
"backend":"airflow.providers.amazon.aws.secrets.systems_manager.SystemsManagerParameterStoreBackend",
       "backend_kwargs":{
         "connections_prefix":"/airflow/connections",
         "variables_prefix": "/airflow/variables",
         "profile_name":"default"
       }
     },
     {
       "backend":"airflow.secrets.metastore.MetastoreBackend"
     },
     {
       
"backend":"airflow.providers.amazon.aws.secrets.systems_manager.SystemsManagerParameterStoreBackend",
       "backend_kwargs":{
         "connections_prefix":"/another/connections",
         "variables_prefix": "/another/variables",
         "profile_name":"awesome",
         "region_name": "ap-southeast-1"
       }
     }
   ]
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscr...@airflow.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to