Skip to content

Commit

Permalink
fix(controller): Fix bug in util/RecoverWorkflowNameFromSelectorStrin…
Browse files Browse the repository at this point in the history
…g. Add error handling (#3596)
  • Loading branch information
rbreeze committed Jul 25, 2020
1 parent c968877 commit 17b46bd
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 5 deletions.
5 changes: 4 additions & 1 deletion server/workflow/workflow_server.go
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,10 @@ func (s *workflowServer) WatchWorkflows(req *workflowpkg.WatchWorkflowsRequest,
opts := &metav1.ListOptions{}
if req.ListOptions != nil {
opts = req.ListOptions
wfName := argoutil.RecoverWorkflowNameFromSelectorString(opts.FieldSelector)
wfName, err := argoutil.RecoverWorkflowNameFromSelectorString(opts.FieldSelector)
if err != nil {
return err
}
if len(wfName) > 0 {
wf, err := s.getWorkflow(wfClient, req.Namespace, wfName, metav1.GetOptions{})
if err != nil {
Expand Down
14 changes: 11 additions & 3 deletions util/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,14 +96,22 @@ func RecoverIndexFromNodeName(name string) int {

func GenerateFieldSelectorFromWorkflowName(wfName string) string {
result := fields.ParseSelectorOrDie(fmt.Sprintf("metadata.name=%s", wfName)).String()
if compare := RecoverWorkflowNameFromSelectorString(result); wfName != compare {
compare, err := RecoverWorkflowNameFromSelectorString(result)
if err != nil {
log.WithFields(log.Fields{"wfName": wfName}).Error(err)
}
if wfName != compare {
panic(fmt.Sprintf("Could not recover field selector from workflow name. Expected '%s' but got '%s'\n", wfName, compare))
}
return result
}

func RecoverWorkflowNameFromSelectorString(selector string) string {
func RecoverWorkflowNameFromSelectorString(selector string) (string, error) {
nameIndex := strings.Index(selector, "=")
prefix := selector[:nameIndex]
if prefix != "metadata.name" {
return "", fmt.Errorf("Incorrect prefix. Expected 'metadata.name' but got '%s'", prefix)
}
name := selector[nameIndex+1:]
return name
return name, nil
}
13 changes: 12 additions & 1 deletion util/util_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package util

import (
"testing"

"github.com/stretchr/testify/assert"
)

func TestGenerateFieldSelectorFromWorkflowName(t *testing.T) {
Expand Down Expand Up @@ -34,12 +36,21 @@ func TestRecoverWorkflowNameFromSelectorString(t *testing.T) {
want string
}{
{"TestRecoverWorkflowNameFromSelectorString", args{"metadata.name=whalesay"}, "whalesay"},
{"TestRecoverWorkflowNameFromSelectorStringEmptyWf", args{"metadata.name="}, ""},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := RecoverWorkflowNameFromSelectorString(tt.args.selector); got != tt.want {
got, err := RecoverWorkflowNameFromSelectorString(tt.args.selector)
assert.NoError(t, err)
if got != tt.want {
t.Errorf("RecoverWorkflowNameFromSelectorString() = %v, want %v", got, tt.want)
}
})
}
}

func TestRecoverWorkflowNameFromSelectorStringError(t *testing.T) {
name, err := RecoverWorkflowNameFromSelectorString("whatever=whalesay")
assert.NotNil(t, err)
assert.Equal(t, name, "")
}

0 comments on commit 17b46bd

Please sign in to comment.