From b20e5432a4d90c07fc12b71632845dbc6df5650f Mon Sep 17 00:00:00 2001 From: Grant Rodgers Date: Wed, 1 Aug 2018 15:12:58 -0700 Subject: [PATCH 1/2] Remove unmarshalJSON method It's only used in one place, and that usage doesn't save any lines of code. --- pkg/controller/feed/reconcile.go | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/pkg/controller/feed/reconcile.go b/pkg/controller/feed/reconcile.go index 73b3de4a6e2..45121c91fb3 100644 --- a/pkg/controller/feed/reconcile.go +++ b/pkg/controller/feed/reconcile.go @@ -408,12 +408,9 @@ func (r *reconciler) fetchParametersFromSource(namespace string, parametersFrom return nil, err } - p, err := unmarshalJSON(data) - if err != nil { - return nil, err + if err := json.Unmarshal(data, ¶ms); err != nil { + return nil, fmt.Errorf("failed to unmarshal parameters as JSON object: %v", err) } - params = p - } return params, nil } @@ -427,14 +424,6 @@ func (r *reconciler) fetchSecretKeyValue(namespace string, secretKeyRef *feedsv1 return secret.Data[secretKeyRef.Key], nil } -func unmarshalJSON(in []byte) (map[string]interface{}, error) { - parameters := make(map[string]interface{}) - if err := json.Unmarshal(in, ¶meters); err != nil { - return nil, fmt.Errorf("failed to unmarshal parameters as JSON object: %v", err) - } - return parameters, nil -} - func (r *reconciler) createJob(feed *feedsv1alpha1.Feed, es *feedsv1alpha1.EventSource, et *feedsv1alpha1.EventType) (*batchv1.Job, error) { trigger, err := r.resolveTrigger(feed) if err != nil { From 0e527712aedf3e263edf7ae5d0d9bb3f6cb43a2b Mon Sep 17 00:00:00 2001 From: Grant Rodgers Date: Wed, 1 Aug 2018 15:13:58 -0700 Subject: [PATCH 2/2] Test the secret retrieval code Adds a test of a feed with a ParametersFrom secret key reference. --- pkg/controller/feed/reconcile_test.go | 106 ++++++++++++++++++++------ 1 file changed, 83 insertions(+), 23 deletions(-) diff --git a/pkg/controller/feed/reconcile_test.go b/pkg/controller/feed/reconcile_test.go index 1f77725a38b..0bd362dbba4 100644 --- a/pkg/controller/feed/reconcile_test.go +++ b/pkg/controller/feed/reconcile_test.go @@ -74,6 +74,21 @@ var testCases = []controllertesting.TestCase{ //TODO job created event }, }, + { + Name: "new feed with secret ref: secret gets to job", + InitialState: []runtime.Object{ + getEventSource(), + getEventType(), + getFeedSecret(), + getNewSecretFeed(), + }, + ReconcileKey: "test/test-feed", + WantPresent: []runtime.Object{ + getSecretStartInProgressFeed(), + getNewSecretStartJob(), + //TODO job created event + }, + }, { Name: "in progress feed with existing job: both unchanged", InitialState: []runtime.Object{ @@ -320,31 +335,42 @@ func getNewFeed() *feedsv1alpha1.Feed { } } -func getFeedFailingWithMissingEventSource() *feedsv1alpha1.Feed { - return &feedsv1alpha1.Feed{ - TypeMeta: feedType(), - ObjectMeta: om("test", "test-feed"), - Spec: feedsv1alpha1.FeedSpec{ - Action: feedsv1alpha1.FeedAction{ - DNSName: targetDNS, - }, - Trigger: feedsv1alpha1.EventTrigger{ - EventType: getEventType().Name, - Resource: "", - Service: "", - Parameters: nil, - ParametersFrom: nil, - }, - }, - Status: feedsv1alpha1.FeedStatus{ - Conditions: []feedsv1alpha1.FeedCondition{{ - Type: feedsv1alpha1.FeedConditionDependenciesSatisfied, - Status: corev1.ConditionFalse, - Reason: "TestGenerated", - Message: "Test generated", - }}, +func getFeedSecret() *corev1.Secret { + secretMap := map[string]interface{}{"foo": "bar"} + data, err := json.Marshal(secretMap) + if err != nil { + panic(err) + } + return &corev1.Secret{ + ObjectMeta: om("test", "feed-secret"), + Data: map[string][]byte{ + "test-secret-key": data, }, } + +} + +func getNewSecretFeed() *feedsv1alpha1.Feed { + feed := getNewFeed() + feed.Spec.Trigger.ParametersFrom = []feedsv1alpha1.ParametersFromSource{{ + SecretKeyRef: &feedsv1alpha1.SecretKeyReference{ + Name: getFeedSecret().Name, + Key: "test-secret-key", + }, + }} + return feed +} + +func getFeedFailingWithMissingEventSource() *feedsv1alpha1.Feed { + feed := getNewFeed() + feed.Status.InitializeConditions() + feed.Status.SetCondition(&feedsv1alpha1.FeedCondition{ + Type: feedsv1alpha1.FeedConditionDependenciesSatisfied, + Status: corev1.ConditionFalse, + Reason: "TestGenerated", + Message: "test generated", + }) + return feed } func getStartInProgressFeed() *feedsv1alpha1.Feed { @@ -369,6 +395,17 @@ func getStartInProgressFeed() *feedsv1alpha1.Feed { return feed } +func getSecretStartInProgressFeed() *feedsv1alpha1.Feed { + feed := getStartInProgressFeed() + feed.Spec.Trigger.ParametersFrom = []feedsv1alpha1.ParametersFromSource{{ + SecretKeyRef: &feedsv1alpha1.SecretKeyReference{ + Name: getFeedSecret().Name, + Key: "test-secret-key", + }, + }} + return feed +} + func getStartedFeed() *feedsv1alpha1.Feed { feed := getStartInProgressFeed() marshalledContext, err := json.Marshal(getFeedContext().Context) @@ -502,6 +539,29 @@ func getNewStartJob() *batchv1.Job { } } +func getNewSecretStartJob() *batchv1.Job { + job := getNewStartJob() + envVars := job.Spec.Template.Spec.Containers[0].Env + var newEnvVars []corev1.EnvVar + for _, envVar := range envVars { + if envVar.Name == string(resources.EnvVarTrigger) { + newEnvVars = append(newEnvVars, corev1.EnvVar{ + Name: string(resources.EnvVarTrigger), + Value: base64.StdEncoding.EncodeToString(bytesOrDie(json.Marshal( + sources.EventTrigger{ + EventType: "test-et", + Parameters: map[string]interface{}{"foo": "bar"}, + }, + ))), + }) + } else { + newEnvVars = append(newEnvVars, envVar) + } + } + job.Spec.Template.Spec.Containers[0].Env = newEnvVars + return job +} + func getInProgressStartFeedJob() *batchv1.Job { job := getNewStartJob() // This is normally set by a webhook. Set it here