From 90290f610b39890c12094cb6d26f36b0a84d0e21 Mon Sep 17 00:00:00 2001 From: Hui Kang Date: Sun, 5 Sep 2021 00:04:49 -0400 Subject: [PATCH] remove resourceVersion and fix spec.args - unit test Signed-off-by: Hui Kang --- utils/analysis/helpers.go | 16 ++++++++-- utils/analysis/helpers_test.go | 57 ++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 2 deletions(-) diff --git a/utils/analysis/helpers.go b/utils/analysis/helpers.go index 0d24512075..90d6fcabea 100644 --- a/utils/analysis/helpers.go +++ b/utils/analysis/helpers.go @@ -13,7 +13,6 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" patchtypes "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/validation/field" argoprojclient "github.com/argoproj/argo-rollouts/pkg/client/clientset/versioned/typed/rollouts/v1alpha1" ) @@ -373,7 +372,17 @@ func NewAnalysisRunFromUnstructured(obj *unstructured.Unstructured, templateArgs return nil, err } + // Remove resourceVersion if exists + _, found, err := unstructured.NestedString(obj.Object, "metadata", "resourceVersion") + if err != nil { + return nil, err + } + if found { + unstructured.RemoveNestedField(obj.Object, "metadata", "resourceVersion") + } + // Set args + newArgVals := []interface{}{} for i := 0; i < len(newArgs); i++ { var newArgInterface map[string]interface{} newArgBytes, err := json.Marshal(newArgs[i]) @@ -384,7 +393,10 @@ func NewAnalysisRunFromUnstructured(obj *unstructured.Unstructured, templateArgs if err != nil { return nil, err } - err = unstructured.SetNestedMap(obj.Object, newArgInterface, field.NewPath("spec", "args").Index(i).String()) + newArgVals = append(newArgVals, newArgInterface) + } + if len(newArgVals) > 0 { + err = unstructured.SetNestedSlice(obj.Object, newArgVals, "spec", "args") if err != nil { return nil, err } diff --git a/utils/analysis/helpers_test.go b/utils/analysis/helpers_test.go index e45c52ad6d..0a5171f23d 100644 --- a/utils/analysis/helpers_test.go +++ b/utils/analysis/helpers_test.go @@ -1,6 +1,7 @@ package analysis import ( + "encoding/json" "errors" "fmt" "testing" @@ -8,6 +9,7 @@ import ( log "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + kunstructured "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" kubetesting "k8s.io/client-go/testing" @@ -15,6 +17,7 @@ import ( "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" "github.com/argoproj/argo-rollouts/pkg/client/clientset/versioned/fake" + "github.com/argoproj/argo-rollouts/utils/unstructured" ) func TestIsWorst(t *testing.T) { @@ -630,6 +633,60 @@ func TestMergeArgs(t *testing.T) { } } +func TestNewAnalysisRunFromUnstructured(t *testing.T) { + template := v1alpha1.AnalysisTemplate{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Namespace: metav1.NamespaceDefault, + ResourceVersion: "12345", + }, + Spec: v1alpha1.AnalysisTemplateSpec{ + Metrics: []v1alpha1.Metric{ + { + Name: "success-rate", + }, + }, + Args: []v1alpha1.Argument{ + { + Name: "my-arg-1", + }, + { + Name: "my-arg-2", + }, + }, + }, + } + args := []v1alpha1.Argument{ + { + Name: "my-arg-1", + Value: pointer.StringPtr("my-val-1"), + }, + { + Name: "my-arg-2", + Value: pointer.StringPtr("my-val-2"), + }, + } + + jsonStr, err := json.Marshal(template) + assert.NoError(t, err) + obj, err := unstructured.StrToUnstructured(string(jsonStr)) + assert.NoError(t, err) + + obj, err = NewAnalysisRunFromUnstructured(obj, args, "foo-run", "foo-run-generate-", "my-ns") + assert.NoError(t, err) + _, found, err := kunstructured.NestedString(obj.Object, "metadata", "resourceVersion") + assert.NoError(t, err) + assert.False(t, found) + arArgs, _, err := kunstructured.NestedSlice(obj.Object, "spec", "args") + assert.NoError(t, err) + assert.Equal(t, len(args), len(arArgs)) + + for i, arg := range arArgs { + argnv := arg.(map[string]interface{}) + assert.Equal(t, *args[i].Value, argnv["value"]) + } +} + //TODO(dthomson) remove this test in v0.9.0 func TestNewAnalysisRunFromTemplate(t *testing.T) { template := v1alpha1.AnalysisTemplate{