diff --git a/test/conformance/helpers/channel_status_subscriber_test_helper.go b/test/conformance/helpers/channel_status_subscriber_test_helper.go index 0e982c8c6f5..a928f7af9c4 100644 --- a/test/conformance/helpers/channel_status_subscriber_test_helper.go +++ b/test/conformance/helpers/channel_status_subscriber_test_helper.go @@ -56,7 +56,7 @@ func channelHasRequiredSubscriberStatus(st *testing.T, client *lib.Client, chann client.CreateChannelOrFail(channelName, &channel) client.WaitForResourceReadyOrFail(channelName, &channel) - pod := resources.EventDetailsPod(subscriberServiceName + "-pod") + pod := resources.EventRecordPod(subscriberServiceName + "-pod") client.CreatePodOrFail(pod, lib.WithService(subscriberServiceName)) subscription := client.CreateSubscriptionOrFail( diff --git a/test/e2e/helpers/performance_image_test_helper.go b/test/e2e/helpers/performance_image_test_helper.go deleted file mode 100644 index ebec929608c..00000000000 --- a/test/e2e/helpers/performance_image_test_helper.go +++ /dev/null @@ -1,154 +0,0 @@ -/* -Copyright 2019 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. -*/ - -package helpers - -import ( - "fmt" - "regexp" - "strconv" - "testing" - - "knative.dev/eventing/test/lib" - "knative.dev/eventing/test/lib/duck" - "knative.dev/eventing/test/lib/resources" - - corev1 "k8s.io/api/core/v1" - rbacv1 "k8s.io/api/rbac/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - pkgtest "knative.dev/pkg/test" -) - -func SetupPerformanceImageRBAC(client *lib.Client) { - client.CreateServiceAccountOrFail(resources.PerfServiceAccount) - client.CreateClusterRoleOrFail(&rbacv1.ClusterRole{ - ObjectMeta: metav1.ObjectMeta{ - Name: "perf-eventing-list-pods", - }, - Rules: []rbacv1.PolicyRule{{ - APIGroups: []string{""}, - Verbs: []string{"get", "watch", "list"}, - Resources: []string{"nodes", "pods"}, - }}, - }) - client.CreateClusterRoleBindingOrFail(resources.PerfServiceAccount, "perf-eventing-list-pods", "perf-eventing-list-pods") -} - -var sentEventsRegex = regexp.MustCompile("Sent count: ([0-9.,]+)") -var acceptedEventsRegex = regexp.MustCompile("Accepted count: ([0-9.,]+)") -var receivedEventsRegex = regexp.MustCompile("Received count: ([0-9.,]+)") -var publishFailuresEventsRegex = regexp.MustCompile("Publish failure count: ([0-9.,]+)") -var deliveryFailuresEventsRegex = regexp.MustCompile("Delivery failure count: ([0-9.,]+)") - -type PerformanceImageResults struct { - SentEvents uint64 - AcceptedEvents uint64 - ReceivedEvents uint64 - PublishFailuresEvents uint64 - DeliveryFailuresEvents uint64 -} - -func getLogCount(log string, regex *regexp.Regexp) (uint64, error) { - countUnparsed := regex.FindAllStringSubmatch(log, 1) - if len(countUnparsed) == 0 { - return 0, fmt.Errorf("no match for regex %s in log %s", regex.String(), log) - } - - count, err := strconv.ParseUint(countUnparsed[0][1], 10, 64) - if err != nil { - return 0, err - } - - return count, nil -} - -func parseLog(log string) (*PerformanceImageResults, error) { - sentEvents, err := getLogCount(log, sentEventsRegex) - if err != nil { - return nil, err - } - acceptedEvents, err := getLogCount(log, acceptedEventsRegex) - if err != nil { - return nil, err - } - receivedEvents, err := getLogCount(log, receivedEventsRegex) - if err != nil { - return nil, err - } - publishFailuresEvents, err := getLogCount(log, publishFailuresEventsRegex) - if err != nil { - return nil, err - } - deliveryFailuresEvents, err := getLogCount(log, deliveryFailuresEventsRegex) - if err != nil { - return nil, err - } - - return &PerformanceImageResults{ - sentEvents, - acceptedEvents, - receivedEvents, - publishFailuresEvents, - deliveryFailuresEvents, - }, nil -} - -// This function setups RBAC, services and aggregator pod. It DOESN'T setup channel, broker nor sender and receiver pod(s). The setup of these resources MUST be done inside `setupEnv` function -func TestWithPerformanceImage(st *testing.T, expectedAggregatorRecords int, setupEnv func(t *testing.T, consumerHostname string, aggregatorHostname string, client *lib.Client), assertResults func(*testing.T, *PerformanceImageResults)) { - client := lib.Setup(st, true) - defer lib.TearDown(client) - - // RBAC - SetupPerformanceImageRBAC(client) - - // Services - aggregatorService := client.CreateServiceOrFail(resources.PerformanceAggregatorService()) - consumerService := client.CreateServiceOrFail(resources.PerformanceConsumerService()) - - // Aggregator - client.CreatePodOrFail(resources.PerformanceImageAggregatorPod(expectedAggregatorRecords, false)) - - // Call user function to setup the test - setupEnv(st, duck.GetServiceHostname(consumerService), duck.GetServiceHostname(aggregatorService), client) - - // Wait for everything ready in test namespace - client.WaitForAllTestResourcesReadyOrFail() - - // Wait for aggregator pod to finish - err := pkgtest.WaitForPodState(client.Kube, func(pod *corev1.Pod) (b bool, e error) { - if pod.Status.Phase == corev1.PodFailed { - return true, fmt.Errorf("aggregator pod failed with message %s", pod.Status.Message) - } else if pod.Status.Phase != corev1.PodSucceeded { - return false, nil - } - return true, nil - }, "perf-aggregator", client.Namespace) - if err != nil { - st.Fatal(err) - } - - aggregatorLog, err := client.GetLog("perf-aggregator") - if err != nil { - st.Fatal(err) - } - - results, err := parseLog(aggregatorLog) - if err != nil { - st.Fatal(err) - } - - assertResults(st, results) -} diff --git a/test/lib/cloudevents.go b/test/lib/cloudevents.go deleted file mode 100644 index 2162ccef421..00000000000 --- a/test/lib/cloudevents.go +++ /dev/null @@ -1,21 +0,0 @@ -/* -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. -*/ -package lib - -const ( - DefaultEventSource = "http://knative.test" - DefaultEventType = "dev.knative.test.event" -) diff --git a/test/lib/cloudevents/cloud_events.go b/test/lib/cloudevents/cloud_events.go deleted file mode 100644 index 544afd9bc70..00000000000 --- a/test/lib/cloudevents/cloud_events.go +++ /dev/null @@ -1,96 +0,0 @@ -/* -Copyright 2019 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. -*/ - -package cloudevents - -import ( - ce "github.com/cloudevents/sdk-go" - "github.com/cloudevents/sdk-go/pkg/cloudevents/types" -) - -// CloudEvent related constants. -const ( - DefaultEncoding = ce.Binary - DefaultSource = "http://knative.test" - DefaultType = "dev.knative.test.event" -) - -// CloudEvent specifies the arguments for a CloudEvent used as input to create a new container in test. -type CloudEvent struct { - ce.EventContextV1 // use cloud events v1 context - Data string // must be in json format - Encoding string // binary or structured -} - -// Option enables further configuration of a CloudEvent. -type Option func(*CloudEvent) - -// WithType returns an option that changes the id for the given CloudEvent. -func WithID(id string) Option { - return func(c *CloudEvent) { - c.ID = id - } -} - -// WithSource returns an option that changes the source for the given CloudEvent. -func WithSource(eventSource string) Option { - return func(c *CloudEvent) { - c.Source = *types.ParseURIRef(eventSource) - } -} - -// WithType returns an option that changes the type for the given CloudEvent. -func WithType(eventType string) Option { - return func(c *CloudEvent) { - c.Type = eventType - } -} - -// WithType returns an option that changes the encoding for the given CloudEvent. -func WithEncoding(encoding string) Option { - return func(c *CloudEvent) { - c.Encoding = encoding - } -} - -// WithExtensions returns an option that changes the extensions for the given CloudEvent. -func WithExtensions(extensions map[string]interface{}) Option { - return func(c *CloudEvent) { - c.Extensions = extensions - } -} - -// New returns a new CloudEvent with most preset default properties. -func New(data string, options ...Option) *CloudEvent { - event := &CloudEvent{ - EventContextV1: ce.EventContextV1{ - Source: *types.ParseURIRef(DefaultSource), - Type: DefaultType, - }, - Data: data, - Encoding: DefaultEncoding, - } - for _, option := range options { - option(event) - } - return event -} - -// BaseData defines a simple struct that can be used as data of a CloudEvent. -type BaseData struct { - Sequence int `json:"id"` - Message string `json:"message"` -} diff --git a/test/lib/config.go b/test/lib/config.go index c1c560e0257..08b49b4efff 100644 --- a/test/lib/config.go +++ b/test/lib/config.go @@ -17,6 +17,8 @@ limitations under the License. package lib import ( + "time" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "knative.dev/eventing/test/lib/resources" @@ -56,3 +58,17 @@ const ( // will persist and be retransmitted when the Pod restarts. FeaturePersistence Feature = "persistence" ) + +const ( + // Default Event values + DefaultEventSource = "http://knative.test" + DefaultEventType = "dev.knative.test.event" + // The interval and timeout used for polling pod logs. + interval = 1 * time.Second + timeout = 4 * time.Minute +) + +// InterestingHeaders is used by logging pods to decide interesting HTTP headers to log +func InterestingHeaders() []string { + return []string{"Traceparent", "X-Custom-Header"} +} diff --git a/test/lib/operation.go b/test/lib/operation.go index 71689a666ee..8eb62320062 100644 --- a/test/lib/operation.go +++ b/test/lib/operation.go @@ -23,7 +23,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" pkgTest "knative.dev/pkg/test" - "knative.dev/eventing/test/lib/cloudevents" "knative.dev/eventing/test/lib/duck" "knative.dev/eventing/test/lib/resources" ) @@ -45,40 +44,6 @@ func (c *Client) LabelNamespace(labels map[string]string) error { return err } -// SendFakeEventToAddressableOrFail will send the given event to the given Addressable. -// Deprecated: you should use SendEventToAddressable -func (c *Client) SendFakeEventToAddressableOrFail( - senderName, - addressableName string, - typemeta *metav1.TypeMeta, - event *cloudevents.CloudEvent, -) { - uri, err := c.GetAddressableURI(addressableName, typemeta) - if err != nil { - c.T.Fatalf("Failed to get the URI for %v-%s", typemeta, addressableName) - } - if err = c.sendFakeEventToAddress(senderName, uri, event); err != nil { - c.T.Fatalf("Failed to send event %v to %s: %v", event, uri, err) - } -} - -// SendFakeEventWithTracingToAddressableOrFail will send the given event with tracing to the given Addressable. -// Deprecated: you should use SendEventToAddressable -func (c *Client) SendFakeEventWithTracingToAddressableOrFail( - senderName, - addressableName string, - typemeta *metav1.TypeMeta, - event *cloudevents.CloudEvent, -) { - uri, err := c.GetAddressableURI(addressableName, typemeta) - if err != nil { - c.T.Fatalf("Failed to get the URI for %v-%s", typemeta, addressableName) - } - if err = c.sendFakeEventWithTracingToAddress(senderName, uri, event); err != nil { - c.T.Fatalf("Failed to send event %v with tracing to %s: %v", event, uri, err) - } -} - // GetAddressableURI returns the URI of the addressable resource. // To use this function, the given resource must have implemented the Addressable duck-type. func (c *Client) GetAddressableURI(addressableName string, typeMeta *metav1.TypeMeta) (string, error) { @@ -91,44 +56,6 @@ func (c *Client) GetAddressableURI(addressableName string, typeMeta *metav1.Type return u.String(), nil } -// sendFakeEventToAddress will create a sender pod, which will send the given event to the given url. -// Deprecated: you should use SendEvent -func (c *Client) sendFakeEventToAddress( - senderName string, - uri string, - event *cloudevents.CloudEvent, -) error { - namespace := c.Namespace - pod, err := resources.EventSenderPod(senderName, uri, event) - if err != nil { - return err - } - c.CreatePodOrFail(pod) - if err := pkgTest.WaitForPodRunning(c.Kube, senderName, namespace); err != nil { - return err - } - return nil -} - -// sendFakeEventWithTracingToAddress will create a sender pod, which will send the given event with tracing to the given url. -// Deprecated: you should use SendEvent -func (c *Client) sendFakeEventWithTracingToAddress( - senderName string, - uri string, - event *cloudevents.CloudEvent, -) error { - namespace := c.Namespace - pod, err := resources.EventSenderTracingPod(senderName, uri, event) - if err != nil { - return err - } - c.CreatePodOrFail(pod) - if err := pkgTest.WaitForPodRunning(c.Kube, senderName, namespace); err != nil { - return err - } - return nil -} - // WaitForResourceReadyOrFail waits for the resource to become ready or fail. // To use this function, the given resource must have implemented the Status duck-type. func (c *Client) WaitForResourceReadyOrFail(name string, typemeta *metav1.TypeMeta) { diff --git a/test/lib/resources/kube.go b/test/lib/resources/kube.go index 288caa34777..2b154fe2b20 100644 --- a/test/lib/resources/kube.go +++ b/test/lib/resources/kube.go @@ -19,7 +19,6 @@ package resources // This file contains functions that construct common Kubernetes resources. import ( - "encoding/json" "fmt" v1 "knative.dev/pkg/apis/duck/v1" @@ -30,8 +29,6 @@ import ( "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/uuid" pkgTest "knative.dev/pkg/test" - - cetest "knative.dev/eventing/test/lib/cloudevents" ) // PodOption enables further configuration of a Pod. @@ -40,79 +37,6 @@ type PodOption func(*corev1.Pod) // Option enables further configuration of a Role. type RoleOption func(*rbacv1.Role) -// EventSenderPod creates a Pod that sends a single event to the given address. -// Deprecated: use sender.EventSenderPod -func EventSenderPod(name string, sink string, event *cetest.CloudEvent) (*corev1.Pod, error) { - return eventSenderPodImage("sendevents", name, sink, event, false) -} - -// EventSenderTracingPod creates a Pod that sends a single event to the given address. -// Deprecated: use sender.EventSenderPod -func EventSenderTracingPod(name string, sink string, event *cetest.CloudEvent) (*corev1.Pod, error) { - return eventSenderPodImage("sendevents", name, sink, event, true) -} - -// Deprecated: use sender.EventSenderPod -func eventSenderPodImage(imageName string, name string, sink string, event *cetest.CloudEvent, addTracing bool) (*corev1.Pod, error) { - if event.Encoding == "" { - event.Encoding = cetest.DefaultEncoding - } - eventExtensionsBytes, err := json.Marshal(event.Extensions) - eventExtensions := string(eventExtensionsBytes) - if err != nil { - return nil, fmt.Errorf("encountered error when we marshall cloud event extensions %v", err) - } - - args := []string{ - "-event-id", - event.ID, - "-event-type", - event.Type, - "-event-source", - event.Source.String(), - "-event-extensions", - eventExtensions, - "-event-data", - event.Data, - "-event-encoding", - event.Encoding, - "-sink", - sink, - } - if addTracing { - args = append(args, "-add-tracing") - } - return &corev1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - }, - Spec: corev1.PodSpec{ - Containers: []corev1.Container{{ - Name: imageName, - Image: pkgTest.ImagePath(imageName), - ImagePullPolicy: corev1.PullAlways, - Args: args, - }}, - // Never restart the event sender Pod. - RestartPolicy: corev1.RestartPolicyNever, - }, - }, nil -} - -// EventLoggerPod creates a Pod that logs events received. -// Deprecated: This test image is gonna be removed soon and you should use EventRecordPod. -// Look at recordevents.StartEventRecordOrFail for more info -func EventLoggerPod(name string) *corev1.Pod { - return eventLoggerPod("logevents", name) -} - -// EventDetailsPod creates a Pod that validates events received and log details about events. -// Deprecated: This test image is gonna be removed soon and you should use EventRecordPod. -// Look at recordevents.StartEventRecordOrFail for more info -func EventDetailsPod(name string) *corev1.Pod { - return eventLoggerPod("eventdetails", name) -} - // EventRecordPod creates a Pod that stores received events for test retrieval. func EventRecordPod(name string) *corev1.Pod { return eventLoggerPod("recordevents", name) @@ -135,35 +59,6 @@ func eventLoggerPod(imageName string, name string) *corev1.Pod { } } -// DeprecatedEventTransformationPod creates a Pod that transforms events received. -// Deprecated: Use EventTransformationPod -// TODO(nlopezgi): remove once other tests that use sdk1 and depend on this method are migrated. -func DeprecatedEventTransformationPod(name string, event *cetest.CloudEvent) *corev1.Pod { - const imageName = "transformevents" - return &corev1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Labels: map[string]string{"e2etest": string(uuid.NewUUID())}, - }, - Spec: corev1.PodSpec{ - Containers: []corev1.Container{{ - Name: imageName, - Image: pkgTest.ImagePath(imageName), - ImagePullPolicy: corev1.PullAlways, - Args: []string{ - "-event-type", - event.Type, - "-event-source", - event.Source.String(), - "-event-data", - event.Data, - }, - }}, - RestartPolicy: corev1.RestartPolicyAlways, - }, - } -} - // EventTransformationPod creates a Pod that transforms events received receiving as arg a cloudevents sdk2 Event func EventTransformationPod(name string, newEventType string, newEventSource string, newEventData []byte) *corev1.Pod { const imageName = "transformevents" diff --git a/test/lib/event_sender.go b/test/lib/send_event.go similarity index 100% rename from test/lib/event_sender.go rename to test/lib/send_event.go diff --git a/test/lib/validation.go b/test/lib/validation.go deleted file mode 100644 index 510fb778005..00000000000 --- a/test/lib/validation.go +++ /dev/null @@ -1,203 +0,0 @@ -/* -Copyright 2019 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. -*/ - -package lib - -import ( - "encoding/json" - "fmt" - "reflect" - "regexp" - "strings" - "time" - - k8serrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/sets" - "k8s.io/apimachinery/pkg/util/wait" -) - -const ( - // The interval and timeout used for polling pod logs. - interval = 1 * time.Second - timeout = 4 * time.Minute -) - -// InterestingHeaders is used by logging pods to decide interesting HTTP headers to log -func InterestingHeaders() []string { - return []string{"Traceparent", "X-Custom-Header"} -} - -// GetLog gets the logs from the given Pod in the namespace of this client. It will get the logs -// from the first container, whichever it is. -func (c *Client) GetLog(podName string) (string, error) { - containerName, err := c.getContainerName(podName, c.Namespace) - if err != nil { - return "", err - } - logs, err := c.Kube.PodLogs(podName, containerName, c.Namespace) - if err != nil { - return "", err - } - return string(logs), nil -} - -// CheckLog waits until logs for the logger Pod satisfy the checker. -// If the checker does not pass within timeout it returns error. -func (c *Client) CheckLog(podName string, checker func(string) bool) error { - return wait.PollImmediate(interval, timeout, func() (bool, error) { - logs, err := c.GetLog(podName) - if err != nil { - return true, err - } - return checker(logs), nil - }) -} - -// CheckLogEmpty waits the given amount of time and check the log is empty -func (c *Client) CheckLogEmpty(podName string, timeout time.Duration) error { - time.Sleep(timeout) - logs, err := c.GetLog(podName) - if err != nil { - return err - } - if logs != "" { - return fmt.Errorf("expected empty log, got %s", logs) - } - return nil -} - -// CheckerContains returns a checker function to check if the log contains the given content. -func CheckerContains(content string) func(string) bool { - return func(log string) bool { - return strings.Contains(log, content) - } -} - -// CheckerContainsAll returns a checker function to check if the log contains all the given contents. -func CheckerContainsAll(contents []string) func(string) bool { - return func(log string) bool { - for _, content := range contents { - if !strings.Contains(log, content) { - return false - } - } - return true - } -} - -// CheckerContainsCount returns a checker function to check if the log contains the count number of given content. -func CheckerContainsCount(content string, count int) func(string) bool { - return func(log string) bool { - return strings.Count(log, content) == count - } -} - -// CheckerContainsAtLeast returns a checker function to check if the log contains at least the count number of given content. -func CheckerContainsAtLeast(content string, count int) func(string) bool { - return func(log string) bool { - return strings.Count(log, content) >= count - } -} - -// FindAnyLogContents attempts to find logs for given Pod/Container that has 'any' of the given contents. -// It returns an error if it couldn't retrieve the logs. In case 'any' of the contents are there, it returns true. -func (c *Client) FindAnyLogContents(podName string, contents []string) (bool, error) { - logs, err := c.GetLog(podName) - if err != nil { - return false, err - } - eventContentsSet, err := parseEventContentsFromPodLogs(logs) - if err != nil { - return false, err - } - for _, content := range contents { - if eventContentsSet.Has(content) { - return true, nil - } - } - return false, nil -} - -// parseEventContentsFromPodLogs extracts the contents of events from a Pod logs -// Example log entry: 2019/08/21 22:46:38 {"msg":"Body-type1-source1--extname1-extval1-extname2-extvalue2","sequence":"1"} -// Use regex to get the event content with json format: {"msg":"Body-type1-source1--extname1-extval1-extname2-extvalue2","sequence":"1"} -// Get the eventContent with key "msg" -// Returns a set with all unique event contents -func parseEventContentsFromPodLogs(logs string) (sets.String, error) { - re := regexp.MustCompile(`{.+}`) - matches := re.FindAllString(logs, -1) - eventContentsSet := sets.String{} - for _, match := range matches { - var matchedLogs map[string]string - err := json.Unmarshal([]byte(match), &matchedLogs) - if err != nil { - return nil, err - } else { - eventContent := matchedLogs["msg"] - eventContentsSet.Insert(eventContent) - } - } - return eventContentsSet, nil -} - -// getContainerName gets name of the first container of the given pod. -// Now our logger pod only contains one single container, and is only used for receiving events and validation. -func (c *Client) getContainerName(podName, namespace string) (string, error) { - pod, err := c.Kube.Kube.CoreV1().Pods(namespace).Get(podName, metav1.GetOptions{}) - if err != nil { - return "", err - } - containerName := pod.Spec.Containers[0].Name - return containerName, nil -} - -// CheckConfigMapsExist will check if copy configmaps exist. -func (c *Client) CheckConfigMapsExist(namespace string, names ...string) error { - return wait.PollImmediate(interval, timeout, func() (bool, error) { - for _, name := range names { - _, err := c.Kube.Kube.CoreV1().ConfigMaps(namespace).Get(name, metav1.GetOptions{}) - if k8serrors.IsNotFound(err) { - return false, nil - } else if err != nil { - return false, err - } - } - return true, nil - }) -} - -// CheckConfigMapsEqual will check if configmaps have the same data as the original one. -func (c *Client) CheckConfigMapsEqual(originalNamespace, cmp string, names ...string) error { - return wait.PollImmediate(interval, timeout, func() (bool, error) { - for _, name := range names { - // Get original configmap - origianlCM, err := c.Kube.Kube.CoreV1().ConfigMaps(originalNamespace).Get(name, metav1.GetOptions{}) - if err != nil { - return false, err - } - // Get copy configmap - copyCM, err := c.Kube.Kube.CoreV1().ConfigMaps(c.Namespace).Get(cmp+"-"+name, metav1.GetOptions{}) - if err != nil { - return false, err - } - if !reflect.DeepEqual(origianlCM.Data, copyCM.Data) { - return false, nil - } - } - return true, nil - }) -} diff --git a/test/test_images/eventdetails/README.md b/test/test_images/eventdetails/README.md deleted file mode 100644 index 94b91b72e5a..00000000000 --- a/test/test_images/eventdetails/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# Event Details Image - -Validates received events and print details for conformance testing. - -## Development - -Can be run without k8s for quick dev testing of code: - -```go -go run knative.dev/eventing/test/test_images/eventdetails -``` - -And use [sendevents](../sendevents) with to get events. diff --git a/test/test_images/eventdetails/main.go b/test/test_images/eventdetails/main.go deleted file mode 100644 index 625b699f57f..00000000000 --- a/test/test_images/eventdetails/main.go +++ /dev/null @@ -1,64 +0,0 @@ -/* -Copyright 2019 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. -*/ - -package main - -import ( - "context" - "fmt" - "log" - - cloudevents "github.com/cloudevents/sdk-go" - "go.uber.org/zap" - - "knative.dev/eventing/pkg/kncloudevents" - "knative.dev/eventing/pkg/tracing" - "knative.dev/eventing/test/lib" -) - -func handler(ctx context.Context, event cloudevents.Event) { - fmt.Printf("Got Event Context: %+v\n", event.Context) - tx := cloudevents.HTTPTransportContextFrom(ctx) - fmt.Printf("Got Transport Context: %+v\n", tx) - fmt.Printf("----------------------------\n") - header := tx.Header - headerNameList := lib.InterestingHeaders() - for _, headerName := range headerNameList { - if headerValue := header.Get(headerName); headerValue != "" { - fmt.Printf("Got Header %s: %s\n", headerName, headerValue) - } else { - fmt.Printf("Missing Header %s\n", headerName) - } - } - if err := event.Validate(); err == nil { - fmt.Printf("eventdetails:\n%s", event.String()) - } else { - log.Printf("error validating the event: %v", err) - } -} - -func main() { - logger, _ := zap.NewDevelopment() - if err := tracing.SetupStaticPublishing(logger.Sugar(), "", tracing.AlwaysSample); err != nil { - log.Fatalf("Unable to setup trace publishing: %v", err) - } - c, err := kncloudevents.NewDefaultClient() - if err != nil { - log.Fatalf("failed to create eventdetails client, %v", err) - } - - log.Fatalf("failed to start eventdetails receiver: %s", c.StartReceiver(context.Background(), handler)) -} diff --git a/test/test_images/eventdetails/pod.yaml b/test/test_images/eventdetails/pod.yaml deleted file mode 100644 index 65cf369fcb4..00000000000 --- a/test/test_images/eventdetails/pod.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: v1 -kind: Pod -metadata: - name: eventdetails -spec: - containers: - - name: eventdetails - image: ko://knative.dev/eventing/test/test_images/eventdetails - diff --git a/test/test_images/logevents/main.go b/test/test_images/logevents/main.go deleted file mode 100644 index cd7411ef0d8..00000000000 --- a/test/test_images/logevents/main.go +++ /dev/null @@ -1,49 +0,0 @@ -/* -Copyright 2019 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. -*/ - -package main - -import ( - "context" - "log" - - cloudevents "github.com/cloudevents/sdk-go" - "go.uber.org/zap" - - "knative.dev/eventing/pkg/kncloudevents" - "knative.dev/eventing/pkg/tracing" -) - -func handler(event cloudevents.Event) { - if err := event.Validate(); err == nil { - log.Printf("%s", event.String()) - } else { - log.Printf("error validating the event: %v", err) - } -} - -func main() { - logger, _ := zap.NewDevelopment() - if err := tracing.SetupStaticPublishing(logger.Sugar(), "", tracing.AlwaysSample); err != nil { - log.Fatalf("Unable to setup trace publishing: %v", err) - } - c, err := kncloudevents.NewDefaultClient() - if err != nil { - log.Fatalf("failed to create client, %v", err) - } - - log.Fatalf("failed to start receiver: %s", c.StartReceiver(context.Background(), handler)) -} diff --git a/test/test_images/logevents/pod.yaml b/test/test_images/logevents/pod.yaml deleted file mode 100644 index 269d53f650f..00000000000 --- a/test/test_images/logevents/pod.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: v1 -kind: Pod -metadata: - name: logevents -spec: - containers: - - name: logevents - image: ko://knative.dev/eventing/test/test_images/logevents - diff --git a/test/test_images/sendevents/main.go b/test/test_images/sendevents/main.go deleted file mode 100644 index d2ec066a595..00000000000 --- a/test/test_images/sendevents/main.go +++ /dev/null @@ -1,184 +0,0 @@ -/* -Copyright 2019 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. -*/ - -package main - -import ( - "context" - "encoding/json" - "flag" - "fmt" - "log" - "os" - "strconv" - "time" - - cloudevents "github.com/cloudevents/sdk-go" - "github.com/cloudevents/sdk-go/pkg/cloudevents/transport/http" - "go.uber.org/zap" - - "knative.dev/eventing/pkg/tracing" -) - -var ( - sink string - eventID string - eventType string - eventSource string - eventExtensions string - eventData string - eventEncoding string - periodStr string - delayStr string - maxMsgStr string - addTracing bool -) - -func init() { - flag.StringVar(&sink, "sink", "", "The sink url for the message destination.") - flag.StringVar(&eventID, "event-id", "", "Event ID to use. Defaults to a generated UUID") - flag.StringVar(&eventType, "event-type", "knative.eventing.test.e2e", "The Event Type to use.") - flag.StringVar(&eventSource, "event-source", "localhost", "Source URI to use. Defaults to the current machine's hostname") - flag.StringVar(&eventExtensions, "event-extensions", "", "The extensions of event with json format.") - flag.StringVar(&eventData, "event-data", `{"hello": "world!"}`, "Cloudevent data body.") - flag.StringVar(&eventEncoding, "event-encoding", "binary", "The encoding of the cloud event, one of(binary, structured).") - flag.StringVar(&periodStr, "period", "5", "The number of seconds between messages.") - flag.StringVar(&delayStr, "delay", "5", "The number of seconds to wait before sending messages.") - flag.StringVar(&maxMsgStr, "max-messages", "1", "The number of messages to attempt to send. 0 for unlimited.") - flag.BoolVar(&addTracing, "add-tracing", false, "Should tracing be added to events sent.") -} - -func parseDurationStr(durationStr string, defaultDuration int) time.Duration { - var duration time.Duration - if d, err := strconv.Atoi(durationStr); err != nil { - duration = time.Duration(defaultDuration) * time.Second - } else { - duration = time.Duration(d) * time.Second - } - return duration -} - -func main() { - flag.Parse() - period := parseDurationStr(periodStr, 5) - delay := parseDurationStr(delayStr, 5) - - maxMsg := 1 - if m, err := strconv.Atoi(maxMsgStr); err == nil { - maxMsg = m - } - - defer func() { - var err error - r := recover() - if r != nil { - err = r.(error) - log.Printf("recovered from panic: %v", err) - } - }() - - if delay > 0 { - log.Printf("will sleep for %s", delay) - time.Sleep(delay) - log.Printf("awake, continuing") - } - - var encodingOption http.Option - switch eventEncoding { - case "binary": - encodingOption = cloudevents.WithBinaryEncoding() - case "structured": - encodingOption = cloudevents.WithStructuredEncoding() - default: - log.Printf("unsupported encoding option: %q\n", eventEncoding) - os.Exit(1) - } - - tOpts := []http.Option{ - cloudevents.WithTarget(sink), - encodingOption, - } - - t, err := cloudevents.NewHTTPTransport(tOpts...) - if err != nil { - log.Fatalf("failed to create transport, %v", err) - } - - if addTracing { - log.Println("addTracing") - logger, _ := zap.NewDevelopment() - if err := tracing.SetupStaticPublishing(logger.Sugar(), "", tracing.AlwaysSample); err != nil { - log.Fatalf("Unable to setup trace publishing: %v", err) - } - } - - c, err := cloudevents.NewClient(t, - cloudevents.WithTimeNow(), - cloudevents.WithUUIDs(), - ) - if err != nil { - log.Fatalf("failed to create client, %v", err) - } - - var untyped map[string]interface{} - if err := json.Unmarshal([]byte(eventData), &untyped); err != nil { - log.Println("Currently sendevent only supports JSON event data") - os.Exit(1) - } - - sequence := 0 - - ticker := time.NewTicker(period) - for { - sequence++ - untyped["sequence"] = fmt.Sprintf("%d", sequence) - - event := cloudevents.NewEvent(cloudevents.VersionV1) - if eventID != "" { - event.SetID(eventID) - } - event.SetDataContentType(cloudevents.ApplicationJSON) - event.SetType(eventType) - event.SetSource(eventSource) - - if eventExtensions != "" { - var extensions map[string]interface{} - if err := json.Unmarshal([]byte(eventExtensions), &extensions); err != nil { - log.Fatalf("Encountered error when unmarshalling cloud event extensions to map[string]interface{}: %v", err) - } - for k, v := range extensions { - event.SetExtension(k, v) - } - } - - if err := event.SetData(untyped); err != nil { - log.Fatalf("failed to set data, %v", err) - } - - if _, resp, err := c.Send(context.Background(), event); err != nil { - log.Printf("send returned an error: %v\n", err) - } else if resp != nil { - log.Printf("Got response from %s\n%s\n", sink, resp) - } - - // Wait for next tick - <-ticker.C - // Only send a limited number of messages. - if maxMsg != 0 && maxMsg == sequence { - return - } - } -} diff --git a/test/test_images/sendevents/pod.yaml b/test/test_images/sendevents/pod.yaml deleted file mode 100644 index 4a1c23656e5..00000000000 --- a/test/test_images/sendevents/pod.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: v1 -kind: Pod -metadata: - name: sendevents -spec: - containers: - - name: sendevents - image: ko://knative.dev/eventing/test/test_images/sendevents -