Azure / msrest-for-python

The runtime library "msrest" for AutoRest generated Python clients.
MIT License
41 stars 64 forks source link

[validation] - 'pattern' vs 'required'. Verify validation behavior. #139

Closed adewaleo closed 4 years ago

adewaleo commented 5 years ago

Someone updating az CLI redis commands encountered the stack trace below. We assumed that they passed None for subnet_id when setting the RedisCreateParameters object. If this is true, msrest should not attempt to validate subnet_id, as it is None. A parameter set to none should not be validated unless it is required. @lmazuel and @marstr agree that this should be the case.

It turned out that None wasn't actually passed in for subnet_id, as parameters were passed in the wrong order. Nevertheless, I am opening this issue according to @lmazuel's request.

Stack trace:

Parameter 'RedisCreateParameters.subnet_id' must conform to the following pattern: '^/subscriptions/[^/]*/resourceGroups/[^/]*/providers/Microsoft.(ClassicNetwork|Network)/virtualNetworks/[^/]*/subnets/[^/]*$'. 
Traceback (most recent call last):
   File "D:\Depots\CLI20\azure-cli\devenv\lib\site-packages\knack\cli.py", line 206, in invoke     cmd_result = self.invocation.execute(args)
   File "d:\depots\cli20\azure-cli\src\azure-cli-core\azure\cli\core\commands\__init__.py", line 328, in execute
     raise ex
   File "d:\depots\cli20\azure-cli\src\azure-cli-core\azure\cli\core\commands\__init__.py", line 386, in _run_jobs_serially
     results.append(self._run_job(expanded_arg, cmd_copy))
   File "d:\depots\cli20\azure-cli\src\azure-cli-core\azure\cli\core\commands\__init__.py", line 377, in _run_job
     cmd_copy.exception_handler(ex)
   File "d:\depots\cli20\azure-cli\src\command_modules\azure-cli-redis\azure\cli\command_modules\redis\custom.py", line 24, in wrong_vmsize_argument_exception_handler
     raise ex
   File "d:\depots\cli20\azure-cli\src\azure-cli-core\azure\cli\core\commands\__init__.py", line 356, in _run_job
     result = cmd_copy(params)
   File "d:\depots\cli20\azure-cli\src\azure-cli-core\azure\cli\core\commands\__init__.py", line 171, in __call__
     return self.handler(*args, **kwargs)
   File "d:\depots\cli20\azure-cli\src\azure-cli-core\azure\cli\core\__init__.py", line 441, in default_command_handler
     return op(**command_args)
   File "d:\depots\cli20\azure-cli\src\command_modules\azure-cli-redis\azure\cli\command_modules\redis\custom.py", line 99, in cli_redis_create
     return client.create(resource_group_name, name, params)
   File "d:\depots\cli20\azure-cli\devenv\src\azure-mgmt-redis\azure-mgmt-redis\azure\mgmt\redis\operations\redis_operations.py", line 246, in create
     **operation_config
   File "d:\depots\cli20\azure-cli\devenv\src\azure-mgmt-redis\azure-mgmt-redis\azure\mgmt\redis\operations\redis_operations.py", line 194, in _create_initial
     body_content = self._serialize.body(parameters, 'RedisCreateParameters')
   File "D:\Depots\CLI20\azure-cli\devenv\lib\site-packages\msrest\serialization.py", line 579, in body
     raise errors[0]
   File "D:\Depots\CLI20\azure-cli\devenv\lib\site-packages\msrest\serialization.py", line 221, in validate
     Serializer.validate(value, debug_name, **self._validation.get(attr_name, {}))
   File "D:\Depots\CLI20\azure-cli\devenv\lib\site-packages\msrest\serialization.py", line 672, in validate
     raise ValidationError(key, name, value) msrest.exceptions.ValidationError: Parameter 'RedisCreateParameters.subnet_id' must conform to the following pattern: '^/subscriptions/[^/]*/resourceGroups/[^/]*/providers/Microsoft.(ClassicNetwork|Network)/virtualNetworks/[^/]*/subnets/[^/]*$'.
lmazuel commented 4 years ago

Tested and msrest does the right thing and doesn't validate if the value is None https://github.com/Azure/msrest-for-python/blob/c2249d459e8af8912c5da4cd728c8201066b9304/msrest/serialization.py#L657-L663