Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

build test images for e2e #974

Merged
merged 20 commits into from
Aug 20, 2020
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .ko.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Use :nonroot base image for all containers
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This repo only defines one cmd/ package, right? Does defaultBaseImage accomplish anything, since it's just overridden below?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Correct.

The test image should be using this base image(test/upload-test-images.sh), but we dont have any particular use case in test images to use this base image. Also just checked their sizes, the default one is 3 times larger than alpine image. @itsmurugappan I think we can simply default to alpine base image here.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The test images(present and future ones) will refer this base image. A non root image will give the flexibility to run in contributors clusters in which non root images are not allowed. Maybe I can change it to 'gcr.io/distroless/static:nonroot' which is used in all the knative repos.

defaultBaseImage: gcr.io/distroless/base:debug-nonroot
itsmurugappan marked this conversation as resolved.
Show resolved Hide resolved
23 changes: 23 additions & 0 deletions lib/test/cli.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import (
"fmt"
"os/exec"
"strings"
"text/template"
)

const (
Expand Down Expand Up @@ -234,3 +235,25 @@ func appendCLIOutput(buffer *bytes.Buffer, desc string, out string, err error) {
func cmdCLIDesc(cli string, args []string) string {
return fmt.Sprintf("%s %s", cli, strings.Join(args, " "))
}

// ImagePath is a helper function to transform an image name into an image reference that can be pulled.
func ImagePath(name string) string {
tpl, err := template.New("image").Parse(Flags.ImageTemplate)
if err != nil {
panic("could not parse image template: " + err.Error())
}

var buf bytes.Buffer
if err := tpl.Execute(&buf, struct {
Repository string
Name string
Tag string
}{
Repository: Flags.DockerRepo,
Name: name,
Tag: Flags.Tag,
}); err != nil {
panic("could not apply the image template: " + err.Error())
}
return buf.String()
}
itsmurugappan marked this conversation as resolved.
Show resolved Hide resolved
12 changes: 12 additions & 0 deletions lib/test/flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ var Flags = InitializeFlags()
// ClientFlags define the flags that are needed to run the e2e tests.
type ClientFlags struct {
DockerConfigJSON string
ImageTemplate string // Template to build the image reference (defaults to {{.Repository}}/{{.Name}}:{{.Tag}})
DockerRepo string // Docker repo (defaults to $KO_DOCKER_REPO)
Tag string // Tag for test images
itsmurugappan marked this conversation as resolved.
Show resolved Hide resolved
}

// InitializeFlags initializes the client's flags
Expand All @@ -38,5 +41,14 @@ func InitializeFlags() *ClientFlags {
flag.StringVar(&f.DockerConfigJSON, "dockerconfigjson", dockerConfigJSON,
"Provide the path to Docker configuration file in json format. Defaults to $DOCKER_CONFIG_JSON")

flag.StringVar(&f.ImageTemplate, "imagetemplate", "{{.Repository}}/{{.Name}}:{{.Tag}}",
"Provide a template to generate the reference to an image from the test. Defaults to `{{.Repository}}/{{.Name}}:{{.Tag}}`.")

defaultRepo := os.Getenv("KO_DOCKER_REPO")
flag.StringVar(&f.DockerRepo, "dockerrepo", defaultRepo,
"Provide the uri of the docker repo you have uploaded the test image to using `uploadtestimage.sh`. Defaults to $KO_DOCKER_REPO")

flag.StringVar(&f.Tag, "tag", "latest", "Provide the version tag for the test images.")

return &f
}
4 changes: 2 additions & 2 deletions lib/test/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import (

// ServiceCreate verifies given service creation in sync mode and also verifies output
func ServiceCreate(r *KnRunResultCollector, serviceName string) {
out := r.KnTest().Kn().Run("service", "create", serviceName, "--image", GetKnTestImage())
out := r.KnTest().Kn().Run("service", "create", serviceName, "--image", ImagePath("helloworld"))
r.AssertNoError(out)
assert.Check(r.T(), util.ContainsAllIgnoreCase(out.Stdout, "service", serviceName, "creating", "namespace", r.KnTest().Kn().Namespace(), "ready"))
}
Expand All @@ -51,7 +51,7 @@ func ServiceList(r *KnRunResultCollector, serviceName string) {
func ServiceDescribe(r *KnRunResultCollector, serviceName string) {
out := r.KnTest().Kn().Run("service", "describe", serviceName)
r.AssertNoError(out)
assert.Assert(r.T(), util.ContainsAll(out.Stdout, serviceName, r.KnTest().Kn().Namespace(), GetKnTestImage()))
assert.Assert(r.T(), util.ContainsAll(out.Stdout, serviceName, r.KnTest().Kn().Namespace(), ImagePath("helloworld")))
assert.Assert(r.T(), util.ContainsAll(out.Stdout, "Conditions", "ConfigurationsReady", "Ready", "RoutesReady"))
assert.Assert(r.T(), util.ContainsAll(out.Stdout, "Name", "Namespace", "URL", "Age", "Revisions"))
}
Expand Down
18 changes: 18 additions & 0 deletions test/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,3 +66,21 @@ mode, use
```bash
test/local-e2e-tests.sh -short
```

## Test images

### Building the test images

The [`upload-test-images.sh`](./upload-test-images.sh) script can be used to
build and push the test images used by e2e tests. The script
expects 'KO_DOCKER_REPO' environment variable set.

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

```bash
./test/upload-test-images.sh
```

### Adding new test images

New test images should be placed in `test/test_images`.
itsmurugappan marked this conversation as resolved.
Show resolved Hide resolved
7 changes: 7 additions & 0 deletions test/common.sh
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,10 @@ function knative_setup() {
wait_until_pods_running knative-eventing || return 1
fi
}

# Create test resources and images
function test_setup() {
echo ">> Uploading test images..."
${REPO_ROOT_DIR}/test/upload-test-images.sh || return 1
}

itsmurugappan marked this conversation as resolved.
Show resolved Hide resolved
3 changes: 0 additions & 3 deletions test/test_images/helloworld/go.mod

This file was deleted.

16 changes: 16 additions & 0 deletions test/test_images/helloworld/release.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# 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
#
# https://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.

image: ko://knative.dev/client/test/test_images/helloworld
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What does this file accomplish? It's not a valid K8s config so ko apply will fail. Does something else consume the output of ko resolve on this file?

If you just want to publish an image, you should be able to simply run ko publish ./test/test_images/helloworld

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The goal is build and publish the images to be used in tests. Currently there is only one image, we are planning to add more. So, if it is specified in this way , we could build and publish all images using 'ko resolve --jobs=4 ${tag_option} -RBf "${image_dir}" > /dev/null' .


itsmurugappan marked this conversation as resolved.
Show resolved Hide resolved
39 changes: 39 additions & 0 deletions test/upload-test-images.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#!/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
#
# https://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.

set -o errexit

function upload_test_images() {
echo ">> Publishing test images"
# Script needs to be executed from the root directory
# to pickup .ko.yaml
cd "$( dirname "$0")/.."
local image_dir="test/test_images"
local docker_tag=$1
local tag_option=""
if [ -n "${docker_tag}" ]; then
tag_option="--tags $docker_tag,latest"
fi

# ko resolve is being used for the side-effect of publishing images,
# so the resulting yaml produced is ignored.
# We limit the number of concurrent builds (jobs) to avoid OOMs.
ko resolve --jobs=4 ${tag_option} -RBf "${image_dir}" > /dev/null
}

: ${KO_DOCKER_REPO:?"You must set 'KO_DOCKER_REPO'"}

upload_test_images $@