Skip to content

Commit

Permalink
Do not de-duplicate event types (#11)
Browse files Browse the repository at this point in the history
* Provider unit tests

Signed-off-by: Ali Ok <aliok@redhat.com>

* GitHub actions for Backstage unit tests

Signed-off-by: Ali Ok <aliok@redhat.com>

* Don't deduplicate event types

Signed-off-by: Ali Ok <aliok@redhat.com>

* Adapt test cases

Signed-off-by: Ali Ok <aliok@redhat.com>

* Run Backstage unit tests on PRs

Signed-off-by: Ali Ok <aliok@redhat.com>

* Fix nvmrc file path in CI

Signed-off-by: Ali Ok <aliok@redhat.com>

* Fix test script for CI

Signed-off-by: Ali Ok <aliok@redhat.com>

* Fix test script for CI

Signed-off-by: Ali Ok <aliok@redhat.com>

* goimports

Signed-off-by: Ali Ok <aliok@redhat.com>

---------

Signed-off-by: Ali Ok <aliok@redhat.com>
  • Loading branch information
aliok authored Dec 21, 2023
1 parent 63ff349 commit 69f9a66
Show file tree
Hide file tree
Showing 7 changed files with 337 additions and 97 deletions.
37 changes: 37 additions & 0 deletions .github/workflows/backstage-unit-tests.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
name: Backstage unit tests

on:
push:
branches:
- main
pull_request:
branches:
- main

jobs:
unit-tests:
name: Test
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version-file: 'backstage/.nvmrc'
cache: 'yarn'
cache-dependency-path: 'backstage/yarn.lock'

- name: Install dependencies
shell: bash
working-directory: ./backstage
run: yarn --prefer-offline --frozen-lockfile

- name: Run tests
shell: bash
working-directory: ./backstage
run: |
export PATH="./node_modules/.bin/:$PATH"
yarn test
6 changes: 6 additions & 0 deletions backends/pkg/reconciler/eventmesh/eventtype.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,11 @@ type EventType struct {
SchemaURL string `json:"schemaURL,omitempty"`
Labels map[string]string `json:"labels,omitempty"`
Annotations map[string]string `json:"annotations,omitempty"`
Reference string `json:"reference,omitempty"`
}

func (et EventType) NameAndNamespace() string {
return NameAndNamespace(et.Namespace, et.Name)
}

func convertEventType(et *v1beta2.EventType) EventType {
Expand All @@ -28,5 +33,6 @@ func convertEventType(et *v1beta2.EventType) EventType {
SchemaURL: et.Spec.Schema.String(),
Labels: et.Labels,
Annotations: FilterAnnotations(et.Annotations),
Reference: RefNameAndNamespace(et.Spec.Reference),
}
}
70 changes: 29 additions & 41 deletions backends/pkg/reconciler/eventmesh/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,17 @@ package eventmesh
import (
"context"
"net/http"
"slices"
"sort"

eventinglistersv1beta2 "knative.dev/eventing/pkg/client/listers/eventing/v1beta2"

"go.uber.org/zap"
"k8s.io/apimachinery/pkg/labels"

"k8s.io/apimachinery/pkg/util/json"

"knative.dev/pkg/logging"

eventingb1beta2 "knative.dev/eventing/pkg/apis/eventing/v1beta2"
eventinglistersv1 "knative.dev/eventing/pkg/client/listers/eventing/v1"
)

Expand Down Expand Up @@ -61,52 +61,25 @@ func BuildEventMesh(listers Listers, logger *zap.SugaredLogger) (EventMesh, erro
brokerMap[cbr.GetNameAndNamespace()] = cbr
}

fetchedEventTypes, err := listers.EventTypeLister.List(labels.Everything())
convertedEventTypes, err := fetchEventTypes(listers.EventTypeLister, logger)
if err != nil {
logger.Errorw("Error listing eventTypes", "error", err)
logger.Errorw("Error fetching and converting event types", "error", err)
return EventMesh{}, err
}

sort.Slice(fetchedEventTypes, func(i, j int) bool {
if fetchedEventTypes[i].Namespace != fetchedEventTypes[j].Namespace {
return fetchedEventTypes[i].Namespace < fetchedEventTypes[j].Namespace
}
return fetchedEventTypes[i].Name < fetchedEventTypes[j].Name
})

logger.Debugw("Fetched event types", "event types", fetchedEventTypes)

convertedEventTypeMap := make(EventTypeMap)
for _, et := range fetchedEventTypes {
namespaceEventTypeRef := NamespaceEventTypeRef(et)

if et.Spec.Reference != nil {
if br, ok := brokerMap[RefNameAndNamespace(et.Spec.Reference)]; ok {
// add to broker provided event types
// only add if it hasn't been added already
if !slices.Contains(br.ProvidedEventTypes, namespaceEventTypeRef) {
br.ProvidedEventTypes = append(br.ProvidedEventTypes, namespaceEventTypeRef)
}
for _, et := range convertedEventTypes {
if et.Reference != "" {
if br, ok := brokerMap[et.Reference]; ok {
br.ProvidedEventTypes = append(br.ProvidedEventTypes, et.NameAndNamespace())
}
}

if _, ok := convertedEventTypeMap[namespaceEventTypeRef]; ok {
logger.Debugw("Duplicate event type", "event type", namespaceEventTypeRef)
continue
}

convertedEventType := convertEventType(et)
convertedEventTypeMap[namespaceEventTypeRef] = &convertedEventType
}

eventMesh := EventMesh{
EventTypes: make([]*EventType, 0, len(convertedEventTypeMap)),
EventTypes: convertedEventTypes,
Brokers: convertedBrokers,
}

for _, et := range convertedEventTypeMap {
eventMesh.EventTypes = append(eventMesh.EventTypes, et)
}
return eventMesh, nil
}

Expand All @@ -125,10 +98,25 @@ func fetchBrokers(brokerLister eventinglistersv1.BrokerLister, logger *zap.Sugar
return convertedBrokers, err
}

func NamespaceEventTypeRef(et *eventingb1beta2.EventType) string {
return BuildNamespaceEventTypeRef(et.Namespace, et.Spec.Type)
}
func fetchEventTypes(eventTypeLister eventinglistersv1beta2.EventTypeLister, logger *zap.SugaredLogger) ([]*EventType, error) {
fetchedEventTypes, err := eventTypeLister.List(labels.Everything())
if err != nil {
logger.Errorw("Error listing eventTypes", "error", err)
return nil, err
}

sort.Slice(fetchedEventTypes, func(i, j int) bool {
if fetchedEventTypes[i].Namespace != fetchedEventTypes[j].Namespace {
return fetchedEventTypes[i].Namespace < fetchedEventTypes[j].Namespace
}
return fetchedEventTypes[i].Name < fetchedEventTypes[j].Name
})

convertedEventTypes := make([]*EventType, 0, len(fetchedEventTypes))
for _, et := range fetchedEventTypes {
convertedEventType := convertEventType(et)
convertedEventTypes = append(convertedEventTypes, &convertedEventType)
}

func BuildNamespaceEventTypeRef(namespace, eventType string) string {
return namespace + "/" + eventType
return convertedEventTypes, err
}
54 changes: 15 additions & 39 deletions backends/pkg/reconciler/eventmesh/handler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ func TestBuildEventMesh(t *testing.T) {
UID: "test-broker-uid",
Labels: map[string]string{"test-broker-label": "foo"},
Annotations: map[string]string{"test-broker-annotation": "foo"},
ProvidedEventTypes: []string{"test-ns/test-eventtype-type"}},
ProvidedEventTypes: []string{"test-ns/test-eventtype"}},
},
EventTypes: []*EventType{
{
Expand All @@ -77,6 +77,7 @@ func TestBuildEventMesh(t *testing.T) {
SchemaURL: "http://test-eventtype-schema",
Labels: map[string]string{"test-eventtype-label": "foo"},
Annotations: map[string]string{"test-eventtype-annotation": "foo"},
Reference: "test-ns/test-broker",
},
},
},
Expand All @@ -93,64 +94,33 @@ func TestBuildEventMesh(t *testing.T) {
),
testingv1beta2.NewEventType("test-eventtype-2", "test-ns",
testingv1beta2.WithEventTypeType("test-eventtype-type-2"),
testingv1beta2.WithEventTypeReference(brokerReference("test-broker", "test-ns")),
),
},
want: EventMesh{
Brokers: []*Broker{
{
Name: "test-broker",
Namespace: "test-ns",
ProvidedEventTypes: []string{"test-ns/test-eventtype-type-1", "test-ns/test-eventtype-type-2"}},
ProvidedEventTypes: []string{"test-ns/test-eventtype-1"}},
},
EventTypes: []*EventType{
{
Name: "test-eventtype-1",
Namespace: "test-ns",
Type: "test-eventtype-type-1",
Reference: "test-ns/test-broker",
},
{
Name: "test-eventtype-2",
Namespace: "test-ns",
Type: "test-eventtype-type-2",
Reference: "",
},
},
},
},
{
name: "With 1 broker and 2 eventtypes with same spec.types deduplicated",
brokers: []*eventingv1.Broker{
testingv1.NewBroker("test-broker", "test-ns"),
},
eventTypes: []*eventingv1beta2.EventType{
testingv1beta2.NewEventType("test-eventtype-1", "test-ns",
testingv1beta2.WithEventTypeType("test-eventtype-type"),
testingv1beta2.WithEventTypeReference(brokerReference("test-broker", "test-ns")),
),
testingv1beta2.NewEventType("test-eventtype-2", "test-ns",
testingv1beta2.WithEventTypeType("test-eventtype-type"),
testingv1beta2.WithEventTypeReference(brokerReference("test-broker", "test-ns")),
),
},
want: EventMesh{
Brokers: []*Broker{
{
Name: "test-broker",
Namespace: "test-ns",
ProvidedEventTypes: []string{"test-ns/test-eventtype-type"}},
},
EventTypes: []*EventType{
// ONLY have the first one
{
Name: "test-eventtype-1",
Namespace: "test-ns",
Type: "test-eventtype-type",
},
},
},
},
{
name: "With 2 brokers and 2 eventtypes with same spec.types deduplicated, but using different brokers",
name: "With 2 brokers and 2 eventtypes with same spec.types",
brokers: []*eventingv1.Broker{
testingv1.NewBroker("test-broker-1", "test-ns"),
testingv1.NewBroker("test-broker-2", "test-ns"),
Expand All @@ -170,20 +140,26 @@ func TestBuildEventMesh(t *testing.T) {
{
Name: "test-broker-1",
Namespace: "test-ns",
ProvidedEventTypes: []string{"test-ns/test-eventtype-type"},
ProvidedEventTypes: []string{"test-ns/test-eventtype-1"},
},
{
Name: "test-broker-2",
Namespace: "test-ns",
ProvidedEventTypes: []string{"test-ns/test-eventtype-type"},
ProvidedEventTypes: []string{"test-ns/test-eventtype-2"},
},
},
EventTypes: []*EventType{
// ONLY have the first one
{
Name: "test-eventtype-1",
Namespace: "test-ns",
Type: "test-eventtype-type",
Reference: "test-ns/test-broker-1",
},
{
Name: "test-eventtype-2",
Namespace: "test-ns",
Type: "test-eventtype-type",
Reference: "test-ns/test-broker-2",
},
},
},
Expand Down
3 changes: 3 additions & 0 deletions backends/pkg/reconciler/eventmesh/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ func ObjNameAndNamespace(obj metav1.ObjectMetaAccessor) string {
}

func RefNameAndNamespace(ref *v1.KReference) string {
if ref == nil {
return ""
}
return NameAndNamespace(ref.Namespace, ref.Name)
}

Expand Down
Loading

0 comments on commit 69f9a66

Please sign in to comment.