From 3d2cd26eff34cd0174f6e841cea5249753848c81 Mon Sep 17 00:00:00 2001 From: John Gardiner Myers Date: Sat, 5 Jun 2021 11:01:27 -0700 Subject: [PATCH] Fix panic in dryrun report --- upup/pkg/fi/BUILD.bazel | 2 ++ upup/pkg/fi/dryrun_target.go | 7 +---- upup/pkg/fi/dryruntarget_test.go | 47 ++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 6 deletions(-) diff --git a/upup/pkg/fi/BUILD.bazel b/upup/pkg/fi/BUILD.bazel index 7596a67eef..2226f923c1 100644 --- a/upup/pkg/fi/BUILD.bazel +++ b/upup/pkg/fi/BUILD.bazel @@ -76,7 +76,9 @@ go_test( embed = [":go_default_library"], deps = [ "//pkg/apis/kops:go_default_library", + "//pkg/assets:go_default_library", "//pkg/pki:go_default_library", "//util/pkg/vfs:go_default_library", + "//vendor/github.com/stretchr/testify/assert:go_default_library", ], ) diff --git a/upup/pkg/fi/dryrun_target.go b/upup/pkg/fi/dryrun_target.go index d94f52b865..d4468a0fdc 100644 --- a/upup/pkg/fi/dryrun_target.go +++ b/upup/pkg/fi/dryrun_target.go @@ -312,17 +312,12 @@ func buildChangeList(a, e, changes Task) ([]change, error) { } case reflect.String: - changed = fieldValC.Interface().(string) != "" + changed = fieldValC.Convert(reflect.TypeOf("")).Interface() != "" } if !changed { continue } - if fieldValC.Kind() == reflect.String && fieldValC.Interface().(string) == "" { - // No change - continue - } - description := "" ignored := false if fieldValE.CanInterface() { diff --git a/upup/pkg/fi/dryruntarget_test.go b/upup/pkg/fi/dryruntarget_test.go index eab9cd1856..a0e87fb595 100644 --- a/upup/pkg/fi/dryruntarget_test.go +++ b/upup/pkg/fi/dryruntarget_test.go @@ -17,8 +17,13 @@ limitations under the License. package fi import ( + "bytes" "reflect" "testing" + + "github.com/stretchr/testify/assert" + api "k8s.io/kops/pkg/apis/kops" + "k8s.io/kops/pkg/assets" ) func Test_tryResourceAsString(t *testing.T) { @@ -48,3 +53,45 @@ func Test_tryResourceAsString(t *testing.T) { } } } + +type testTask struct { + Name *string + Lifecycle Lifecycle + Tags map[string]string +} + +var _ Task = &testTask{} + +func (*testTask) Run(_ *Context) error { + panic("not implemented") +} + +func Test_DryrunTarget_PrintReport(t *testing.T) { + builder := assets.NewAssetBuilder(&api.Cluster{ + Spec: api.ClusterSpec{ + KubernetesVersion: "1.17.3", + }, + }, "'") + var stdout bytes.Buffer + target := NewDryRunTarget(builder, &stdout) + tasks := map[string]Task{} + a := &testTask{ + Name: String("TestName"), + Lifecycle: LifecycleSync, + Tags: map[string]string{"key": "value"}, + } + e := &testTask{ + Name: String("TestName"), + Lifecycle: LifecycleSync, + Tags: map[string]string{"key": "value"}, + } + changes := reflect.New(reflect.TypeOf(e).Elem()).Interface().(Task) + _ = BuildChanges(a, e, changes) + err := target.Render(a, e, changes) + tasks[*e.Name] = e + assert.NoError(t, err, "target.Render()") + + var out bytes.Buffer + err = target.PrintReport(tasks, &out) + assert.NoError(t, err, "target.PrintReport()") +}