...

Text file src/sigs.k8s.io/gateway-api/hack/verify-crds-kind.sh

Documentation: sigs.k8s.io/gateway-api/hack

     1#!/bin/bash
     2
     3# Copyright 2020 The Kubernetes Authors.
     4#
     5# Licensed under the Apache License, Version 2.0 (the "License");
     6# you may not use this file except in compliance with the License.
     7# You may obtain a copy of the License at
     8#
     9#     http://www.apache.org/licenses/LICENSE-2.0
    10#
    11# Unless required by applicable law or agreed to in writing, software
    12# distributed under the License is distributed on an "AS IS" BASIS,
    13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14# See the License for the specific language governing permissions and
    15# limitations under the License.
    16
    17set -o nounset
    18set -o pipefail
    19
    20readonly GO111MODULE="on"
    21readonly GOFLAGS="-mod=readonly"
    22readonly GOPATH="$(mktemp -d)"
    23readonly CLUSTER_NAME="verify-gateway-api"
    24readonly LOCAL_IMAGE="registry.k8s.io/gateway-api/admission-server:latest"
    25
    26export KUBECONFIG="${GOPATH}/.kubeconfig"
    27export GOFLAGS GO111MODULE GOPATH
    28export PATH="${GOPATH}/bin:${PATH}"
    29
    30# Cleanup logic for cleanup on exit
    31CLEANED_UP=false
    32cleanup() {
    33  if [ "$CLEANED_UP" = "true" ]; then
    34    return
    35  fi
    36
    37  rm -f config/webhook/kustomization.yaml
    38
    39  if [ "${KIND_CREATE_ATTEMPTED:-}" = true ]; then
    40    kind delete cluster --name "${CLUSTER_NAME}" || true
    41  fi
    42  CLEANED_UP=true
    43}
    44
    45trap cleanup INT TERM EXIT
    46
    47# For exit code
    48res=0
    49
    50# Install kind
    51(cd $GOPATH && go install sigs.k8s.io/kind@v0.20.0) || res=$?
    52
    53# Create cluster
    54KIND_CREATE_ATTEMPTED=true
    55kind create cluster --name "${CLUSTER_NAME}"
    56
    57# Verify CEL validations before installing webhook.
    58for CHANNEL in experimental standard; do
    59  # Install CRDs.
    60  kubectl apply -f "config/crd/${CHANNEL}/gateway*.yaml"
    61
    62  # Run tests.
    63  go test -v -timeout=120s -count=1 --tags ${CHANNEL} sigs.k8s.io/gateway-api/pkg/test/cel || res=$?
    64
    65  # Delete CRDs to reset environment.
    66  kubectl delete -f "config/crd/${CHANNEL}/gateway*.yaml"
    67done
    68
    69# Temporary workaround for https://github.com/kubernetes/kubernetes/issues/104090
    70sleep 8
    71
    72## Check using example YAMLs as well
    73## with _only_ CEL validation
    74
    75
    76for CHANNEL in experimental standard; do
    77  ##### Test valid CRD apply and that invalid examples are invalid.
    78  # Install CRDs
    79  kubectl apply -f "config/crd/${CHANNEL}/gateway*.yaml" || res=$?
    80
    81  # Temporary workaround for https://github.com/kubernetes/kubernetes/issues/104090
    82  sleep 8
    83
    84  kubectl apply --recursive -f examples/standard || res=$?
    85
    86  # Install all experimental example gateway-api resources when experimental mode is enabled
    87  if [[ "${CHANNEL}" == "experimental" ]]; then
    88    echo "Experimental mode enabled: deploying experimental examples"
    89    kubectl apply --recursive -f examples/experimental || res=$?
    90  fi
    91
    92  # Find all our invalid examples and check them one by one.
    93  # This lets us check the output in a cleaner way than a grep pipeline.
    94  for file in $(find hack/invalid-examples -name "*.yaml"); do
    95    # Don't check alpha resources in Standard checks
    96    if [[ "$file" =~ "experimental" && "$CHANNEL" == "standard" ]]; then
    97      continue
    98    fi
    99
   100    KUBECTL_OUTPUT=$(kubectl apply -f "$file" 2>&1)
   101
   102    if [[ \
   103          ! ("$KUBECTL_OUTPUT" =~ "is invalid") && \
   104          ! ("$KUBECTL_OUTPUT" =~ "missing required field") &&  \
   105          ! ("$KUBECTL_OUTPUT" =~ "denied the request") && \
   106          ! ("$KUBECTL_OUTPUT" =~ "Invalid value") \
   107          ]]; then
   108      res=2
   109      cat<<EOF
   110
   111Error: Example $file in channel $CHANNEL failed in an unexpected way with CEL validation.
   112$KUBECTL_OUTPUT
   113EOF
   114    else
   115    echo "Example $file in channel $CHANNEL failed as expected with CEL validation."
   116    fi
   117
   118  done
   119  kubectl delete -f "config/crd/${CHANNEL}/gateway*.yaml" || res=$?
   120done
   121
   122###
   123# This section and below can be REMOVED once the webhook is removed.
   124###
   125# Install webhook and check the _invalid_ examples again.
   126cat <<EOF >config/webhook/kustomization.yaml
   127resources:
   128  - 0-namespace.yaml
   129  - certificate_config.yaml
   130  - admission_webhook.yaml
   131patches:
   132  - patch: |-
   133      - op: replace
   134        path: /spec/template/spec/containers/0/image
   135        value: ${LOCAL_IMAGE}
   136      - op: replace
   137        path: /spec/template/spec/containers/0/imagePullPolicy
   138        value: IfNotPresent
   139    target:
   140      group: apps
   141      version: v1
   142      kind: Deployment
   143      name: gateway-api-admission-server
   144EOF
   145
   146
   147
   148docker build -t ${LOCAL_IMAGE} -f docker/Dockerfile.webhook .
   149kind load docker-image ${LOCAL_IMAGE} --name "${CLUSTER_NAME}"
   150kubectl apply -k config/webhook/
   151
   152# Wait for webhook to be ready
   153for check in {1..10}; do
   154  sleep 5
   155  NUM_COMPLETED=$(kubectl get po -n gateway-system | grep Completed | wc -l | xargs || echo Failed to get completed Pods)
   156  if [ "${NUM_COMPLETED}" = "2" ]; then
   157    echo "Webhook successfully configured"
   158    break
   159  elif [ "${check}" = "10" ]; then
   160    echo "Timed out waiting for webhook setup to complete"
   161    cleanup
   162    exit 1
   163  fi
   164  echo "Webhook not ready yet, will check again in 5 seconds"
   165done
   166
   167for CHANNEL in experimental standard; do
   168  ##### Test valid CRD apply and that invalid examples are invalid.
   169  # Install CRDs
   170  kubectl apply -f "config/crd/${CHANNEL}/gateway*.yaml" || res=$?
   171
   172  # Temporary workaround for https://github.com/kubernetes/kubernetes/issues/104090
   173  sleep 8
   174
   175  # Note that we skip the working examples since we did them already with
   176  # just CEL validation.
   177
   178  for file in $(find hack/invalid-examples -name "*.yaml"); do
   179    # Don't check alpha resources in Standard checks
   180    if [[ "$file" =~ "experimental" && "$CHANNEL" == "standard" ]]; then
   181      continue
   182    fi
   183
   184    KUBECTL_OUTPUT=$(kubectl apply -f "$file" 2>&1)
   185
   186    if [[ \
   187          ! ("$KUBECTL_OUTPUT" =~ "is invalid") && \
   188          ! ("$KUBECTL_OUTPUT" =~ "missing required field") &&  \
   189          ! ("$KUBECTL_OUTPUT" =~ "denied the request") && \
   190          ! ("$KUBECTL_OUTPUT" =~ "Invalid value") \
   191          ]]; then
   192      res=2
   193      cat<<EOF
   194
   195Error: Example $file in channel $CHANNEL failed in an unexpected way with webhook validation.
   196$KUBECTL_OUTPUT
   197EOF
   198    else
   199    echo "Example $file in channel $CHANNEL failed as expected with webhook validation."
   200    fi
   201
   202  done
   203  kubectl delete -f "config/crd/${CHANNEL}/gateway*.yaml" || res=$?
   204done
   205
   206### We've trapped EXIT with cleanup(), so just exit with what we've got.
   207exit $res

View as plain text