Skip to content

Commit

Permalink
Update the event-type cleanup logic
Browse files Browse the repository at this point in the history
  • Loading branch information
marcobebway committed Mar 29, 2021
1 parent face4fc commit d6e770d
Show file tree
Hide file tree
Showing 9 changed files with 171 additions and 281 deletions.
11 changes: 3 additions & 8 deletions components/eventing-controller/pkg/application/clean.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,10 @@ func GetCleanTypeOrName(application *applicationv1alpha1.Application) string {
break
}
}
return GetCleanName(applicationName)
return getCleanName(applicationName)
}

// GetCleanName cleans the name form none-alphanumeric characters and returns the clean name
func GetCleanName(name string) string {
// getCleanName cleans the name form none-alphanumeric characters and returns the clean name
func getCleanName(name string) string {
return invalidApplicationNameSegment.ReplaceAllString(name, "")
}

// IsCleanName returns true if the name contains alphanumeric characters only, otherwise returns false
func IsCleanName(name string) bool {
return !invalidApplicationNameSegment.MatchString(name)
}
20 changes: 0 additions & 20 deletions components/eventing-controller/pkg/application/clean_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,23 +54,3 @@ func TestCleanName(t *testing.T) {
}
}
}

func TestIsCleanName(t *testing.T) {
testCases := []struct {
givenName string
wantClean bool
}{
{givenName: "with.dot", wantClean: false},
{givenName: "with-dash", wantClean: false},
{givenName: "with_underscore", wantClean: false},
{givenName: "with#special$characters", wantClean: false},
{givenName: "alphabetical", wantClean: true},
{givenName: "alphanumeric0123", wantClean: true},
}

for _, tc := range testCases {
if gotClean := IsCleanName(tc.givenName); tc.wantClean != gotClean {
t.Errorf("Is clean application name:[%s] failed, want:[%v] but got:[%v]", tc.givenName, tc.wantClean, gotClean)
}
}
}

This file was deleted.

This file was deleted.

61 changes: 49 additions & 12 deletions components/eventing-controller/pkg/handlers/eventtype/clean.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,21 @@
package eventtype

import (
"errors"
"fmt"
"regexp"
"strings"

"github.com/go-logr/logr"
"github.com/kyma-project/kyma/components/eventing-controller/pkg/application"
)

var (
// invalidEventTypeSegment used to match and replace none-alphanumeric characters in the event-type segments
// as per SAP Event spec https://github.tools.sap/CentralEngineering/sap-event-specification#type
invalidEventTypeSegment = regexp.MustCompile("[^a-zA-Z0-9.]")
)

type Cleaner interface {
Clean(eventType string) (string, error)
}
Expand All @@ -22,23 +33,49 @@ func NewCleaner(eventTypePrefix string, applicationLister *application.Lister, l
return &cleaner{eventTypePrefix: eventTypePrefix, applicationLister: applicationLister, logger: logger}
}

// Clean cleans the application name segment in the event-type from none-alphanumeric characters
// and returns the clean event-type, or returns an error if the event-type parsing failed
// Clean cleans the event-type from none-alphanumeric characters and returns it
// or returns an error if the event-type structure is not valid (prefix.application.object.operation.version)
func (c cleaner) Clean(eventType string) (string, error) {
appName, event, version, err := parse(eventType, c.eventTypePrefix)
if err != nil {
c.logger.Error(err, "failed to parse event-type", "prefix", c.eventTypePrefix, "type", eventType)
if err := validate(eventType, c.eventTypePrefix); err != nil {
return "", err
}
eventTypeClean := c.cleanApplicationNameSegment(eventType)
eventTypeClean = invalidEventTypeSegment.ReplaceAllString(eventTypeClean, "")
c.logger.Info("clean event-type", "before", eventType, "after", eventTypeClean)
return eventTypeClean, nil
}

// handle existing applications
func (c cleaner) cleanApplicationNameSegment(eventType string) string {
appName := getApplicationName(eventType, c.eventTypePrefix)
if appObj, err := c.applicationLister.Get(appName); err == nil {
eventType = build(c.eventTypePrefix, application.GetCleanTypeOrName(appObj), event, version)
return eventType, nil
appNameClean := application.GetCleanTypeOrName(appObj)
return strings.ReplaceAll(eventType, appName, appNameClean)
}
c.logger.Info("cannot find application", "name", appName)
return eventType
}

func validate(eventType, prefix string) error {
if !strings.HasPrefix(eventType, prefix) {
return errors.New(fmt.Sprintf("invalid event-type [%s], prefix not found [%s]", eventType, prefix))
}

// handle non-existing applications
c.logger.Info("failed to get application", "name", appName)
eventType = build(c.eventTypePrefix, application.GetCleanName(appName), event, version)
return eventType, nil
eventType = removePrefix(eventType, prefix)
parts := strings.Split(eventType, ".")
if len(parts) < 4 {
return errors.New(fmt.Sprintf("invalid event-type format [%s]", eventType))
}

return nil
}

func getApplicationName(eventType, prefix string) string {
eventType = removePrefix(eventType, prefix)
return strings.Split(eventType, ".")[0]
}

func removePrefix(eventType, prefix string) string {
eventType = strings.ReplaceAll(eventType, prefix, "")
eventType = strings.TrimPrefix(eventType, ".")
return eventType
}

0 comments on commit d6e770d

Please sign in to comment.