#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you under the Apache License, Version 2.0 (the
#  "License"); you may not use this file except in compliance
#  with the License.  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: app-ingress
  namespace: trafficserver-test-3
  annotations:
    ats.ingress.kubernetes.io/server-snippet: |
      ts.hook(TS_LUA_HOOK_SEND_RESPONSE_HDR, function()
        ts.client_response.header['Location'] = 'https://test.edge.com/app2'
      end)
      ts.http.skip_remapping_set(0)
      ts.http.set_resp(301, 'Redirect')
spec:
  rules:
  - host: test.edge.com
    http:
      paths:
      - path: /app2
        backend:
          serviceName: appsvc2
          servicePort: 8080