Skip to content

Commit 79b593e

Browse files
committed
fix: recover from panic in IsMinikubeKubernetes when kubeconfig extensions are plain strings
Some tools (e.g. Teleport) write kubeconfig cluster extensions as raw YAML strings rather than structured objects. When devspace calls runtime.DefaultUnstructuredConverter.ToUnstructured() on such an extension, the k8s apimachinery reflection layer panics instead of returning an error: panic: reflect.Set: value of type string is not assignable to type map[string]interface {} Extract the per-extension check into a helper (isMinikubeExtension) that uses recover() to catch the panic and treat unparseable extensions as non-minikube, allowing the build to proceed normally.
1 parent af83b7e commit 79b593e

1 file changed

Lines changed: 24 additions & 7 deletions

File tree

pkg/devspace/kubectl/util.go

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -255,20 +255,37 @@ func IsMinikubeKubernetes(kubeClient Client) bool {
255255
if rawConfig, err := kubeClient.ClientConfig().RawConfig(); err == nil {
256256
clusters := rawConfig.Clusters[rawConfig.Contexts[rawConfig.CurrentContext].Cluster]
257257
for _, extension := range clusters.Extensions {
258-
ext, err := runtime.DefaultUnstructuredConverter.ToUnstructured(extension)
259-
if err == nil {
260-
if provider, ok := ext["provider"].(string); ok {
261-
if provider == minikubeProvider {
262-
return true
263-
}
264-
}
258+
if isMinikubeExtension(extension) {
259+
return true
265260
}
266261
}
267262
}
268263

269264
return false
270265
}
271266

267+
// isMinikubeExtension safely checks whether a kubeconfig cluster extension
268+
// identifies the cluster as a minikube provider.
269+
//
270+
// Some tools (e.g. Teleport) write extension values as plain YAML strings
271+
// rather than structured objects. runtime.DefaultUnstructuredConverter.ToUnstructured
272+
// panics on such values via reflection ("reflect.Set: value of type string is
273+
// not assignable to type map[string]interface {}") rather than returning an
274+
// error, so we recover() and treat unparseable extensions as non-minikube.
275+
func isMinikubeExtension(extension runtime.Object) (result bool) {
276+
defer func() {
277+
if recover() != nil {
278+
result = false
279+
}
280+
}()
281+
ext, err := runtime.DefaultUnstructuredConverter.ToUnstructured(extension)
282+
if err != nil {
283+
return false
284+
}
285+
provider, ok := ext["provider"].(string)
286+
return ok && provider == minikubeProvider
287+
}
288+
272289
// GetKindContext returns the kind cluster name
273290
func GetKindContext(context string) string {
274291
if !strings.HasPrefix(context, "kind-") {

0 commit comments

Comments
 (0)