Mock responses using Tyk Operator not working properly?

Hi all,

The example from Using the Mock Response middleware with Tyk Classic APIs to create an ApiDefinition CR that should return a mock response seems to not work properly (or I’m understanding it wrong)

The API definition is properly added to the GW but a call to http://tyk-gw/httpbin/foo does not return the mock response as expected.

Here’s the definition that was applied to the GW (using tyk-operator):
curl 'http://tyk-gw/tyk/apis' --header 'x-tyk-authorization: ...' | jq | pbcopy

[
  {
    "name": "httpbin",
    "slug": "httpbin",
    "listen_port": 0,
    "protocol": "",
    "enable_proxy_protocol": false,
    "api_id": "1",
    "org_id": "default",
    "use_keyless": true,
    "use_oauth2": false,
    "external_oauth": {
      "enabled": false,
      "providers": null
    },
    "use_openid": false,
    "openid_options": {
      "providers": null,
      "segregate_by_client": false
    },
    "oauth_meta": {
      "allowed_access_types": null,
      "allowed_authorize_types": null,
      "auth_login_redirect": ""
    },
    "auth": {
      "name": "",
      "use_param": false,
      "param_name": "",
      "use_cookie": false,
      "cookie_name": "",
      "disable_header": false,
      "auth_header_name": "",
      "use_certificate": false,
      "validate_signature": false,
      "signature": {
        "algorithm": "",
        "header": "",
        "use_param": false,
        "param_name": "",
        "secret": "",
        "allowed_clock_skew": 0,
        "error_code": 0,
        "error_message": ""
      }
    },
    "auth_configs": null,
    "use_basic_auth": false,
    "basic_auth": {
      "disable_caching": false,
      "cache_ttl": 0,
      "extract_from_body": false,
      "body_user_regexp": "",
      "body_password_regexp": ""
    },
    "use_mutual_tls_auth": false,
    "client_certificates": null,
    "upstream_certificates": null,
    "pinned_public_keys": null,
    "enable_jwt": false,
    "use_standard_auth": false,
    "use_go_plugin_auth": false,
    "enable_coprocess_auth": false,
    "custom_plugin_auth_enabled": false,
    "jwt_signing_method": "",
    "jwt_source": "",
    "jwt_identity_base_field": "",
    "jwt_client_base_field": "",
    "jwt_policy_field_name": "",
    "jwt_default_policies": null,
    "jwt_issued_at_validation_skew": 0,
    "jwt_expires_at_validation_skew": 0,
    "jwt_not_before_validation_skew": 0,
    "jwt_skip_kid": false,
    "scopes": {
      "jwt": {},
      "oidc": {}
    },
    "idp_client_id_mapping_disabled": false,
    "jwt_scope_to_policy_mapping": null,
    "jwt_scope_claim_name": "",
    "notifications": {
      "shared_secret": "",
      "oauth_on_keychange_url": ""
    },
    "enable_signature_checking": false,
    "hmac_allowed_clock_skew": 0,
    "hmac_allowed_algorithms": null,
    "request_signing": {
      "is_enabled": false,
      "secret": "",
      "key_id": "",
      "algorithm": "",
      "header_list": null,
      "certificate_id": "",
      "signature_header": ""
    },
    "base_identity_provided_by": "",
    "definition": {
      "enabled": false,
      "name": "",
      "default": "",
      "location": "header",
      "key": "version",
      "strip_path": false,
      "strip_versioning_data": false,
      "url_versioning_pattern": "",
      "fallback_to_default": false,
      "versions": null
    },
    "version_data": {
      "not_versioned": true,
      "default_version": "",
      "versions": {
        "Default": {
          "name": "Default",
          "expires": "",
          "paths": {
            "ignored": null,
            "white_list": null,
            "black_list": null
          },
          "use_extended_paths": true,
          "extended_paths": {
            "persist_graphql": null,
            "rate_limit": null
          },
          "global_headers": null,
          "global_headers_remove": null,
          "global_headers_disabled": false,
          "global_response_headers": null,
          "global_response_headers_remove": null,
          "global_response_headers_disabled": false,
          "ignore_endpoint_case": false,
          "global_size_limit": 0,
          "override_target": ""
        }
      }
    },
    "uptime_tests": {
      "check_list": null,
      "config": {
        "expire_utime_after": 0,
        "service_discovery": {
          "use_discovery_service": false,
          "query_endpoint": "",
          "use_nested_query": false,
          "parent_data_path": "",
          "data_path": "",
          "port_data_path": "",
          "target_path": "",
          "use_target_list": false,
          "cache_disabled": false,
          "cache_timeout": 0,
          "endpoint_returns_list": false
        },
        "recheck_wait": 0
      }
    },
    "proxy": {
      "preserve_host_header": false,
      "listen_path": "/httpbin/",
      "target_url": "https://httpbin.org",
      "disable_strip_slash": false,
      "strip_listen_path": true,
      "enable_load_balancing": false,
      "target_list": null,
      "check_host_against_uptime_tests": false,
      "service_discovery": {
        "use_discovery_service": false,
        "query_endpoint": "",
        "use_nested_query": false,
        "parent_data_path": "",
        "data_path": "",
        "port_data_path": "",
        "target_path": "",
        "use_target_list": false,
        "cache_disabled": false,
        "cache_timeout": 0,
        "endpoint_returns_list": false
      },
      "transport": {
        "ssl_insecure_skip_verify": false,
        "ssl_ciphers": null,
        "ssl_min_version": 0,
        "ssl_max_version": 0,
        "ssl_force_common_name_check": false,
        "proxy_url": ""
      }
    },
    "disable_rate_limit": false,
    "disable_quota": false,
    "custom_middleware": {
      "pre": null,
      "post": null,
      "post_key_auth": null,
      "auth_check": {
        "disabled": false,
        "name": "",
        "path": "",
        "require_session": false,
        "raw_body_only": false
      },
      "response": null,
      "driver": "",
      "id_extractor": {
        "disabled": false,
        "extract_from": "",
        "extract_with": "",
        "extractor_config": null
      }
    },
    "custom_middleware_bundle": "",
    "custom_middleware_bundle_disabled": false,
    "cache_options": {
      "cache_timeout": 60,
      "enable_cache": false,
      "cache_all_safe_requests": false,
      "cache_response_codes": null,
      "enable_upstream_cache_control": false,
      "cache_control_ttl_header": "",
      "cache_by_headers": null
    },
    "session_lifetime": 0,
    "active": true,
    "internal": false,
    "auth_provider": {
      "name": "",
      "storage_engine": "",
      "meta": null
    },
    "session_provider": {
      "name": "",
      "storage_engine": "",
      "meta": null
    },
    "event_handlers": {
      "events": null
    },
    "enable_batch_request_support": false,
    "enable_ip_whitelisting": false,
    "allowed_ips": null,
    "enable_ip_blacklisting": false,
    "blacklisted_ips": null,
    "dont_set_quota_on_create": false,
    "expire_analytics_after": 0,
    "response_processors": null,
    "CORS": {
      "enable": true,
      "allowed_origins": [
        "*"
      ],
      "allowed_methods": [
        "GET",
        "POST",
        "PUT",
        "DELETE"
      ],
      "allowed_headers": [
        "Authorization",
        "Content-Type"
      ],
      "exposed_headers": [],
      "allow_credentials": true,
      "max_age": 24,
      "options_passthrough": false,
      "debug": false
    },
    "domain": "",
    "certificates": null,
    "do_not_track": false,
    "enable_context_vars": false,
    "config_data": null,
    "config_data_disabled": false,
    "tag_headers": null,
    "global_rate_limit": {
      "disabled": false,
      "rate": 0,
      "per": 0
    },
    "strip_auth_data": false,
    "enable_detailed_recording": false,
    "graphql": {
      "enabled": false,
      "execution_mode": "",
      "version": "",
      "schema": "",
      "type_field_configurations": null,
      "playground": {
        "enabled": false,
        "path": ""
      },
      "engine": {
        "field_configs": null,
        "data_sources": null,
        "global_headers": null
      },
      "proxy": {
        "features": {
          "use_immutable_headers": false
        },
        "auth_headers": null,
        "request_headers": null,
        "use_response_extensions": {
          "on_error_forwarding": false
        },
        "request_headers_rewrite": null
      },
      "subgraph": {
        "sdl": ""
      },
      "supergraph": {
        "subgraphs": null,
        "merged_sdl": "",
        "global_headers": null,
        "disable_query_batching": false
      },
      "introspection": {
        "disabled": false
      }
    },
    "analytics_plugin": {},
    "tags": null,
    "detailed_tracing": false
  },
  {
    "name": "httpbin",
    "slug": "",
    "listen_port": 0,
    "protocol": "http",
    "enable_proxy_protocol": false,
    "api_id": "cWJuay1sb2NhbC9odHRwYmlu",
    "org_id": "orgid",
    "use_keyless": true,
    "use_oauth2": false,
    "external_oauth": {
      "enabled": false,
      "providers": null
    },
    "use_openid": false,
    "openid_options": {
      "providers": null,
      "segregate_by_client": false
    },
    "oauth_meta": {
      "allowed_access_types": null,
      "allowed_authorize_types": null,
      "auth_login_redirect": ""
    },
    "auth": {
      "name": "",
      "use_param": false,
      "param_name": "",
      "use_cookie": false,
      "cookie_name": "",
      "disable_header": false,
      "auth_header_name": "",
      "use_certificate": false,
      "validate_signature": false,
      "signature": {
        "algorithm": "",
        "header": "",
        "use_param": false,
        "param_name": "",
        "secret": "",
        "allowed_clock_skew": 0,
        "error_code": 0,
        "error_message": ""
      }
    },
    "auth_configs": null,
    "use_basic_auth": false,
    "basic_auth": {
      "disable_caching": false,
      "cache_ttl": 0,
      "extract_from_body": false,
      "body_user_regexp": "",
      "body_password_regexp": ""
    },
    "use_mutual_tls_auth": false,
    "client_certificates": null,
    "upstream_certificates": null,
    "pinned_public_keys": null,
    "enable_jwt": false,
    "use_standard_auth": false,
    "use_go_plugin_auth": false,
    "enable_coprocess_auth": false,
    "custom_plugin_auth_enabled": false,
    "jwt_signing_method": "",
    "jwt_source": "",
    "jwt_identity_base_field": "",
    "jwt_client_base_field": "",
    "jwt_policy_field_name": "",
    "jwt_default_policies": null,
    "jwt_issued_at_validation_skew": 0,
    "jwt_expires_at_validation_skew": 0,
    "jwt_not_before_validation_skew": 0,
    "jwt_skip_kid": false,
    "scopes": {
      "jwt": {},
      "oidc": {}
    },
    "idp_client_id_mapping_disabled": false,
    "jwt_scope_to_policy_mapping": null,
    "jwt_scope_claim_name": "",
    "notifications": {
      "shared_secret": "",
      "oauth_on_keychange_url": ""
    },
    "enable_signature_checking": false,
    "hmac_allowed_clock_skew": 0,
    "hmac_allowed_algorithms": null,
    "request_signing": {
      "is_enabled": false,
      "secret": "",
      "key_id": "",
      "algorithm": "",
      "header_list": null,
      "certificate_id": "",
      "signature_header": ""
    },
    "base_identity_provided_by": "",
    "definition": {
      "enabled": false,
      "name": "",
      "default": "",
      "location": "",
      "key": "",
      "strip_path": false,
      "strip_versioning_data": false,
      "url_versioning_pattern": "",
      "fallback_to_default": false,
      "versions": null
    },
    "version_data": {
      "not_versioned": true,
      "default_version": "Default",
      "versions": {
        "Default": {
          "name": "Default",
          "expires": "",
          "paths": {
            "ignored": null,
            "white_list": null,
            "black_list": null
          },
          "use_extended_paths": true,
          "extended_paths": {
            "ignored": [
              {
                "disabled": false,
                "path": "/foo",
                "method": "",
                "ignore_case": false,
                "method_actions": {
                  "GET": {
                    "action": "reply",
                    "code": 200,
                    "data": "{\"foo\": \"bar\"}",
                    "headers": {}
                  }
                }
              }
            ],
            "persist_graphql": null,
            "rate_limit": null
          },
          "global_headers": null,
          "global_headers_remove": null,
          "global_headers_disabled": false,
          "global_response_headers": null,
          "global_response_headers_remove": null,
          "global_response_headers_disabled": false,
          "ignore_endpoint_case": false,
          "global_size_limit": 0,
          "override_target": ""
        }
      }
    },
    "uptime_tests": {
      "check_list": null,
      "config": {
        "expire_utime_after": 0,
        "service_discovery": {
          "use_discovery_service": false,
          "query_endpoint": "",
          "use_nested_query": false,
          "parent_data_path": "",
          "data_path": "",
          "port_data_path": "",
          "target_path": "",
          "use_target_list": false,
          "cache_disabled": false,
          "cache_timeout": 0,
          "endpoint_returns_list": false
        },
        "recheck_wait": 0
      }
    },
    "proxy": {
      "preserve_host_header": false,
      "listen_path": "/httpbin",
      "target_url": "http://httpbin.org",
      "disable_strip_slash": false,
      "strip_listen_path": true,
      "enable_load_balancing": false,
      "target_list": null,
      "check_host_against_uptime_tests": false,
      "service_discovery": {
        "use_discovery_service": false,
        "query_endpoint": "",
        "use_nested_query": false,
        "parent_data_path": "",
        "data_path": "",
        "port_data_path": "",
        "target_path": "",
        "use_target_list": false,
        "cache_disabled": false,
        "cache_timeout": 0,
        "endpoint_returns_list": false
      },
      "transport": {
        "ssl_insecure_skip_verify": false,
        "ssl_ciphers": null,
        "ssl_min_version": 0,
        "ssl_max_version": 0,
        "ssl_force_common_name_check": false,
        "proxy_url": ""
      }
    },
    "disable_rate_limit": false,
    "disable_quota": false,
    "custom_middleware": {
      "pre": null,
      "post": null,
      "post_key_auth": null,
      "auth_check": {
        "disabled": false,
        "name": "",
        "path": "",
        "require_session": false,
        "raw_body_only": false
      },
      "response": null,
      "driver": "",
      "id_extractor": {
        "disabled": false,
        "extract_from": "",
        "extract_with": "",
        "extractor_config": {}
      }
    },
    "custom_middleware_bundle": "",
    "custom_middleware_bundle_disabled": false,
    "cache_options": {
      "cache_timeout": 0,
      "enable_cache": false,
      "cache_all_safe_requests": false,
      "cache_response_codes": null,
      "enable_upstream_cache_control": false,
      "cache_control_ttl_header": "",
      "cache_by_headers": null
    },
    "session_lifetime": 0,
    "active": true,
    "internal": false,
    "auth_provider": {
      "name": "",
      "storage_engine": "",
      "meta": null
    },
    "session_provider": {
      "name": "",
      "storage_engine": "",
      "meta": null
    },
    "event_handlers": {
      "events": null
    },
    "enable_batch_request_support": false,
    "enable_ip_whitelisting": false,
    "allowed_ips": null,
    "enable_ip_blacklisting": false,
    "blacklisted_ips": null,
    "dont_set_quota_on_create": false,
    "expire_analytics_after": 0,
    "response_processors": null,
    "CORS": {
      "enable": false,
      "allowed_origins": null,
      "allowed_methods": null,
      "allowed_headers": null,
      "exposed_headers": null,
      "allow_credentials": false,
      "max_age": 0,
      "options_passthrough": false,
      "debug": false
    },
    "domain": "",
    "certificates": null,
    "do_not_track": false,
    "enable_context_vars": false,
    "config_data": null,
    "config_data_disabled": false,
    "tag_headers": null,
    "global_rate_limit": {
      "disabled": false,
      "rate": 0,
      "per": 0
    },
    "strip_auth_data": false,
    "enable_detailed_recording": false,
    "graphql": {
      "enabled": false,
      "execution_mode": "",
      "version": "",
      "schema": "",
      "type_field_configurations": null,
      "playground": {
        "enabled": false,
        "path": ""
      },
      "engine": {
        "field_configs": null,
        "data_sources": null,
        "global_headers": null
      },
      "proxy": {
        "features": {
          "use_immutable_headers": false
        },
        "auth_headers": null,
        "request_headers": null,
        "use_response_extensions": {
          "on_error_forwarding": false
        },
        "request_headers_rewrite": null
      },
      "subgraph": {
        "sdl": ""
      },
      "supergraph": {
        "subgraphs": null,
        "merged_sdl": "",
        "global_headers": null,
        "disable_query_batching": false
      },
      "introspection": {
        "disabled": false
      }
    },
    "analytics_plugin": {},
    "tags": null,
    "detailed_tracing": false
  }
]

and a call to http://tyk-gw/httpbin/foo seems to go to httpbin.org still and returns a 404 not found response.

curl  'http://tyk-gw/httpbin/foo'
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>404 Not Found</title>
<h1>Not Found</h1>
<p>The requested URL was not found on the server.  If you entered the URL manually please check your spelling and try again.</p>

I might have misunderstood the usage here, I’ve tried a couple of different endpoints and configurations but not having any luck.

Best regards,
Henrik

Update: Might have been due to formatting of the YAML, when applying the following CRD today it seems to work:

kind: ApiDefinition
metadata:
  name: httpbin
spec:
  name: httpbin
  protocol: http
  active: true
  use_keyless: true
  proxy:
    target_url: http://httpbin.org
    listen_path: /httpbin
    strip_listen_path: true
  version_data:
    default_version: Default
    not_versioned: true
    versions:
      Default:
        name: Default
        use_extended_paths: true
        paths:
          black_list: []
          ignored: []
          white_list: []
        extended_paths:
          ignored:
            - ignore_case: false
              method_actions:
                GET:
                  action: "reply"
                  code: 200
                  data: '{"foo": "bar"}'
                  headers: {}
              path: /foo
1 Like

Great work! Glad to know you were able to get it sorted.