[bitnami/contour-operator] Adapt ginkgo tests for non-GKE (#15138)

* [bitnami/contour-operator] Adapt ginkgo tests for non-GKE

Signed-off-by: FraPazGal <fdepaz@vmware.com>

* Update runtime params

Signed-off-by: FraPazGal <fdepaz@vmware.com>

* Apply suggestions and trigger VIB

Signed-off-by: FraPazGal <fdepaz@vmware.com>

* Fix tests structure

Signed-off-by: FraPazGal <fdepaz@vmware.com>

* Remove VIB trigger

Signed-off-by: FraPazGal <fdepaz@vmware.com>

---------

Signed-off-by: FraPazGal <fdepaz@vmware.com>
This commit is contained in:
Francisco de Paz Galan
2023-03-02 13:18:31 +01:00
committed by GitHub
parent 329d4172e6
commit 7132efcd82
5 changed files with 275 additions and 97 deletions

View File

@@ -1,62 +0,0 @@
package integration
import (
"context"
"fmt"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
netv1 "k8s.io/api/networking/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
cv1 "k8s.io/client-go/kubernetes/typed/core/v1"
netcv1 "k8s.io/client-go/kubernetes/typed/networking/v1"
// For client auth plugins
_ "k8s.io/client-go/plugin/pkg/client/auth"
)
var _ = Describe("Contour Operator:", func() {
var netclient netcv1.NetworkingV1Interface
var coreclient cv1.CoreV1Interface
var ctx context.Context
BeforeEach(func() {
netclient = netcv1.NewForConfigOrDie(clusterConfigOrDie())
coreclient = cv1.NewForConfigOrDie(clusterConfigOrDie())
ctx = context.Background()
})
Context("When both operator and testing resources are deployed", func() {
var testingIngress *netv1.Ingress
const contourNs = "projectcontour"
var err error
BeforeEach(func() {
testingIngress, err = netclient.Ingresses(*namespace).Get(ctx, *ingressName, metav1.GetOptions{})
if err != nil {
panic(fmt.Sprintf("There was an error retrieving the %q Ingress resource: %q", *ingressName, err))
}
})
It("the operator manages the contour resource", func() {
controllerPods := getPodsByLabelOrDie(ctx, coreclient, "app.kubernetes.io/component=contour-operator")
containerLogs := getContainerLogsOrDie(ctx, coreclient, controllerPods.Items[0].GetName(), "contour-operator")
Expect(containsString(containerLogs, *contourName)).To(BeTrue())
})
It("the ingress' asigned IP is the same as the one used by the envoy service", func() {
envoySvc, err := coreclient.Services(contourNs).Get(ctx, "envoy", metav1.GetOptions{})
if err != nil {
panic(fmt.Sprintf("There was an error retrieving the envoy service: %q", err))
}
Expect(testingIngress.Status.LoadBalancer.Ingress[0].IP).To(Equal(envoySvc.Status.LoadBalancer.Ingress[0].IP))
})
It("the ingress' asigned IP resolves to the testing deployment", func() {
responseBody := getResponseBodyOrDie(ctx, "http://"+testingIngress.Status.LoadBalancer.Ingress[0].IP)
Expect(containsString(responseBody, "kuard")).To(BeTrue())
})
})
})

View File

@@ -0,0 +1,97 @@
package integration
import (
"context"
"fmt"
"time"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/dynamic"
cv1 "k8s.io/client-go/kubernetes/typed/core/v1"
netcv1 "k8s.io/client-go/kubernetes/typed/networking/v1"
// For client auth plugins
_ "k8s.io/client-go/plugin/pkg/client/auth"
)
var _ = Describe("Contour Operator:", func() {
Context("When both operator and testing resources are deployed", Ordered, func() {
var netclient netcv1.NetworkingV1Interface
var coreclient cv1.CoreV1Interface
var dynamicClient dynamic.Interface
var envoySvc *v1.Service
var ctx context.Context
var err error
const contourName = "contour-crd-vib"
const ingressName = "contour-ing-vib"
BeforeAll(func() {
var ingressHost string
var hasIP, isReady bool
netclient = netcv1.NewForConfigOrDie(clusterConfigOrDie())
coreclient = cv1.NewForConfigOrDie(clusterConfigOrDie())
dynamicClient = dynamic.NewForConfigOrDie(clusterConfigOrDie())
ctx = context.Background()
// The tests evaluate the Operator by deploying both Contour and Ingress resources.
// Their creation takes some time, so they will be deployed once and reused across the different checks.
createContourResourceOrDie(ctx, dynamicClient, contourName)
isReady, err = retry("isContourReady", 10, 30*time.Second, func() (bool, error) {
return isContourReady(ctx, dynamicClient, contourName)
})
Expect(isReady).To(BeTrue())
hasIP, err = retry("isServiceReady", 10, 30*time.Second, func() (bool, error) {
return isServiceReady(ctx, coreclient, "envoy")
})
if err != nil {
panic(fmt.Sprintf("There was an error checking whether the testing Envoy service had an IP assigned: %q", err))
}
Expect(hasIP).To(BeTrue())
envoySvc, err = coreclient.Services(*namespace).Get(ctx, "envoy", metav1.GetOptions{})
if err != nil {
panic(fmt.Sprintf("There was an error retrieving the Envoy service created by contour: %q", err))
}
// AWS based clusters will use a host instead of an IP for the svc address
ingressHost = returnValidHost(envoySvc.Status.LoadBalancer.Ingress[0])
createIngressOrDie(ctx, netclient, ingressName, ingressHost)
// Once created, the operator has to assign an IP to the managed ingress
hasIP, err = retry("isIngressReady", 10, 30*time.Second, func() (bool, error) {
return isIngressReady(ctx, netclient, ingressName)
})
if err != nil {
panic(fmt.Sprintf("There was an error checking whether the testing ingress had a host assigned: %q", err))
}
Expect(hasIP).To(BeTrue())
})
It("the operator manages the contour resource", func() {
controllerPods := getPodsByLabelOrDie(ctx, coreclient, "app.kubernetes.io/component=contour-operator")
containerLogs := getContainerLogsOrDie(ctx, coreclient, controllerPods.Items[0].GetName(), "contour-operator")
Expect(containsString(containerLogs, contourName)).To(BeTrue())
})
It("the ingress' asigned IP is the same as the one used by the envoy service", func() {
testingIngress, err := netclient.Ingresses(*namespace).Get(ctx, ingressName, metav1.GetOptions{})
if err != nil {
panic(fmt.Sprintf("There was an error retrieving the %q Ingress resource: %q", ingressName, err))
}
Expect(returnValidHost(testingIngress.Status.LoadBalancer.Ingress[0])).To(Equal(returnValidHost(envoySvc.Status.LoadBalancer.Ingress[0])))
})
AfterAll(func() {
// No need to panic here if failed, the cluster is expected to clean up with the undeployment
dynamicClient.Resource(contourType).Namespace(*namespace).Delete(ctx, contourName, metav1.DeleteOptions{})
netclient.Ingresses(*namespace).Delete(ctx, ingressName, metav1.DeleteOptions{})
})
})
})

View File

@@ -6,13 +6,18 @@ import (
"flag"
"fmt"
"io"
"net/http"
"strings"
"testing"
"time"
v1 "k8s.io/api/core/v1"
netv1 "k8s.io/api/networking/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/dynamic"
cv1 "k8s.io/client-go/kubernetes/typed/core/v1"
netcv1 "k8s.io/client-go/kubernetes/typed/networking/v1"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
@@ -27,8 +32,10 @@ const APP_NAME = "Contour Operator"
var kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
var namespace = flag.String("namespace", "", "namespace where the resources are deployed")
var contourName = flag.String("contour-crd-name", "", "name of the contour resource")
var ingressName = flag.String("ingress-name", "", "resource name of the testing ingress")
var svcName = flag.String("service-name", "", "service name used to serve the apache deployment")
var secretName = flag.String("secret-name", "", "secret name with TLS certs")
var contourType = schema.GroupVersionResource{Group: "operator.projectcontour.io", Version: "v1alpha1", Resource: "contours"}
func clusterConfigOrDie() *rest.Config {
var config *rest.Config
@@ -46,6 +53,115 @@ func clusterConfigOrDie() *rest.Config {
return config
}
func createIngressOrDie(ctx context.Context, c netcv1.NetworkingV1Interface, name string, ingressRuleHost string) {
var pathType netv1.PathType = "Prefix"
ingressRuleValue := netv1.IngressRuleValue{
HTTP: &netv1.HTTPIngressRuleValue{
Paths: []netv1.HTTPIngressPath{
{
Path: "/",
PathType: &pathType,
Backend: netv1.IngressBackend{
Service: &netv1.IngressServiceBackend{
Name: *svcName,
Port: netv1.ServiceBackendPort{
Number: int32(80),
},
},
},
},
},
},
}
ingress := &netv1.Ingress{
ObjectMeta: metav1.ObjectMeta{
Namespace: *namespace,
Name: name,
Annotations: map[string]string{
"kubernetes.io/ingress.class": "contour",
},
},
Spec: netv1.IngressSpec{
TLS: []netv1.IngressTLS{
{
Hosts: []string{
ingressRuleHost,
},
SecretName: *secretName,
},
},
Rules: []netv1.IngressRule{
{
Host: ingressRuleHost,
IngressRuleValue: ingressRuleValue,
},
},
DefaultBackend: &netv1.IngressBackend{
Service: &netv1.IngressServiceBackend{
Name: *svcName,
Port: netv1.ServiceBackendPort{
Number: int32(80),
},
},
},
},
}
result, err := c.Ingresses(*namespace).Create(ctx, ingress, metav1.CreateOptions{})
if err != nil {
panic(err.Error())
}
fmt.Printf("Created ingress %q.\n", result.GetObjectMeta().GetName())
}
func createContourResourceOrDie(ctx context.Context, dC dynamic.Interface, name string) *unstructured.Unstructured {
payload := &unstructured.Unstructured{
Object: map[string]interface{}{
"apiVersion": "operator.projectcontour.io/v1alpha1",
"kind": "Contour",
"metadata": map[string]interface{}{
"name": name,
},
"spec": map[string]interface{}{
"namespace": map[string]interface{}{
"name": *namespace,
},
},
},
}
res, err := dC.Resource(contourType).Namespace(*namespace).Create(ctx, payload, metav1.CreateOptions{})
if err != nil {
panic(fmt.Sprintf("There was an error creating the Contour object: %s", err))
}
return res
}
func isContourReady(ctx context.Context, dC dynamic.Interface, name string) (bool, error) {
var err error
contour, err := dC.Resource(contourType).Namespace(*namespace).Get(ctx, name, metav1.GetOptions{})
if err != nil {
fmt.Printf("There was an error obtaining the Contour object %q", name)
return false, err
}
conditions, found, err := unstructured.NestedSlice(contour.Object, "status", "conditions")
if !found {
fmt.Printf("Status conditions for Contour %q were not found", name)
return false, err
}
mostRecentConditionUpdate := conditions[len(conditions)-1]
conditionToMap, conversionOk := mostRecentConditionUpdate.(map[string]interface{})
if !conversionOk {
return false, fmt.Errorf("Error converting last Contour condition to type map[string]interface{}; got %T", conditionToMap)
}
return conditionToMap["type"] == "Available" && conditionToMap["status"] == "True", nil
}
func getPodsByLabelOrDie(ctx context.Context, c cv1.PodsGetter, selector string) v1.PodList {
output, err := c.Pods(*namespace).List(ctx, metav1.ListOptions{
@@ -85,28 +201,6 @@ func getContainerLogsOrDie(ctx context.Context, c cv1.PodsGetter, podName string
return output
}
func getResponseBodyOrDie(ctx context.Context, address string) []string {
var output []string
var client http.Client
resp, err := client.Get(address)
if err != nil {
panic(fmt.Sprintf("There was an error during the GET request: %q", err))
}
defer resp.Body.Close()
if resp.StatusCode == http.StatusOK {
scanner := bufio.NewScanner(interruptableReader{ctx, resp.Body})
for scanner.Scan() {
output = append(output, scanner.Text())
}
if scanner.Err() != nil {
panic(scanner.Err())
}
}
return output
}
type interruptableReader struct {
ctx context.Context
r io.Reader
@@ -123,6 +217,55 @@ func (r interruptableReader) Read(p []byte) (int, error) {
return n, r.ctx.Err()
}
func isServiceReady(ctx context.Context, c cv1.CoreV1Interface, resourceName string) (bool, error) {
var err error
netResource, err := c.Services(*namespace).Get(ctx, resourceName, metav1.GetOptions{})
if netResource != nil && len(netResource.Status.LoadBalancer.Ingress) > 0 {
return true, err
} else {
return false, err
}
}
func isIngressReady(ctx context.Context, c netcv1.NetworkingV1Interface, resourceName string) (bool, error) {
var err error
netResource, err := c.Ingresses(*namespace).Get(ctx, resourceName, metav1.GetOptions{})
if netResource != nil && len(netResource.Status.LoadBalancer.Ingress) > 0 {
return true, err
} else {
return false, err
}
}
func returnValidHost(ingress v1.LoadBalancerIngress) string {
if ingress.IP != "" {
return ingress.IP + ".nip.io"
} else if ingress.Hostname != "" {
return ingress.Hostname
} else {
panic("No valid host found for the provided ingress")
}
}
func retry(name string, attempts int, sleep time.Duration, f func() (bool, error)) (res bool, err error) {
for i := 0; i < attempts; i++ {
fmt.Printf("[retriable] operation %q executing now [attempt %d/%d]\n", name, (i + 1), attempts)
res, err = f()
if res {
fmt.Printf("[retriable] operation %q succedeed [attempt %d/%d]\n", name, (i + 1), attempts)
return res, err
}
fmt.Printf("[retriable] operation %q failed, sleeping for %q now...\n", name, sleep)
time.Sleep(sleep)
}
fmt.Printf("[retriable] operation %q failed [attempt %d/%d]\n", name, attempts, attempts)
return res, err
}
func containsString(haystack []string, needle string) bool {
for _, s := range haystack {
if strings.Contains(s, needle) {
@@ -136,11 +279,11 @@ func CheckRequirements() {
if *namespace == "" {
panic(fmt.Sprintf("The namespace where %s is deployed must be provided. Use the '--namespace' flag", APP_NAME))
}
if *contourName == "" {
panic("The name of the contour resource must be provided. Use the '--contour-crd-name' flag")
if *svcName == "" {
panic(fmt.Sprintln("The testing service name used to serve the apache deployment must be provided. Use the '--service-name' flag"))
}
if *ingressName == "" {
panic("The resource name of the testing ingress must be provided. Use the '--ingress-name' flag")
if *secretName == "" {
panic(fmt.Sprintln("The testing secret name with TLS certs must be provided. Use the '--secret-name' flag"))
}
}

View File

@@ -22,7 +22,7 @@
"url": "{SHA_ARCHIVE}",
"path": "/bitnami/contour-operator"
},
"runtime_parameters": "ZXh0cmFEZXBsb3k6Ci0gYXBpVmVyc2lvbjogb3BlcmF0b3IucHJvamVjdGNvbnRvdXIuaW8vdjFhbHBoYTEKICBraW5kOiBDb250b3VyCiAgbWV0YWRhdGE6CiAgICBuYW1lOiBjb250b3VyLWNyZC12aWIKICBzcGVjOiB7fQotIGFwaVZlcnNpb246IGFwcHMvdjEKICBraW5kOiBEZXBsb3ltZW50CiAgbWV0YWRhdGE6CiAgICBsYWJlbHM6CiAgICAgIGFwcDoga3VhcmQKICAgIG5hbWU6IGt1YXJkCiAgc3BlYzoKICAgIHJlcGxpY2FzOiAxCiAgICBzZWxlY3RvcjoKICAgICAgbWF0Y2hMYWJlbHM6CiAgICAgICAgYXBwOiBrdWFyZAogICAgdGVtcGxhdGU6CiAgICAgIG1ldGFkYXRhOgogICAgICAgIGxhYmVsczoKICAgICAgICAgIGFwcDoga3VhcmQKICAgICAgc3BlYzoKICAgICAgICBjb250YWluZXJzOgogICAgICAgIC0gaW1hZ2U6IGdjci5pby9rdWFyLWRlbW8va3VhcmQtYW1kNjQ6MQogICAgICAgICAgbmFtZToga3VhcmQKLSBhcGlWZXJzaW9uOiB2MQogIGtpbmQ6IFNlcnZpY2UKICBtZXRhZGF0YToKICAgIGxhYmVsczoKICAgICAgYXBwOiBrdWFyZAogICAgbmFtZToga3VhcmQKICBzcGVjOgogICAgcG9ydHM6CiAgICAtIHBvcnQ6IDgwCiAgICAgIHByb3RvY29sOiBUQ1AKICAgICAgdGFyZ2V0UG9ydDogODA4MAogICAgc2VsZWN0b3I6CiAgICAgIGFwcDoga3VhcmQKICAgIHNlc3Npb25BZmZpbml0eTogTm9uZQogICAgdHlwZTogQ2x1c3RlcklQCi0gYXBpVmVyc2lvbjogbmV0d29ya2luZy5rOHMuaW8vdjEKICBraW5kOiBJbmdyZXNzCiAgbWV0YWRhdGE6CiAgICBuYW1lOiBjb250b3VyLW9wLXZpYi10ZXN0CiAgICBsYWJlbHM6CiAgICAgIGFwcDoga3VhcmQKICBzcGVjOgogICAgZGVmYXVsdEJhY2tlbmQ6CiAgICAgIHNlcnZpY2U6CiAgICAgICAgbmFtZToga3VhcmQKICAgICAgICBwb3J0OgogICAgICAgICAgbnVtYmVyOiA4MA==",
"runtime_parameters": "ZXh0cmFEZXBsb3k6Ci0gfAogIHt7LSAkY2EgOj0gZ2VuQ0EgImNvbnRvdXItY2EiIDM2NSB9fQogIHt7LSAkY29udG91cl9ob3N0bmFtZSA6PSAiY29udG91ciIgfX0KICB7ey0gJGNvbnRvdXJfY2VydCA6PSBnZW5TaWduZWRDZXJ0ICRjb250b3VyX2hvc3RuYW1lIG5pbCAobGlzdCAkY29udG91cl9ob3N0bmFtZSkgMzY1ICRjYSB9fQogIGFwaVZlcnNpb246IHYxCiAga2luZDogU2VjcmV0CiAgbWV0YWRhdGE6CiAgICAjIE9ubHkgbmVjZXNzYXJ5IGZvciB0aGUgaW5ncmVzcyB0byBlbmFibGUgSFRUUFMgcG9ydHMKICAgIG5hbWU6IGZha2UtdGxzLWNlcnRpZmljYXRlcwogICAgbmFtZXNwYWNlOiB7eyBpbmNsdWRlICJjb21tb24ubmFtZXMubmFtZXNwYWNlIiAkIHwgcXVvdGUgfX0KICB0eXBlOiBrdWJlcm5ldGVzLmlvL3RscwogIGRhdGE6CiAgICB0bHMuY3J0OiB7eyAkY29udG91cl9jZXJ0LkNlcnQgfCBiNjRlbmMgfCBxdW90ZSB9fQogICAgdGxzLmtleToge3sgJGNvbnRvdXJfY2VydC5LZXkgfCBiNjRlbmMgfCBxdW90ZSB9fQogICAgY2EuY3J0OiB7eyAkY2EuQ2VydCB8IGI2NGVuYyB8IHF1b3RlIH19CiAgLS0tCiAgYXBpVmVyc2lvbjogYXBwcy92MQogIGtpbmQ6IERlcGxveW1lbnQKICBtZXRhZGF0YToKICAgIGxhYmVsczoKICAgICAgYXBwOiBhcGFjaGUKICAgIG5hbWU6IGFwYWNoZQogIHNwZWM6CiAgICByZXBsaWNhczogMQogICAgc2VsZWN0b3I6CiAgICAgIG1hdGNoTGFiZWxzOgogICAgICAgIGFwcDogYXBhY2hlCiAgICB0ZW1wbGF0ZToKICAgICAgbWV0YWRhdGE6CiAgICAgICAgbGFiZWxzOgogICAgICAgICAgYXBwOiBhcGFjaGUKICAgICAgc3BlYzoKICAgICAgICBjb250YWluZXJzOgogICAgICAgIC0gaW1hZ2U6IGRvY2tlci5pby9iaXRuYW1pL2FwYWNoZTpsYXRlc3QKICAgICAgICAgIG5hbWU6IGFwYWNoZQogIC0tLQogIGFwaVZlcnNpb246IHYxCiAga2luZDogU2VydmljZQogIG1ldGFkYXRhOgogICAgbGFiZWxzOgogICAgICBhcHA6IGFwYWNoZQogICAgbmFtZTogYXBhY2hlCiAgc3BlYzoKICAgIHBvcnRzOgogICAgLSBuYW1lOiBodHRwCiAgICAgIHBvcnQ6IDgwCiAgICAgIHByb3RvY29sOiBUQ1AKICAgICAgdGFyZ2V0UG9ydDogODA4MAogICAgLSBuYW1lOiBodHRwcwogICAgICBwb3J0OiA0NDMKICAgICAgcHJvdG9jb2w6IFRDUAogICAgICB0YXJnZXRQb3J0OiA4NDQzCiAgICBzZWxlY3RvcjoKICAgICAgYXBwOiBhcGFjaGUKICAgIHNlc3Npb25BZmZpbml0eTogTm9uZQogICAgdHlwZTogQ2x1c3RlcklQ",
"target_platform": {
"target_platform_id": "{VIB_ENV_ALTERNATIVE_TARGET_PLATFORM}",
"size": {
@@ -41,8 +41,8 @@
"params": {
"kubeconfig": "{{kubeconfig}}",
"namespace": "{{namespace}}",
"contour-crd-name": "contour-crd-vib",
"ingress-name": "contour-op-vib-test"
"service-name": "apache",
"secret-name": "fake-tls-certificates"
}
}
}

View File

@@ -22,7 +22,7 @@
"url": "{SHA_ARCHIVE}",
"path": "/bitnami/contour-operator"
},
"runtime_parameters": "ZXh0cmFEZXBsb3k6Ci0gYXBpVmVyc2lvbjogb3BlcmF0b3IucHJvamVjdGNvbnRvdXIuaW8vdjFhbHBoYTEKICBraW5kOiBDb250b3VyCiAgbWV0YWRhdGE6CiAgICBuYW1lOiBjb250b3VyLWNyZC12aWIKICBzcGVjOiB7fQotIGFwaVZlcnNpb246IGFwcHMvdjEKICBraW5kOiBEZXBsb3ltZW50CiAgbWV0YWRhdGE6CiAgICBsYWJlbHM6CiAgICAgIGFwcDoga3VhcmQKICAgIG5hbWU6IGt1YXJkCiAgc3BlYzoKICAgIHJlcGxpY2FzOiAxCiAgICBzZWxlY3RvcjoKICAgICAgbWF0Y2hMYWJlbHM6CiAgICAgICAgYXBwOiBrdWFyZAogICAgdGVtcGxhdGU6CiAgICAgIG1ldGFkYXRhOgogICAgICAgIGxhYmVsczoKICAgICAgICAgIGFwcDoga3VhcmQKICAgICAgc3BlYzoKICAgICAgICBjb250YWluZXJzOgogICAgICAgIC0gaW1hZ2U6IGdjci5pby9rdWFyLWRlbW8va3VhcmQtYW1kNjQ6MQogICAgICAgICAgbmFtZToga3VhcmQKLSBhcGlWZXJzaW9uOiB2MQogIGtpbmQ6IFNlcnZpY2UKICBtZXRhZGF0YToKICAgIGxhYmVsczoKICAgICAgYXBwOiBrdWFyZAogICAgbmFtZToga3VhcmQKICBzcGVjOgogICAgcG9ydHM6CiAgICAtIHBvcnQ6IDgwCiAgICAgIHByb3RvY29sOiBUQ1AKICAgICAgdGFyZ2V0UG9ydDogODA4MAogICAgc2VsZWN0b3I6CiAgICAgIGFwcDoga3VhcmQKICAgIHNlc3Npb25BZmZpbml0eTogTm9uZQogICAgdHlwZTogQ2x1c3RlcklQCi0gYXBpVmVyc2lvbjogbmV0d29ya2luZy5rOHMuaW8vdjEKICBraW5kOiBJbmdyZXNzCiAgbWV0YWRhdGE6CiAgICBuYW1lOiBjb250b3VyLW9wLXZpYi10ZXN0CiAgICBsYWJlbHM6CiAgICAgIGFwcDoga3VhcmQKICBzcGVjOgogICAgZGVmYXVsdEJhY2tlbmQ6CiAgICAgIHNlcnZpY2U6CiAgICAgICAgbmFtZToga3VhcmQKICAgICAgICBwb3J0OgogICAgICAgICAgbnVtYmVyOiA4MA==",
"runtime_parameters": "ZXh0cmFEZXBsb3k6Ci0gfAogIHt7LSAkY2EgOj0gZ2VuQ0EgImNvbnRvdXItY2EiIDM2NSB9fQogIHt7LSAkY29udG91cl9ob3N0bmFtZSA6PSAiY29udG91ciIgfX0KICB7ey0gJGNvbnRvdXJfY2VydCA6PSBnZW5TaWduZWRDZXJ0ICRjb250b3VyX2hvc3RuYW1lIG5pbCAobGlzdCAkY29udG91cl9ob3N0bmFtZSkgMzY1ICRjYSB9fQogIGFwaVZlcnNpb246IHYxCiAga2luZDogU2VjcmV0CiAgbWV0YWRhdGE6CiAgICAjIE9ubHkgbmVjZXNzYXJ5IGZvciB0aGUgaW5ncmVzcyB0byBlbmFibGUgSFRUUFMgcG9ydHMKICAgIG5hbWU6IGZha2UtdGxzLWNlcnRpZmljYXRlcwogICAgbmFtZXNwYWNlOiB7eyBpbmNsdWRlICJjb21tb24ubmFtZXMubmFtZXNwYWNlIiAkIHwgcXVvdGUgfX0KICB0eXBlOiBrdWJlcm5ldGVzLmlvL3RscwogIGRhdGE6CiAgICB0bHMuY3J0OiB7eyAkY29udG91cl9jZXJ0LkNlcnQgfCBiNjRlbmMgfCBxdW90ZSB9fQogICAgdGxzLmtleToge3sgJGNvbnRvdXJfY2VydC5LZXkgfCBiNjRlbmMgfCBxdW90ZSB9fQogICAgY2EuY3J0OiB7eyAkY2EuQ2VydCB8IGI2NGVuYyB8IHF1b3RlIH19CiAgLS0tCiAgYXBpVmVyc2lvbjogYXBwcy92MQogIGtpbmQ6IERlcGxveW1lbnQKICBtZXRhZGF0YToKICAgIGxhYmVsczoKICAgICAgYXBwOiBhcGFjaGUKICAgIG5hbWU6IGFwYWNoZQogIHNwZWM6CiAgICByZXBsaWNhczogMQogICAgc2VsZWN0b3I6CiAgICAgIG1hdGNoTGFiZWxzOgogICAgICAgIGFwcDogYXBhY2hlCiAgICB0ZW1wbGF0ZToKICAgICAgbWV0YWRhdGE6CiAgICAgICAgbGFiZWxzOgogICAgICAgICAgYXBwOiBhcGFjaGUKICAgICAgc3BlYzoKICAgICAgICBjb250YWluZXJzOgogICAgICAgIC0gaW1hZ2U6IGRvY2tlci5pby9iaXRuYW1pL2FwYWNoZTpsYXRlc3QKICAgICAgICAgIG5hbWU6IGFwYWNoZQogIC0tLQogIGFwaVZlcnNpb246IHYxCiAga2luZDogU2VydmljZQogIG1ldGFkYXRhOgogICAgbGFiZWxzOgogICAgICBhcHA6IGFwYWNoZQogICAgbmFtZTogYXBhY2hlCiAgc3BlYzoKICAgIHBvcnRzOgogICAgLSBuYW1lOiBodHRwCiAgICAgIHBvcnQ6IDgwCiAgICAgIHByb3RvY29sOiBUQ1AKICAgICAgdGFyZ2V0UG9ydDogODA4MAogICAgLSBuYW1lOiBodHRwcwogICAgICBwb3J0OiA0NDMKICAgICAgcHJvdG9jb2w6IFRDUAogICAgICB0YXJnZXRQb3J0OiA4NDQzCiAgICBzZWxlY3RvcjoKICAgICAgYXBwOiBhcGFjaGUKICAgIHNlc3Npb25BZmZpbml0eTogTm9uZQogICAgdHlwZTogQ2x1c3RlcklQ",
"target_platform": {
"target_platform_id": "{VIB_ENV_ALTERNATIVE_TARGET_PLATFORM}",
"size": {
@@ -41,8 +41,8 @@
"params": {
"kubeconfig": "{{kubeconfig}}",
"namespace": "{{namespace}}",
"contour-crd-name": "contour-crd-vib",
"ingress-name": "contour-op-vib-test"
"service-name": "apache",
"secret-name": "fake-tls-certificates"
}
}
}