Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

go: Panic on preview: panic: reflect: Elem of [secret] type interface {} #7706

Closed
pquerna opened this issue Aug 4, 2021 · 4 comments
Closed
Assignees
Labels
area/sdks Pulumi language SDKs impact/panic This bug represents a panic or unexpected crash kind/bug Some behavior is incorrect or out of spec language/go resolution/fixed This issue was fixed
Milestone

Comments

@pquerna
Copy link

pquerna commented Aug 4, 2021

Steps to reproduce

❯ pulumi version
v3.9.1
❯ cat ../../../go.mod | grep pulumi
	github.com/pulumi/pulumi-aws/sdk/v4 v4.14.0
	github.com/pulumi/pulumi-eks/sdk v0.31.0
	github.com/pulumi/pulumi-kubernetes/sdk/v3 v3.5.2
	github.com/pulumi/pulumi-random/sdk/v4 v4.2.0
	github.com/pulumi/pulumi-tls/sdk/v4 v4.0.0
	github.com/pulumi/pulumi/sdk/v3 v3.9.1
package main

import (
	"fmt"

	"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes"
	appsv1 "github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/apps/v1"
	corev1 "github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/core/v1"
	metav1 "github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/meta/v1"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

const vectorAgentVersion = "0.15.1-debian"

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		kubeStack, err := pulumi.NewStackReference(ctx, "stack-name-with/kubernetes", nil)
		if err != nil {
			return err
		}

		kubeconfig := kubeStack.GetStringOutput(pulumi.String("kubeconfig"))

		xKubeProvider, err := kubernetes.NewProvider(ctx, "k8s", &kubernetes.ProviderArgs{
			Kubeconfig: kubeconfig,
		})
		if err != nil {
			return err
		}
		kubeProvider := pulumi.Provider(xKubeProvider)

		vectorNS, err := corev1.NewNamespace(ctx, "vector-namespace",
			&corev1.NamespaceArgs{
				Metadata: &metav1.ObjectMetaArgs{
					Name: pulumi.String("vector"),
				},
			},
			kubeProvider)
		if err != nil {
			return err
		}

		_, err = appsv1.NewDaemonSet(ctx, "vector-agent-daemon-set",
			&appsv1.DaemonSetArgs{
				ApiVersion: pulumi.String("apps/v1"),
				Kind:       pulumi.String("DaemonSet"),
				Metadata: metav1.ObjectMetaArgs{
					Name:      pulumi.StringPtr("vector-agent"),
					Namespace: vectorNS.ID(),
				},
				Spec: appsv1.DaemonSetSpecArgs{
					MinReadySeconds: pulumi.Int(1),
					Selector: metav1.LabelSelectorArgs{
						MatchLabels: pulumi.StringMap{
							"name": pulumi.String("vector-agent"),
						},
					},
					UpdateStrategy: appsv1.DaemonSetUpdateStrategyArgs{
						RollingUpdate: appsv1.RollingUpdateDaemonSetArgs{
							MaxUnavailable: pulumi.IntPtr(1),
						},
					},
					Template: corev1.PodTemplateSpecArgs{
						Metadata: metav1.ObjectMetaArgs{
							Labels: pulumi.StringMap{
								"name": pulumi.String("vector-agent"),
							},
							Namespace: vectorNS.ID(),
						},
						Spec: corev1.PodSpecArgs{
							ServiceAccountName: pulumi.StringPtr("vector-agent"),
							Tolerations: corev1.TolerationArray{
								corev1.TolerationArgs{
									Effect: pulumi.String("NoSchedule"),
									Key:    pulumi.StringPtr("node-role.kubernetes.io/master"),
								},
							},
							SecurityContext:               corev1.PodSecurityContextArgs{},
							TerminationGracePeriodSeconds: pulumi.Int(10),
							Containers: corev1.ContainerArray{
								corev1.ContainerArgs{
									// docker pull timberio/vector:0.15.1-debian
									Image:           pulumi.StringPtr(fmt.Sprintf("timberio/vector:%s", vectorAgentVersion)),
									ImagePullPolicy: pulumi.StringPtr("IfNotPresent"),
									Args: pulumi.StringArray{
										pulumi.String("--config-dir"),
										pulumi.String("/mnt/config"),
									},
									Env: corev1.EnvVarArray{
										corev1.EnvVarArgs{
											Name: pulumi.String("VECTOR_SELF_NODE_NAME"),
											ValueFrom: corev1.EnvVarSourceArgs{
												FieldRef: corev1.ObjectFieldSelectorArgs{
													FieldPath: pulumi.String("spec.nodeName"),
												},
											},
										},
										corev1.EnvVarArgs{
											Name: pulumi.String("VECTOR_SELF_POD_NAME"),
											ValueFrom: corev1.EnvVarSourceArgs{
												FieldRef: corev1.ObjectFieldSelectorArgs{
													FieldPath: pulumi.String("metadata.name"),
												},
											},
										},
										corev1.EnvVarArgs{
											Name: pulumi.String("VECTOR_SELF_POD_NAMESPACE"),
											ValueFrom: corev1.EnvVarSourceArgs{
												FieldRef: corev1.ObjectFieldSelectorArgs{
													FieldPath: pulumi.String("metadata.namespace"),
												},
											},
										},
										corev1.EnvVarArgs{
											Name:  pulumi.String("PROCFS_ROOT"),
											Value: pulumi.String("/host/proc"),
										},
										corev1.EnvVarArgs{
											Name:  pulumi.String("SYSFS_ROOT"),
											Value: pulumi.String("/host/sys"),
										},
										corev1.EnvVarArgs{
											Name:  pulumi.String("LOG"),
											Value: pulumi.String("info"),
										},
										corev1.EnvVarArgs{
											Name: pulumi.String("VECTOR_LOKI_ENDPOINT"),
											ValueFrom: corev1.EnvVarSourceArgs{
												SecretKeyRef: corev1.SecretKeySelectorArgs{
													Name: pulumi.String("vector-loki"),
													Key:  pulumi.String("endpoint"),
												},
											},
										},
										corev1.EnvVarArgs{
											Name: pulumi.String("VECTOR_LOKI_USERNAME"),
											ValueFrom: corev1.EnvVarSourceArgs{
												SecretKeyRef: corev1.SecretKeySelectorArgs{
													Name: pulumi.String("vector-loki"),
													Key:  pulumi.String("username"),
												},
											},
										},
										corev1.EnvVarArgs{
											Name: pulumi.String("VECTOR_LOKI_PASSWORD"),
											ValueFrom: corev1.EnvVarSourceArgs{
												SecretKeyRef: corev1.SecretKeySelectorArgs{
													Name: pulumi.String("vector-loki"),
													Key:  pulumi.String("password"),
												},
											},
										},

										corev1.EnvVarArgs{
											Name: pulumi.String("VECTOR_PROM_ENDPOINT"),
											ValueFrom: corev1.EnvVarSourceArgs{
												SecretKeyRef: corev1.SecretKeySelectorArgs{
													Name: pulumi.String("vector-prom"),
													Key:  pulumi.String("endpoint"),
												},
											},
										},
										corev1.EnvVarArgs{
											Name: pulumi.String("VECTOR_PROM_USERNAME"),
											ValueFrom: corev1.EnvVarSourceArgs{
												SecretKeyRef: corev1.SecretKeySelectorArgs{
													Name: pulumi.String("vector-prom"),
													Key:  pulumi.String("username"),
												},
											},
										},
										corev1.EnvVarArgs{
											Name: pulumi.String("VECTOR_PROM_PASSWORD"),
											ValueFrom: corev1.EnvVarSourceArgs{
												SecretKeyRef: corev1.SecretKeySelectorArgs{
													Name: pulumi.String("vector-prom"),
													Key:  pulumi.String("password"),
												},
											},
										},
									},
									Resources: corev1.ResourceRequirementsArgs{},

									VolumeMounts: corev1.VolumeMountArray{
										corev1.VolumeMountArgs{
											Name:      pulumi.String("var-log"),
											MountPath: pulumi.String("/var/log"),
											ReadOnly:  pulumi.BoolPtr(true),
										},
										corev1.VolumeMountArgs{
											Name:      pulumi.String("var-lib"),
											MountPath: pulumi.String("/var/lib"),
											ReadOnly:  pulumi.BoolPtr(true),
										},
										corev1.VolumeMountArgs{
											Name:      pulumi.String("vector-data-dir"),
											MountPath: pulumi.String("/mnt/vector-data-dir"),
											ReadOnly:  pulumi.BoolPtr(false),
										},
										corev1.VolumeMountArgs{
											Name:      pulumi.String("config"),
											MountPath: pulumi.String("/mnt/config"),
											ReadOnly:  pulumi.BoolPtr(true),
										},
										corev1.VolumeMountArgs{
											Name:      pulumi.String("procfs"),
											MountPath: pulumi.String("/host/proc"),
											ReadOnly:  pulumi.BoolPtr(true),
										},
										corev1.VolumeMountArgs{
											Name:      pulumi.String("sysfs"),
											MountPath: pulumi.String("/host/sys"),
											ReadOnly:  pulumi.BoolPtr(true),
										},
									},
								},
							},
							Volumes: corev1.VolumeArray{
								corev1.VolumeArgs{
									Name: pulumi.String("var-log"),
									HostPath: corev1.HostPathVolumeSourceArgs{
										Path: pulumi.String("/var/log/"),
									},
								},
								corev1.VolumeArgs{
									Name: pulumi.String("var-lib"),
									HostPath: corev1.HostPathVolumeSourceArgs{
										Path: pulumi.String("/var/lib/"),
									},
								},
								corev1.VolumeArgs{
									Name: pulumi.String("procfs"),
									HostPath: corev1.HostPathVolumeSourceArgs{
										Path: pulumi.String("/proc"),
									},
								},
								corev1.VolumeArgs{
									Name: pulumi.String("sysfs"),
									HostPath: corev1.HostPathVolumeSourceArgs{
										Path: pulumi.String("/sys"),
									},
								},
								corev1.VolumeArgs{
									Name: pulumi.String("vector-data-dir"),
									HostPath: corev1.HostPathVolumeSourceArgs{
										Path: pulumi.String("/var/lib/vector/"),
									},
								},
								corev1.VolumeArgs{
									Name: pulumi.String("config"),
									ConfigMap: corev1.ConfigMapVolumeSourceArgs{
										Name: pulumi.String("vector-config"),
										Items: corev1.KeyToPathArray{
											corev1.KeyToPathArgs{
												Key:  pulumi.String("vector.yaml"),
												Path: pulumi.String("vector.yaml"),
											},
										},
									},
								},
							},
						},
					},
				},
			},
			kubeProvider)
		if err != nil {
			return err
		}

		return nil
	})
}

Expected: pulumi preview works and doesn't panic
Actual: Panic on pulumi preview

❯ pulumi preview
Please choose a stack, or create a new one: redacted-name
Previewing update (redacted-name)

View Live: redacted-url

     Type                             Name                                          Plan       Info
 +   pulumi:pulumi:Stack              redacted-name  create     1 error; 13 messages
 +   ├─ pulumi:providers:kubernetes   k8s                                           create
 +   └─ kubernetes:core/v1:Namespace  vector-namespace                              create

Diagnostics:
  pulumi:pulumi:Stack (redacted-name):
    error: an unhandled error occurred: program exited with non-zero exit code: 1

    panic: reflect: Elem of [secret] type interface {}
    goroutine 76 [running]:
    reflect.(*rtype).Elem(0x1abd200, 0xc000418650, 0x194)
    	/usr/local/Cellar/go/1.16.3/libexec/src/reflect/type.go:915 +0x1a5
    github.com/pulumi/pulumi/sdk/v3/go/pulumi.awaitInputs(0x1dbb2f8, 0xc000130030, 0x1aeab20, 0xc000418630, 0x94, 0x1abd200, 0xc000418650, 0x194, 0x1dd0000, 0x0, ...)
    	/Users/pquerna/xsrc/ductone/ops/vendor/github.com/pulumi/pulumi/sdk/v3/go/pulumi/types.go:702 +0x2662
    github.com/pulumi/pulumi/sdk/v3/go/pulumi.awaitInputs(0x1dbb2f8, 0xc000130030, 0x1b8cac0, 0xc000418620, 0x99, 0x1b1fa00, 0xc000418640, 0x199, 0x0, 0x0, ...)
    	/Users/pquerna/xsrc/ductone/ops/vendor/github.com/pulumi/pulumi/sdk/v3/go/pulumi/types.go:734 +0x150a
    github.com/pulumi/pulumi/sdk/v3/go/pulumi.toOutputTWithContext.func3(0xc000418660, 0x1b8cac0, 0xc000418620, 0x1dbca60, 0xc0005b69a0, 0x1dbb2f8, 0xc000130030, 0x1b1fa00, 0xc000418640, 0x199, ...)
    	/Users/pquerna/xsrc/ductone/ops/vendor/github.com/pulumi/pulumi/sdk/v3/go/pulumi/types.go:828 +0x137
    created by github.com/pulumi/pulumi/sdk/v3/go/pulumi.toOutputTWithContext
    	/Users/pquerna/xsrc/ductone/ops/vendor/github.com/pulumi/pulumi/sdk/v3/go/pulumi/types.go:820 +0x216
    exit status 2

@pquerna pquerna added the kind/bug Some behavior is incorrect or out of spec label Aug 4, 2021
@pquerna
Copy link
Author

pquerna commented Aug 4, 2021

After some experimentation, if I null out the RollingUpdate configuration, this does not panic:

// panics
					UpdateStrategy: appsv1.DaemonSetUpdateStrategyArgs{
						RollingUpdate: appsv1.RollingUpdateDaemonSetArgs{
							MaxUnavailable: pulumi.IntPtr(1),
						},
					},
// doesn't panic:
					UpdateStrategy: appsv1.DaemonSetUpdateStrategyArgs{
						RollingUpdate: nil,
					},

There is nothing I can see i DaemonSetUpdateStrategyArgs that in particular that looks special to me.

@pquerna
Copy link
Author

pquerna commented Aug 4, 2021

reduced demo:

package main

import (
	"github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes"
	appsv1 "github.com/pulumi/pulumi-kubernetes/sdk/v3/go/kubernetes/apps/v1"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		kubeStack, err := pulumi.NewStackReference(ctx, "ductone/app-25-eks-zonal-cluster/sandbox-usw2a", nil)
		if err != nil {
			return err
		}

		kubeconfig := kubeStack.GetStringOutput(pulumi.String("kubeconfig"))

		xKubeProvider, err := kubernetes.NewProvider(ctx, "k8s", &kubernetes.ProviderArgs{
			Kubeconfig: kubeconfig,
		})
		if err != nil {
			return err
		}
		kubeProvider := pulumi.Provider(xKubeProvider)

		_, err = appsv1.NewDaemonSet(ctx, "vector-agent-daemon-set",
			&appsv1.DaemonSetArgs{
				Spec: appsv1.DaemonSetSpecArgs{
					UpdateStrategy: appsv1.DaemonSetUpdateStrategyArgs{
						RollingUpdate: appsv1.RollingUpdateDaemonSetArgs{
							MaxUnavailable: pulumi.IntPtr(1),
						},
					},
				},
			},
			kubeProvider)
		if err != nil {
			return err
		}

		return nil
	})
}

(would fail to successful deploy, because its not a really valid daemonset, but still shouldn't panic)

@emiliza emiliza added impact/panic This bug represents a panic or unexpected crash language/go labels Aug 5, 2021
@emiliza emiliza added this to the 0.61 milestone Aug 6, 2021
@emiliza emiliza removed this from the 0.61 milestone Sep 8, 2021
@Frassle Frassle self-assigned this Mar 15, 2022
@Frassle
Copy link
Member

Frassle commented Mar 15, 2022

Might be fixed by #9197, need to confirm.

@dixler dixler assigned dixler and unassigned Frassle Aug 24, 2023
@dixler dixler added this to the 0.93 milestone Aug 24, 2023
@dixler dixler added resolution/fixed This issue was fixed area/sdks Pulumi language SDKs labels Aug 24, 2023
@dixler
Copy link
Contributor

dixler commented Aug 24, 2023

Was able to repro the panic on preview with sdk/v3.9.1. It does not panic in sdk/v3.25.0 (prior to #9197) and sdk/v3.78.1.

@dixler dixler closed this as completed Aug 24, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area/sdks Pulumi language SDKs impact/panic This bug represents a panic or unexpected crash kind/bug Some behavior is incorrect or out of spec language/go resolution/fixed This issue was fixed
Projects
None yet
Development

No branches or pull requests

4 participants