{"record":{"id":"ff402ea51833f91c","repo":"kubernetes/kops","slug":"error-creating-akamai-linode-subnet-q-w","errorCode":null,"errorMessage":"error creating Akamai (Linode) Subnet %q: %w","messagePattern":"error creating Akamai \\(Linode\\) Subnet %q: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/linodetasks/subnet.go","lineNumber":149,"sourceCode":"\t\t}\n\t\tif expected.VPC == nil {\n\t\t\treturn fi.RequiredField(\"VPC\")\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (_ *Subnet) RenderLinode(t *linode.APITarget, actual, expected, changes *Subnet) error {\n\tif actual == nil {\n\t\tsubnet, err := t.Cloud.Client().CreateVPCSubnet(context.Background(), linodego.VPCSubnetCreateOptions{\n\t\t\tLabel: fi.ValueOf(expected.Name),\n\t\t\tIPv4:  fi.ValueOf(expected.IPv4),\n\t\t},\n\t\t\tfi.ValueOf(expected.VPC.ID),\n\t\t)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"error creating Akamai (Linode) Subnet %q: %w\", fi.ValueOf(expected.Name), err)\n\t\t}\n\t\texpected.ID = new(subnet.ID)\n\t\treturn nil\n\t}\n\n\tif changes == nil || (changes.Name == nil && changes.IPv4 == nil) {\n\t\texpected.ID = actual.ID\n\t\treturn nil\n\t}\n\n\tsubnet, err := t.Cloud.Client().UpdateVPCSubnet(context.Background(), fi.ValueOf(actual.VPC.ID), fi.ValueOf(actual.ID), linodego.VPCSubnetUpdateOptions{\n\t\tLabel: fi.ValueOf(expected.Name),\n\t})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error updating Akamai (Linode) Subnet %q: %w\", fi.ValueOf(expected.Name), err)\n\t}\n\texpected.ID = new(subnet.ID)\n","sourceCodeStart":131,"sourceCodeEnd":167,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/linodetasks/subnet.go#L131-L167","documentation":"Subnet.RenderLinode wraps the linodego CreateVPCSubnet error when the subnet does not yet exist. It fires when the Linode API rejects subnet creation (invalid IPv4 range, VPC not ready, quota, auth), leaving the expected subnet uncreated.","triggerScenarios":"createVPCSubnet (CreateVPCSubnet) fails while applying a new subnet — invalid IPv4 range for the VPC, auth failure, rate limit, or nonexistent VPC ID.","commonSituations":"Specified subnet IPv4 CIDR overlapping or outside the VPC's subnet range, invalid Linode API token, or the parent VPC was deleted out-of-band.","solutions":["Check the wrapped inner error; validate the subnet's IPv4 CIDR fits within the VPC's subnet range and doesn't overlap siblings","Verify LINODE_API_TOKEN validity and write scopes","Confirm the parent VPC ID exists (linode-cli vpcs list)","Retry after transient API errors/rate limits"],"exampleFix":"// before\nipv4: 10.0.99.0/24   // outside VPC range 10.0.0.0/16 subnets 10.0.1.0/24..\n// after\nipv4: 10.0.2.0/24    // within VPC range, non-overlapping","handlingStrategy":"retry","validationCode":"// validate CIDR fits the VPC subnet range and doesn't overlap siblings\nif !cidrWithin(vpcSubnetRange, desiredCIDR) { return errors.New(\"subnet CIDR outside VPC range\") }\nfor _, s := range existingSubnets { if cidrOverlaps(s.IPv4, desiredCIDR) { return errors.New(\"CIDR overlap\") } }","typeGuard":null,"tryCatchPattern":"subnet, err := client.CreateVPCSubnet(ctx, vpcID, opts)\nif err != nil {\n    var le *linodego.Error\n    if errors.As(err, &le) && (le.Code == 429 || le.Code >= 500) {\n        return retryWithBackoff()\n    }\n    return fmt.Errorf(\"error creating Akamai (Linode) Subnet %q: %w\", name, err)\n}","preventionTips":["Plan non-overlapping CIDRs inside the VPC range","Validate spec CIDRs before applying","Use a valid RW API token","Add backoff for rate limits"],"tags":["linode","akamai","subnet","api-error","cidr"],"backgroundTag":"api-request-failed","analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T12:17:11.808Z"}