test

package
v0.3.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 8, 2019 License: Apache-2.0 Imports: 33 Imported by: 0

README

Test

This directory contains tests and testing docs for Knative Serving:

The conformance tests are a subset of the end to end test with more strict requirements around what can be tested.

If you want to add more tests, see adding_tests.md.

Presubmit tests

presubmit-tests.sh is the entry point for both the end-to-end tests and the conformance tests

This script, and consequently, the e2e and conformance tests will be run before every code submission. You can run these tests manually with:

test/presubmit-tests.sh

Note that to run presubmit-tests.sh or e2e-tests.sh scripts, you'll need kubernetes kubetest installed:

go get -u k8s.io/test-infra/kubetest

Running unit tests

To run all unit tests:

go test ./...

By default go test will not run the e2e tests, which need -tags=e2e to be enabled.

Running end to end tests

To run the e2e tests and the conformance tests, you need to have a running environment that meets the e2e test environment requirements, and you need to specify the build tag e2e.

go test -v -tags=e2e -count=1 ./test/conformance
go test -v -tags=e2e -count=1 ./test/e2e

Running performance tests

To run the performance tests, you need to have a running environment that meets the test environment requirements, and you need to specify the build tag performance.

go test -v -tags=performance -count=1 ./test/performance
Running a single test case

To run one e2e test case, e.g. TestAutoscaleUpDownUp, use the -run flag with go test:

go test -v -tags=e2e -count=1 ./test/e2e -run ^TestAutoscaleUpDownUp$
Environment requirements

These tests require:

  1. A running Knative Serving cluster.
  2. The knative-testing resources:
    ko apply -f test/config
    
  3. The namespace serving-tests:
    kubectl create namespace serving-tests
    
  4. A docker repo containing the test images
Common Flags

You can use test flags to control the environment your tests run against, i.e. override your environment variables:

go test -v -tags=e2e -count=1 ./test/conformance --kubeconfig ~/special/kubeconfig --cluster myspecialcluster --dockerrepo myspecialdockerrepo
go test -v -tags=e2e -count=1 ./test/e2e --kubeconfig ~/special/kubeconfig --cluster myspecialcluster --dockerrepo myspecialdockerrepo

If you are running against an environment with no loadbalancer for the ingress, at the moment your only option is to use a domain which will resolve to the IP of the running node (see #609):

go test -v -tags=e2e -count=1 ./test/conformance --resolvabledomain
go test -v -tags=e2e -count=1 ./test/e2e --resolvabledomain

Test images

Building the test images

Note: this is only required when you run conformance/e2e tests locally with go test commands.

The upload-test-images.sh script can be used to build and push the test images used by the conformance and e2e tests. It requires:

To run the script for all end to end test images:

./test/upload-test-images.sh

A docker tag may be passed as an optional parameter. This can be useful on [Minikube] in tandem with the --tag flag:

eval $(minikube docker-env)
./test/upload-test-images.sh any-old-tag
Adding new test images

New test images should be placed in ./test/test_images.

Flags

These flags are useful for running against an existing cluster, making use of your existing environment setup.

Tests importing github.com/knative/serving/test recognize these flags:

Overridding docker repo

The --dockerrepo argument lets you specify the docker repo from which images used by your tests should be pulled. This will default to the value of your DOCKER_REPO_OVERRIDE environment variable if not specified.

go test -v -tags=e2e -count=1 ./test/conformance --dockerrepo gcr.myhappyproject
go test -v -tags=e2e -count=1 ./test/e2e --dockerrepo gcr.myhappyproject
Using a docker tag

The default docker tag used for the test images is latest, which can be problematic on [Minikube]. To avoid having to configure a remote container registry to support the Always pull policy for latest tags, you can have the tests use a specific tag:

go test -v -tags=e2e -count=1 ./test/conformance --tag any-old-tag
go test -v -tags=e2e -count=1 ./test/e2e --tag any-old-tag

Of course, this implies that you tagged the images when you uploaded them.

Using a resolvable domain

If you set up your cluster using the getting started docs, Routes created in the test will use the domain example.com, unless the route has label app=prod in which case they will use the domain prod-domain.com. Since these domains will not be resolvable to deployments in your test cluster, in order to make a request against the endpoint, the test use the IP assigned to the service istio-ingressgateway in the namespace istio-system and spoof the Host in the header.

If you have configured your cluster to use a resolvable domain, you can use the --resolvabledomain flag to indicate that the test should make requests directly against Route.Status.Domain and does not need to spoof the Host.

Documentation

Index

Constants

View Source
const EnvImageEnvVarsPath = "/envvars"

EnvImageEnvVarsPath path exposed by environment test-image to fetch environment variables.

View Source
const EnvImageFilePathInfoPath = "/filepath"

EnvImageFilePathInfoPath path exposed by environment test-image to fetch information for filepaths

View Source
const EnvImageFilePathQueryParam = "path"

EnvImageFilePathQueryParam query param to be used with EnvImageFilePathInfoPath to specify filepath

View Source
const EnvImageServerPort = 8080

EnvImageServerPort is the port on which the environment test-image server starts. TODO: Modify this port number after https://github.com/knative/serving/issues/2258 is fixed for a stricter verification.

View Source
const (
	// ServingNamespace is the default namespace for serving e2e tests
	ServingNamespace = "serving-tests"
)

Variables

View Source
var ServingFlags = initializeServingFlags()

ServingFlags holds the flags or defaults for knative/serving settings in the user's environment.

Functions

func AllRouteTrafficAtRevision

func AllRouteTrafficAtRevision(names ResourceNames) func(r *v1alpha1.Route) (bool, error)

AllRouteTrafficAtRevision will check the revision that route r is routing traffic to and return true if 100% of the traffic is routing to revisionName.

func AppendRandomString

func AppendRandomString(prefix string, logger *logging.BaseLogger) string

AppendRandomString will generate a random string that begins with prefix. This is useful if you want to make sure that your tests can run at the same time against the same environment without conflicting. This method will seed rand with the current time when called for the first time.

func BlueGreenRoute

func BlueGreenRoute(namespace string, names, blue, green ResourceNames) *v1alpha1.Route

BlueGreenRoute returns a Route object in namespace using the route and configuration names in names. Traffic is split evenly between blue and green.

func CheckConfigurationState

func CheckConfigurationState(client *ServingClients, name string, inState func(r *v1alpha1.Configuration) (bool, error)) error

CheckConfigurationState verifies the status of the Configuration called name from client is in a particular state by calling `inState` and expecting `true`. This is the non-polling variety of WaitForConfigurationState

func CheckRevisionState

func CheckRevisionState(client *ServingClients, name string, inState func(r *v1alpha1.Revision) (bool, error)) error

CheckRevisionState verifies the status of the Revision called name from client is in a particular state by calling `inState` and expecting `true`. This is the non-polling variety of WaitForRevisionState

func CheckRouteState

func CheckRouteState(client *ServingClients, name string, inState func(r *v1alpha1.Route) (bool, error)) error

CheckRouteState verifies the status of the Route called name from client is in a particular state by calling `inState` and expecting `true`. This is the non-polling variety of WaitForRouteState

func CheckServiceState

func CheckServiceState(client *ServingClients, name string, inState func(s *v1alpha1.Service) (bool, error)) error

CheckServiceState verifies the status of the Service called name from client is in a particular state by calling `inState` and expecting `true`. This is the non-polling variety of WaitForServiceState

func CleanupOnInterrupt

func CleanupOnInterrupt(cleanup func(), logger *logging.BaseLogger)

CleanupOnInterrupt will execute the function cleanup if an interrupt signal is caught

func Configuration

func Configuration(namespace string, names ResourceNames, imagePath string, options *Options) *v1alpha1.Configuration

Configuration returns a Configuration object in namespace with the name names.Config that uses the image specified by imagePath.

func ConfigurationHasCreatedRevision added in v0.2.0

func ConfigurationHasCreatedRevision(c *v1alpha1.Configuration) (bool, error)

ConfigurationHasCreatedRevision returns whether the Configuration has created a Revision.

func ConfigurationSpec added in v0.3.0

func ConfigurationSpec(imagePath string, options *Options) *v1alpha1.ConfigurationSpec

ConfigurationSpec returns the spec of a configuration to be used throughout different CRD helpers.

func ConfigurationWithBuild added in v0.2.0

func ConfigurationWithBuild(namespace string, names ResourceNames, build *v1alpha1.RawExtension, imagePath string) *v1alpha1.Configuration

ConfigurationWithBuild returns a Configurtion object in the `namespace` with the name `names.Config` that uses the provided Build spec `build` and image specified by `imagePath`.

func CreateBlueGreenRoute added in v0.2.0

func CreateBlueGreenRoute(logger *logging.BaseLogger, clients *Clients, names, blue, green ResourceNames) error

CreateBlueGreenRoute creates a route in the given namespace using the route name in names. Traffic is evenly split between the two routes specified by blue and green.

func CreateConfiguration added in v0.2.0

func CreateConfiguration(logger *logging.BaseLogger, clients *Clients, names ResourceNames, imagePath string, options *Options) (*v1alpha1.Configuration, error)

CreateConfiguration create a configuration resource in namespace with the name names.Config that uses the image specified by imagePath. TODO(dangerd): Update to use names.Image instead of imagePath to match Service. Requires some refactoring test/e2e.

func CreateLatestService added in v0.2.0

func CreateLatestService(logger *logging.BaseLogger, clients *Clients, names ResourceNames, options *Options) (*v1alpha1.Service, error)

CreateLatestService creates a service in namespace with the name names.Service and names.Image

func CreateLatestServiceWithResources added in v0.3.0

func CreateLatestServiceWithResources(logger *logging.BaseLogger, clients *Clients, names ResourceNames, imagePath string) (*v1alpha1.Service, error)

CreateLatestServiceWithResources creates a service in namespace with the name names.Service that uses the image specified by imagePath

func CreateRoute added in v0.2.0

func CreateRoute(logger *logging.BaseLogger, clients *Clients, names ResourceNames) (*v1alpha1.Route, error)

CreateRoute creates a route in the given namespace using the route name in names

func GetConfigMap added in v0.2.0

func GetConfigMap(client *pkgTest.KubeClient) k8styped.ConfigMapInterface

GetConfigMap gets the knative serving config map.

func GetRouteProberError added in v0.2.0

func GetRouteProberError(errorChan <-chan error, logger *logging.BaseLogger) error

GetRouteProberError gets the error of route prober.

func ImagePath added in v0.2.0

func ImagePath(name string) string

ImagePath is a helper function to prefix image name with repo and suffix with tag

func IsConfigRevisionCreationFailed added in v0.2.0

func IsConfigRevisionCreationFailed(c *v1alpha1.Configuration) (bool, error)

IsConfigRevisionCreationFailed will check the status conditions of the configuration and return true if the configuration's revision failed to create.

func IsRevisionAtExpectedGeneration added in v0.2.0

func IsRevisionAtExpectedGeneration(expectedGeneration string) func(r *v1alpha1.Revision) (bool, error)

IsRevisionAtExpectedGeneration returns a function that will check if the annotations on the revision include an annotation for the generation and that the annotation is set to the expected value. TODO(dprotaso) Delete this assertion for the 0.4 release

func IsRevisionBuildFailed added in v0.2.0

func IsRevisionBuildFailed(r *v1alpha1.Revision) (bool, error)

IsRevisionBuildFailed will check the status conditions of the revision and return true if the revision's build failed.

func IsRevisionReady

func IsRevisionReady(r *v1alpha1.Revision) (bool, error)

IsRevisionReady will check the status conditions of the revision and return true if the revision is ready to serve traffic. It will return false if the status indicates a state other than deploying or being ready. It will also return false if the type of the condition is unexpected.

func IsRouteReady

func IsRouteReady(r *v1alpha1.Route) (bool, error)

IsRouteReady will check the status conditions of the route and return true if the route is ready.

func IsServiceReady

func IsServiceReady(s *v1alpha1.Service) (bool, error)

IsServiceReady will check the status conditions of the service and return true if the service is ready. This means that its configurations and routes have all reported ready.

func LatestService

func LatestService(namespace string, names ResourceNames, imagePath string, options *Options) *v1alpha1.Service

LatestService returns a RunLatest Service object in namespace with the name names.Service that uses the image specified by imagePath.

func LatestServiceWithResources added in v0.3.0

func LatestServiceWithResources(namespace string, names ResourceNames, imagePath string) *v1alpha1.Service

LatestServiceWithResources returns a RunLatest Service object in namespace with the name names.Service that uses the image specified by imagePath, and small constant resources.

func ListenAndServeGracefully added in v0.3.0

func ListenAndServeGracefully(addr string, handler func(w http.ResponseWriter, r *http.Request))

ListenAndServeGracefully calls into ListenAndServeGracefullyWithPattern by passing handler to handle requests for "/"

func ListenAndServeGracefullyWithPattern added in v0.3.0

func ListenAndServeGracefullyWithPattern(addr string, handlers map[string]func(w http.ResponseWriter, r *http.Request))

ListenAndServeGracefullyWithPattern creates an HTTP server, listens on the defined address and handles incoming requests specified on pattern(path) with the given handlers. It blocks until SIGTERM is received and the underlying server has shutdown gracefully.

func LogResourceObject added in v0.2.0

func LogResourceObject(logger *logging.BaseLogger, value ResourceObjects)

LogResourceObject logs the resource object with the resource name and value

func ManualService added in v0.2.0

func ManualService(svc *v1alpha1.Service) *v1alpha1.Service

ManualService returns a Manual Service object in namespace with the name names.Service

func PatchConfigImage added in v0.3.0

func PatchConfigImage(logger *logging.BaseLogger, clients *Clients, cfg *v1alpha1.Configuration, imagePath string) (*v1alpha1.Configuration, error)

PatchConfigImage patches the existing config passed in with a new imagePath. Returns the latest Configuration object

func PatchManualService added in v0.3.0

func PatchManualService(logger *logging.BaseLogger, clients *Clients, svc *v1alpha1.Service) (*v1alpha1.Service, error)

PatchManualService patches an existing service in namespace with the name names.Service

func PatchReleaseService added in v0.3.0

func PatchReleaseService(logger *logging.BaseLogger, clients *Clients, svc *v1alpha1.Service, revisions []string, rolloutPercent int) (*v1alpha1.Service, error)

PatchReleaseService patches an existing service in namespace with the name names.Service

func PatchService added in v0.3.0

func PatchService(logger *logging.BaseLogger, clients *Clients, curSvc *v1alpha1.Service, desiredSvc *v1alpha1.Service) (*v1alpha1.Service, error)

PatchService creates and applies a patch from the diff between curSvc and desiredSvc. Returns the latest service object.

func PatchServiceImage added in v0.3.0

func PatchServiceImage(logger *logging.BaseLogger, clients *Clients, svc *v1alpha1.Service, imagePath string) (*v1alpha1.Service, error)

PatchServiceImage patches the existing service passed in with a new imagePath. Returns the latest service object

func PatchServiceRevisionTemplateMetadata added in v0.3.0

func PatchServiceRevisionTemplateMetadata(logger *logging.BaseLogger, clients *Clients, svc *v1alpha1.Service, metadata metav1.ObjectMeta) (*v1alpha1.Service, error)

PatchServiceRevisionTemplateMetadata patches an existing service by adding metadata to the service's RevisionTemplateSpec.

func ReleaseService added in v0.2.0

func ReleaseService(svc *v1alpha1.Service, revisions []string, rolloutPercent int) *v1alpha1.Service

ReleaseService returns a Release Service object in namespace with the name names.Service that uses the image specifeid by imagePath. It also takes a list of 1-2 revisons and a rolloutPercent to be used to configure routing

func Route

func Route(namespace string, names ResourceNames) *v1alpha1.Route

Route returns a Route object in namespace using the route and configuration names in names.

func RunRouteProber added in v0.2.0

func RunRouteProber(logger *logging.BaseLogger, clients *Clients, domain string) <-chan error

RunRouteProber creates and runs a prober as background goroutine to keep polling Route. It stops when getting an error response from Route.

func TODO_RouteTrafficToRevisionWithInClusterDNS

func TODO_RouteTrafficToRevisionWithInClusterDNS(r *v1alpha1.Route) (bool, error)

RouteTrafficToRevisionWithInClusterDNS will check the revision that route r is routing traffic using in cluster DNS and return true if the revision received the request.

func TODO_ServiceTrafficToRevisionWithInClusterDNS

func TODO_ServiceTrafficToRevisionWithInClusterDNS(s *v1alpha1.Service) (bool, error)

ServiceTrafficToRevisionWithInClusterDNS will check the revision that route r is routing traffic using in cluster DNS and return true if the revision received the request.

func UpdateBlueGreenRoute added in v0.2.0

func UpdateBlueGreenRoute(logger *logging.BaseLogger, clients *Clients, names, blue, green ResourceNames) (*v1alpha1.Route, error)

UpdateRoute updates a route in the given namespace using the route name in names

func WaitForConfigLatestRevision added in v0.3.0

func WaitForConfigLatestRevision(clients *Clients, names ResourceNames) (string, error)

WaitForConfigLatestRevision takes a revision in through names and compares it to the current state of LatestCreatedRevisionName in Configuration. Once an update is detected in the LatestCreatedRevisionName, the function waits for the created revision to be set in LatestReadyRevisionName before returning the name of the revision.

func WaitForConfigurationState

func WaitForConfigurationState(client *ServingClients, name string, inState func(c *v1alpha1.Configuration) (bool, error), desc string) error

WaitForConfigurationState polls the status of the Configuration called name from client every interval until inState returns `true` indicating it is done, returns an error or timeout. desc will be used to name the metric that is emitted to track how long it took for name to get into the state checked by inState.

func WaitForRevisionState

func WaitForRevisionState(client *ServingClients, name string, inState func(r *v1alpha1.Revision) (bool, error), desc string) error

WaitForRevisionState polls the status of the Revision called name from client every interval until inState returns `true` indicating it is done, returns an error or timeout. desc will be used to name the metric that is emitted to track how long it took for name to get into the state checked by inState.

func WaitForRouteState

func WaitForRouteState(client *ServingClients, name string, inState func(r *v1alpha1.Route) (bool, error), desc string) error

WaitForRouteState polls the status of the Route called name from client every interval until inState returns `true` indicating it is done, returns an error or timeout. desc will be used to name the metric that is emitted to track how long it took for name to get into the state checked by inState.

func WaitForServiceLatestRevision added in v0.3.0

func WaitForServiceLatestRevision(clients *Clients, names ResourceNames) (string, error)

WaitForServiceLatestRevision takes a revision in through names and compares it to the current state of LatestCreatedRevisionName in Service. Once an update is detected in the LatestCreatedRevisionName, the function waits for the created revision to be set in LatestReadyRevisionName before returning the name of the revision.

func WaitForServiceState

func WaitForServiceState(client *ServingClients, name string, inState func(s *v1alpha1.Service) (bool, error), desc string) error

WaitForServiceState polls the status of the Service called name from client every interval until inState returns `true` indicating it is done, returns an error or timeout. desc will be used to name the metric that is emitted to track how long it took for name to get into the state checked by inState.

Types

type BuildClient added in v0.2.0

type BuildClient struct {
	TestBuilds testbuildtyped.BuildInterface
}

BuildClient holds instances of interfaces for making requests to build client.

type Clients

type Clients struct {
	KubeClient    *test.KubeClient
	ServingClient *ServingClients
	BuildClient   *BuildClient
	Dynamic       dynamic.Interface
}

Clients holds instances of interfaces for making requests to Knative Serving.

func NewClients

func NewClients(configPath string, clusterName string, namespace string) (*Clients, error)

NewClients instantiates and returns several clientsets required for making request to the Knative Serving cluster specified by the combination of clusterName and configPath. Clients can make requests within namespace.

type Options added in v0.2.0

type Options struct {
	EnvVars                []corev1.EnvVar
	ContainerPorts         []corev1.ContainerPort
	ContainerConcurrency   int
	RevisionTimeoutSeconds int64
	ContainerResources     corev1.ResourceRequirements
	ReadinessProbe         *corev1.Probe
}

Options are test setup parameters.

type ResourceNames

type ResourceNames struct {
	Config        string
	Route         string
	Revision      string
	Service       string
	TrafficTarget string
	Domain        string
	Image         string
}

ResourceNames holds names of various resources.

type ResourceObjects added in v0.2.0

type ResourceObjects struct {
	Route    *v1alpha1.Route
	Config   *v1alpha1.Configuration
	Service  *v1alpha1.Service
	Revision *v1alpha1.Revision
}

ResourceObjects holds types of the resource objects.

func CreateRunLatestServiceReady added in v0.3.0

func CreateRunLatestServiceReady(logger *logging.BaseLogger, clients *Clients, names *ResourceNames, options *Options) (*ResourceObjects, error)

CreateRunLatestServiceReady creates a new RunLatest Service in state 'Ready'. This function expects Service and Image name passed in through 'names'. Names is updated with the Route and Configuration created by the Service and ResourceObjects is returned with the Service, Route, and Configuration objects. Returns error if the service does not come up correctly.

type ServingClients added in v0.2.0

ServingClients holds instances of interfaces for making requests to knative serving clients

func (*ServingClients) Delete added in v0.2.0

func (clients *ServingClients) Delete(routes []string, configs []string, services []string) error

Delete will delete all Routes and Configs with the names routes and configs, if clients has been successfully initialized.

type ServingEnvironmentFlags added in v0.2.0

type ServingEnvironmentFlags struct {
	ResolvableDomain bool   // Resolve Route controller's `domainSuffix`
	DockerRepo       string // Docker repo (defaults to $DOCKER_REPO_OVERRIDE)
	Tag              string // Test images version tag
}

ServingEnvironmentFlags holds the e2e flags needed only by the serving repo.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL