@@ -246,6 +246,82 @@ def _validate_resource_constants(self):
246246
247247 return parameters
248248
249+ def _resolve_provider_values (self , expected_value : dict ) -> list :
250+ """
251+ Resolve provider-specific values from a configuration dictionary.
252+
253+ This method handles the complex logic of extracting appropriate values
254+ based on the NFS provider configuration. It supports both provider-specific
255+ configurations and fallback to all available providers.
256+
257+ :param expected_value: Dictionary containing provider configurations
258+ :type expected_value: dict
259+ :return: List of resolved values for validation
260+ :rtype: list
261+ :raises TypeError: If expected_value is not a dictionary
262+ """
263+ if not isinstance (expected_value , dict ):
264+ raise TypeError ("Expected value must be a dictionary for provider resolution" )
265+
266+ provider_values = []
267+ if self .nfs_provider and self .nfs_provider in expected_value :
268+ provider_config = expected_value [self .nfs_provider ]
269+ provider_values = self ._extract_values_from_config (provider_config )
270+ else :
271+ for _ , provider_config in expected_value .items ():
272+ extracted_values = self ._extract_values_from_config (provider_config )
273+ if isinstance (extracted_values , list ):
274+ provider_values .extend (extracted_values )
275+ else :
276+ provider_values .append (extracted_values )
277+
278+ return provider_values if isinstance (provider_values , list ) else [provider_values ]
279+
280+ def _extract_values_from_config (self , provider_config ):
281+ """
282+ Extract values from a provider configuration structure.
283+
284+ Handles various configuration formats:
285+ - {"value": [list]} or {"value": "single"}
286+ - [list] directly
287+ - "single" value directly
288+
289+ :param provider_config: Configuration object to extract values from
290+ :type provider_config: dict or list or str
291+ :return: Extracted value(s)
292+ :rtype: list or str
293+ """
294+ if isinstance (provider_config , dict ) and "value" in provider_config :
295+ return provider_config ["value" ]
296+ elif isinstance (provider_config , (list , str )):
297+ return provider_config
298+ else :
299+ return provider_config
300+
301+ def _compare_value_with_expectations (self , value : str , expected_values ) -> str :
302+ """
303+ Compare a value against expected values and return test status.
304+
305+ :param value: The actual value to compare
306+ :type value: str
307+ :param expected_values: Expected value(s) for comparison
308+ :type expected_values: str or list
309+ :return: Test status (SUCCESS or ERROR)
310+ :rtype: str
311+ """
312+ if isinstance (expected_values , list ):
313+ return (
314+ TestStatus .SUCCESS .value
315+ if str (value ) in [str (v ) for v in expected_values ]
316+ else TestStatus .ERROR .value
317+ )
318+ else :
319+ return (
320+ TestStatus .SUCCESS .value
321+ if str (value ) == str (expected_values )
322+ else TestStatus .ERROR .value
323+ )
324+
249325 def _determine_parameter_status (self , value , expected_value ):
250326 """
251327 Determine the status of a parameter with SCS-specific logic for NFS provider.
@@ -257,60 +333,31 @@ def _determine_parameter_status(self, value, expected_value):
257333 :return: The status of the parameter.
258334 :rtype: str
259335 """
336+ # Handle tuple format (value, required)
260337 if isinstance (expected_value , tuple ):
261338 expected_val , required = expected_value
262339 if not required and (expected_val is None or value == "" ):
263340 return TestStatus .INFO .value
264341 expected_value = expected_val
265342
343+ # Handle empty/null cases
266344 if expected_value is None or value == "" :
267345 return TestStatus .INFO .value
346+
347+ # Handle simple string/list cases
268348 elif isinstance (expected_value , (str , list )):
269- if isinstance (expected_value , list ):
270- return (
271- TestStatus .SUCCESS .value
272- if str (value ) in expected_value
273- else TestStatus .ERROR .value
274- )
275- else :
276- return (
277- TestStatus .SUCCESS .value
278- if str (value ) == str (expected_value )
279- else TestStatus .ERROR .value
280- )
349+ return self ._compare_value_with_expectations (value , expected_value )
350+
351+ # Handle complex provider-based dictionary cases
281352 elif isinstance (expected_value , dict ):
282- provider_values = []
283- if self .nfs_provider and self .nfs_provider in expected_value :
284- provider_config = expected_value [self .nfs_provider ]
285- if isinstance (provider_config , dict ) and "value" in provider_config :
286- provider_values = provider_config ["value" ]
287- else :
288- provider_values = provider_config
289- else :
290- # If provider is unknown/not set, collect all provider values
291- for provider_key , provider_config in expected_value .items ():
292- if isinstance (provider_config , dict ) and "value" in provider_config :
293- if isinstance (provider_config ["value" ], list ):
294- provider_values .extend (provider_config ["value" ])
295- else :
296- provider_values .append (provider_config ["value" ])
297- elif isinstance (provider_config , list ):
298- provider_values .extend (provider_config )
299- else :
300- provider_values .append (provider_config )
301-
302- if isinstance (provider_values , list ):
303- return (
304- TestStatus .SUCCESS .value
305- if str (value ) in provider_values
306- else TestStatus .ERROR .value
307- )
308- else :
309- return (
310- TestStatus .SUCCESS .value
311- if str (value ) == str (provider_values )
312- else TestStatus .ERROR .value
313- )
353+ try :
354+ provider_values = self ._resolve_provider_values (expected_value )
355+ return self ._compare_value_with_expectations (value , provider_values )
356+ except (TypeError , KeyError ) as ex :
357+ self .result ["message" ] += f"Error resolving provider values: { str (ex )} "
358+ return TestStatus .ERROR .value
359+
360+ # Handle unexpected types
314361 else :
315362 return TestStatus .ERROR .value
316363
0 commit comments