{"record":{"id":"31574c0342380325","repo":"kubernetes/kops","slug":"failed-to-find-external-network-v","errorCode":null,"errorMessage":"Failed to find external network: %v","messagePattern":"Failed to find external network: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/openstacktasks/floatingip.go","lineNumber":234,"sourceCode":"}\n\nfunc (_ *FloatingIP) ShouldCreate(a, e, changes *FloatingIP) (bool, error) {\n\tif a == nil {\n\t\treturn true, nil\n\t}\n\tif changes.Name != nil {\n\t\treturn true, nil\n\t}\n\treturn false, nil\n}\n\nfunc (f *FloatingIP) RenderOpenstack(t *openstack.OpenstackAPITarget, a, e, changes *FloatingIP) error {\n\tcloud := t.Cloud\n\n\tif a == nil {\n\t\texternal, err := cloud.GetExternalNetwork()\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"Failed to find external network: %v\", err)\n\t\t}\n\n\t\topts := l3floatingip.CreateOpts{\n\t\t\tFloatingNetworkID: external.ID,\n\t\t\tDescription:       fi.ValueOf(e.Name),\n\t\t}\n\n\t\tif e.LB != nil {\n\t\t\topts.PortID = fi.ValueOf(e.LB.PortID)\n\t\t}\n\n\t\t// instance floatingips comes from the same subnet as the kubernetes API floatingip\n\t\tlbSubnet, err := cloud.GetLBFloatingSubnet()\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"Failed to find floatingip subnet: %v\", err)\n\t\t}\n\t\tif lbSubnet != nil {\n\t\t\topts.SubnetID = lbSubnet.ID","sourceCodeStart":216,"sourceCodeEnd":252,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/openstacktasks/floatingip.go#L216-L252","documentation":"RenderOpenstack in floatingip.go:234 wraps an error from cloud.GetExternalNetwork() when creating a new FloatingIP task (a == nil). A floating IP must be allocated from an external (public) network, and kops could not resolve which configured network is the external one.","triggerScenarios":"GetExternalNetwork fails because no network in the project has router:external=true, the cluster config's external network name doesn't match, or the Neutron list-networks call itself errored.","commonSituations":"Missing or misnamed `[cloudConfig] externalNetwork` in the kops cluster spec; project lacks permission to see the shared external network; OpenStack admin forgot to mark the public network as external; typo after renaming the network.","solutions":["Set the correct external network name in the cluster spec (cluster.spec.networkID / cloudConfig) or via `kops edit cluster`, matching `openstack network list --external`.","Ask the cloud admin to set router:external on the intended public network and grant the project access.","Verify credentials/project scope allow listing networks.","Rerun `kops update cluster` after fixing the config."],"exampleFix":"// before (cluster spec)\ncloudConfig:\n  externalNetwork: \"pubnet\"   # wrong name\n// after\ncloudConfig:\n  externalNetwork: \"public\"   # matches `openstack network list --external`","handlingStrategy":"validation","validationCode":"// confirm an external network exists and is visible before creating FIPs\nnets, err := cloud.ListNetworks(networks.ListOpts{RouterExternal: true})\nif err != nil || len(nets) == 0 {\n    return fmt.Errorf(\"no external network visible to this project; set cloudConfig externalNetwork\")\n}","typeGuard":"func hasExternalNetwork(nets []networks.Network) bool {\n    for _, n := range nets {\n        if n.External {\n            return true\n        }\n    }\n    return false\n}","tryCatchPattern":"err := f.RenderOpenstack(target, a, e, changes)\nif err != nil && strings.Contains(err.Error(), \"Failed to find external network\") {\n    // fix cluster.spec cloudConfig externalNetwork, then re-run update\n}","preventionTips":["Run `openstack network list --external` and put that exact name in the cluster spec","Ask the admin to mark the public network router:external and grant project access","Validate the cluster spec with `kops update cluster` (dry-run) before applying","Re-check after OpenStack upgrades that network names are unchanged"],"tags":["openstack","neutron","floating-ip","external-network","config"],"backgroundTag":"missing-external-network","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"}