{"record":{"id":"d9fc45a39cee7b00","repo":"kubernetes/kops","slug":"externalcloudcontrollermanager-is-nil","errorCode":null,"errorMessage":"ExternalCloudControllerManager is nil","messagePattern":"ExternalCloudControllerManager is nil","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/template_functions.go","lineNumber":686,"sourceCode":"func (tf *TemplateFunctions) HasHighlyAvailableControlPlane() bool {\n\tcp := 0\n\tfor _, ig := range tf.AllInstanceGroups {\n\t\tif ig.Spec.Role.HasControlPlane() {\n\t\t\tcp++\n\t\t\tif cp > 1 {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t}\n\treturn false\n}\n\n// CloudControllerConfigArgv returns the args to external cloud controller\nfunc (tf *TemplateFunctions) CloudControllerConfigArgv() ([]string, error) {\n\tcluster := tf.Cluster\n\n\tif cluster.Spec.ExternalCloudControllerManager == nil {\n\t\treturn nil, fmt.Errorf(\"ExternalCloudControllerManager is nil\")\n\t}\n\n\targv, err := flagbuilder.BuildFlagsList(cluster.Spec.ExternalCloudControllerManager)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// default verbosity to 2\n\tif cluster.Spec.ExternalCloudControllerManager.LogLevel == 0 {\n\t\targv = append(argv, \"--v=2\")\n\t}\n\n\t// take the cloud provider value from clusterSpec if unset\n\tif cluster.Spec.ExternalCloudControllerManager.CloudProvider == \"\" {\n\t\tif cluster.GetCloudProvider() != \"\" {\n\t\t\targv = append(argv, fmt.Sprintf(\"--cloud-provider=%s\", cluster.GetCloudProvider()))\n\t\t} else {\n\t\t\treturn nil, fmt.Errorf(\"Cloud Provider is not set\")","sourceCodeStart":668,"sourceCodeEnd":704,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/template_functions.go#L668-L704","documentation":"A nil-check guard in CloudControllerConfigArgv: the cluster spec has no ExternalCloudControllerManager block, yet the template asked to build the external cloud-controller-manager argv. kOps only populates this field when the external CCM feature is enabled, so rendering its flags without it is a configuration inconsistency.","triggerScenarios":"Thrown at upup/pkg/fi/cloudup/template_functions.go:686 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Enable the external cloud controller manager in the cluster spec (spec.externalCloudControllerManager)","Guard the template/helper call behind a check that the CCM config exists","Ensure the template is only rendered for cloud providers that use an external CCM"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T07:17:12.445Z"}