@@ -246,6 +246,82 @@ def _validate_resource_constants(self):
246
246
247
247
return parameters
248
248
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
+
249
325
def _determine_parameter_status (self , value , expected_value ):
250
326
"""
251
327
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):
257
333
:return: The status of the parameter.
258
334
:rtype: str
259
335
"""
336
+ # Handle tuple format (value, required)
260
337
if isinstance (expected_value , tuple ):
261
338
expected_val , required = expected_value
262
339
if not required and (expected_val is None or value == "" ):
263
340
return TestStatus .INFO .value
264
341
expected_value = expected_val
265
342
343
+ # Handle empty/null cases
266
344
if expected_value is None or value == "" :
267
345
return TestStatus .INFO .value
346
+
347
+ # Handle simple string/list cases
268
348
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
281
352
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
314
361
else :
315
362
return TestStatus .ERROR .value
316
363
0 commit comments