[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:
Matt Moore 2020-08-18 09:11:14 -07:00 committed by GitHub
parent bed54e5ecf
commit 1d7658a53a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 342 additions and 360 deletions

4
go.mod
View File

@ -16,8 +16,8 @@ require (
k8s.io/client-go v11.0.1-0.20190805182717-6502b5e7b1b5+incompatible k8s.io/client-go v11.0.1-0.20190805182717-6502b5e7b1b5+incompatible
k8s.io/code-generator v0.18.6 k8s.io/code-generator v0.18.6
k8s.io/kube-openapi v0.0.0-20200410145947-bcb3869e6f29 k8s.io/kube-openapi v0.0.0-20200410145947-bcb3869e6f29
knative.dev/pkg v0.0.0-20200816190606-6d1b0e90624b knative.dev/pkg v0.0.0-20200818021113-c451e3c37f5f
knative.dev/test-infra v0.0.0-20200813220306-af5517f4f576 knative.dev/test-infra v0.0.0-20200817225313-c0ea00ce480c
) )
replace ( replace (

6
go.sum
View File

@ -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-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-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-20200711004937-22502028e31a/go.mod h1:AqAJV6rYi8IGikDjJ/9ZQd9qKdkXVlesVnVjwx62YB8=
knative.dev/pkg v0.0.0-20200816190606-6d1b0e90624b h1:aESEp8dEjoByMeYkdx82ho8BSMR2j2mtXEyxO3L+vbg= knative.dev/pkg v0.0.0-20200818021113-c451e3c37f5f h1:20+d8Jhl4n8PEgXJjBjviv3XL+ddjtk9Arxp0CRBDAc=
knative.dev/pkg v0.0.0-20200816190606-6d1b0e90624b/go.mod h1:jDDuXO7eEDWooxPadJRyt6dhO0Vi4B2B1l+Ju9VtnZ4= 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-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-20200505052144-5ea2f705bb55/go.mod h1:WqF1Azka+FxPZ20keR2zCNtiQA1MP9ZB4BH4HuI+SIU=
knative.dev/test-infra v0.0.0-20200513011557-d03429a76034/go.mod h1:aMif0KXL4g19YCYwsy4Ocjjz5xgPlseYV+B95Oo4JGE= 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-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 h1:gsZMM8J2MA3iTSMOt5MTMt84y6H5PkIFMmUakqqogJ0=
knative.dev/test-infra v0.0.0-20200813220306-af5517f4f576/go.mod h1:Pmg2c7Z7q7BGFUV/GOpU5BlrD3ePJft4MPqx8AYBplc= 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/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/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk=
modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k=

View File

@ -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 // CompareSetFields returns a list of field names that differ between
// x and y. Uses SafeEqual for comparison. // x and y. Uses SafeEqual for comparison.
func CompareSetFields(x, y interface{}, opts ...cmp.Option) ([]string, error) { func CompareSetFields(x, y interface{}, opts ...cmp.Option) ([]string, error) {
r := new(FieldListReporter) r := new(fieldListReporter)
opts = append(opts, cmp.Reporter(r)) opts = append(opts, cmp.Reporter(r))
_, err := SafeEqual(x, y, opts...) _, err := SafeEqual(x, y, opts...)
return r.Fields(), err 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. // ShortDiff returns a zero-context, unified human-readable diff.
// Uses SafeEqual for comparison. // Uses SafeEqual for comparison.
func ShortDiff(prev, cur interface{}, opts ...cmp.Option) (string, error) { func ShortDiff(prev, cur interface{}, opts ...cmp.Option) (string, error) {
r := new(ShortDiffReporter) r := new(shortDiffReporter)
opts = append(opts, cmp.Reporter(r)) opts = append(opts, cmp.Reporter(r))
var err error var err error
if _, err = SafeEqual(prev, cur, opts...); err != nil { if _, err = SafeEqual(prev, cur, opts...); err != nil {

View File

@ -25,42 +25,41 @@ import (
"github.com/google/go-cmp/cmp" "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 // track of the field names that differ between two structs and reports
// them through the Fields() function. // them through the Fields() function.
type FieldListReporter struct { type fieldListReporter struct {
path cmp.Path path cmp.Path
fieldNames []string fieldNames []string
} }
// PushStep implements the cmp.Reporter. // 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) r.path = append(r.path, ps)
} }
// fieldName returns a readable name for the field. If the field has JSON annotations it // 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 // 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 // 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 { if len(r.path) < 2 {
return r.path.Index(0).String() 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)
if exists {
tag := structField.Tag.Get("json")
if tag != "" && tag != "-" {
return strings.SplitN(tag, ",", 2)[0]
}
}
return fieldName
} }
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)
if exists {
tag := structField.Tag.Get("json")
if tag != "" && tag != "-" {
return strings.SplitN(tag, ",", 2)[0]
}
}
return fieldName
} }
// Report implements the cmp.Reporter. // Report implements the cmp.Reporter.
func (r *FieldListReporter) Report(rs cmp.Result) { func (r *fieldListReporter) Report(rs cmp.Result) {
if rs.Equal() { if rs.Equal() {
return return
} }
@ -75,72 +74,70 @@ func (r *FieldListReporter) Report(rs cmp.Result) {
} }
// PopStep implements cmp.Reporter. // PopStep implements cmp.Reporter.
func (r *FieldListReporter) PopStep() { func (r *fieldListReporter) PopStep() {
r.path = r.path[:len(r.path)-1] r.path = r.path[:len(r.path)-1]
} }
// Fields returns the field names that differed between the two // Fields returns the field names that differed between the two
// objects after calling cmp.Equal with the FieldListReporter. Field names // objects after calling cmp.Equal with the FieldListReporter. Field names
// are returned in alphabetical order. // are returned in alphabetical order.
func (r *FieldListReporter) Fields() []string { func (r *fieldListReporter) Fields() []string {
sort.Strings(r.fieldNames) sort.Strings(r.fieldNames)
return 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 // on fields which have diffing values in a short zero-context, unified diff
// format. // format.
type ShortDiffReporter struct { type shortDiffReporter struct {
path cmp.Path path cmp.Path
diffs []string diffs []string
err error err error
} }
// PushStep implements the cmp.Reporter. // 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) r.path = append(r.path, ps)
} }
// Report implements the cmp.Reporter. // Report implements the cmp.Reporter.
func (r *ShortDiffReporter) Report(rs cmp.Result) { func (r *shortDiffReporter) Report(rs cmp.Result) {
if rs.Equal() { if rs.Equal() {
return return
} }
cur := r.path.Last() cur := r.path.Last()
vx, vy := cur.Values() vx, vy := cur.Values()
t := cur.Type() t := cur.Type()
var diff string
// Prefix struct values with the types to add clarity in output // Prefix struct values with the types to add clarity in output
if !vx.IsValid() && !vy.IsValid() { if !vx.IsValid() && !vy.IsValid() {
r.err = fmt.Errorf("unable to diff %+v and %+v on path %#v", vx, vy, r.path) r.err = fmt.Errorf("unable to diff %+v and %+v on path %#v", vx, vy, r.path)
} else { return
diff = fmt.Sprintf("%#v:\n", r.path) }
if vx.IsValid() { diff := fmt.Sprintf("%#v:\n", r.path)
diff += r.diffString("-", t, vx) if vx.IsValid() {
} diff += r.diffString("-", t, vx)
if vy.IsValid() { }
diff += r.diffString("+", t, vy) if vy.IsValid() {
} diff += r.diffString("+", t, vy)
} }
r.diffs = append(r.diffs, diff) 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 { if t.Kind() == reflect.Struct {
return fmt.Sprintf("\t%s: %+v: \"%+v\"\n", diffType, t, v) 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. // PopStep implements the cmp.Reporter.
func (r *ShortDiffReporter) PopStep() { func (r *shortDiffReporter) PopStep() {
r.path = r.path[:len(r.path)-1] r.path = r.path[:len(r.path)-1]
} }
// Diff returns the generated short diff for this object. // Diff returns the generated short diff for this object.
// cmp.Equal should be called before this method. // cmp.Equal should be called before this method.
func (r *ShortDiffReporter) Diff() (string, error) { func (r *shortDiffReporter) Diff() (string, error) {
if r.err != nil { if r.err != nil {
return "", r.err return "", r.err
} }

View File

@ -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 1. [optional] Customize the test cluster. Set the following environment
variables if the default values don't fit your needs: variables if the default values don't fit your needs:
- `E2E_CLUSTER_REGION`: Cluster region, defaults to `us-central1`. - `E2E_GCP_PROJECT_ID`: GCP project ID for creating the clusters, defaults to none.
- `E2E_CLUSTER_BACKUP_REGIONS`: Space-separated list of regions to retry test - `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`. 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). 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, cluster creation in case of stockout. If defined,
`E2E_CLUSTER_BACKUP_REGIONS` will be ignored thus it defaults to none. `E2E_GKE_CLUSTER_BACKUP_REGIONS` will be ignored thus it defaults to none.
- `E2E_CLUSTER_MACHINE`: Cluster node machine type, defaults to - `E2E_GKE_CLUSTER_MACHINE`: Cluster node machine type, defaults to
`e2-standard-4}`. `e2-standard-4}`.
- `E2E_MIN_CLUSTER_NODES`: Minimum number of nodes in the cluster when - `E2E_MIN_CLUSTER_NODES`: Minimum number of nodes in the cluster when
autoscaling, defaults to 1. autoscaling, defaults to 1.
- `E2E_MAX_CLUSTER_NODES`: Maximum number of nodes in the cluster when - `E2E_MAX_CLUSTER_NODES`: Maximum number of nodes in the cluster when
autoscaling, defaults to 3. 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. Source the script.
1. [optional] Write the `knative_setup()` function, which will set up your 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 system under test (e.g., Knative Serving).
you use the `--skip-knative-setup` flag.
1. [optional] Write the `knative_teardown()` function, which will tear down your 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 system under test (e.g., Knative Serving).
you use the `--skip-knative-setup` flag.
1. [optional] Write the `test_setup()` function, which will set up the test 1. [optional] Write the `test_setup()` function, which will set up the test
resources. resources.
@ -171,7 +172,7 @@ This is a helper script for Knative E2E test scripts. To use it:
**Notes:** **Notes:**
1. Calling your script without arguments will create a new cluster in the GCP 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 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 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 1. By default Istio is installed on the cluster via Addon, use
`--skip-istio-addon` if you choose not to have it preinstalled. `--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 ### Sample end-to-end test script
This script will test that the latest Knative Serving nightly release works. It This script will test that the latest Knative Serving nightly release works. It

View File

@ -17,50 +17,9 @@
# This is a helper script for Knative E2E test scripts. # This is a helper script for Knative E2E test scripts.
# See README.md for instructions on how to use it. # 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. readonly TEST_RESULT_FILE=/tmp/${REPO_NAME}-e2e-result
# 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
# Flag whether test is using a boskos GCP project # Flag whether test is using a boskos GCP project
IS_BOSKOS=0 IS_BOSKOS=0
@ -71,7 +30,7 @@ function teardown_test_resources() {
(( IS_BOSKOS )) && return (( IS_BOSKOS )) && return
header "Tearing down test environment" header "Tearing down test environment"
function_exists test_teardown && test_teardown 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. # 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[@]}" 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. # Setup the test cluster for running the tests.
function setup_test_cluster() { function setup_test_cluster() {
# Fail fast during setup. # Fail fast during setup.
@ -296,14 +58,11 @@ function setup_test_cluster() {
# Set the actual project the test cluster resides in # Set the actual project the test cluster resides in
# It will be a project assigned by Boskos if test is running on Prow, # 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)" E2E_PROJECT_ID="$(gcloud config get-value project)"
export E2E_PROJECT_ID export E2E_PROJECT_ID
readonly E2E_PROJECT_ID readonly E2E_PROJECT_ID
# Save some metadata about cluster creation for using in prow and testgrid
save_metadata
local k8s_user local k8s_user
k8s_user=$(gcloud config get-value core/account) k8s_user=$(gcloud config get-value core/account)
local k8s_cluster local k8s_cluster
@ -315,9 +74,9 @@ function setup_test_cluster() {
# If cluster admin role isn't set, this is a brand new 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 # 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 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. # 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 fi
# Safety checks # Safety checks
@ -327,8 +86,6 @@ function setup_test_cluster() {
# Use default namespace for all subsequent kubectl commands in this context # Use default namespace for all subsequent kubectl commands in this context
kubectl config set-context "${k8s_cluster}" --namespace=default 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 "- Cluster is ${k8s_cluster}"
echo "- Docker is ${KO_DOCKER_REPO}" echo "- Docker is ${KO_DOCKER_REPO}"
@ -341,9 +98,10 @@ function setup_test_cluster() {
set +o errexit set +o errexit
set +o pipefail set +o pipefail
if (( ! SKIP_KNATIVE_SETUP )) && function_exists knative_setup; then # Wait for Istio installation to complete, if necessary, before calling knative_setup.
# 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) (( ! 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" knative_setup || fail_test "Knative setup failed"
fi fi
if function_exists test_setup; then if function_exists test_setup; then
@ -369,34 +127,30 @@ function fail_test() {
exit 1 exit 1
} }
RUN_TESTS=0
SKIP_KNATIVE_SETUP=0
SKIP_ISTIO_ADDON=0
SKIP_TEARDOWNS=0 SKIP_TEARDOWNS=0
GCP_PROJECT="" SKIP_ISTIO_ADDON=0
E2E_SCRIPT=""
E2E_CLUSTER_VERSION="latest"
GKE_ADDONS=""
EXTRA_CLUSTER_CREATION_FLAGS=()
EXTRA_KUBETEST2_FLAGS=()
E2E_SCRIPT_CUSTOM_FLAGS=()
# Parse flags and initialize the test cluster. # Parse flags and initialize the test cluster.
function initialize() { 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}" cd "${REPO_ROOT_DIR}"
while [[ $# -ne 0 ]]; do while [[ $# -ne 0 ]]; do
local parameter=$1 local parameter=$1
# Try parsing flag as a custom one. # Try parsing flag as a custom one.
if function_exists parse_flags; then if function_exists parse_flags; then
parse_flags $@ parse_flags "$@"
local skip=$? local skip=$?
if [[ ${skip} -ne 0 ]]; then if [[ ${skip} -ne 0 ]]; then
# Skip parsed flag (and possibly argument) and continue # Skip parsed flag (and possibly argument) and continue
# Also save it to it's passed through to the test script # Also save it to it's passed through to the test script
for ((i=1;i<=skip;i++)); do for ((i=1;i<=skip;i++)); do
E2E_SCRIPT_CUSTOM_FLAGS+=("$1") e2e_script_command+=("$1")
shift shift
done done
continue continue
@ -404,52 +158,35 @@ function initialize() {
fi fi
# Try parsing flag as a standard one. # Try parsing flag as a standard one.
case ${parameter} in case ${parameter} in
--run-tests) RUN_TESTS=1 ;; --run-tests) run_tests=1 ;;
--skip-knative-setup) SKIP_KNATIVE_SETUP=1 ;;
--skip-teardowns) SKIP_TEARDOWNS=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 ;; --skip-istio-addon) SKIP_ISTIO_ADDON=1 ;;
*) *)
[[ $# -ge 2 ]] || abort "missing parameter after $1" [[ $# -ge 2 ]] || abort "missing parameter after $1"
shift shift
case ${parameter} in case ${parameter} in
--gcp-project) GCP_PROJECT=$1 ;; --kubetest2-flag) extra_kubetest2_flags+=("$1") ;;
--cluster-version) E2E_CLUSTER_VERSION=$1 ;; --cluster-creation-flag) extra_cluster_creation_flags+=("$1") ;;
--cluster-creation-flag) EXTRA_CLUSTER_CREATION_FLAGS+=("$1") ;;
--kubetest2-flag) EXTRA_KUBETEST2_FLAGS+=("$1") ;;
*) abort "unknown option ${parameter}" ;; *) abort "unknown option ${parameter}" ;;
esac esac
esac esac
shift shift
done done
# Use PROJECT_ID if set, unless --gcp-project was used. (( IS_PROW )) && [[ -z "${GCP_PROJECT_ID:-}" ]] && IS_BOSKOS=1
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
if (( SKIP_ISTIO_ADDON )); then if (( SKIP_ISTIO_ADDON )); then
GKE_ADDONS="--addons=NodeLocalDNS" extra_cluster_creation_flags+=("--addons=NodeLocalDNS")
else else
GKE_ADDONS="--addons=Istio,NodeLocalDNS" extra_cluster_creation_flags+=("--addons=Istio,NodeLocalDNS")
fi fi
readonly RUN_TESTS
readonly GCP_PROJECT
readonly IS_BOSKOS readonly IS_BOSKOS
readonly EXTRA_CLUSTER_CREATION_FLAGS
readonly EXTRA_KUBETEST2_FLAGS
readonly SKIP_KNATIVE_SETUP
readonly SKIP_TEARDOWNS readonly SKIP_TEARDOWNS
readonly GKE_ADDONS
if (( ! RUN_TESTS )); then if (( ! run_tests )); then
create_test_cluster create_gke_test_cluster extra_kubetest2_flags extra_cluster_creation_flags e2e_script_command
else else
setup_test_cluster setup_test_cluster
fi fi

View File

@ -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
}

View File

@ -65,6 +65,22 @@ function abort() {
exit 1 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. # Display a box banner.
# Parameters: $1 - character to use for the box. # Parameters: $1 - character to use for the box.
# $2 - banner message. # $2 - banner message.

View File

@ -322,15 +322,6 @@ function main() {
echo ">> docker version" echo ">> docker version"
docker version docker version
fi 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 fi
[[ -z $1 ]] && set -- "--all-tests" [[ -z $1 ]] && set -- "--all-tests"

4
vendor/modules.txt vendored
View File

@ -752,7 +752,7 @@ k8s.io/kube-openapi/pkg/util/sets
k8s.io/utils/buffer k8s.io/utils/buffer
k8s.io/utils/integer k8s.io/utils/integer
k8s.io/utils/trace k8s.io/utils/trace
# knative.dev/pkg v0.0.0-20200816190606-6d1b0e90624b # knative.dev/pkg v0.0.0-20200818021113-c451e3c37f5f
## explicit ## explicit
knative.dev/pkg/apis knative.dev/pkg/apis
knative.dev/pkg/apis/duck/ducktypes knative.dev/pkg/apis/duck/ducktypes
@ -776,7 +776,7 @@ knative.dev/pkg/metrics/metricskey
knative.dev/pkg/network knative.dev/pkg/network
knative.dev/pkg/reconciler knative.dev/pkg/reconciler
knative.dev/pkg/system knative.dev/pkg/system
# knative.dev/test-infra v0.0.0-20200813220306-af5517f4f576 # knative.dev/test-infra v0.0.0-20200817225313-c0ea00ce480c
## explicit ## explicit
knative.dev/test-infra/scripts knative.dev/test-infra/scripts
knative.dev/test-infra/tools/dep-collector knative.dev/test-infra/tools/dep-collector