kubernetes/kops · error

error creating Akamai (Linode) Subnet %q: %w

Error message

error creating Akamai (Linode) Subnet %q: %w

What it means

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.

Source

Thrown at upup/pkg/fi/cloudup/linodetasks/subnet.go:149

		}
		if expected.VPC == nil {
			return fi.RequiredField("VPC")
		}
	}

	return nil
}

func (_ *Subnet) RenderLinode(t *linode.APITarget, actual, expected, changes *Subnet) error {
	if actual == nil {
		subnet, err := t.Cloud.Client().CreateVPCSubnet(context.Background(), linodego.VPCSubnetCreateOptions{
			Label: fi.ValueOf(expected.Name),
			IPv4:  fi.ValueOf(expected.IPv4),
		},
			fi.ValueOf(expected.VPC.ID),
		)
		if err != nil {
			return fmt.Errorf("error creating Akamai (Linode) Subnet %q: %w", fi.ValueOf(expected.Name), err)
		}
		expected.ID = new(subnet.ID)
		return nil
	}

	if changes == nil || (changes.Name == nil && changes.IPv4 == nil) {
		expected.ID = actual.ID
		return nil
	}

	subnet, err := t.Cloud.Client().UpdateVPCSubnet(context.Background(), fi.ValueOf(actual.VPC.ID), fi.ValueOf(actual.ID), linodego.VPCSubnetUpdateOptions{
		Label: fi.ValueOf(expected.Name),
	})
	if err != nil {
		return fmt.Errorf("error updating Akamai (Linode) Subnet %q: %w", fi.ValueOf(expected.Name), err)
	}
	expected.ID = new(subnet.ID)

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Check the wrapped inner error; validate the subnet's IPv4 CIDR fits within the VPC's subnet range and doesn't overlap siblings
  2. Verify LINODE_API_TOKEN validity and write scopes
  3. Confirm the parent VPC ID exists (linode-cli vpcs list)
  4. Retry after transient API errors/rate limits

Example fix

// before
ipv4: 10.0.99.0/24   // outside VPC range 10.0.0.0/16 subnets 10.0.1.0/24..
// after
ipv4: 10.0.2.0/24    // within VPC range, non-overlapping
Defensive patterns

Strategy: retry

Validate before calling

// validate CIDR fits the VPC subnet range and doesn't overlap siblings
if !cidrWithin(vpcSubnetRange, desiredCIDR) { return errors.New("subnet CIDR outside VPC range") }
for _, s := range existingSubnets { if cidrOverlaps(s.IPv4, desiredCIDR) { return errors.New("CIDR overlap") } }

Try / catch

subnet, err := client.CreateVPCSubnet(ctx, vpcID, opts)
if err != nil {
    var le *linodego.Error
    if errors.As(err, &le) && (le.Code == 429 || le.Code >= 500) {
        return retryWithBackoff()
    }
    return fmt.Errorf("error creating Akamai (Linode) Subnet %q: %w", name, err)
}

Prevention

When it happens

Trigger: createVPCSubnet (CreateVPCSubnet) fails while applying a new subnet — invalid IPv4 range for the VPC, auth failure, rate limit, or nonexistent VPC ID.

Common situations: 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.

Understand the failure class

Background: "API request failed": what wrapped HTTP errors from external APIs mean and how to find the real cause — this error's family across 29 libraries.

Related errors


AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05). Data as JSON: /api/errors/ff402ea51833f91c. Report an issue: GitHub.