# Buggy code
def __init__(self, parent_gate_cls, rule_id=None, **kwargs):
    """
    Instantiate the trigger with a specific set of parameters. Does not evaluate the trigger, just configures
    it for execution.
    """
    self.gate_cls = parent_gate_cls
    self.msg = None
    self.eval_params = {}
    self._fired_instances = []
    self.rule_id = rule_id

    # Short circuit if gate is eol or trigger is eol
    if (
        self.gate_cls.__lifecycle_state__ == LifecycleStates.eol
        or self.__lifecycle_state__ == LifecycleStates.eol
    ):
        return

    # Setup the parameters, try setting each. If not provided, set to None to handle validation path for required params
    invalid_params = []

    # The list of class vars that are parameters
    params = self.__class__._parameters()

    param_name_map = {}

    if kwargs is None:
        kwargs = {}

    # Find all class objects that are params
    for attr_name, param_obj in list(params.items()):
        for a in param_obj.aliases:
            param_name_map[a] = param_obj.name

        param_name_map[param_obj.name] = param_obj.name

        try:
            setattr(self, attr_name, copy.deepcopy(param_obj))
            param_value = kwargs.get(param_obj.name, None)
            if param_value is None:
                # Try aliases
                for alias in param_obj.aliases:
                    param_value = kwargs.get(alias, None)
                    if param_value:
                        break

            getattr(self, attr_name).set_value(param_value)
        except ValidationError as e:
            invalid_params.append(
                ParameterValueInvalidError(
                    validation_error=e,
                    gate=self.gate_cls.__gate_name__,
                    trigger=self.__trigger_name__,
                    rule_id=self.rule_id,
                )
            )

    # Then, check for any parameters provided that are not defined in the trigger.
    if kwargs:
        given_param_names = set([param_name_map.get(x) for x in list(kwargs.keys())])
        for i in given_param_names.difference(
            set([x.name for x in list(params.values())])
        ):
            # Need to aggregate and return all invalid if there is more than one
            invalid_params.append(
                InvalidParameterError(
                    i,
                    list(params.keys()),
                    trigger=self.__trigger_name__,
                    gate=self.gate_cls.__gate_name__,
                )
            )

    if invalid_params:
        raise PolicyRuleValidationErrorCollection(
            invalid_params,
            trigger=self.__trigger_name__,
            gate=self.gate_cls.__gate_name__,
        )


# Traceback (ValueError)
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-] Traceback (most recent call last):
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-]   File "/usr/local/lib/python3.6/dist-packages/anchore_engine/services/policy_engine/engine/policy/gate.py", line 234, in execute
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-]     self.evaluate(image_obj, context)
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-]   File "/usr/local/lib/python3.6/dist-packages/anchore_engine/services/policy_engine/engine/policy/gates/image_metadata.py", line 59, in evaluate
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-]     rval = type(img_val)(rval)
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-] ValueError: invalid literal for int() with base 10: '4gb'
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-]
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-] During handling of the above exception, another exception occurred:
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-]
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-] Traceback (most recent call last):
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-]   File "/usr/local/lib/python3.6/dist-packages/anchore_engine/services/policy_engine/engine/policy/bundles.py", line 453, in execute
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-]     self.configured_trigger.execute(image_obj, exec_context)
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-]   File "/usr/local/lib/python3.6/dist-packages/anchore_engine/services/policy_engine/engine/policy/gate.py", line 237, in execute
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-]     raise TriggerEvaluationError(trigger=self, message='Error executing gate {} trigger {} with params: {}. Msg: {}'.format(self.gate_cls.__gate_name__, self.__trigger_name__, self.eval_params, e.message))
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-] AttributeError: 'ValueError' object has no attribute 'message'
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-]
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-] During handling of the above exception, another exception occurred:
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-]
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-] Traceback (most recent call last):
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-]   File "/usr/local/lib/python3.6/dist-packages/anchore_engine/services/policy_engine/api/controllers/synchronous_operations.py", line 481, in check_user_image_inline
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-]     eval_result = executable_bundle.execute(img_obj, tag, ExecutionContext(db_session=db, configuration={}))
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-]   File "/usr/local/lib/python3.6/dist-packages/anchore_engine/services/policy_engine/engine/policy/bundles.py", line 1260, in execute
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-]     bundle_exec = self._process_mapping_result(bundle_exec, image_object, tag, context)
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-]   File "/usr/local/lib/python3.6/dist-packages/anchore_engine/services/policy_engine/engine/policy/bundles.py", line 1207, in _process_mapping_result
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-]     errors, policy_decision = evaluated_policy.execute(image_obj=image_object, context=context)
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-]   File "/usr/local/lib/python3.6/dist-packages/anchore_engine/services/policy_engine/engine/policy/bundles.py", line 596, in execute
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-]     errs, matches = rule.execute(image_obj=image_obj, exec_context=exec_context)
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-]   File "/usr/local/lib/python3.6/dist-packages/anchore_engine/services/policy_engine/engine/policy/bundles.py", line 458, in execute
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-]     raise TriggerEvaluationError(trigger=self.configured_trigger, message='Could not evaluate trigger due to error in evaluation execution')
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-] anchore_engine.services.policy_engine.engine.policy.exceptions.TriggerEvaluationError: TriggerEvaluationError: severity:error message:Trigger evaluation failed for gate metadata and trigger attribute, with parameters: ([]) due to: Could not evaluate trigger due to error in evaluation execution
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-]
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-] During handling of the above exception, another exception occurred:
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-]
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-] Traceback (most recent call last):
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-]   File "/usr/local/lib/python3.6/dist-packages/anchore_engine/apis/authorization.py", line 339, in inner_wrapper
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-]     return f(*args, **kwargs)
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-]   File "/usr/local/lib/python3.6/dist-packages/anchore_engine/services/policy_engine/api/controllers/synchronous_operations.py", line 484, in check_user_image_inline
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-]     abort(Response(response='Cannot execute given policy against the image due to errors executing the policy bundle: {}'.format(e.message), status=500))
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-]   File "/usr/local/lib/python3.6/dist-packages/werkzeug/exceptions.py", line 707, in abort
engine-policy-engine_1  | [service:policy-engine] 2019-01-11 05:49:12+0000 [-]     return _aborter(status, *args, **kwargs)

# Fixed code
def __init__(self, parent_gate_cls, rule_id=None, **kwargs):
    """
    Instantiate the trigger with a specific set of parameters. Does not evaluate the trigger, just configures
    it for execution.
    """
    self.gate_cls = parent_gate_cls
    self.msg = None
    self._fired_instances = []
    self.rule_id = rule_id

    # Short circuit if gate is eol or trigger is eol
    if (
        self.gate_cls.__lifecycle_state__ == LifecycleStates.eol
        or self.__lifecycle_state__ == LifecycleStates.eol
    ):
        return

    # Setup the parameters, try setting each. If not provided, set to None to handle validation path for required params
    invalid_params = []

    # The list of class vars that are parameters
    params = self.__class__._parameters()

    param_name_map = {}

    if kwargs is None:
        kwargs = {}

    # Find all class objects that are params
    for attr_name, param_obj in list(params.items()):
        for a in param_obj.aliases:
            param_name_map[a] = param_obj.name

        param_name_map[param_obj.name] = param_obj.name

        try:
            setattr(self, attr_name, copy.deepcopy(param_obj))
            param_value = kwargs.get(param_obj.name, None)
            if param_value is None:
                # Try aliases
                for alias in param_obj.aliases:
                    param_value = kwargs.get(alias, None)
                    if param_value:
                        break

            getattr(self, attr_name).set_value(param_value)
        except ValidationError as e:
            invalid_params.append(
                ParameterValueInvalidError(
                    validation_error=e,
                    gate=self.gate_cls.__gate_name__,
                    trigger=self.__trigger_name__,
                    rule_id=self.rule_id,
                )
            )

    # One last pass to catch any dependent validations after all values are set, to eliminate issues due to eval order
    for param_obj in filter(
        lambda x: isinstance(x.validator, LinkedValidator),
        list(self.parameters().values()),
    ):
        # Update the discriminator link to the object member instead of the class member
        param_obj.validator.inject_discriminator(
            self.parameters()[param_obj.validator.discriminator_name].value()
        )

        try:
            param_obj.validator.validate(param_obj._param_value)
        except ValidationError as e:
            invalid_params.append(
                ParameterValueInvalidError(
                    validation_error=e,
                    gate=self.gate_cls.__gate_name__,
                    trigger=self.__trigger_name__,
                    rule_id=self.rule_id,
                )
            )

    # Then, check for any parameters provided that are not defined in the trigger.
    if kwargs:
        given_param_names = set([param_name_map.get(x) for x in list(kwargs.keys())])
        for i in given_param_names.difference(
            set([x.name for x in list(params.values())])
        ):
            # Need to aggregate and return all invalid if there is more than one
            invalid_params.append(
                InvalidParameterError(
                    i,
                    list(params.keys()),
                    trigger=self.__trigger_name__,
                    gate=self.gate_cls.__gate_name__,
                )
            )

    if invalid_params:
        raise PolicyRuleValidationErrorCollection(
            invalid_params,
            trigger=self.__trigger_name__,
            gate=self.gate_cls.__gate_name__,
        )