Skip to content

Commit 2d3cd2a

Browse files
authored
fix: create analysisrun cmd using template generated name (argoproj#1471)
Signed-off-by: Hui Kang <[email protected]>
1 parent 8ece7fb commit 2d3cd2a

File tree

5 files changed

+114
-4
lines changed

5 files changed

+114
-4
lines changed

pkg/kubectl-argo-rollouts/cmd/create/create.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -274,11 +274,11 @@ func NewCmdCreateAnalysisRun(o *options.ArgoRolloutsOptions) *cobra.Command {
274274
}
275275
}
276276

277-
objName, notFound, err := unstructured.NestedString(obj.Object, "metadata", "name")
277+
objName, found, err := unstructured.NestedString(obj.Object, "metadata", "name")
278278
if err != nil {
279279
return err
280280
}
281-
if !notFound {
281+
if found {
282282
templateName = objName
283283
}
284284

@@ -292,6 +292,10 @@ func NewCmdCreateAnalysisRun(o *options.ArgoRolloutsOptions) *cobra.Command {
292292
}
293293
ns := o.Namespace()
294294

295+
if name == "" && generateName == "-" {
296+
return fmt.Errorf("name is invalid")
297+
}
298+
295299
obj, err = analysisutil.NewAnalysisRunFromUnstructured(obj, templateArgs, name, generateName, ns)
296300
if err != nil {
297301
return err

pkg/kubectl-argo-rollouts/cmd/create/create_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,21 @@ func TestCreateAnalysisRunName(t *testing.T) {
155155
assert.Empty(t, stderr)
156156
}
157157

158+
func TestCreateAnalysisRunNameNotSpecified(t *testing.T) {
159+
tf, o := options.NewFakeArgoRolloutsOptions()
160+
defer tf.Cleanup()
161+
162+
cmd := NewCmdCreateAnalysisRun(o)
163+
cmd.PersistentPreRunE = o.PersistentPreRunE
164+
cmd.SetArgs([]string{"--from-file", "testdata/analysis-template-no-name.yaml", "-a", "foo=bar"})
165+
err := cmd.Execute()
166+
assert.EqualError(t, err, "name is invalid")
167+
stdout := o.Out.(*bytes.Buffer).String()
168+
stderr := o.ErrOut.(*bytes.Buffer).String()
169+
assert.Empty(t, stdout)
170+
assert.Equal(t, "Error: name is invalid\n", stderr)
171+
}
172+
158173
func TestCreateAnalysisRunWithInstanceID(t *testing.T) {
159174
tf, o := options.NewFakeArgoRolloutsOptions()
160175
defer tf.Cleanup()
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
kind: AnalysisTemplate
2+
apiVersion: argoproj.io/v1alpha1
3+
metadata:
4+
spec:
5+
args:
6+
- name: foo
7+
metrics:
8+
- name: pass
9+
interval: 5s
10+
failureLimit: 1
11+
provider:
12+
job:
13+
spec:
14+
template:
15+
spec:
16+
containers:
17+
- name: sleep
18+
image: alpine:3.8
19+
command: [sh, -c]
20+
args: [exit 0]
21+
restartPolicy: Never
22+
backoffLimit: 0

utils/analysis/helpers.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import (
1313
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
1414
"k8s.io/apimachinery/pkg/runtime"
1515
patchtypes "k8s.io/apimachinery/pkg/types"
16-
"k8s.io/apimachinery/pkg/util/validation/field"
1716

1817
argoprojclient "github.com/argoproj/argo-rollouts/pkg/client/clientset/versioned/typed/rollouts/v1alpha1"
1918
)
@@ -373,7 +372,17 @@ func NewAnalysisRunFromUnstructured(obj *unstructured.Unstructured, templateArgs
373372
return nil, err
374373
}
375374

375+
// Remove resourceVersion if exists
376+
_, found, err := unstructured.NestedString(obj.Object, "metadata", "resourceVersion")
377+
if err != nil {
378+
return nil, err
379+
}
380+
if found {
381+
unstructured.RemoveNestedField(obj.Object, "metadata", "resourceVersion")
382+
}
383+
376384
// Set args
385+
newArgVals := []interface{}{}
377386
for i := 0; i < len(newArgs); i++ {
378387
var newArgInterface map[string]interface{}
379388
newArgBytes, err := json.Marshal(newArgs[i])
@@ -384,7 +393,10 @@ func NewAnalysisRunFromUnstructured(obj *unstructured.Unstructured, templateArgs
384393
if err != nil {
385394
return nil, err
386395
}
387-
err = unstructured.SetNestedMap(obj.Object, newArgInterface, field.NewPath("spec", "args").Index(i).String())
396+
newArgVals = append(newArgVals, newArgInterface)
397+
}
398+
if len(newArgVals) > 0 {
399+
err = unstructured.SetNestedSlice(obj.Object, newArgVals, "spec", "args")
388400
if err != nil {
389401
return nil, err
390402
}

utils/analysis/helpers_test.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,23 @@
11
package analysis
22

33
import (
4+
"encoding/json"
45
"errors"
56
"fmt"
67
"testing"
78

89
log "github.com/sirupsen/logrus"
910
"github.com/stretchr/testify/assert"
1011
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
12+
kunstructured "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
1113
"k8s.io/apimachinery/pkg/runtime"
1214
"k8s.io/apimachinery/pkg/types"
1315
kubetesting "k8s.io/client-go/testing"
1416
"k8s.io/utils/pointer"
1517

1618
"github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1"
1719
"github.com/argoproj/argo-rollouts/pkg/client/clientset/versioned/fake"
20+
"github.com/argoproj/argo-rollouts/utils/unstructured"
1821
)
1922

2023
func TestIsWorst(t *testing.T) {
@@ -630,6 +633,60 @@ func TestMergeArgs(t *testing.T) {
630633
}
631634
}
632635

636+
func TestNewAnalysisRunFromUnstructured(t *testing.T) {
637+
template := v1alpha1.AnalysisTemplate{
638+
ObjectMeta: metav1.ObjectMeta{
639+
Name: "foo",
640+
Namespace: metav1.NamespaceDefault,
641+
ResourceVersion: "12345",
642+
},
643+
Spec: v1alpha1.AnalysisTemplateSpec{
644+
Metrics: []v1alpha1.Metric{
645+
{
646+
Name: "success-rate",
647+
},
648+
},
649+
Args: []v1alpha1.Argument{
650+
{
651+
Name: "my-arg-1",
652+
},
653+
{
654+
Name: "my-arg-2",
655+
},
656+
},
657+
},
658+
}
659+
args := []v1alpha1.Argument{
660+
{
661+
Name: "my-arg-1",
662+
Value: pointer.StringPtr("my-val-1"),
663+
},
664+
{
665+
Name: "my-arg-2",
666+
Value: pointer.StringPtr("my-val-2"),
667+
},
668+
}
669+
670+
jsonStr, err := json.Marshal(template)
671+
assert.NoError(t, err)
672+
obj, err := unstructured.StrToUnstructured(string(jsonStr))
673+
assert.NoError(t, err)
674+
675+
obj, err = NewAnalysisRunFromUnstructured(obj, args, "foo-run", "foo-run-generate-", "my-ns")
676+
assert.NoError(t, err)
677+
_, found, err := kunstructured.NestedString(obj.Object, "metadata", "resourceVersion")
678+
assert.NoError(t, err)
679+
assert.False(t, found)
680+
arArgs, _, err := kunstructured.NestedSlice(obj.Object, "spec", "args")
681+
assert.NoError(t, err)
682+
assert.Equal(t, len(args), len(arArgs))
683+
684+
for i, arg := range arArgs {
685+
argnv := arg.(map[string]interface{})
686+
assert.Equal(t, *args[i].Value, argnv["value"])
687+
}
688+
}
689+
633690
//TODO(dthomson) remove this test in v0.9.0
634691
func TestNewAnalysisRunFromTemplate(t *testing.T) {
635692
template := v1alpha1.AnalysisTemplate{

0 commit comments

Comments
 (0)