Source code for vmware.vapi.provider.lib
"""
Utility library for Provider modules
"""
__author__ = 'VMware, Inc.'
__copyright__ = 'Copyright 2013 VMware, Inc. All rights reserved. -- VMware Confidential'
from vmware.vapi.core import MethodResult, MethodDefinition
from vmware.vapi.data.value import StructValue, ListValue
from vmware.vapi.lib.constants import Introspection
[docs]def augment_method_result_with_errors(service_id, operation_id, method_result,
errors_to_augment):
"""
Returns a new method result that is identical to `method_result` except that
the `errors_definition` field in the `output` (which is of type Operation.Info
from Introspection service) contains the errors from the Info structure in
`method_result` plus the errors in `errors_to_augment`. This code will be
executed only for "get" operation in vAPI Operation Introspection service.
:type service_id: :class:`str`
:param service_id: Service identifier
:type operation_id: :class:`str`
:param operation_id: Operation identifier
:type method_result: :class:`vmware.vapi.core.MethodResult`
:param method_result: Operation result
:type errors_to_augment: :class:`list` of :class:`vmware.vapi.data.value.StructValue`
:param errors_to_augment: Errors to augment. These are struct values of type
com.vmware.vapi.std.introspection.Operation.DataDefinition whose `type`
field has the value ERROR
to the DataDefinition type in Introspection service IDL.
:rtype: :class:`vmware.vapi.data.value.DataValue`
:return: Output data value
"""
if method_result.success():
if (service_id == Introspection.OPERATION_SVC and
operation_id == 'get'):
output = method_result.output
augmented_output = StructValue(
'com.vmware.vapi.std.introspection.operation.info')
augmented_output.set_field(
'input_definition',
output.get_field('input_definition'))
augmented_output.set_field(
'output_definition',
output.get_field('output_definition'))
errors = ListValue()
error_names = []
for error_def in output.get_field('error_definitions'):
errors.add(error_def)
error_names.append(error_def.get_field('name').value.value)
for error_def in errors_to_augment:
if error_def.get_field('name').value.value not in error_names:
errors.add(error_def)
augmented_output.set_field('error_definitions', errors)
return MethodResult(output=augmented_output)
return method_result
[docs]def augment_method_def_with_errors(method_def, errors):
"""
Add errors reported by this ApiProviderFilter to a method definition.
This method clones the input method definition and appends errors. It
does not modify the parameter.
:type method_def: :class:`vmware.vapi.core.MethodDefinition`
:param method_def: Method definition
:type errors: :class:`list` of :class:`vmware.vapi.data.definition.ErrorDefinition`
:param errors: Error definitions to augment to MethodDefinition
:rtype: :class:`vmware.vapi.core.MethodDefinition`
:return: Method definition after augmenting the errors
"""
method_errors = method_def.get_error_definitions()
return MethodDefinition(method_def.get_identifier(),
method_def.get_input_definition(),
method_def.get_output_definition(),
method_errors.union(errors))