Skip to content

Commit

Permalink
test: add tests for repo and policy add,remove
Browse files Browse the repository at this point in the history
  • Loading branch information
shreddedbacon committed Jan 15, 2025
1 parent d349a42 commit c132907
Show file tree
Hide file tree
Showing 10 changed files with 256 additions and 50 deletions.
22 changes: 21 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,26 @@ helm/repos: local-dev/helm
$(HELM) repo add metallb https://metallb.github.io/metallb
$(HELM) repo update

ARCH := $(shell uname | tr '[:upper:]' '[:lower:]')

KIND = $(realpath ./local-dev/kind)
KIND_VERSION = v0.25.0

.PHONY: local-dev/kind
local-dev/kind:
ifeq ($(KIND_VERSION), $(shell kind version 2>/dev/null | sed -nE 's/kind (v[0-9.]+).*/\1/p'))
$(info linking local kind version $(KIND_VERSION))
ln -sf $(shell command -v kind) ./local-dev/kind
else
ifneq ($(KIND_VERSION), $(shell ./local-dev/kind version 2>/dev/null | sed -nE 's/kind (v[0-9.]+).*/\1/p'))
$(info downloading kind version $(KIND_VERSION) for $(ARCH))
mkdir -p local-dev
rm local-dev/kind || true
curl -sSLo local-dev/kind https://kind.sigs.k8s.io/dl/$(KIND_VERSION)/kind-$(ARCH)-amd64
chmod a+x local-dev/kind
endif
endif

# Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set)
ifeq (,$(shell go env GOBIN))
GOBIN=$(shell go env GOPATH)/bin
Expand Down Expand Up @@ -371,7 +391,7 @@ kind/clean:
test-e2e:
export HARBOR_VERSION=$(HARBOR_VERSION) && \
export OVERRIDE_BUILD_DEPLOY_DIND_IMAGE=$(OVERRIDE_BUILD_DEPLOY_DIND_IMAGE) && \
go test ./test/e2e/ -v -ginkgo.v
go test ./test/e2e/ -v -ginkgo.v -timeout 20m

.PHONY: github/test-e2e
github/test-e2e: local-dev/tools install-lagoon-remote test-e2e
Expand Down
1 change: 1 addition & 0 deletions config/default/manager_auth_proxy_patch.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ spec:
- "--enable-deprecated-apis"
- "--lagoon-feature-flag-support-k8upv2"
- "--skip-tls-verify"
- "--cleanup-harbor-repository-on-delete" # enabled for tests
ports:
- containerPort: 8443
name: https
149 changes: 100 additions & 49 deletions test/e2e/e2e_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ limitations under the License.
package e2e

import (
"encoding/json"
"fmt"
"os"
"os/exec"
Expand Down Expand Up @@ -54,6 +55,10 @@ var (
"lagoon_tasks_running_current",
"lagoon_tasks_started_total",
}

createPolicyWant = `{"algorithm":"or","rules":[{"action":"retain","params":{"latestPulledN":3},"scope_selectors":{"repository":[{"decoration":"repoMatches","kind":"doublestar","pattern":"[^pr\\-]*/*"}]},"tag_selectors":[{"decoration":"matches","extras":"{\"untagged\":true}","kind":"doublestar","pattern":"**"}],"template":"latestPulledN"},{"action":"retain","params":{"latestPulledN":1},"scope_selectors":{"repository":[{"decoration":"repoMatches","kind":"doublestar","pattern":"pr-*"}]},"tag_selectors":[{"decoration":"matches","extras":"{\"untagged\":true}","kind":"doublestar","pattern":"**"}],"template":"latestPulledN"}],"scope":{"level":"project"},"trigger":{"kind":"Schedule","settings":{"cron":"0 3 3 * * 3"}}}`
deletePolicyWant = `{"algorithm":"or","rules":[],"scope":{"level":"project"},"trigger":{"kind":"Schedule","settings":{"cron":""}}}`
projectRepositoriesWant = `[{"artifact_count":1,"name":"nginx-example/main/nginx","pull_count":1}]`
)

func init() {
Expand All @@ -62,19 +67,30 @@ func init() {
}

var _ = Describe("controller", Ordered, func() {
// get the ingress lb ip for use later
ip, err := utils.GetIngressLB()
ExpectWithOffset(1, err).NotTo(HaveOccurred())

BeforeAll(func() {
By("start local services")
Expect(utils.StartLocalServices()).To(Succeed())

By("removing manager namespace")
cmd := exec.Command(utils.Kubectl(), "delete", "ns", namespace)
_, _ = utils.Run(cmd)

By("creating manager namespace")
cmd := exec.Command(utils.Kubectl(), "create", "ns", namespace)
cmd = exec.Command(utils.Kubectl(), "create", "ns", namespace)
_, _ = utils.Run(cmd)

// when running a re-test, it is best to make sure the old namespace doesn't exist
By("removing existing test resources")
// remove the old namespace
cmd = exec.Command(utils.Kubectl(), "delete", "ns", "nginx-example-main")
_, _ = utils.Run(cmd)
By("delete harbor project")
_ = utils.DeleteHarborProject(ip, "nginx-example")

// clean up the k8up crds
utils.UninstallK8upCRDs()
})
Expand Down Expand Up @@ -164,22 +180,7 @@ var _ = Describe("controller", Ordered, func() {
for _, name := range []string{"7m5zypx", "8m5zypx", "9m5zypx", "1m5zypx"} {
if name == "9m5zypx" {
By("creating a LagoonBuild resource via rabbitmq")
cmd = exec.Command(
"curl",
"-s",
"-u",
"guest:guest",
"-H",
"'Accept: application/json'",
"-H",
"'Content-Type:application/json'",
"-X",
"POST",
"-d",
fmt.Sprintf("@test/e2e/testdata/lagoon-build-%s.json", name),
"http://172.17.0.1:15672/api/exchanges/%2f/lagoon-tasks/publish",
)
_, err = utils.Run(cmd)
err = utils.PublishMessage(fmt.Sprintf("@test/e2e/testdata/lagoon-build-%s.json", name))
ExpectWithOffset(1, err).NotTo(HaveOccurred())
} else {
By("creating a LagoonBuild resource")
Expand Down Expand Up @@ -334,22 +335,7 @@ var _ = Describe("controller", Ordered, func() {
time.Sleep(5 * time.Second)

By(fmt.Sprintf("creating a %s restore task via rabbitmq", name))
cmd = exec.Command(
"curl",
"-s",
"-u",
"guest:guest",
"-H",
"'Accept: application/json'",
"-H",
"'Content-Type:application/json'",
"-X",
"POST",
"-d",
fmt.Sprintf("@test/e2e/testdata/%s-restore.json", name),
"http://172.17.0.1:15672/api/exchanges/%2f/lagoon-tasks/publish",
)
_, err = utils.Run(cmd)
err = utils.PublishMessage(fmt.Sprintf("@test/e2e/testdata/%s-restore.json", name))
ExpectWithOffset(1, err).NotTo(HaveOccurred())

time.Sleep(10 * time.Second)
Expand Down Expand Up @@ -400,23 +386,40 @@ var _ = Describe("controller", Ordered, func() {
}
EventuallyWithOffset(1, verifyRobotCredentialsRotate, duration, interval).Should(Succeed())

By("check harbor project policies before creating policy")
_, err = utils.QueryHarborProjectPolicies(ip, "nginx-example")
if err != nil {
if !strings.Contains(err.Error(), "project metadata value is empty: retention_id") {
ExpectWithOffset(1, err).NotTo(HaveOccurred())
}
}
By("creating harbor policy update via rabbitmq")
err = utils.PublishMessage("@test/e2e/testdata/create-retention-policy.json")
ExpectWithOffset(1, err).NotTo(HaveOccurred())
time.Sleep(10 * time.Second)
By("check harbor project policies after creating policy")
after, err := utils.QueryHarborProjectPolicies(ip, "nginx-example")
ExpectWithOffset(1, err).NotTo(HaveOccurred())
err = comparePolicy(createPolicyWant, after)
ExpectWithOffset(1, err).NotTo(HaveOccurred())

By("delete harbor policy via rabbitmq")
err = utils.PublishMessage("@test/e2e/testdata/remove-retention-policy.json")
ExpectWithOffset(1, err).NotTo(HaveOccurred())
time.Sleep(10 * time.Second)
By("check harbor project policies after deleting policy")
after, err = utils.QueryHarborProjectPolicies(ip, "nginx-example")
ExpectWithOffset(1, err).NotTo(HaveOccurred())
err = comparePolicy(deletePolicyWant, after)
ExpectWithOffset(1, err).NotTo(HaveOccurred())

By("check harbor project repositories before deleting environment")
before, err := utils.QueryHarborRepositories(ip, "nginx-example")
ExpectWithOffset(1, err).NotTo(HaveOccurred())
err = compareRepositories(projectRepositoriesWant, before)
ExpectWithOffset(1, err).NotTo(HaveOccurred())
By("delete environment via rabbitmq")
cmd = exec.Command(
"curl",
"-s",
"-u",
"guest:guest",
"-H",
"'Accept: application/json'",
"-H",
"'Content-Type:application/json'",
"-X",
"POST",
"-d",
"@test/e2e/testdata/remove-environment.json",
"http://172.17.0.1:15672/api/exchanges/%2f/lagoon-tasks/publish",
)
_, err = utils.Run(cmd)
err = utils.PublishMessage("@test/e2e/testdata/remove-environment.json")
ExpectWithOffset(1, err).NotTo(HaveOccurred())

By("validating that the namespace deletes")
Expand All @@ -435,6 +438,12 @@ var _ = Describe("controller", Ordered, func() {
}
EventuallyWithOffset(1, verifyNamespaceRemoved, duration, interval).Should(Succeed())

By("check harbor project repositories after deleting environment")
after, err = utils.QueryHarborRepositories(ip, "nginx-example")
ExpectWithOffset(1, err).NotTo(HaveOccurred())
err = compareRepositories("null", after)
ExpectWithOffset(1, err).NotTo(HaveOccurred())

By("validating that unauthenticated metrics requests fail")
runCmd := `curl -s -k https://remote-controller-controller-manager-metrics-service.remote-controller-system.svc.cluster.local:8443/metrics | grep -v "#" | grep "lagoon_"`
_, err = utils.RunCommonsCommand(namespace, runCmd)
Expand All @@ -451,3 +460,45 @@ var _ = Describe("controller", Ordered, func() {
})
})
})

func comparePolicy(want, got string) error {
// this removes the next scheduled time from the payload as it can vary
var m map[string]interface{}
if err := json.Unmarshal([]byte(got), &m); err != nil {
return err
}
delete(m["scope"].(map[string]interface{}), "ref")
delete(m["trigger"].(map[string]interface{})["settings"].(map[string]interface{}), "next_scheduled_time")
delete(m, "id")
p, err := json.Marshal(m)
if err != nil {
return err
}
if want != string(p) {
return fmt.Errorf("resulting policies don't match:\nwant: %s\ngot: %s", want, string(p))
}
return nil
}

func compareRepositories(want, got string) error {
if got == "null" && want == "null" {
return nil
}
// this removes the next scheduled time from the payload as it can vary
var m []interface{}
if err := json.Unmarshal([]byte(got), &m); err != nil {
return err
}
delete(m[0].(map[string]interface{}), "id")
delete(m[0].(map[string]interface{}), "creation_time")
delete(m[0].(map[string]interface{}), "update_time")
delete(m[0].(map[string]interface{}), "project_id")
p, err := json.Marshal(m)
if err != nil {
return err
}
if want != string(p) {
return fmt.Errorf("resulting policies don't match:\nwant: %s\ngot: %s", want, string(p))
}
return nil
}
20 changes: 20 additions & 0 deletions test/e2e/testdata/create-retention-policy.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{"properties":{"delivery_mode":2},"routing_key":"ci-local-controller-kubernetes:misc",
"payload":"{
\"misc\":{
\"miscResource\":\"eyJ0eXBlIjoiaGFyYm9yUmV0ZW50aW9uUG9saWN5IiwiZXZlbnRUeXBlIjoidXBkYXRlUG9saWN5IiwiZGF0YSI6eyJwcm9qZWN0Ijp7ImlkIjoxLCJuYW1lIjoibmdpbngtZXhhbXBsZSJ9LCJwb2xpY3kiOnsicnVsZXMiOlt7Im5hbWUiOiJhbGwgYnJhbmNoZXMsIGV4Y2x1ZGluZyBwdWxscmVxdWVzdHMiLCJwYXR0ZXJuIjoiW15wclxcLV0qLyoiLCJsYXRlc3RQdWxsZWQiOjN9LHsibmFtZSI6InB1bGxyZXF1ZXN0cyIsInBhdHRlcm4iOiJwci0qIiwibGF0ZXN0UHVsbGVkIjoxfV0sInNjaGVkdWxlIjoiMyAzICogKiAzIn19fQ==\"
},
\"key\":\"deploytarget:harborpolicy:update\",
\"environment\":{
\"name\":\"main\",
\"openshiftProjectName\":\"nginx-example-main\"
},
\"project\":{
\"name\":\"nginx-example\"
},
\"advancedTask\":{}
}",
"payload_encoding":"string"
}



1 change: 1 addition & 0 deletions test/e2e/testdata/lagoon-build-1m5zypx.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ spec:
project:
name: nginx-example
environment: main
id: 1
organization:
id: 123
name: test-org
Expand Down
1 change: 1 addition & 0 deletions test/e2e/testdata/lagoon-build-7m5zypx.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ spec:
gitReference: origin/main
project:
name: nginx-example
id: 1
environment: main
uiLink: https://dashboard.amazeeio.cloud/projects/project/project-environment/deployments/lagoon-build-7m5zypx
routerPattern: 'main-nginx-example'
Expand Down
1 change: 1 addition & 0 deletions test/e2e/testdata/lagoon-build-8m5zypx.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ spec:
project:
name: nginx-example
environment: main
id: 1
organization:
id: 123
name: test-org
Expand Down
5 changes: 5 additions & 0 deletions test/e2e/testdata/lagoon-build-9m5zypx.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,11 @@
\"gitReference\": \"origin\/main\",
\"project\": {
\"name\": \"nginx-example\",
\"id\": 1,
\"organization\": {
\"id\": 123,
\"name\": \"test-org\"
},
\"environment\": \"main\",
\"uiLink\": \"https:\/\/dashboard.amazeeio.cloud\/projects\/project\/project-environment\/deployments\/lagoon-build-9m5zypx\",
\"routerPattern\": \"main-nginx-example\",
Expand Down
20 changes: 20 additions & 0 deletions test/e2e/testdata/remove-retention-policy.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{"properties":{"delivery_mode":2},"routing_key":"ci-local-controller-kubernetes:misc",
"payload":"{
\"misc\":{
\"miscResource\":\"eyJ0eXBlIjoiaGFyYm9yUmV0ZW50aW9uUG9saWN5IiwiZXZlbnRUeXBlIjoicmVtb3ZlUG9saWN5IiwiZGF0YSI6eyJwcm9qZWN0Ijp7ImlkIjoxLCJuYW1lIjoibmdpbngtZXhhbXBsZSJ9fX0=\"
},
\"key\":\"deploytarget:harborpolicy:update\",
\"environment\":{
\"name\":\"main\",
\"openshiftProjectName\":\"nginx-example-main\"
},
\"project\":{
\"name\":\"nginx-example\"
},
\"advancedTask\":{}
}",
"payload_encoding":"string"
}



Loading

0 comments on commit c132907

Please sign in to comment.