mirror of https://github.com/knative/caching.git
[master] Auto-update dependencies (#311)
Produced via: `./hack/update-deps.sh --upgrade && ./hack/update-codegen.sh` /assign n3wscott vagababov /cc n3wscott vagababov
This commit is contained in:
parent
bed54e5ecf
commit
1d7658a53a
4
go.mod
4
go.mod
|
@ -16,8 +16,8 @@ require (
|
|||
k8s.io/client-go v11.0.1-0.20190805182717-6502b5e7b1b5+incompatible
|
||||
k8s.io/code-generator v0.18.6
|
||||
k8s.io/kube-openapi v0.0.0-20200410145947-bcb3869e6f29
|
||||
knative.dev/pkg v0.0.0-20200816190606-6d1b0e90624b
|
||||
knative.dev/test-infra v0.0.0-20200813220306-af5517f4f576
|
||||
knative.dev/pkg v0.0.0-20200818021113-c451e3c37f5f
|
||||
knative.dev/test-infra v0.0.0-20200817225313-c0ea00ce480c
|
||||
)
|
||||
|
||||
replace (
|
||||
|
|
6
go.sum
6
go.sum
|
@ -1868,8 +1868,8 @@ knative.dev/pkg v0.0.0-20200505191044-3da93ebb24c2/go.mod h1:Q6sL35DdGs8hIQZKdaC
|
|||
knative.dev/pkg v0.0.0-20200515002500-16d7b963416f/go.mod h1:tMOHGbxtRz8zYFGEGpV/bpoTEM1o89MwYFC4YJXl3GY=
|
||||
knative.dev/pkg v0.0.0-20200528142800-1c6815d7e4c9/go.mod h1:QgNZTxnwpB/oSpNcfnLVlw+WpEwwyKAvJlvR3hgeltA=
|
||||
knative.dev/pkg v0.0.0-20200711004937-22502028e31a/go.mod h1:AqAJV6rYi8IGikDjJ/9ZQd9qKdkXVlesVnVjwx62YB8=
|
||||
knative.dev/pkg v0.0.0-20200816190606-6d1b0e90624b h1:aESEp8dEjoByMeYkdx82ho8BSMR2j2mtXEyxO3L+vbg=
|
||||
knative.dev/pkg v0.0.0-20200816190606-6d1b0e90624b/go.mod h1:jDDuXO7eEDWooxPadJRyt6dhO0Vi4B2B1l+Ju9VtnZ4=
|
||||
knative.dev/pkg v0.0.0-20200818021113-c451e3c37f5f h1:20+d8Jhl4n8PEgXJjBjviv3XL+ddjtk9Arxp0CRBDAc=
|
||||
knative.dev/pkg v0.0.0-20200818021113-c451e3c37f5f/go.mod h1:jDDuXO7eEDWooxPadJRyt6dhO0Vi4B2B1l+Ju9VtnZ4=
|
||||
knative.dev/test-infra v0.0.0-20200407185800-1b88cb3b45a5/go.mod h1:xcdUkMJrLlBswIZqL5zCuBFOC22WIPMQoVX1L35i0vQ=
|
||||
knative.dev/test-infra v0.0.0-20200505052144-5ea2f705bb55/go.mod h1:WqF1Azka+FxPZ20keR2zCNtiQA1MP9ZB4BH4HuI+SIU=
|
||||
knative.dev/test-infra v0.0.0-20200513011557-d03429a76034/go.mod h1:aMif0KXL4g19YCYwsy4Ocjjz5xgPlseYV+B95Oo4JGE=
|
||||
|
@ -1877,6 +1877,8 @@ knative.dev/test-infra v0.0.0-20200519015156-82551620b0a9/go.mod h1:A5b2OAXTOeHT
|
|||
knative.dev/test-infra v0.0.0-20200707183444-aed09e56ddc7/go.mod h1:RjYAhXnZqeHw9+B0zsbqSPlae0lCvjekO/nw5ZMpLCs=
|
||||
knative.dev/test-infra v0.0.0-20200813220306-af5517f4f576 h1:gsZMM8J2MA3iTSMOt5MTMt84y6H5PkIFMmUakqqogJ0=
|
||||
knative.dev/test-infra v0.0.0-20200813220306-af5517f4f576/go.mod h1:Pmg2c7Z7q7BGFUV/GOpU5BlrD3ePJft4MPqx8AYBplc=
|
||||
knative.dev/test-infra v0.0.0-20200817225313-c0ea00ce480c h1:AT7+D1fWJlqcCpMDgYYLNPa0//gBTRtX8bnCz4Ar4Jg=
|
||||
knative.dev/test-infra v0.0.0-20200817225313-c0ea00ce480c/go.mod h1:Pmg2c7Z7q7BGFUV/GOpU5BlrD3ePJft4MPqx8AYBplc=
|
||||
modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw=
|
||||
modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk=
|
||||
modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k=
|
||||
|
|
|
@ -73,7 +73,7 @@ func SafeEqual(x, y interface{}, opts ...cmp.Option) (equal bool, err error) {
|
|||
// CompareSetFields returns a list of field names that differ between
|
||||
// x and y. Uses SafeEqual for comparison.
|
||||
func CompareSetFields(x, y interface{}, opts ...cmp.Option) ([]string, error) {
|
||||
r := new(FieldListReporter)
|
||||
r := new(fieldListReporter)
|
||||
opts = append(opts, cmp.Reporter(r))
|
||||
_, err := SafeEqual(x, y, opts...)
|
||||
return r.Fields(), err
|
||||
|
@ -82,7 +82,7 @@ func CompareSetFields(x, y interface{}, opts ...cmp.Option) ([]string, error) {
|
|||
// ShortDiff returns a zero-context, unified human-readable diff.
|
||||
// Uses SafeEqual for comparison.
|
||||
func ShortDiff(prev, cur interface{}, opts ...cmp.Option) (string, error) {
|
||||
r := new(ShortDiffReporter)
|
||||
r := new(shortDiffReporter)
|
||||
opts = append(opts, cmp.Reporter(r))
|
||||
var err error
|
||||
if _, err = SafeEqual(prev, cur, opts...); err != nil {
|
||||
|
|
|
@ -25,26 +25,26 @@ import (
|
|||
"github.com/google/go-cmp/cmp"
|
||||
)
|
||||
|
||||
// FieldListReporter implements the cmp.Reporter interface. It keeps
|
||||
// fieldListReporter implements the cmp.Reporter interface. It keeps
|
||||
// track of the field names that differ between two structs and reports
|
||||
// them through the Fields() function.
|
||||
type FieldListReporter struct {
|
||||
type fieldListReporter struct {
|
||||
path cmp.Path
|
||||
fieldNames []string
|
||||
}
|
||||
|
||||
// PushStep implements the cmp.Reporter.
|
||||
func (r *FieldListReporter) PushStep(ps cmp.PathStep) {
|
||||
func (r *fieldListReporter) PushStep(ps cmp.PathStep) {
|
||||
r.path = append(r.path, ps)
|
||||
}
|
||||
|
||||
// fieldName returns a readable name for the field. If the field has JSON annotations it
|
||||
// returns the JSON key. If the field does not have JSON annotations or the JSON annotation
|
||||
// marks the field as ignored it returns the field's go name
|
||||
func (r *FieldListReporter) fieldName() string {
|
||||
func (r *fieldListReporter) fieldName() string {
|
||||
if len(r.path) < 2 {
|
||||
return r.path.Index(0).String()
|
||||
} else {
|
||||
}
|
||||
fieldName := strings.TrimPrefix(r.path.Index(1).String(), ".")
|
||||
// Prefer JSON name to fieldName if it exists
|
||||
structField, exists := r.path.Index(0).Type().FieldByName(fieldName)
|
||||
|
@ -53,14 +53,13 @@ func (r *FieldListReporter) fieldName() string {
|
|||
if tag != "" && tag != "-" {
|
||||
return strings.SplitN(tag, ",", 2)[0]
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return fieldName
|
||||
}
|
||||
}
|
||||
|
||||
// Report implements the cmp.Reporter.
|
||||
func (r *FieldListReporter) Report(rs cmp.Result) {
|
||||
func (r *fieldListReporter) Report(rs cmp.Result) {
|
||||
if rs.Equal() {
|
||||
return
|
||||
}
|
||||
|
@ -75,72 +74,70 @@ func (r *FieldListReporter) Report(rs cmp.Result) {
|
|||
}
|
||||
|
||||
// PopStep implements cmp.Reporter.
|
||||
func (r *FieldListReporter) PopStep() {
|
||||
func (r *fieldListReporter) PopStep() {
|
||||
r.path = r.path[:len(r.path)-1]
|
||||
}
|
||||
|
||||
// Fields returns the field names that differed between the two
|
||||
// objects after calling cmp.Equal with the FieldListReporter. Field names
|
||||
// are returned in alphabetical order.
|
||||
func (r *FieldListReporter) Fields() []string {
|
||||
func (r *fieldListReporter) Fields() []string {
|
||||
sort.Strings(r.fieldNames)
|
||||
return r.fieldNames
|
||||
}
|
||||
|
||||
// ShortDiffReporter implements the cmp.Reporter interface. It reports
|
||||
// shortDiffReporter implements the cmp.Reporter interface. It reports
|
||||
// on fields which have diffing values in a short zero-context, unified diff
|
||||
// format.
|
||||
type ShortDiffReporter struct {
|
||||
type shortDiffReporter struct {
|
||||
path cmp.Path
|
||||
diffs []string
|
||||
err error
|
||||
}
|
||||
|
||||
// PushStep implements the cmp.Reporter.
|
||||
func (r *ShortDiffReporter) PushStep(ps cmp.PathStep) {
|
||||
func (r *shortDiffReporter) PushStep(ps cmp.PathStep) {
|
||||
r.path = append(r.path, ps)
|
||||
}
|
||||
|
||||
// Report implements the cmp.Reporter.
|
||||
func (r *ShortDiffReporter) Report(rs cmp.Result) {
|
||||
func (r *shortDiffReporter) Report(rs cmp.Result) {
|
||||
if rs.Equal() {
|
||||
return
|
||||
}
|
||||
cur := r.path.Last()
|
||||
vx, vy := cur.Values()
|
||||
t := cur.Type()
|
||||
var diff string
|
||||
// Prefix struct values with the types to add clarity in output
|
||||
if !vx.IsValid() && !vy.IsValid() {
|
||||
r.err = fmt.Errorf("unable to diff %+v and %+v on path %#v", vx, vy, r.path)
|
||||
} else {
|
||||
diff = fmt.Sprintf("%#v:\n", r.path)
|
||||
return
|
||||
}
|
||||
diff := fmt.Sprintf("%#v:\n", r.path)
|
||||
if vx.IsValid() {
|
||||
diff += r.diffString("-", t, vx)
|
||||
}
|
||||
if vy.IsValid() {
|
||||
diff += r.diffString("+", t, vy)
|
||||
}
|
||||
}
|
||||
r.diffs = append(r.diffs, diff)
|
||||
}
|
||||
|
||||
func (r *ShortDiffReporter) diffString(diffType string, t reflect.Type, v reflect.Value) string {
|
||||
func (r *shortDiffReporter) diffString(diffType string, t reflect.Type, v reflect.Value) string {
|
||||
if t.Kind() == reflect.Struct {
|
||||
return fmt.Sprintf("\t%s: %+v: \"%+v\"\n", diffType, t, v)
|
||||
} else {
|
||||
return fmt.Sprintf("\t%s: \"%+v\"\n", diffType, v)
|
||||
}
|
||||
return fmt.Sprintf("\t%s: \"%+v\"\n", diffType, v)
|
||||
}
|
||||
|
||||
// PopStep implements the cmp.Reporter.
|
||||
func (r *ShortDiffReporter) PopStep() {
|
||||
func (r *shortDiffReporter) PopStep() {
|
||||
r.path = r.path[:len(r.path)-1]
|
||||
}
|
||||
|
||||
// Diff returns the generated short diff for this object.
|
||||
// cmp.Equal should be called before this method.
|
||||
func (r *ShortDiffReporter) Diff() (string, error) {
|
||||
func (r *shortDiffReporter) Diff() (string, error) {
|
||||
if r.err != nil {
|
||||
return "", r.err
|
||||
}
|
||||
|
|
|
@ -113,30 +113,31 @@ This is a helper script for Knative E2E test scripts. To use it:
|
|||
1. [optional] Customize the test cluster. Set the following environment
|
||||
variables if the default values don't fit your needs:
|
||||
|
||||
- `E2E_CLUSTER_REGION`: Cluster region, defaults to `us-central1`.
|
||||
- `E2E_CLUSTER_BACKUP_REGIONS`: Space-separated list of regions to retry test
|
||||
- `E2E_GCP_PROJECT_ID`: GCP project ID for creating the clusters, defaults to none.
|
||||
- `E2E_GKE_CLUSTER_REGION`: Cluster region, defaults to `us-central1`.
|
||||
- `E2E_GKE_CLUSTER_BACKUP_REGIONS`: Space-separated list of regions to retry test
|
||||
cluster creation in case of stockout. Defaults to `us-west1 us-east1`.
|
||||
- `E2E_CLUSTER_ZONE`: Cluster zone (e.g., `a`), defaults to none (i.e. use a
|
||||
- `E2E_GKE_CLUSTER_ZONE`: Cluster zone (e.g., `a`), defaults to none (i.e. use a
|
||||
regional cluster).
|
||||
- `E2E_CLUSTER_BACKUP_ZONES`: Space-separated list of zones to retry test
|
||||
- `E2E_GKE_CLUSTER_BACKUP_ZONES`: Space-separated list of zones to retry test
|
||||
cluster creation in case of stockout. If defined,
|
||||
`E2E_CLUSTER_BACKUP_REGIONS` will be ignored thus it defaults to none.
|
||||
- `E2E_CLUSTER_MACHINE`: Cluster node machine type, defaults to
|
||||
`E2E_GKE_CLUSTER_BACKUP_REGIONS` will be ignored thus it defaults to none.
|
||||
- `E2E_GKE_CLUSTER_MACHINE`: Cluster node machine type, defaults to
|
||||
`e2-standard-4}`.
|
||||
- `E2E_MIN_CLUSTER_NODES`: Minimum number of nodes in the cluster when
|
||||
autoscaling, defaults to 1.
|
||||
- `E2E_MAX_CLUSTER_NODES`: Maximum number of nodes in the cluster when
|
||||
autoscaling, defaults to 3.
|
||||
- `E2E_GKE_SCOPES`: Scopes for the GKE node instances, defaults to `cloud-platform`.
|
||||
- `E2E_CLUSTER_VERSION`: Version for the cluster, defaults to `latest`.
|
||||
|
||||
1. Source the script.
|
||||
|
||||
1. [optional] Write the `knative_setup()` function, which will set up your
|
||||
system under test (e.g., Knative Serving). This function won't be called if
|
||||
you use the `--skip-knative-setup` flag.
|
||||
system under test (e.g., Knative Serving).
|
||||
|
||||
1. [optional] Write the `knative_teardown()` function, which will tear down your
|
||||
system under test (e.g., Knative Serving). This function won't be called if
|
||||
you use the `--skip-knative-setup` flag.
|
||||
system under test (e.g., Knative Serving).
|
||||
|
||||
1. [optional] Write the `test_setup()` function, which will set up the test
|
||||
resources.
|
||||
|
@ -171,7 +172,7 @@ This is a helper script for Knative E2E test scripts. To use it:
|
|||
**Notes:**
|
||||
|
||||
1. Calling your script without arguments will create a new cluster in the GCP
|
||||
project `$PROJECT_ID` and run the tests against it.
|
||||
project `$E2E_GCP_PROJECT_ID` and run the tests against it.
|
||||
|
||||
1. Calling your script with `--run-tests` and the variable `KO_DOCKER_REPO` set
|
||||
will immediately start the tests against the cluster currently configured for
|
||||
|
@ -183,10 +184,6 @@ This is a helper script for Knative E2E test scripts. To use it:
|
|||
1. By default Istio is installed on the cluster via Addon, use
|
||||
`--skip-istio-addon` if you choose not to have it preinstalled.
|
||||
|
||||
1. You can force running the tests against a specific GKE cluster version by
|
||||
using the `--cluster-version` flag and passing a full version as the flag
|
||||
value.
|
||||
|
||||
### Sample end-to-end test script
|
||||
|
||||
This script will test that the latest Knative Serving nightly release works. It
|
||||
|
|
|
@ -17,50 +17,9 @@
|
|||
# This is a helper script for Knative E2E test scripts.
|
||||
# See README.md for instructions on how to use it.
|
||||
|
||||
source $(dirname "${BASH_SOURCE[0]}")/library.sh
|
||||
source $(dirname "${BASH_SOURCE[0]}")/infra-library.sh
|
||||
|
||||
# Build a resource name based on $E2E_BASE_NAME, a suffix and $BUILD_NUMBER.
|
||||
# Restricts the name length to 40 chars (the limit for resource names in GCP).
|
||||
# Name will have the form $E2E_BASE_NAME-<PREFIX>$BUILD_NUMBER.
|
||||
# Parameters: $1 - name suffix
|
||||
function build_resource_name() {
|
||||
local prefix=${E2E_BASE_NAME}-$1
|
||||
local suffix=${BUILD_NUMBER}
|
||||
# Restrict suffix length to 20 chars
|
||||
if [[ -n "${suffix}" ]]; then
|
||||
suffix=${suffix:${#suffix}<20?0:-20}
|
||||
fi
|
||||
local name="${prefix:0:20}${suffix}"
|
||||
# Ensure name doesn't end with "-"
|
||||
echo "${name%-}"
|
||||
}
|
||||
|
||||
# Test cluster parameters
|
||||
|
||||
# Configurable parameters
|
||||
# export E2E_CLUSTER_REGION and E2E_CLUSTER_ZONE as they're used in the cluster setup subprocess
|
||||
export E2E_CLUSTER_REGION=${E2E_CLUSTER_REGION:-us-central1}
|
||||
# By default we use regional clusters.
|
||||
export E2E_CLUSTER_ZONE=${E2E_CLUSTER_ZONE:-}
|
||||
|
||||
# Default backup regions in case of stockouts; by default we don't fall back to a different zone in the same region
|
||||
readonly E2E_CLUSTER_BACKUP_REGIONS=${E2E_CLUSTER_BACKUP_REGIONS:-us-west1 us-east1}
|
||||
readonly E2E_CLUSTER_BACKUP_ZONES=${E2E_CLUSTER_BACKUP_ZONES:-}
|
||||
|
||||
readonly E2E_GKE_ENVIRONMENT=${E2E_GKE_ENVIRONMENT:-prod}
|
||||
readonly E2E_GKE_COMMAND_GROUP=${E2E_GKE_COMMAND_GROUP:-beta}
|
||||
|
||||
# Each knative repository may have a different cluster size requirement here,
|
||||
# so we allow calling code to set these parameters. If they are not set we
|
||||
# use some sane defaults.
|
||||
readonly E2E_MIN_CLUSTER_NODES=${E2E_MIN_CLUSTER_NODES:-1}
|
||||
readonly E2E_MAX_CLUSTER_NODES=${E2E_MAX_CLUSTER_NODES:-3}
|
||||
readonly E2E_CLUSTER_MACHINE=${E2E_CLUSTER_MACHINE:-e2-standard-4}
|
||||
|
||||
readonly E2E_BASE_NAME="k${REPO_NAME}"
|
||||
readonly E2E_CLUSTER_NAME=$(build_resource_name e2e-cls)
|
||||
readonly E2E_NETWORK_NAME=$(build_resource_name e2e-net)
|
||||
readonly TEST_RESULT_FILE=/tmp/${E2E_BASE_NAME}-e2e-result
|
||||
readonly TEST_RESULT_FILE=/tmp/${REPO_NAME}-e2e-result
|
||||
|
||||
# Flag whether test is using a boskos GCP project
|
||||
IS_BOSKOS=0
|
||||
|
@ -71,7 +30,7 @@ function teardown_test_resources() {
|
|||
(( IS_BOSKOS )) && return
|
||||
header "Tearing down test environment"
|
||||
function_exists test_teardown && test_teardown
|
||||
(( ! SKIP_KNATIVE_SETUP )) && function_exists knative_teardown && knative_teardown
|
||||
function_exists knative_teardown && knative_teardown
|
||||
}
|
||||
|
||||
# Run the given E2E tests. Assume tests are tagged e2e, unless `-tags=XXX` is passed.
|
||||
|
@ -86,203 +45,6 @@ function go_test_e2e() {
|
|||
report_go_test -race -count=1 "${go_test_args[@]}"
|
||||
}
|
||||
|
||||
# Dumps the k8s api server metrics. Spins up a proxy, waits a little bit and
|
||||
# dumps the metrics to ${ARTIFACTS}/k8s.metrics.txt
|
||||
function dump_metrics() {
|
||||
header ">> Starting kube proxy"
|
||||
kubectl proxy --port=8080 &
|
||||
local proxy_pid=$!
|
||||
sleep 5
|
||||
header ">> Grabbing k8s metrics"
|
||||
curl -s http://localhost:8080/metrics > "${ARTIFACTS}"/k8s.metrics.txt
|
||||
# Clean up proxy so it doesn't interfere with job shutting down
|
||||
kill $proxy_pid || true
|
||||
}
|
||||
|
||||
# Dump info about the test cluster. If dump_extra_cluster_info() is defined, calls it too.
|
||||
# This is intended to be called when a test fails to provide debugging information.
|
||||
function dump_cluster_state() {
|
||||
echo "***************************************"
|
||||
echo "*** E2E TEST FAILED ***"
|
||||
echo "*** Start of information dump ***"
|
||||
echo "***************************************"
|
||||
|
||||
local output
|
||||
output="${ARTIFACTS}/k8s.dump-$(basename "${E2E_SCRIPT}").txt"
|
||||
echo ">>> The dump is located at ${output}"
|
||||
|
||||
for crd in $(kubectl api-resources --verbs=list -o name | sort); do
|
||||
local count
|
||||
count="$(kubectl get "$crd" --all-namespaces --no-headers 2>/dev/null | wc -l)"
|
||||
echo ">>> ${crd} (${count} objects)"
|
||||
if [[ "${count}" -gt "0" ]]; then
|
||||
{
|
||||
echo ">>> ${crd} (${count} objects)"
|
||||
|
||||
echo ">>> Listing"
|
||||
kubectl get "${crd}" --all-namespaces
|
||||
|
||||
echo ">>> Details"
|
||||
if [[ "${crd}" == "secrets" ]]; then
|
||||
echo "Secrets are ignored for security reasons"
|
||||
elif [[ "${crd}" == "events" ]]; then
|
||||
echo "events are ignored as making a lot of noise"
|
||||
else
|
||||
kubectl get "${crd}" --all-namespaces -o yaml
|
||||
fi
|
||||
} >> "${output}"
|
||||
fi
|
||||
done
|
||||
|
||||
if function_exists dump_extra_cluster_state; then
|
||||
echo ">>> Extra dump" >> "${output}"
|
||||
dump_extra_cluster_state >> "${output}"
|
||||
fi
|
||||
echo "***************************************"
|
||||
echo "*** E2E TEST FAILED ***"
|
||||
echo "*** End of information dump ***"
|
||||
echo "***************************************"
|
||||
}
|
||||
|
||||
# On a Prow job, save some metadata about the test for Testgrid.
|
||||
function save_metadata() {
|
||||
(( ! IS_PROW )) && return
|
||||
local geo_key="Region"
|
||||
local geo_value="${E2E_CLUSTER_REGION}"
|
||||
if [[ -n "${E2E_CLUSTER_ZONE}" ]]; then
|
||||
geo_key="Zone"
|
||||
geo_value="${E2E_CLUSTER_REGION}-${E2E_CLUSTER_ZONE}"
|
||||
fi
|
||||
local cluster_version
|
||||
cluster_version="$(gcloud container clusters list --project="${E2E_PROJECT_ID}" --format='value(currentMasterVersion)')"
|
||||
run_kntest metadata set --key="E2E:${geo_key}" --value="${geo_value}"
|
||||
run_kntest metadata set --key="E2E:Machine" --value="${E2E_CLUSTER_MACHINE}"
|
||||
run_kntest metadata set --key="E2E:Version" --value="${cluster_version}"
|
||||
run_kntest metadata set --key="E2E:MinNodes" --value="${E2E_MIN_CLUSTER_NODES}"
|
||||
run_kntest metadata set --key="E2E:MaxNodes" --value="${E2E_MAX_CLUSTER_NODES}"
|
||||
}
|
||||
|
||||
# Create a test cluster with kubetest and call the current script again.
|
||||
function create_test_cluster() {
|
||||
# Fail fast during setup.
|
||||
set -o errexit
|
||||
set -o pipefail
|
||||
|
||||
if function_exists cluster_setup; then
|
||||
cluster_setup || fail_test "cluster setup failed"
|
||||
fi
|
||||
|
||||
echo "Cluster will have a minimum of ${E2E_MIN_CLUSTER_NODES} and a maximum of ${E2E_MAX_CLUSTER_NODES} nodes."
|
||||
local CLUSTER_CREATION_ARGS=(
|
||||
"gke"
|
||||
"--create-command=${E2E_GKE_COMMAND_GROUP} container clusters create --quiet --enable-autoscaling
|
||||
--min-nodes=${E2E_MIN_CLUSTER_NODES} --max-nodes=${E2E_MAX_CLUSTER_NODES}
|
||||
--cluster-version=${E2E_CLUSTER_VERSION}
|
||||
--scopes=cloud-platform --enable-basic-auth --no-issue-client-certificate
|
||||
--no-enable-ip-alias --no-enable-autoupgrade
|
||||
${GKE_ADDONS} ${EXTRA_CLUSTER_CREATION_FLAGS[@]}"
|
||||
"--environment=${E2E_GKE_ENVIRONMENT}"
|
||||
"--cluster-name=${E2E_CLUSTER_NAME}"
|
||||
"--num-nodes=${E2E_MIN_CLUSTER_NODES}"
|
||||
"--machine-type=${E2E_CLUSTER_MACHINE}"
|
||||
"--network=${E2E_NETWORK_NAME}"
|
||||
--up
|
||||
)
|
||||
if (( ! IS_BOSKOS )); then
|
||||
CLUSTER_CREATION_ARGS+=("--gcp-project=${GCP_PROJECT}")
|
||||
fi
|
||||
# SSH keys are not used, but kubetest checks for their existence.
|
||||
# Touch them so if they don't exist, empty files are create to satisfy the check.
|
||||
mkdir -p "$HOME"/.ssh
|
||||
touch "$HOME"/.ssh/google_compute_engine.pub
|
||||
touch "$HOME"/.ssh/google_compute_engine
|
||||
|
||||
local gcloud_project="${GCP_PROJECT}"
|
||||
[[ -z "${gcloud_project}" ]] && gcloud_project="$(gcloud config get-value project)"
|
||||
echo "gcloud project is ${gcloud_project}"
|
||||
echo "gcloud user is $(gcloud config get-value core/account)"
|
||||
(( IS_BOSKOS )) && echo "Using boskos for the test cluster"
|
||||
[[ -n "${GCP_PROJECT}" ]] && echo "GCP project for test cluster is ${GCP_PROJECT}"
|
||||
echo "Test script is ${E2E_SCRIPT}"
|
||||
# Set arguments for this script again
|
||||
local test_cmd_args="--run-tests"
|
||||
(( SKIP_KNATIVE_SETUP )) && test_cmd_args+=" --skip-knative-setup"
|
||||
[[ -n "${GCP_PROJECT}" ]] && test_cmd_args+=" --project ${GCP_PROJECT}"
|
||||
[[ -n "${E2E_SCRIPT_CUSTOM_FLAGS[*]}" ]] && test_cmd_args+=" ${E2E_SCRIPT_CUSTOM_FLAGS[*]}"
|
||||
local extra_flags=()
|
||||
if (( IS_BOSKOS )); then
|
||||
# Add arbitrary duration, wait for Boskos projects acquisition before error out
|
||||
extra_flags+=("--boskos-acquire-timeout-seconds=1200")
|
||||
elif (( ! SKIP_TEARDOWNS )); then
|
||||
# Only let kubetest2 tear down the cluster if not using Boskos and teardowns are not expected to be skipped,
|
||||
# it's done by Janitor if using Boskos
|
||||
extra_flags+=("--down")
|
||||
fi
|
||||
|
||||
# Create cluster and run the tests
|
||||
create_test_cluster_with_retries "${E2E_SCRIPT} ${test_cmd_args}" \
|
||||
"${CLUSTER_CREATION_ARGS[@]}" "${extra_flags[@]}" "${EXTRA_KUBETEST2_FLAGS[@]}"
|
||||
local result="$?"
|
||||
# Ignore any errors below, this is a best-effort cleanup and shouldn't affect the test result.
|
||||
set +o errexit
|
||||
function_exists cluster_teardown && cluster_teardown
|
||||
echo "Artifacts were written to ${ARTIFACTS}"
|
||||
echo "Test result code is ${result}"
|
||||
exit "${result}"
|
||||
}
|
||||
|
||||
# Retry backup regions/zones if cluster creations failed due to stockout.
|
||||
# Parameters: $1 - test command to run by the kubetest2 tester
|
||||
# $2..$n - any other kubetest2 flags other than geo and cluster version flag.
|
||||
function create_test_cluster_with_retries() {
|
||||
local tester_command
|
||||
IFS=' ' read -r -a tester_command <<< "$1"
|
||||
local kubetest2_flags=( "${@:2}" )
|
||||
local cluster_creation_log=/tmp/${E2E_BASE_NAME}-cluster_creation-log
|
||||
# zone_not_provided is a placeholder for e2e_cluster_zone to make for loop below work
|
||||
local zone_not_provided="zone_not_provided"
|
||||
|
||||
local e2e_cluster_regions=(${E2E_CLUSTER_REGION})
|
||||
local e2e_cluster_zones=(${E2E_CLUSTER_ZONE})
|
||||
|
||||
if [[ -n "${E2E_CLUSTER_BACKUP_ZONES}" ]]; then
|
||||
e2e_cluster_zones+=(${E2E_CLUSTER_BACKUP_ZONES})
|
||||
elif [[ -n "${E2E_CLUSTER_BACKUP_REGIONS}" ]]; then
|
||||
e2e_cluster_regions+=(${E2E_CLUSTER_BACKUP_REGIONS})
|
||||
e2e_cluster_zones=(${zone_not_provided})
|
||||
else
|
||||
echo "No backup region/zone set, cluster creation will fail in case of stockout"
|
||||
fi
|
||||
|
||||
for e2e_cluster_region in "${e2e_cluster_regions[@]}"; do
|
||||
for e2e_cluster_zone in "${e2e_cluster_zones[@]}"; do
|
||||
E2E_CLUSTER_REGION=${e2e_cluster_region}
|
||||
E2E_CLUSTER_ZONE=${e2e_cluster_zone}
|
||||
[[ "${E2E_CLUSTER_ZONE}" == "${zone_not_provided}" ]] && E2E_CLUSTER_ZONE=""
|
||||
local cluster_creation_zone="${E2E_CLUSTER_REGION}"
|
||||
[[ -n "${E2E_CLUSTER_ZONE}" ]] && cluster_creation_zone="${E2E_CLUSTER_REGION}-${E2E_CLUSTER_ZONE}"
|
||||
|
||||
header "Creating test cluster ${E2E_CLUSTER_VERSION} in ${cluster_creation_zone}"
|
||||
if run_go_tool k8s-sigs.io/kubetest2 \
|
||||
kubetest2 "${kubetest2_flags[@]}" --region="${cluster_creation_zone}" \
|
||||
--test=exec -- "${tester_command[@]}" 2>&1 \
|
||||
| tee "${cluster_creation_log}"; then
|
||||
return 0
|
||||
fi
|
||||
# Retry if cluster creation failed because of:
|
||||
# - stockout (https://github.com/knative/test-infra/issues/592)
|
||||
# - latest GKE not available in this region/zone yet (https://github.com/knative/test-infra/issues/694)
|
||||
[[ -z "$(grep -Fo 'does not have enough resources available to fulfill' "${cluster_creation_log}")" \
|
||||
&& -z "$(grep -Fo 'ResponseError: code=400, message=No valid versions with the prefix' "${cluster_creation_log}")" \
|
||||
&& -z "$(grep -Po 'ResponseError: code=400, message=Master version "[0-9a-z\-\.]+" is unsupported' "${cluster_creation_log}")" \
|
||||
&& -z "$(grep -Po 'only \d+ nodes out of \d+ have registered; this is likely due to Nodes failing to start correctly' "${cluster_creation_log}")" ]] \
|
||||
&& return 1
|
||||
done
|
||||
done
|
||||
echo "No more region/zones to try, quitting"
|
||||
return 1
|
||||
}
|
||||
|
||||
# Setup the test cluster for running the tests.
|
||||
function setup_test_cluster() {
|
||||
# Fail fast during setup.
|
||||
|
@ -296,14 +58,11 @@ function setup_test_cluster() {
|
|||
|
||||
# Set the actual project the test cluster resides in
|
||||
# It will be a project assigned by Boskos if test is running on Prow,
|
||||
# otherwise will be ${GCP_PROJECT} set up by user.
|
||||
# otherwise will be ${E2E_GCP_PROJECT_ID} set up by user.
|
||||
E2E_PROJECT_ID="$(gcloud config get-value project)"
|
||||
export E2E_PROJECT_ID
|
||||
readonly E2E_PROJECT_ID
|
||||
|
||||
# Save some metadata about cluster creation for using in prow and testgrid
|
||||
save_metadata
|
||||
|
||||
local k8s_user
|
||||
k8s_user=$(gcloud config get-value core/account)
|
||||
local k8s_cluster
|
||||
|
@ -315,9 +74,9 @@ function setup_test_cluster() {
|
|||
# If cluster admin role isn't set, this is a brand new cluster
|
||||
# Setup the admin role and also KO_DOCKER_REPO if it is a GKE cluster
|
||||
if [[ -z "$(kubectl get clusterrolebinding cluster-admin-binding 2> /dev/null)" && "${k8s_cluster}" =~ ^gke_.* ]]; then
|
||||
acquire_cluster_admin_role "${k8s_user}" "${E2E_CLUSTER_NAME}" "${E2E_CLUSTER_REGION}" "${E2E_CLUSTER_ZONE}"
|
||||
acquire_cluster_admin_role "${k8s_user}" "${E2E_CLUSTER_NAME}" "${E2E_GKE_CLUSTER_REGION}" "${E2E_GKE_CLUSTER_ZONE}"
|
||||
# Incorporate an element of randomness to ensure that each run properly publishes images.
|
||||
export KO_DOCKER_REPO=gcr.io/${E2E_PROJECT_ID}/${E2E_BASE_NAME}-e2e-img/${RANDOM}
|
||||
export KO_DOCKER_REPO=gcr.io/${E2E_PROJECT_ID}/${REPO_NAME}-e2e-img/${RANDOM}
|
||||
fi
|
||||
|
||||
# Safety checks
|
||||
|
@ -327,8 +86,6 @@ function setup_test_cluster() {
|
|||
# Use default namespace for all subsequent kubectl commands in this context
|
||||
kubectl config set-context "${k8s_cluster}" --namespace=default
|
||||
|
||||
echo "- gcloud project is ${E2E_PROJECT_ID}"
|
||||
echo "- gcloud user is ${k8s_user}"
|
||||
echo "- Cluster is ${k8s_cluster}"
|
||||
echo "- Docker is ${KO_DOCKER_REPO}"
|
||||
|
||||
|
@ -341,9 +98,10 @@ function setup_test_cluster() {
|
|||
set +o errexit
|
||||
set +o pipefail
|
||||
|
||||
if (( ! SKIP_KNATIVE_SETUP )) && function_exists knative_setup; then
|
||||
# Wait for Istio installation to complete, if necessary, before calling knative_setup.
|
||||
# TODO(chizhg): is it really needed?
|
||||
(( ! SKIP_ISTIO_ADDON )) && (wait_until_batch_job_complete istio-system || return 1)
|
||||
if function_exists knative_setup; then
|
||||
knative_setup || fail_test "Knative setup failed"
|
||||
fi
|
||||
if function_exists test_setup; then
|
||||
|
@ -369,34 +127,30 @@ function fail_test() {
|
|||
exit 1
|
||||
}
|
||||
|
||||
RUN_TESTS=0
|
||||
SKIP_KNATIVE_SETUP=0
|
||||
SKIP_ISTIO_ADDON=0
|
||||
SKIP_TEARDOWNS=0
|
||||
GCP_PROJECT=""
|
||||
E2E_SCRIPT=""
|
||||
E2E_CLUSTER_VERSION="latest"
|
||||
GKE_ADDONS=""
|
||||
EXTRA_CLUSTER_CREATION_FLAGS=()
|
||||
EXTRA_KUBETEST2_FLAGS=()
|
||||
E2E_SCRIPT_CUSTOM_FLAGS=()
|
||||
SKIP_ISTIO_ADDON=0
|
||||
|
||||
# Parse flags and initialize the test cluster.
|
||||
function initialize() {
|
||||
E2E_SCRIPT="$(get_canonical_path "$0")"
|
||||
local run_tests=0
|
||||
local extra_kubetest2_flags=()
|
||||
local extra_cluster_creation_flags=()
|
||||
local e2e_script
|
||||
e2e_script="$(get_canonical_path "$0")"
|
||||
local e2e_script_command=( "${e2e_script}" "--run-tests" )
|
||||
|
||||
cd "${REPO_ROOT_DIR}"
|
||||
while [[ $# -ne 0 ]]; do
|
||||
local parameter=$1
|
||||
# Try parsing flag as a custom one.
|
||||
if function_exists parse_flags; then
|
||||
parse_flags $@
|
||||
parse_flags "$@"
|
||||
local skip=$?
|
||||
if [[ ${skip} -ne 0 ]]; then
|
||||
# Skip parsed flag (and possibly argument) and continue
|
||||
# Also save it to it's passed through to the test script
|
||||
for ((i=1;i<=skip;i++)); do
|
||||
E2E_SCRIPT_CUSTOM_FLAGS+=("$1")
|
||||
e2e_script_command+=("$1")
|
||||
shift
|
||||
done
|
||||
continue
|
||||
|
@ -404,52 +158,35 @@ function initialize() {
|
|||
fi
|
||||
# Try parsing flag as a standard one.
|
||||
case ${parameter} in
|
||||
--run-tests) RUN_TESTS=1 ;;
|
||||
--skip-knative-setup) SKIP_KNATIVE_SETUP=1 ;;
|
||||
--run-tests) run_tests=1 ;;
|
||||
--skip-teardowns) SKIP_TEARDOWNS=1 ;;
|
||||
# TODO(chizhg): remove this flag once the addons is defined as an env var.
|
||||
--skip-istio-addon) SKIP_ISTIO_ADDON=1 ;;
|
||||
*)
|
||||
[[ $# -ge 2 ]] || abort "missing parameter after $1"
|
||||
shift
|
||||
case ${parameter} in
|
||||
--gcp-project) GCP_PROJECT=$1 ;;
|
||||
--cluster-version) E2E_CLUSTER_VERSION=$1 ;;
|
||||
--cluster-creation-flag) EXTRA_CLUSTER_CREATION_FLAGS+=("$1") ;;
|
||||
--kubetest2-flag) EXTRA_KUBETEST2_FLAGS+=("$1") ;;
|
||||
--kubetest2-flag) extra_kubetest2_flags+=("$1") ;;
|
||||
--cluster-creation-flag) extra_cluster_creation_flags+=("$1") ;;
|
||||
*) abort "unknown option ${parameter}" ;;
|
||||
esac
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
# Use PROJECT_ID if set, unless --gcp-project was used.
|
||||
if [[ -n "${PROJECT_ID:-}" && -z "${GCP_PROJECT}" ]]; then
|
||||
echo "\$PROJECT_ID is set to '${PROJECT_ID}', using it to run the tests"
|
||||
GCP_PROJECT="${PROJECT_ID}"
|
||||
fi
|
||||
if (( ! IS_PROW )) && (( ! RUN_TESTS )) && [[ -z "${GCP_PROJECT}" ]]; then
|
||||
abort "set \$PROJECT_ID or use --gcp-project to select the GCP project where the tests are run"
|
||||
fi
|
||||
|
||||
(( IS_PROW )) && [[ -z "${GCP_PROJECT}" ]] && IS_BOSKOS=1
|
||||
(( IS_PROW )) && [[ -z "${GCP_PROJECT_ID:-}" ]] && IS_BOSKOS=1
|
||||
|
||||
if (( SKIP_ISTIO_ADDON )); then
|
||||
GKE_ADDONS="--addons=NodeLocalDNS"
|
||||
extra_cluster_creation_flags+=("--addons=NodeLocalDNS")
|
||||
else
|
||||
GKE_ADDONS="--addons=Istio,NodeLocalDNS"
|
||||
extra_cluster_creation_flags+=("--addons=Istio,NodeLocalDNS")
|
||||
fi
|
||||
|
||||
readonly RUN_TESTS
|
||||
readonly GCP_PROJECT
|
||||
readonly IS_BOSKOS
|
||||
readonly EXTRA_CLUSTER_CREATION_FLAGS
|
||||
readonly EXTRA_KUBETEST2_FLAGS
|
||||
readonly SKIP_KNATIVE_SETUP
|
||||
readonly SKIP_TEARDOWNS
|
||||
readonly GKE_ADDONS
|
||||
|
||||
if (( ! RUN_TESTS )); then
|
||||
create_test_cluster
|
||||
if (( ! run_tests )); then
|
||||
create_gke_test_cluster extra_kubetest2_flags extra_cluster_creation_flags e2e_script_command
|
||||
else
|
||||
setup_test_cluster
|
||||
fi
|
||||
|
|
|
@ -0,0 +1,242 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright 2020 The Knative Authors
|
||||
#
|
||||
# Licensed 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.
|
||||
|
||||
# This is a collection of functions for infra related setups, mainly
|
||||
# cluster provisioning. It doesn't do anything when called from command line.
|
||||
|
||||
source $(dirname "${BASH_SOURCE[0]}")/library.sh
|
||||
|
||||
# Test cluster parameters
|
||||
|
||||
# Configurable parameters
|
||||
export E2E_GCP_PROJECT_ID=${E2E_GCP_PROJECT_ID:-}
|
||||
# export E2E_GKE_CLUSTER_REGION and E2E_GKE_CLUSTER_ZONE as they're used in the cluster setup subprocess
|
||||
export E2E_GKE_CLUSTER_REGION=${E2E_GKE_CLUSTER_REGION:-us-central1}
|
||||
# By default we use regional clusters.
|
||||
export E2E_GKE_CLUSTER_ZONE=${E2E_GKE_CLUSTER_ZONE:-}
|
||||
|
||||
# Default backup regions in case of stockouts; by default we don't fall back to a different zone in the same region
|
||||
readonly E2E_GKE_CLUSTER_BACKUP_REGIONS=${E2E_GKE_CLUSTER_BACKUP_REGIONS:-us-west1 us-east1}
|
||||
readonly E2E_GKE_CLUSTER_BACKUP_ZONES=${E2E_GKE_CLUSTER_BACKUP_ZONES:-}
|
||||
|
||||
readonly E2E_GKE_ENVIRONMENT=${E2E_GKE_ENVIRONMENT:-prod}
|
||||
readonly E2E_GKE_COMMAND_GROUP=${E2E_GKE_COMMAND_GROUP:-beta}
|
||||
readonly E2E_GKE_CLUSTER_MACHINE=${E2E_GKE_CLUSTER_MACHINE:-e2-standard-4}
|
||||
readonly E2E_GKE_SCOPES=${E2E_GKE_SCOPES:-cloud-platform}
|
||||
|
||||
# Each knative repository may have a different cluster size requirement here,
|
||||
# so we allow calling code to set these parameters. If they are not set we
|
||||
# use some sane defaults.
|
||||
readonly E2E_MIN_CLUSTER_NODES=${E2E_MIN_CLUSTER_NODES:-1}
|
||||
readonly E2E_MAX_CLUSTER_NODES=${E2E_MAX_CLUSTER_NODES:-3}
|
||||
readonly E2E_CLUSTER_VERSION=${E2E_CLUSTER_VERSION:-latest}
|
||||
|
||||
readonly E2E_CLUSTER_NAME=$(build_resource_name e2e-cls)
|
||||
readonly E2E_GKE_NETWORK_NAME=$(build_resource_name e2e-net)
|
||||
|
||||
# Dumps the k8s api server metrics. Spins up a proxy, waits a little bit and
|
||||
# dumps the metrics to ${ARTIFACTS}/k8s.metrics.txt
|
||||
function dump_metrics() {
|
||||
header ">> Starting kube proxy"
|
||||
kubectl proxy --port=8080 &
|
||||
local proxy_pid=$!
|
||||
sleep 5
|
||||
header ">> Grabbing k8s metrics"
|
||||
curl -s http://localhost:8080/metrics > "${ARTIFACTS}"/k8s.metrics.txt
|
||||
# Clean up proxy so it doesn't interfere with job shutting down
|
||||
kill $proxy_pid || true
|
||||
}
|
||||
|
||||
# Dump info about the test cluster. If dump_extra_cluster_info() is defined, calls it too.
|
||||
# This is intended to be called when a test fails to provide debugging information.
|
||||
function dump_cluster_state() {
|
||||
echo "***************************************"
|
||||
echo "*** E2E TEST FAILED ***"
|
||||
echo "*** Start of information dump ***"
|
||||
echo "***************************************"
|
||||
|
||||
local output
|
||||
output="${ARTIFACTS}/k8s.dump-$(basename "${E2E_SCRIPT}").txt"
|
||||
echo ">>> The dump is located at ${output}"
|
||||
|
||||
for crd in $(kubectl api-resources --verbs=list -o name | sort); do
|
||||
local count
|
||||
count="$(kubectl get "$crd" --all-namespaces --no-headers 2>/dev/null | wc -l)"
|
||||
echo ">>> ${crd} (${count} objects)"
|
||||
if [[ "${count}" -gt "0" ]]; then
|
||||
{
|
||||
echo ">>> ${crd} (${count} objects)"
|
||||
|
||||
echo ">>> Listing"
|
||||
kubectl get "${crd}" --all-namespaces
|
||||
|
||||
echo ">>> Details"
|
||||
if [[ "${crd}" == "secrets" ]]; then
|
||||
echo "Secrets are ignored for security reasons"
|
||||
elif [[ "${crd}" == "events" ]]; then
|
||||
echo "events are ignored as making a lot of noise"
|
||||
else
|
||||
kubectl get "${crd}" --all-namespaces -o yaml
|
||||
fi
|
||||
} >> "${output}"
|
||||
fi
|
||||
done
|
||||
|
||||
if function_exists dump_extra_cluster_state; then
|
||||
echo ">>> Extra dump" >> "${output}"
|
||||
dump_extra_cluster_state >> "${output}"
|
||||
fi
|
||||
echo "***************************************"
|
||||
echo "*** E2E TEST FAILED ***"
|
||||
echo "*** End of information dump ***"
|
||||
echo "***************************************"
|
||||
}
|
||||
|
||||
# On a Prow job, save some metadata about the test for Testgrid.
|
||||
function save_metadata() {
|
||||
(( ! IS_PROW )) && return
|
||||
local geo_key="Region"
|
||||
local geo_value="${E2E_GKE_CLUSTER_REGION}"
|
||||
if [[ -n "${E2E_GKE_CLUSTER_ZONE}" ]]; then
|
||||
geo_key="Zone"
|
||||
geo_value="${E2E_GKE_CLUSTER_REGION}-${E2E_GKE_CLUSTER_ZONE}"
|
||||
fi
|
||||
local cluster_version
|
||||
cluster_version="$(kubectl version --short=true)"
|
||||
run_kntest metadata set --key="E2E:${geo_key}" --value="${geo_value}"
|
||||
run_kntest metadata set --key="E2E:Machine" --value="${E2E_GKE_CLUSTER_MACHINE}"
|
||||
run_kntest metadata set --key="E2E:Version" --value="${cluster_version}"
|
||||
run_kntest metadata set --key="E2E:MinNodes" --value="${E2E_MIN_CLUSTER_NODES}"
|
||||
run_kntest metadata set --key="E2E:MaxNodes" --value="${E2E_MAX_CLUSTER_NODES}"
|
||||
}
|
||||
|
||||
# Create a GKE test cluster with kubetest2 and call the current script again.
|
||||
# Parameters: $1 - extra kubetest2 flags
|
||||
# $2 - extra cluster creation flags
|
||||
# $3 - test command to run by the kubetest2 tester
|
||||
function create_gke_test_cluster() {
|
||||
# Fail fast during setup.
|
||||
set -o errexit
|
||||
set -o pipefail
|
||||
local -n _extra_kubetest2_flags=$1
|
||||
local -n _extra_cluster_creation_flags=$2
|
||||
local -n _tester_command=$3
|
||||
|
||||
if function_exists cluster_setup; then
|
||||
cluster_setup || fail_test "cluster setup failed"
|
||||
fi
|
||||
|
||||
echo "Cluster will have a minimum of ${E2E_MIN_CLUSTER_NODES} and a maximum of ${E2E_MAX_CLUSTER_NODES} nodes."
|
||||
local _kubetest2_flags=(
|
||||
"gke"
|
||||
"--create-command=${E2E_GKE_COMMAND_GROUP} container clusters create --quiet --enable-autoscaling
|
||||
--min-nodes=${E2E_MIN_CLUSTER_NODES} --max-nodes=${E2E_MAX_CLUSTER_NODES}
|
||||
--cluster-version=${E2E_CLUSTER_VERSION}
|
||||
--scopes=${E2E_GKE_SCOPES} --enable-basic-auth --no-issue-client-certificate
|
||||
--no-enable-ip-alias --no-enable-autoupgrade
|
||||
${_extra_cluster_creation_flags[@]}"
|
||||
"--environment=${E2E_GKE_ENVIRONMENT}"
|
||||
"--cluster-name=${E2E_CLUSTER_NAME}"
|
||||
"--num-nodes=${E2E_MIN_CLUSTER_NODES}"
|
||||
"--machine-type=${E2E_GKE_CLUSTER_MACHINE}"
|
||||
"--network=${E2E_GKE_NETWORK_NAME}"
|
||||
"--ignore-gcp-ssh-key=true"
|
||||
--up
|
||||
)
|
||||
_kubetest2_flags+=( "${_extra_kubetest2_flags[@]}" )
|
||||
if (( ! IS_BOSKOS )); then
|
||||
local gcloud_project="${E2E_GCP_PROJECT_ID}"
|
||||
[[ -z "${gcloud_project}" ]] && gcloud_project="$(gcloud config get-value project)"
|
||||
_kubetest2_flags+=("--project=${gcloud_project}")
|
||||
echo "gcloud project is ${gcloud_project}"
|
||||
else
|
||||
echo "Using boskos for the test cluster"
|
||||
fi
|
||||
|
||||
if (( IS_BOSKOS )); then
|
||||
# Add arbitrary duration, wait for Boskos projects acquisition before error out
|
||||
_kubetest2_flags+=("--boskos-acquire-timeout-seconds=1200")
|
||||
elif (( ! SKIP_TEARDOWNS )); then
|
||||
# Only let kubetest2 tear down the cluster if not using Boskos and teardowns are not expected to be skipped,
|
||||
# it's done by Janitor if using Boskos
|
||||
_kubetest2_flags+=("--down")
|
||||
fi
|
||||
|
||||
# Create cluster and run the tests
|
||||
create_gke_test_cluster_with_retries _kubetest2_flags _tester_command
|
||||
local result="$?"
|
||||
# Ignore any errors below, this is a best-effort cleanup and shouldn't affect the test result.
|
||||
set +o errexit
|
||||
set +o pipefail
|
||||
function_exists cluster_teardown && cluster_teardown
|
||||
echo "Artifacts were written to ${ARTIFACTS}"
|
||||
echo "Test result code is ${result}"
|
||||
exit "${result}"
|
||||
}
|
||||
|
||||
# TODO(chizhg): move this to kubetest2 gke deployer.
|
||||
# Retry backup regions/zones if cluster creations failed due to stockout.
|
||||
# Parameters: $1 - kubetest2 flags other than geo flag
|
||||
# $2 - test command to run by the kubetest2 tester
|
||||
function create_gke_test_cluster_with_retries() {
|
||||
local -n kubetest2_flags=$1
|
||||
local -n tester_command=$2
|
||||
local cluster_creation_log=/tmp/${REPO_NAME}-cluster_creation-log
|
||||
# zone_not_provided is a placeholder for e2e_cluster_zone to make for loop below work
|
||||
local zone_not_provided="zone_not_provided"
|
||||
|
||||
local e2e_cluster_regions=("${E2E_GKE_CLUSTER_REGION}")
|
||||
local e2e_cluster_zones=("${E2E_GKE_CLUSTER_ZONE}")
|
||||
|
||||
if [[ -n "${E2E_GKE_CLUSTER_BACKUP_ZONES}" ]]; then
|
||||
e2e_cluster_zones+=("${E2E_GKE_CLUSTER_BACKUP_ZONES}")
|
||||
elif [[ -n "${E2E_GKE_CLUSTER_BACKUP_REGIONS}" ]]; then
|
||||
e2e_cluster_regions+=("${E2E_GKE_CLUSTER_BACKUP_REGIONS}")
|
||||
e2e_cluster_zones=("${zone_not_provided}")
|
||||
else
|
||||
echo "No backup region/zone set, cluster creation will fail in case of stockout"
|
||||
fi
|
||||
|
||||
for e2e_cluster_region in "${e2e_cluster_regions[@]}"; do
|
||||
for e2e_cluster_zone in "${e2e_cluster_zones[@]}"; do
|
||||
E2E_GKE_CLUSTER_REGION=${e2e_cluster_region}
|
||||
E2E_GKE_CLUSTER_ZONE=${e2e_cluster_zone}
|
||||
[[ "${E2E_GKE_CLUSTER_ZONE}" == "${zone_not_provided}" ]] && E2E_GKE_CLUSTER_ZONE=""
|
||||
local cluster_creation_zone="${E2E_GKE_CLUSTER_REGION}"
|
||||
[[ -n "${E2E_GKE_CLUSTER_ZONE}" ]] && cluster_creation_zone="${E2E_GKE_CLUSTER_REGION}-${E2E_GKE_CLUSTER_ZONE}"
|
||||
|
||||
header "Creating test cluster ${E2E_CLUSTER_VERSION} in ${cluster_creation_zone}"
|
||||
if run_go_tool k8s-sigs.io/kubetest2 \
|
||||
kubetest2 "${kubetest2_flags[@]}" --region="${cluster_creation_zone}" \
|
||||
--test=exec -- "${tester_command[@]}" 2>&1 \
|
||||
| tee "${cluster_creation_log}"; then
|
||||
# Save some metadata about cluster creation for using in prow and testgrid
|
||||
save_metadata
|
||||
return 0
|
||||
fi
|
||||
# Retry if cluster creation failed because of:
|
||||
# - stockout (https://github.com/knative/test-infra/issues/592)
|
||||
# - latest GKE not available in this region/zone yet (https://github.com/knative/test-infra/issues/694)
|
||||
[[ -z "$(grep -Fo 'does not have enough resources available to fulfill' "${cluster_creation_log}")" \
|
||||
&& -z "$(grep -Fo 'ResponseError: code=400, message=No valid versions with the prefix' "${cluster_creation_log}")" \
|
||||
&& -z "$(grep -Po 'ResponseError: code=400, message=Master version "[0-9a-z\-\.]+" is unsupported' "${cluster_creation_log}")" \
|
||||
&& -z "$(grep -Po 'only \d+ nodes out of \d+ have registered; this is likely due to Nodes failing to start correctly' "${cluster_creation_log}")" ]] \
|
||||
&& return 1
|
||||
done
|
||||
done
|
||||
echo "No more region/zones to try, quitting"
|
||||
return 1
|
||||
}
|
|
@ -65,6 +65,22 @@ function abort() {
|
|||
exit 1
|
||||
}
|
||||
|
||||
# Build a resource name based on $REPO_NAME, a suffix and $BUILD_NUMBER.
|
||||
# Restricts the name length to 40 chars (the limit for resource names in GCP).
|
||||
# Name will have the form $REPO_NAME-<PREFIX>$BUILD_NUMBER.
|
||||
# Parameters: $1 - name suffix
|
||||
function build_resource_name() {
|
||||
local prefix=${REPO_NAME}-$1
|
||||
local suffix=${BUILD_NUMBER}
|
||||
# Restrict suffix length to 20 chars
|
||||
if [[ -n "${suffix}" ]]; then
|
||||
suffix=${suffix:${#suffix}<20?0:-20}
|
||||
fi
|
||||
local name="${prefix:0:20}${suffix}"
|
||||
# Ensure name doesn't end with "-"
|
||||
echo "${name%-}"
|
||||
}
|
||||
|
||||
# Display a box banner.
|
||||
# Parameters: $1 - character to use for the box.
|
||||
# $2 - banner message.
|
||||
|
|
|
@ -322,15 +322,6 @@ function main() {
|
|||
echo ">> docker version"
|
||||
docker version
|
||||
fi
|
||||
# node/pod names are important for debugging purposes, but they are missing
|
||||
# after migrating from bootstrap to podutil.
|
||||
# Report it here with the same logic as in bootstrap until it is fixed.
|
||||
# (https://github.com/kubernetes/test-infra/blob/09bd4c6709dc64308406443f8996f90cf3b40ed1/jenkins/bootstrap.py#L588)
|
||||
# TODO(chaodaiG): follow up on https://github.com/kubernetes/test-infra/blob/0fabd2ea816daa8c15d410c77a0c93c0550b283f/prow/initupload/run.go#L49
|
||||
echo ">> node name"
|
||||
curl -H "Metadata-Flavor: Google" 'http://169.254.169.254/computeMetadata/v1/instance/name' 2> /dev/null
|
||||
echo ">> pod name"
|
||||
echo "${HOSTNAME}"
|
||||
fi
|
||||
|
||||
[[ -z $1 ]] && set -- "--all-tests"
|
||||
|
|
|
@ -752,7 +752,7 @@ k8s.io/kube-openapi/pkg/util/sets
|
|||
k8s.io/utils/buffer
|
||||
k8s.io/utils/integer
|
||||
k8s.io/utils/trace
|
||||
# knative.dev/pkg v0.0.0-20200816190606-6d1b0e90624b
|
||||
# knative.dev/pkg v0.0.0-20200818021113-c451e3c37f5f
|
||||
## explicit
|
||||
knative.dev/pkg/apis
|
||||
knative.dev/pkg/apis/duck/ducktypes
|
||||
|
@ -776,7 +776,7 @@ knative.dev/pkg/metrics/metricskey
|
|||
knative.dev/pkg/network
|
||||
knative.dev/pkg/reconciler
|
||||
knative.dev/pkg/system
|
||||
# knative.dev/test-infra v0.0.0-20200813220306-af5517f4f576
|
||||
# knative.dev/test-infra v0.0.0-20200817225313-c0ea00ce480c
|
||||
## explicit
|
||||
knative.dev/test-infra/scripts
|
||||
knative.dev/test-infra/tools/dep-collector
|
||||
|
|
Loading…
Reference in New Issue