# Buggy code
def check_user_image_inline(user_id, image_id, tag, bundle):
    """
    Execute a policy evaluation using the info in the request body including the bundle content

    :param user_id:
    :param image_id:
    :param tag:
    :param bundle:
    :return:
    """

    timer = time.time()
    db = get_session()
    cache_mgr = None

    try:
        # Input validation
        if tag is None:
            # set tag value to a value that only matches wildcards
            tag = "*/*:*"

        try:
            img_obj = db.query(Image).get((image_id, user_id))
        except:
            abort(Response(response="Image not found", status=404))

        if not img_obj:
            log.info(
                "Request for evaluation of image that cannot be found: user_id = {}, image_id = {}".format(
                    user_id, image_id
                )
            )
            abort(Response(response="Image not found", status=404))

        if evaluation_cache_enabled:
            timer2 = time.time()
            try:
                try:
                    cache_mgr = EvaluationCacheManager(img_obj, tag, bundle)
                except ValueError as err:
                    log.warn(
                        "Could not leverage cache due to error in bundle data: {}".format(
                            err
                        )
                    )
                    cache_mgr = None

                if cache_mgr is None:
                    log.info(
                        "Could not initialize cache manager for policy evaluation, skipping cache usage"
                    )
                else:
                    cached_result = cache_mgr.refresh()
                    if cached_result:
                        metrics.counter_inc(name="anchore_policy_evaluation_cache_hits")
                        metrics.histogram_observe(
                            "anchore_policy_evaluation_cache_access_latency",
                            time.time() - timer2,
                            status="hit",
                        )
                        log.info(
                            "Returning cached result of policy evaluation for {}/{}, with tag {} and bundle {} with digest {}. Last evaluation: {}".format(
                                user_id,
                                image_id,
                                tag,
                                cache_mgr.bundle_id,
                                cache_mgr.bundle_digest,
                                cached_result.get("last_modified"),
                            )
                        )
                        return cached_result
                    else:
                        metrics.counter_inc(
                            name="anchore_policy_evaluation_cache_misses"
                        )
                        metrics.histogram_observe(
                            "anchore_policy_evaluation_cache_access_latency",
                            time.time() - timer2,
                            status="miss",
                        )
                        log.info(
                            "Policy evaluation not cached, or invalid, executing evaluation for {}/{} with tag {} and bundle {} with digest {}".format(
                                user_id,
                                image_id,
                                tag,
                                cache_mgr.bundle_id,
                                cache_mgr.bundle_digest,
                            )
                        )

            except Exception as ex:
                log.exception(
                    "Unexpected error operating on policy evaluation cache. Skipping use of cache."
                )

        else:
            log.info("Policy evaluation cache disabled. Executing evaluation")

        # Build bundle exec.
        problems = []
        executable_bundle = None
        try:
            # Allow deprecated gates here to support upgrade cases from old policy bundles.
            executable_bundle = build_bundle(bundle, for_tag=tag, allow_deprecated=True)
            if executable_bundle.init_errors:
                problems = executable_bundle.init_errors
        except InitializationError as e:
            log.exception("Bundle construction and initialization returned errors")
            problems = e.causes

        eval_result = None
        if not problems:
            # Execute bundle
            try:
                eval_result = executable_bundle.execute(
                    img_obj, tag, ExecutionContext(db_session=db, configuration={})
                )
            except Exception as e:
                log.exception(
                    "Error executing policy bundle {} against image {} w/tag {}: {}".format(
                        bundle["id"], image_id, tag, e.message
                    )
                )
                abort(
                    Response(
                        response="Cannot execute given policy against the image due to errors executing the policy bundle: {}".format(
                            e.message
                        ),
                        status=500,
                    )
                )
        else:
            # Construct a failure eval with details on the errors and mappings to send to client
            eval_result = build_empty_error_execution(
                img_obj, tag, executable_bundle, errors=problems, warnings=[]
            )
            if (
                executable_bundle
                and executable_bundle.mapping
                and len(executable_bundle.mapping.mapping_rules) == 1
            ):
                eval_result.executed_mapping = executable_bundle.mapping.mapping_rules[
                    0
                ]

        resp = PolicyEvaluation()
        resp.user_id = user_id
        resp.image_id = image_id
        resp.tag = tag
        resp.bundle = bundle
        resp.matched_mapping_rule = (
            eval_result.executed_mapping.json()
            if eval_result.executed_mapping
            else False
        )
        resp.last_modified = int(time.time())
        resp.final_action = eval_result.bundle_decision.final_decision.name
        resp.final_action_reason = eval_result.bundle_decision.reason
        resp.matched_whitelisted_images_rule = (
            eval_result.bundle_decision.whitelisted_image.json()
            if eval_result.bundle_decision.whitelisted_image
            else False
        )
        resp.matched_blacklisted_images_rule = (
            eval_result.bundle_decision.blacklisted_image.json()
            if eval_result.bundle_decision.blacklisted_image
            else False
        )
        resp.result = eval_result.as_table_json()
        resp.created_at = int(time.time())
        resp.evaluation_problems = [
            problem_from_exception(i) for i in eval_result.errors
        ]
        resp.evaluation_problems += [
            problem_from_exception(i) for i in eval_result.warnings
        ]
        if resp.evaluation_problems:
            for i in resp.evaluation_problems:
                log.warn(
                    "Returning evaluation response for image {}/{} w/tag {} and bundle {} that contains error: {}".format(
                        user_id, image_id, tag, bundle["id"], json.dumps(i.to_dict())
                    )
                )
            metrics.histogram_observe(
                "anchore_policy_evaluation_time_seconds",
                time.time() - timer,
                status="fail",
            )
        else:
            metrics.histogram_observe(
                "anchore_policy_evaluation_time_seconds",
                time.time() - timer,
                status="success",
            )

        result = resp.to_dict()

        # Never let the cache block returning results
        try:
            if evaluation_cache_enabled and cache_mgr is not None:
                cache_mgr.save(result)
        except Exception as ex:
            log.exception(
                "Failed saving policy result in cache. Skipping and continuing."
            )

        db.commit()

        return result

    except HTTPException as e:
        db.rollback()
        log.exception("Caught exception in execution: {}".format(e))
        raise
    except Exception as e:
        db.rollback()
        log.exception("Failed processing bundle evaluation: {}".format(e))
        abort(Response("Unexpected internal error", 500))
    finally:
        db.close()


# 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 check_user_image_inline(user_id, image_id, tag, bundle):
    """
    Execute a policy evaluation using the info in the request body including the bundle content

    :param user_id:
    :param image_id:
    :param tag:
    :param bundle:
    :return:
    """

    timer = time.time()
    db = get_session()
    cache_mgr = None

    try:
        # Input validation
        if tag is None:
            # set tag value to a value that only matches wildcards
            tag = "*/*:*"

        try:
            img_obj = db.query(Image).get((image_id, user_id))
        except:
            return make_response_error("Image not found", in_httpcode=404), 404

        if not img_obj:
            log.info(
                "Request for evaluation of image that cannot be found: user_id = {}, image_id = {}".format(
                    user_id, image_id
                )
            )
            return make_response_error("Image not found", in_httpcode=404), 404

        if evaluation_cache_enabled:
            timer2 = time.time()
            try:
                try:
                    cache_mgr = EvaluationCacheManager(img_obj, tag, bundle)
                except ValueError as err:
                    log.warn(
                        "Could not leverage cache due to error in bundle data: {}".format(
                            err
                        )
                    )
                    cache_mgr = None

                if cache_mgr is None:
                    log.info(
                        "Could not initialize cache manager for policy evaluation, skipping cache usage"
                    )
                else:
                    cached_result = cache_mgr.refresh()
                    if cached_result:
                        metrics.counter_inc(name="anchore_policy_evaluation_cache_hits")
                        metrics.histogram_observe(
                            "anchore_policy_evaluation_cache_access_latency",
                            time.time() - timer2,
                            status="hit",
                        )
                        log.info(
                            "Returning cached result of policy evaluation for {}/{}, with tag {} and bundle {} with digest {}. Last evaluation: {}".format(
                                user_id,
                                image_id,
                                tag,
                                cache_mgr.bundle_id,
                                cache_mgr.bundle_digest,
                                cached_result.get("last_modified"),
                            )
                        )
                        return cached_result
                    else:
                        metrics.counter_inc(
                            name="anchore_policy_evaluation_cache_misses"
                        )
                        metrics.histogram_observe(
                            "anchore_policy_evaluation_cache_access_latency",
                            time.time() - timer2,
                            status="miss",
                        )
                        log.info(
                            "Policy evaluation not cached, or invalid, executing evaluation for {}/{} with tag {} and bundle {} with digest {}".format(
                                user_id,
                                image_id,
                                tag,
                                cache_mgr.bundle_id,
                                cache_mgr.bundle_digest,
                            )
                        )

            except Exception as ex:
                log.exception(
                    "Unexpected error operating on policy evaluation cache. Skipping use of cache."
                )

        else:
            log.info("Policy evaluation cache disabled. Executing evaluation")

        # Build bundle exec.
        problems = []
        executable_bundle = None
        try:
            # Allow deprecated gates here to support upgrade cases from old policy bundles.
            executable_bundle = build_bundle(bundle, for_tag=tag, allow_deprecated=True)
            if executable_bundle.init_errors:
                problems = executable_bundle.init_errors
        except InitializationError as e:
            log.exception("Bundle construction and initialization returned errors")
            problems = e.causes

        eval_result = None
        if not problems:
            # Execute bundle
            try:
                eval_result = executable_bundle.execute(
                    img_obj, tag, ExecutionContext(db_session=db, configuration={})
                )
            except Exception as e:
                log.exception(
                    "Error executing policy bundle {} against image {} w/tag {}: {}".format(
                        bundle["id"], image_id, tag, e
                    )
                )
                return make_response_error(
                    "Internal bundle evaluation error",
                    detail="Cannot execute given policy against the image due to errors executing the policy bundle: {}".format(
                        e
                    ),
                    in_httpcode=500,
                ), 500
        else:
            # Construct a failure eval with details on the errors and mappings to send to client
            eval_result = build_empty_error_execution(
                img_obj, tag, executable_bundle, errors=problems, warnings=[]
            )
            if (
                executable_bundle
                and executable_bundle.mapping
                and len(executable_bundle.mapping.mapping_rules) == 1
            ):
                eval_result.executed_mapping = executable_bundle.mapping.mapping_rules[
                    0
                ]

        resp = PolicyEvaluation()
        resp.user_id = user_id
        resp.image_id = image_id
        resp.tag = tag
        resp.bundle = bundle
        resp.matched_mapping_rule = (
            eval_result.executed_mapping.json()
            if eval_result.executed_mapping
            else False
        )
        resp.last_modified = int(time.time())
        resp.final_action = eval_result.bundle_decision.final_decision.name
        resp.final_action_reason = eval_result.bundle_decision.reason
        resp.matched_whitelisted_images_rule = (
            eval_result.bundle_decision.whitelisted_image.json()
            if eval_result.bundle_decision.whitelisted_image
            else False
        )
        resp.matched_blacklisted_images_rule = (
            eval_result.bundle_decision.blacklisted_image.json()
            if eval_result.bundle_decision.blacklisted_image
            else False
        )
        resp.result = eval_result.as_table_json()
        resp.created_at = int(time.time())
        resp.evaluation_problems = [
            problem_from_exception(i) for i in eval_result.errors
        ]
        resp.evaluation_problems += [
            problem_from_exception(i) for i in eval_result.warnings
        ]
        if resp.evaluation_problems:
            for i in resp.evaluation_problems:
                log.warn(
                    "Returning evaluation response for image {}/{} w/tag {} and bundle {} that contains error: {}".format(
                        user_id, image_id, tag, bundle["id"], json.dumps(i.to_dict())
                    )
                )
            metrics.histogram_observe(
                "anchore_policy_evaluation_time_seconds",
                time.time() - timer,
                status="fail",
            )
        else:
            metrics.histogram_observe(
                "anchore_policy_evaluation_time_seconds",
                time.time() - timer,
                status="success",
            )

        result = resp.to_dict()

        # Never let the cache block returning results
        try:
            if evaluation_cache_enabled and cache_mgr is not None:
                cache_mgr.save(result)
        except Exception as ex:
            log.exception(
                "Failed saving policy result in cache. Skipping and continuing."
            )

        db.commit()

        return result

    except HTTPException as e:
        db.rollback()
        log.exception("Caught exception in execution: {}".format(e))
        raise
    except Exception as e:
        db.rollback()
        log.exception("Failed processing bundle evaluation: {}".format(e))
        return make_response_error(
            "Unexpected internal error", detail=str(e), in_httpcode=500
        ), 500
    finally:
        db.close()